@babylonjs/lite 1.0.1 → 1.1.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 (212) hide show
  1. package/LICENSE +201 -0
  2. package/README.md +51 -0
  3. package/THIRD_PARTY_NOTICES.txt +318 -0
  4. package/{_mat4-storage-f64-BW9sTaVh.js → _mat4-storage-f64-WeexU-hd.js} +2 -2
  5. package/{_mat4-storage-f64-BW9sTaVh.js.map → _mat4-storage-f64-WeexU-hd.js.map} +1 -1
  6. package/{alpha-test-fragment-eUG971h3.js → alpha-test-fragment-x2mnjLgC.js} +2 -2
  7. package/{alpha-test-fragment-eUG971h3.js.map → alpha-test-fragment-x2mnjLgC.js.map} +1 -1
  8. package/{background-dds-skybox-BwG0kYQP.js → background-dds-skybox-BpcDr-9c.js} +3 -3
  9. package/{background-dds-skybox-BwG0kYQP.js.map → background-dds-skybox-BpcDr-9c.js.map} +1 -1
  10. package/{background-ground-DiFpKJzF.js → background-ground-Bm6gjWqx.js} +2 -2
  11. package/{background-ground-DiFpKJzF.js.map → background-ground-Bm6gjWqx.js.map} +1 -1
  12. package/{background-hdr-skybox-DIgJhvfj.js → background-hdr-skybox-CSFo8RX6.js} +3 -3
  13. package/{background-hdr-skybox-DIgJhvfj.js.map → background-hdr-skybox-CSFo8RX6.js.map} +1 -1
  14. package/{background-solid-skybox--fqHdan_.js → background-solid-skybox-DOOBeDIz.js} +2 -2
  15. package/{background-solid-skybox--fqHdan_.js.map → background-solid-skybox-DOOBeDIz.js.map} +1 -1
  16. package/{billboard-renderable-HY2XCd52.js → billboard-renderable-IJfCpeDS.js} +2 -2
  17. package/{billboard-renderable-HY2XCd52.js.map → billboard-renderable-IJfCpeDS.js.map} +1 -1
  18. package/{clamp-block-XHdUk2Va.js → clamp-block-BD_t8I89.js} +2 -2
  19. package/{clamp-block-XHdUk2Va.js.map → clamp-block-BD_t8I89.js.map} +1 -1
  20. package/{clearcoat-fragment-CHYw8MPB.js → clearcoat-fragment-Dj7vGX2u.js} +2 -2
  21. package/{clearcoat-fragment-CHYw8MPB.js.map → clearcoat-fragment-Dj7vGX2u.js.map} +1 -1
  22. package/{create-skeleton-9tdiUjRP.js → create-skeleton-s0hjrC3A.js} +2 -2
  23. package/{create-skeleton-9tdiUjRP.js.map → create-skeleton-s0hjrC3A.js.map} +1 -1
  24. package/{cubemap-skybox-material-DqQ0dyz8.js → cubemap-skybox-material-8lzbgi7K.js} +2 -2
  25. package/{cubemap-skybox-material-DqQ0dyz8.js.map → cubemap-skybox-material-8lzbgi7K.js.map} +1 -1
  26. package/{curve-block-S27sXrJQ.js → curve-block-Ditr4R7V.js} +2 -2
  27. package/{curve-block-S27sXrJQ.js.map → curve-block-Ditr4R7V.js.map} +1 -1
  28. package/{emissive-fragment-CZMQ0_bF.js → emissive-fragment-BOAezkfk.js} +2 -2
  29. package/{emissive-fragment-CZMQ0_bF.js.map → emissive-fragment-BOAezkfk.js.map} +1 -1
  30. package/{esm-shadow-view-Cl36rOrK.js → esm-shadow-view-DRpyRAfa.js} +2 -2
  31. package/{esm-shadow-view-Cl36rOrK.js.map → esm-shadow-view-DRpyRAfa.js.map} +1 -1
  32. package/{esm-shadow-view-CUwxbnMR.js → esm-shadow-view-DmIORQGZ.js} +2 -2
  33. package/{esm-shadow-view-CUwxbnMR.js.map → esm-shadow-view-DmIORQGZ.js.map} +1 -1
  34. package/{esm-shadow-view-DKQ-FSoV.js → esm-shadow-view-JCPaOOi7.js} +2 -2
  35. package/{esm-shadow-view-DKQ-FSoV.js.map → esm-shadow-view-JCPaOOi7.js.map} +1 -1
  36. package/{gaussian-splatting-pipeline-sh-DDo7QQ8l.js → gaussian-splatting-pipeline-sh-B30Mu56i.js} +2 -2
  37. package/{gaussian-splatting-pipeline-sh-DDo7QQ8l.js.map → gaussian-splatting-pipeline-sh-B30Mu56i.js.map} +1 -1
  38. package/{geometry-texture-output-BmuAquio.js → geometry-texture-output-DURiaJ_n.js} +2 -2
  39. package/{geometry-texture-output-BmuAquio.js.map → geometry-texture-output-DURiaJ_n.js.map} +1 -1
  40. package/{geometry-view-xWZmq799.js → geometry-view-DRrscyWU.js} +4 -4
  41. package/{geometry-view-xWZmq799.js.map → geometry-view-DRrscyWU.js.map} +1 -1
  42. package/{gltf-animation-Bq7k_5HA.js → gltf-animation-BjnXkop6.js} +2 -2
  43. package/{gltf-animation-Bq7k_5HA.js.map → gltf-animation-BjnXkop6.js.map} +1 -1
  44. package/{gltf-ext-basisu-C5teqxzQ.js → gltf-ext-basisu-DtzVV1Xx.js} +2 -2
  45. package/{gltf-ext-basisu-C5teqxzQ.js.map → gltf-ext-basisu-DtzVV1Xx.js.map} +1 -1
  46. package/{gltf-ext-node-visibility-DnGTKkMf.js → gltf-ext-node-visibility-BhX0DmiP.js} +2 -2
  47. package/{gltf-ext-node-visibility-DnGTKkMf.js.map → gltf-ext-node-visibility-BhX0DmiP.js.map} +1 -1
  48. package/{gltf-ext-quantization-DheC7FhB.js → gltf-ext-quantization-DaymajCR.js} +2 -2
  49. package/{gltf-ext-quantization-DheC7FhB.js.map → gltf-ext-quantization-DaymajCR.js.map} +1 -1
  50. package/{gltf-ext-uv-transform-DljdVllE.js → gltf-ext-uv-transform-DFmNJ8kA.js} +2 -2
  51. package/{gltf-ext-uv-transform-DljdVllE.js.map → gltf-ext-uv-transform-DFmNJ8kA.js.map} +1 -1
  52. package/{gltf-feature-animation-pointer-DVhymFLK.js → gltf-feature-animation-pointer-C40tqOhL.js} +3 -3
  53. package/{gltf-feature-animation-pointer-DVhymFLK.js.map → gltf-feature-animation-pointer-C40tqOhL.js.map} +1 -1
  54. package/{gltf-feature-animations-hxC3y3bJ.js → gltf-feature-animations-v0S_yb4T.js} +2 -2
  55. package/{gltf-feature-animations-hxC3y3bJ.js.map → gltf-feature-animations-v0S_yb4T.js.map} +1 -1
  56. package/{gltf-feature-draco-B7Q_cMUv.js → gltf-feature-draco-CljWrsna.js} +2 -2
  57. package/{gltf-feature-draco-B7Q_cMUv.js.map → gltf-feature-draco-CljWrsna.js.map} +1 -1
  58. package/{gltf-feature-gpu-instancing-C7sRzWv7.js → gltf-feature-gpu-instancing-BoeSm6Tn.js} +2 -2
  59. package/{gltf-feature-gpu-instancing-C7sRzWv7.js.map → gltf-feature-gpu-instancing-BoeSm6Tn.js.map} +1 -1
  60. package/{gltf-feature-lights-punctual-DF7kya14.js → gltf-feature-lights-punctual-BCTwgyi_.js} +5 -5
  61. package/{gltf-feature-lights-punctual-DF7kya14.js.map → gltf-feature-lights-punctual-BCTwgyi_.js.map} +1 -1
  62. package/{gltf-feature-meshopt-DRG9hEqT.js → gltf-feature-meshopt-DItMkOMt.js} +2 -2
  63. package/{gltf-feature-meshopt-DRG9hEqT.js.map → gltf-feature-meshopt-DItMkOMt.js.map} +1 -1
  64. package/{gltf-feature-morph-DZydYgWp.js → gltf-feature-morph-Cv0mEYIq.js} +3 -3
  65. package/{gltf-feature-morph-DZydYgWp.js.map → gltf-feature-morph-Cv0mEYIq.js.map} +1 -1
  66. package/{gltf-feature-registry-DeYdy3DV.js → gltf-feature-registry-wNbt6UC-.js} +15 -15
  67. package/{gltf-feature-registry-DeYdy3DV.js.map → gltf-feature-registry-wNbt6UC-.js.map} +1 -1
  68. package/{gltf-feature-skeleton-B9och1W0.js → gltf-feature-skeleton-Deh2UBAn.js} +3 -3
  69. package/{gltf-feature-skeleton-B9och1W0.js.map → gltf-feature-skeleton-Deh2UBAn.js.map} +1 -1
  70. package/{gltf-feature-variants-CY_Qft7f.js → gltf-feature-variants-DGSdFNJq.js} +2 -2
  71. package/{gltf-feature-variants-CY_Qft7f.js.map → gltf-feature-variants-DGSdFNJq.js.map} +1 -1
  72. package/{gltf-glb-parser-CqOeXFOz.js → gltf-glb-parser-DSQWsT4r.js} +2 -2
  73. package/{gltf-glb-parser-CqOeXFOz.js.map → gltf-glb-parser-DSQWsT4r.js.map} +1 -1
  74. package/{gltf-interleave-DWf27t-h.js → gltf-interleave-OBqmlu-h.js} +11 -4
  75. package/gltf-interleave-OBqmlu-h.js.map +1 -0
  76. package/{gltf-normals-b2h74380.js → gltf-normals-D_P0KA4b.js} +10 -2
  77. package/gltf-normals-D_P0KA4b.js.map +1 -0
  78. package/{gltf-pbr-builder-ext-DvFxuOqN.js → gltf-pbr-builder-ext-3imk8Tev.js} +2 -2
  79. package/{gltf-pbr-builder-ext-DvFxuOqN.js.map → gltf-pbr-builder-ext-3imk8Tev.js.map} +1 -1
  80. package/{gltf-variants-CUvzYGYX.js → gltf-variants-Dyr54wwg.js} +4 -4
  81. package/{gltf-variants-CUvzYGYX.js.map → gltf-variants-Dyr54wwg.js.map} +1 -1
  82. package/{gpu-task-timer-Dgkff80h.js → gpu-task-timer-DVBNZfq5.js} +2 -2
  83. package/{gpu-task-timer-Dgkff80h.js.map → gpu-task-timer-DVBNZfq5.js.map} +1 -1
  84. package/{gs-picking-pipeline-55sM5LzV.js → gs-picking-pipeline-CERN-Trj.js} +2 -2
  85. package/{gs-picking-pipeline-55sM5LzV.js.map → gs-picking-pipeline-CERN-Trj.js.map} +1 -1
  86. package/{havok-floating-origin-5xp32P-C.js → havok-floating-origin-VVdJRUYc.js} +2 -2
  87. package/{havok-floating-origin-5xp32P-C.js.map → havok-floating-origin-VVdJRUYc.js.map} +1 -1
  88. package/{index-CYZDclhF.js → index-7Bk-uLSM.js} +2 -2
  89. package/{index-CYZDclhF.js.map → index-7Bk-uLSM.js.map} +1 -1
  90. package/{index-C-tEgwbZ.js → index-BgY3QEzL.js} +2817 -1166
  91. package/index-BgY3QEzL.js.map +1 -0
  92. package/{index-SMJ67XwT.js → index-Dr5LK2tg.js} +2 -2
  93. package/{index-SMJ67XwT.js.map → index-Dr5LK2tg.js.map} +1 -1
  94. package/index.d.ts +572 -18
  95. package/index.js +499 -464
  96. package/{input-block-DbRYCnet.js → input-block-DjdlndCL.js} +2 -2
  97. package/{input-block-DbRYCnet.js.map → input-block-DjdlndCL.js.map} +1 -1
  98. package/{iridescence-fragment-S3Ko1jvC.js → iridescence-fragment-kfsCs8lN.js} +2 -2
  99. package/{iridescence-fragment-S3Ko1jvC.js.map → iridescence-fragment-kfsCs8lN.js.map} +1 -1
  100. package/{light-block-CAqWkucp.js → light-block-qjCrz3de.js} +2 -2
  101. package/{light-block-CAqWkucp.js.map → light-block-qjCrz3de.js.map} +1 -1
  102. package/{loop-block-ch-biPFY.js → loop-block-C8vkQ2bz.js} +2 -2
  103. package/{loop-block-ch-biPFY.js.map → loop-block-C8vkQ2bz.js.map} +1 -1
  104. package/{manifold-AS8POaOr.js → manifold-DeXMNgxT.js} +3 -3
  105. package/{manifold-AS8POaOr.js.map → manifold-DeXMNgxT.js.map} +1 -1
  106. package/{morph-fragment-D9he3Ksk.js → morph-fragment-NpZYyIIU.js} +2 -2
  107. package/{morph-fragment-D9he3Ksk.js.map → morph-fragment-NpZYyIIU.js.map} +1 -1
  108. package/{multilight-wgsl-74aXpcJG.js → multilight-wgsl-I5SncF0q.js} +2 -2
  109. package/{multilight-wgsl-74aXpcJG.js.map → multilight-wgsl-I5SncF0q.js.map} +1 -1
  110. package/{node-env-B2bjGcMS.js → node-env-D7Aee08u.js} +2 -2
  111. package/{node-env-B2bjGcMS.js.map → node-env-D7Aee08u.js.map} +1 -1
  112. package/{node-geometry-view-CSXlEAhG.js → node-geometry-view-DfKXWNfV.js} +3 -3
  113. package/{node-geometry-view-CSXlEAhG.js.map → node-geometry-view-DfKXWNfV.js.map} +1 -1
  114. package/{node-registry-extra-compat-BEQH_ksg.js → node-registry-extra-compat-CDLeBR1P.js} +2 -2
  115. package/{node-registry-extra-compat-BEQH_ksg.js.map → node-registry-extra-compat-CDLeBR1P.js.map} +1 -1
  116. package/{node-registry-extra-math-Bm32WBAa.js → node-registry-extra-math-BA8_l4lB.js} +2 -2
  117. package/{node-registry-extra-math-Bm32WBAa.js.map → node-registry-extra-math-BA8_l4lB.js.map} +1 -1
  118. package/{node-renderable-BMHny4tC.js → node-renderable-EwLLnaL1.js} +2 -2
  119. package/{node-renderable-BMHny4tC.js.map → node-renderable-EwLLnaL1.js.map} +1 -1
  120. package/{node-shadow-BRiz7CT1.js → node-shadow-CeTmT6g4.js} +2 -2
  121. package/{node-shadow-BRiz7CT1.js.map → node-shadow-CeTmT6g4.js.map} +1 -1
  122. package/{normal-map-fragment-sE3TjF4U.js → normal-map-fragment-BHImLyM-.js} +2 -2
  123. package/{normal-map-fragment-sE3TjF4U.js.map → normal-map-fragment-BHImLyM-.js.map} +1 -1
  124. package/package.json +10 -3
  125. package/{parse-camera-CmZBS423.js → parse-camera-5IGdctAS.js} +2 -2
  126. package/{parse-camera-CmZBS423.js.map → parse-camera-5IGdctAS.js.map} +1 -1
  127. package/{pbr-geometry-view-T3vMABM8.js → pbr-geometry-view-Dthf9Aut.js} +3 -3
  128. package/{pbr-geometry-view-T3vMABM8.js.map → pbr-geometry-view-Dthf9Aut.js.map} +1 -1
  129. package/{pbr-metallic-roughness-block-full-CHC8w-Uv.js → pbr-metallic-roughness-block-full-DD6zI_Lx.js} +2 -2
  130. package/{pbr-metallic-roughness-block-full-CHC8w-Uv.js.map → pbr-metallic-roughness-block-full-DD6zI_Lx.js.map} +1 -1
  131. package/{pbr-metallic-roughness-block-DbozMlHU.js → pbr-metallic-roughness-block-g7wjzwN_.js} +2 -2
  132. package/{pbr-metallic-roughness-block-DbozMlHU.js.map → pbr-metallic-roughness-block-g7wjzwN_.js.map} +1 -1
  133. package/{pbr-mr-helper-core-DGRgbRXl.js → pbr-mr-helper-core-CWROQ7OA.js} +2 -2
  134. package/{pbr-mr-helper-core-DGRgbRXl.js.map → pbr-mr-helper-core-CWROQ7OA.js.map} +1 -1
  135. package/{pbr-refraction-CquDP9JO.js → pbr-refraction-Dxsm_gii.js} +2 -2
  136. package/{pbr-refraction-CquDP9JO.js.map → pbr-refraction-Dxsm_gii.js.map} +1 -1
  137. package/{pbr-renderable-CaHKHU0g.js → pbr-renderable-CuKWalEM.js} +22 -22
  138. package/{pbr-renderable-CaHKHU0g.js.map → pbr-renderable-CuKWalEM.js.map} +1 -1
  139. package/{pbr-shadow-fragment-DmnNe6yz.js → pbr-shadow-fragment-waeIBQUq.js} +2 -2
  140. package/{pbr-shadow-fragment-DmnNe6yz.js.map → pbr-shadow-fragment-waeIBQUq.js.map} +1 -1
  141. package/{pbr-tracking-Bo7RTANK.js → pbr-tracking-CdeqbBrh.js} +2 -2
  142. package/{pbr-tracking-Bo7RTANK.js.map → pbr-tracking-CdeqbBrh.js.map} +1 -1
  143. package/{pbr-transmission-ext-CoGcJBGE.js → pbr-transmission-ext-BNiXngZc.js} +2 -2
  144. package/{pbr-transmission-ext-CoGcJBGE.js.map → pbr-transmission-ext-BNiXngZc.js.map} +1 -1
  145. package/{recast-navigation.wasm-DG_0AFuk.js → recast-navigation.wasm-VC4lGlEe.js} +3 -3
  146. package/{recast-navigation.wasm-DG_0AFuk.js.map → recast-navigation.wasm-VC4lGlEe.js.map} +1 -1
  147. package/{recast-navigation.wasm-compat-C-Bf2ylB.js → recast-navigation.wasm-compat-CTwYOzRz.js} +3 -3
  148. package/{recast-navigation.wasm-compat-C-Bf2ylB.js.map → recast-navigation.wasm-compat-CTwYOzRz.js.map} +1 -1
  149. package/{reflectance-fragment-CExe6qDY.js → reflectance-fragment-BQFZ_pgy.js} +2 -2
  150. package/{reflectance-fragment-CExe6qDY.js.map → reflectance-fragment-BQFZ_pgy.js.map} +1 -1
  151. package/{rgbd-decode-DkiiiIlt.js → rgbd-decode-duTlXMWd.js} +2 -2
  152. package/{rgbd-decode-DkiiiIlt.js.map → rgbd-decode-duTlXMWd.js.map} +1 -1
  153. package/{screenshot-readback-avr_tYGZ.js → screenshot-readback-DnxR4rhp.js} +2 -2
  154. package/{screenshot-readback-avr_tYGZ.js.map → screenshot-readback-DnxR4rhp.js.map} +1 -1
  155. package/{shader-composer-CZagsJDS.js → shader-composer-CBy2i8nU.js} +2 -2
  156. package/{shader-composer-CZagsJDS.js.map → shader-composer-CBy2i8nU.js.map} +1 -1
  157. package/{shader-renderable-D5sbgzxt.js → shader-renderable-DVMVD6zP.js} +4 -4
  158. package/{shader-renderable-D5sbgzxt.js.map → shader-renderable-DVMVD6zP.js.map} +1 -1
  159. package/{shader-thin-instance-CkQ8rrfH.js → shader-thin-instance-CsDo3ULk.js} +2 -2
  160. package/{shader-thin-instance-CkQ8rrfH.js.map → shader-thin-instance-CsDo3ULk.js.map} +1 -1
  161. package/{sheen-fragment-BEigjpTX.js → sheen-fragment-B_Jd7wrr.js} +2 -2
  162. package/{sheen-fragment-BEigjpTX.js.map → sheen-fragment-B_Jd7wrr.js.map} +1 -1
  163. package/{singlelight-directional-wgsl-Ccsk-ys3.js → singlelight-directional-wgsl-Bw84txva.js} +2 -2
  164. package/{singlelight-directional-wgsl-Ccsk-ys3.js.map → singlelight-directional-wgsl-Bw84txva.js.map} +1 -1
  165. package/{singlelight-hemispheric-wgsl-DL-jpc97.js → singlelight-hemispheric-wgsl-DjxhgI8r.js} +2 -2
  166. package/{singlelight-hemispheric-wgsl-DL-jpc97.js.map → singlelight-hemispheric-wgsl-DjxhgI8r.js.map} +1 -1
  167. package/{singlelight-point-wgsl-hYmiP6ys.js → singlelight-point-wgsl-iA1aRkXA.js} +2 -2
  168. package/{singlelight-point-wgsl-hYmiP6ys.js.map → singlelight-point-wgsl-iA1aRkXA.js.map} +1 -1
  169. package/{singlelight-spot-wgsl-DSjp1p1C.js → singlelight-spot-wgsl-MDdTdstF.js} +2 -2
  170. package/{singlelight-spot-wgsl-DSjp1p1C.js.map → singlelight-spot-wgsl-MDdTdstF.js.map} +1 -1
  171. package/{skeleton-fragment-B__bUbPK.js → skeleton-fragment-COdHWFcK.js} +2 -2
  172. package/{skeleton-fragment-B__bUbPK.js.map → skeleton-fragment-COdHWFcK.js.map} +1 -1
  173. package/{skybox-renderable-BH6uUkal.js → skybox-renderable-DJYkfw32.js} +2 -2
  174. package/{skybox-renderable-BH6uUkal.js.map → skybox-renderable-DJYkfw32.js.map} +1 -1
  175. package/{splat-ply-compressed-BGNK6dnh.js → splat-ply-compressed-SxMlsKNK.js} +2 -2
  176. package/{splat-ply-compressed-BGNK6dnh.js.map → splat-ply-compressed-SxMlsKNK.js.map} +1 -1
  177. package/{standard-pipeline-BvFynkwL.js → standard-pipeline-DXFOUqU_.js} +3 -3
  178. package/{standard-pipeline-BvFynkwL.js.map → standard-pipeline-DXFOUqU_.js.map} +1 -1
  179. package/{standard-renderable-1Q3zemys.js → standard-renderable-BAc-i-ig.js} +3 -3
  180. package/{standard-renderable-1Q3zemys.js.map → standard-renderable-BAc-i-ig.js.map} +1 -1
  181. package/{std-ambient-fragment-__F1KTEu.js → std-ambient-fragment-P8dHZ4An.js} +2 -2
  182. package/{std-ambient-fragment-__F1KTEu.js.map → std-ambient-fragment-P8dHZ4An.js.map} +1 -1
  183. package/{std-cube-reflection-fragment-DidM0byH.js → std-cube-reflection-fragment-CF03MuQt.js} +2 -2
  184. package/{std-cube-reflection-fragment-DidM0byH.js.map → std-cube-reflection-fragment-CF03MuQt.js.map} +1 -1
  185. package/{std-emissive-fragment-Bj62X4Np.js → std-emissive-fragment-P8yJGclx.js} +2 -2
  186. package/{std-emissive-fragment-Bj62X4Np.js.map → std-emissive-fragment-P8yJGclx.js.map} +1 -1
  187. package/{std-lightmap-fragment-DXvfWvKc.js → std-lightmap-fragment-CymEG79z.js} +9 -6
  188. package/std-lightmap-fragment-CymEG79z.js.map +1 -0
  189. package/{std-opacity-fragment-BzMMb1K_.js → std-opacity-fragment-DLa1zV06.js} +2 -2
  190. package/{std-opacity-fragment-BzMMb1K_.js.map → std-opacity-fragment-DLa1zV06.js.map} +1 -1
  191. package/{std-reflection-fragment-DC9Kvu1C.js → std-reflection-fragment-BLySsYos.js} +2 -2
  192. package/{std-reflection-fragment-DC9Kvu1C.js.map → std-reflection-fragment-BLySsYos.js.map} +1 -1
  193. package/{std-shadow-fragment-BnMHeF1-.js → std-shadow-fragment-C_q27Mdi.js} +2 -2
  194. package/{std-shadow-fragment-BnMHeF1-.js.map → std-shadow-fragment-C_q27Mdi.js.map} +1 -1
  195. package/{std-specular-fragment-Bio681OG.js → std-specular-fragment-CaBXyAWY.js} +2 -2
  196. package/{std-specular-fragment-Bio681OG.js.map → std-specular-fragment-CaBXyAWY.js.map} +1 -1
  197. package/{std-tracking-BTcrry2o.js → std-tracking-Bw61Dv98.js} +2 -2
  198. package/{std-tracking-BTcrry2o.js.map → std-tracking-Bw61Dv98.js.map} +1 -1
  199. package/{subsurface-fragment-DpKib445.js → subsurface-fragment-BNQoG9gr.js} +2 -2
  200. package/{subsurface-fragment-DpKib445.js.map → subsurface-fragment-BNQoG9gr.js.map} +1 -1
  201. package/{thin-instance-cull-binding-DwZi7mlE.js → thin-instance-cull-binding-BNC5JiGw.js} +3 -3
  202. package/{thin-instance-cull-binding-DwZi7mlE.js.map → thin-instance-cull-binding-BNC5JiGw.js.map} +1 -1
  203. package/{thin-instance-gpu-uY2NOv0J.js → thin-instance-gpu-C1DGstap.js} +2 -2
  204. package/{thin-instance-gpu-uY2NOv0J.js.map → thin-instance-gpu-C1DGstap.js.map} +1 -1
  205. package/{tracking-primitives-Ck5bgCuo.js → tracking-primitives-CMBWLxGr.js} +2 -2
  206. package/{tracking-primitives-Ck5bgCuo.js.map → tracking-primitives-CMBWLxGr.js.map} +1 -1
  207. package/{unlit-fragment-nc6hu3Mw.js → unlit-fragment-BsHrS9XX.js} +2 -2
  208. package/{unlit-fragment-nc6hu3Mw.js.map → unlit-fragment-BsHrS9XX.js.map} +1 -1
  209. package/gltf-interleave-DWf27t-h.js.map +0 -1
  210. package/gltf-normals-b2h74380.js.map +0 -1
  211. package/index-C-tEgwbZ.js.map +0 -1
  212. package/std-lightmap-fragment-DXvfWvKc.js.map +0 -1
@@ -1,4 +1,4 @@
1
- import { aK as PBR_HAS_METALLIC_REFLECTANCE_MAP, aL as PBR_HAS_REFLECTANCE_MAP, aM as PBR2_HAS_REFLECTANCE_FACTORS, aN as PBR2_HAS_UV2, aO as PBR_HAS_USE_ALPHA_ONLY_MR } from "./index-C-tEgwbZ.js";
1
+ import { aM as PBR_HAS_METALLIC_REFLECTANCE_MAP, aN as PBR_HAS_REFLECTANCE_MAP, aO as PBR2_HAS_REFLECTANCE_FACTORS, aP as PBR2_HAS_UV2, aQ as PBR_HAS_USE_ALPHA_ONLY_MR } from "./index-BgY3QEzL.js";
2
2
  const STAGE_FRAGMENT = 2;
3
3
  function writeReflectanceUBO(data, material, offsets) {
4
4
  if (!offsets.has("occlusionStrength")) {
@@ -140,4 +140,4 @@ export {
140
140
  pbrExt,
141
141
  writeReflectanceUBO
142
142
  };
143
- //# sourceMappingURL=reflectance-fragment-CExe6qDY.js.map
143
+ //# sourceMappingURL=reflectance-fragment-BQFZ_pgy.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"reflectance-fragment-CExe6qDY.js","sources":["../src/material/pbr/fragments/reflectance-fragment.ts"],"sourcesContent":["/**\n * Metallic Reflectance Fragment\n *\n * Advanced F0 computation with metallicReflectanceTexture and/or reflectanceTexture.\n * Only bundled when a scene uses these textures.\n *\n * Provides: UBO fields (occlusionStrength, metallicF0Factor, specularWeight, metallicReflectanceColor),\n * conditional texture bindings, F0 computation, and occlusion handling.\n */\n\nimport type { ShaderFragment, BindingDecl } from \"../../../shader/fragment-types.js\";\nimport type { PbrMaterialProps } from \"../pbr-material.js\";\nimport type { PbrExt } from \"../pbr-flags.js\";\nimport { PBR_HAS_METALLIC_REFLECTANCE_MAP, PBR_HAS_REFLECTANCE_MAP, PBR_HAS_USE_ALPHA_ONLY_MR, PBR2_HAS_REFLECTANCE_FACTORS, PBR2_HAS_UV2 } from \"../pbr-flag-bits.js\";\n\n// WebGPU shader stage constants\nconst STAGE_FRAGMENT = 0x2;\n\n/** Write the reflectance-extension material-UBO slice\n * (occlusionStrength, metallicF0Factor, specularWeight, metallicReflectanceColor).\n * Gated by the presence of the `occlusionStrength` field in the UBO spec,\n * which is added only when a metallic-reflectance or reflectance texture\n * is in use. */\nexport function writeReflectanceUBO(data: Float32Array, material: PbrMaterialProps, offsets: ReadonlyMap<string, number>): void {\n if (!offsets.has(\"occlusionStrength\")) {\n return;\n }\n const off = offsets.get(\"occlusionStrength\")! / 4;\n data[off] = material.occlusionStrength ?? 1.0;\n data[off + 1] = material.metallicF0Factor ?? 1.0;\n data[off + 2] = material.specularWeight ?? material.metallicF0Factor ?? 1.0;\n const mrc = material.metallicReflectanceColor;\n data[off + 4] = mrc ? mrc[0]! : 1.0;\n data[off + 5] = mrc ? mrc[1]! : 1.0;\n data[off + 6] = mrc ? mrc[2]! : 1.0;\n}\n\n/**\n * Create a metallic reflectance fragment.\n * @param hasMetallicReflectanceMap - Whether the material has a metallicReflectanceTexture.\n * @param hasReflectanceMap - Whether the material has a reflectanceTexture.\n * @param useAlphaOnlyMR - Whether to use only the alpha channel from the metallic reflectance map.\n */\nexport function createReflectanceFragment(\n hasMetallicReflectanceMap: boolean,\n hasReflectanceMap: boolean,\n useAlphaOnlyMR: boolean,\n hasOcclusionUv2: boolean = false\n): ShaderFragment {\n const bindings: BindingDecl[] = [];\n if (hasMetallicReflectanceMap) {\n bindings.push(\n { _name: \"metallicReflectanceMap\", _type: { _kind: \"texture\", _textureType: \"texture_2d<f32>\" }, _visibility: STAGE_FRAGMENT },\n { _name: \"metallicReflectanceMapSampler\", _type: { _kind: \"sampler\", _samplerType: \"sampler\" }, _visibility: STAGE_FRAGMENT }\n );\n }\n if (hasReflectanceMap) {\n bindings.push(\n { _name: \"reflectanceMap\", _type: { _kind: \"texture\", _textureType: \"texture_2d<f32>\" }, _visibility: STAGE_FRAGMENT },\n { _name: \"reflectanceMapSampler\", _type: { _kind: \"sampler\", _samplerType: \"sampler\" }, _visibility: STAGE_FRAGMENT }\n );\n }\n\n // Build F0 computation code\n let f0Code = `var mrFactors = vec4<f32>(material.metallicReflectanceColor, material.metallicF0Factor);\nvar specularWeight = material.specularWeight;`;\n if (hasReflectanceMap) {\n f0Code += `\n{ let rSample = textureSample(reflectanceMap, reflectanceMapSampler, input.uv);\n let rLinear = pow(rSample.rgb, vec3<f32>(2.2));\n mrFactors = vec4<f32>(mrFactors.rgb * rLinear, mrFactors.a); }`;\n }\n if (hasMetallicReflectanceMap) {\n if (!useAlphaOnlyMR) {\n f0Code += `\n{ let mrSample = textureSample(metallicReflectanceMap, metallicReflectanceMapSampler, input.uv);\n let mrLinear = pow(mrSample.rgb, vec3<f32>(2.2));\n mrFactors = vec4<f32>(mrFactors.rgb * mrLinear, mrFactors.a * mrSample.a);\n specularWeight *= mrSample.a; }`;\n } else {\n f0Code += `\n{ let mrSample = textureSample(metallicReflectanceMap, metallicReflectanceMapSampler, input.uv);\n mrFactors = vec4<f32>(mrFactors.rgb, mrFactors.a * mrSample.a);\n specularWeight *= mrSample.a; }`;\n }\n }\n f0Code += `\nlet dielectricF0 = material.reflectance * mrFactors.a;\nlet surfaceReflectivityColor = mrFactors.rgb;\nlet dielectricColorF0 = vec3<f32>(dielectricF0) * surfaceReflectivityColor;\nlet metallicColorF0 = baseColor;\nvar colorF0 = mix(dielectricColorF0, metallicColorF0, metallic);\nlet colorF90 = vec3<f32>(mix(specularWeight, 1.0, metallic));\nlet surfaceAlbedo = baseColor * (vec3<f32>(1.0) - vec3<f32>(dielectricF0) * surfaceReflectivityColor) * (1.0 - metallic);`;\n\n return {\n _id: \"reflectance\",\n\n _uboFields: [\n { _name: \"occlusionStrength\", _type: \"f32\" },\n { _name: \"metallicF0Factor\", _type: \"f32\" },\n { _name: \"specularWeight\", _type: \"f32\" },\n { _name: \"_mrPad1\", _type: \"f32\" },\n { _name: \"metallicReflectanceColor\", _type: \"vec3<f32>\" },\n { _name: \"_mrPad2\", _type: \"f32\" },\n ],\n\n _bindings: bindings,\n\n _fragmentSlots: {\n MF: f0Code,\n AT: hasOcclusionUv2\n ? `let occlusion = mix(1.0, textureSample(occlusionTexture, occlusionSampler_, input.uv2).r, material.occlusionStrength);`\n : `let occlusion = mix(1.0, orm.r, material.occlusionStrength);`,\n },\n };\n}\n\n/** Create the reflectance PBR extension (group 1, fragment phase). */\nexport const pbrExt: PbrExt = {\n id: \"reflectance\",\n phase: \"fragment\",\n detect(mat) {\n const m = mat as PbrMaterialProps;\n let f = 0;\n let f2 = 0;\n if (m.metallicReflectanceTexture) {\n f |= PBR_HAS_METALLIC_REFLECTANCE_MAP;\n }\n if (m.reflectanceTexture) {\n f |= PBR_HAS_REFLECTANCE_MAP;\n }\n if (f === 0) {\n const hasNonDefaultF0 = m.metallicF0Factor != null && Math.abs(m.metallicF0Factor - 1) > 1e-6;\n const mrc = m.metallicReflectanceColor;\n const hasNonDefaultColor = mrc != null && (mrc[0] !== 1 || mrc[1] !== 1 || mrc[2] !== 1);\n if (hasNonDefaultF0 || hasNonDefaultColor) {\n f2 |= PBR2_HAS_REFLECTANCE_FACTORS;\n }\n }\n if ((f !== 0 || f2 & PBR2_HAS_REFLECTANCE_FACTORS) && m.useOnlyMetallicFromMetallicReflectanceTexture) {\n f |= PBR_HAS_USE_ALPHA_ONLY_MR;\n }\n return { f, f2 };\n },\n frag(ctx) {\n const hasMR = (ctx._features & PBR_HAS_METALLIC_REFLECTANCE_MAP) !== 0;\n const hasR = (ctx._features & PBR_HAS_REFLECTANCE_MAP) !== 0;\n const hasFactors = (ctx._features2 & PBR2_HAS_REFLECTANCE_FACTORS) !== 0;\n if (!hasMR && !hasR && !hasFactors) {\n return null;\n }\n return createReflectanceFragment(hasMR, hasR, (ctx._features & PBR_HAS_USE_ALPHA_ONLY_MR) !== 0, (ctx._features2 & PBR2_HAS_UV2) !== 0);\n },\n writeUbo: writeReflectanceUBO as PbrExt[\"writeUbo\"],\n bind(ctx, entries, b) {\n if ((ctx._features & (PBR_HAS_METALLIC_REFLECTANCE_MAP | PBR_HAS_REFLECTANCE_MAP)) === 0) {\n return b;\n }\n const m = ctx._material as PbrMaterialProps;\n if (m.metallicReflectanceTexture) {\n entries.push({ binding: b++, resource: m.metallicReflectanceTexture.view });\n entries.push({ binding: b++, resource: m.metallicReflectanceTexture.sampler });\n }\n if (m.reflectanceTexture) {\n entries.push({ binding: b++, resource: m.reflectanceTexture.view });\n entries.push({ binding: b++, resource: m.reflectanceTexture.sampler });\n }\n return b;\n },\n textures(mat, t) {\n const m = mat as PbrMaterialProps;\n if (m.metallicReflectanceTexture) {\n t.push(m.metallicReflectanceTexture);\n }\n if (m.reflectanceTexture) {\n t.push(m.reflectanceTexture);\n }\n },\n};\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"reflectance-fragment-BQFZ_pgy.js","sources":["../src/material/pbr/fragments/reflectance-fragment.ts"],"sourcesContent":["/**\n * Metallic Reflectance Fragment\n *\n * Advanced F0 computation with metallicReflectanceTexture and/or reflectanceTexture.\n * Only bundled when a scene uses these textures.\n *\n * Provides: UBO fields (occlusionStrength, metallicF0Factor, specularWeight, metallicReflectanceColor),\n * conditional texture bindings, F0 computation, and occlusion handling.\n */\n\nimport type { ShaderFragment, BindingDecl } from \"../../../shader/fragment-types.js\";\nimport type { PbrMaterialProps } from \"../pbr-material.js\";\nimport type { PbrExt } from \"../pbr-flags.js\";\nimport { PBR_HAS_METALLIC_REFLECTANCE_MAP, PBR_HAS_REFLECTANCE_MAP, PBR_HAS_USE_ALPHA_ONLY_MR, PBR2_HAS_REFLECTANCE_FACTORS, PBR2_HAS_UV2 } from \"../pbr-flag-bits.js\";\n\n// WebGPU shader stage constants\nconst STAGE_FRAGMENT = 0x2;\n\n/** Write the reflectance-extension material-UBO slice\n * (occlusionStrength, metallicF0Factor, specularWeight, metallicReflectanceColor).\n * Gated by the presence of the `occlusionStrength` field in the UBO spec,\n * which is added only when a metallic-reflectance or reflectance texture\n * is in use. */\nexport function writeReflectanceUBO(data: Float32Array, material: PbrMaterialProps, offsets: ReadonlyMap<string, number>): void {\n if (!offsets.has(\"occlusionStrength\")) {\n return;\n }\n const off = offsets.get(\"occlusionStrength\")! / 4;\n data[off] = material.occlusionStrength ?? 1.0;\n data[off + 1] = material.metallicF0Factor ?? 1.0;\n data[off + 2] = material.specularWeight ?? material.metallicF0Factor ?? 1.0;\n const mrc = material.metallicReflectanceColor;\n data[off + 4] = mrc ? mrc[0]! : 1.0;\n data[off + 5] = mrc ? mrc[1]! : 1.0;\n data[off + 6] = mrc ? mrc[2]! : 1.0;\n}\n\n/**\n * Create a metallic reflectance fragment.\n * @param hasMetallicReflectanceMap - Whether the material has a metallicReflectanceTexture.\n * @param hasReflectanceMap - Whether the material has a reflectanceTexture.\n * @param useAlphaOnlyMR - Whether to use only the alpha channel from the metallic reflectance map.\n */\nexport function createReflectanceFragment(\n hasMetallicReflectanceMap: boolean,\n hasReflectanceMap: boolean,\n useAlphaOnlyMR: boolean,\n hasOcclusionUv2: boolean = false\n): ShaderFragment {\n const bindings: BindingDecl[] = [];\n if (hasMetallicReflectanceMap) {\n bindings.push(\n { _name: \"metallicReflectanceMap\", _type: { _kind: \"texture\", _textureType: \"texture_2d<f32>\" }, _visibility: STAGE_FRAGMENT },\n { _name: \"metallicReflectanceMapSampler\", _type: { _kind: \"sampler\", _samplerType: \"sampler\" }, _visibility: STAGE_FRAGMENT }\n );\n }\n if (hasReflectanceMap) {\n bindings.push(\n { _name: \"reflectanceMap\", _type: { _kind: \"texture\", _textureType: \"texture_2d<f32>\" }, _visibility: STAGE_FRAGMENT },\n { _name: \"reflectanceMapSampler\", _type: { _kind: \"sampler\", _samplerType: \"sampler\" }, _visibility: STAGE_FRAGMENT }\n );\n }\n\n // Build F0 computation code\n let f0Code = `var mrFactors = vec4<f32>(material.metallicReflectanceColor, material.metallicF0Factor);\nvar specularWeight = material.specularWeight;`;\n if (hasReflectanceMap) {\n f0Code += `\n{ let rSample = textureSample(reflectanceMap, reflectanceMapSampler, input.uv);\n let rLinear = pow(rSample.rgb, vec3<f32>(2.2));\n mrFactors = vec4<f32>(mrFactors.rgb * rLinear, mrFactors.a); }`;\n }\n if (hasMetallicReflectanceMap) {\n if (!useAlphaOnlyMR) {\n f0Code += `\n{ let mrSample = textureSample(metallicReflectanceMap, metallicReflectanceMapSampler, input.uv);\n let mrLinear = pow(mrSample.rgb, vec3<f32>(2.2));\n mrFactors = vec4<f32>(mrFactors.rgb * mrLinear, mrFactors.a * mrSample.a);\n specularWeight *= mrSample.a; }`;\n } else {\n f0Code += `\n{ let mrSample = textureSample(metallicReflectanceMap, metallicReflectanceMapSampler, input.uv);\n mrFactors = vec4<f32>(mrFactors.rgb, mrFactors.a * mrSample.a);\n specularWeight *= mrSample.a; }`;\n }\n }\n f0Code += `\nlet dielectricF0 = material.reflectance * mrFactors.a;\nlet surfaceReflectivityColor = mrFactors.rgb;\nlet dielectricColorF0 = vec3<f32>(dielectricF0) * surfaceReflectivityColor;\nlet metallicColorF0 = baseColor;\nvar colorF0 = mix(dielectricColorF0, metallicColorF0, metallic);\nlet colorF90 = vec3<f32>(mix(specularWeight, 1.0, metallic));\nlet surfaceAlbedo = baseColor * (vec3<f32>(1.0) - vec3<f32>(dielectricF0) * surfaceReflectivityColor) * (1.0 - metallic);`;\n\n return {\n _id: \"reflectance\",\n\n _uboFields: [\n { _name: \"occlusionStrength\", _type: \"f32\" },\n { _name: \"metallicF0Factor\", _type: \"f32\" },\n { _name: \"specularWeight\", _type: \"f32\" },\n { _name: \"_mrPad1\", _type: \"f32\" },\n { _name: \"metallicReflectanceColor\", _type: \"vec3<f32>\" },\n { _name: \"_mrPad2\", _type: \"f32\" },\n ],\n\n _bindings: bindings,\n\n _fragmentSlots: {\n MF: f0Code,\n AT: hasOcclusionUv2\n ? `let occlusion = mix(1.0, textureSample(occlusionTexture, occlusionSampler_, input.uv2).r, material.occlusionStrength);`\n : `let occlusion = mix(1.0, orm.r, material.occlusionStrength);`,\n },\n };\n}\n\n/** Create the reflectance PBR extension (group 1, fragment phase). */\nexport const pbrExt: PbrExt = {\n id: \"reflectance\",\n phase: \"fragment\",\n detect(mat) {\n const m = mat as PbrMaterialProps;\n let f = 0;\n let f2 = 0;\n if (m.metallicReflectanceTexture) {\n f |= PBR_HAS_METALLIC_REFLECTANCE_MAP;\n }\n if (m.reflectanceTexture) {\n f |= PBR_HAS_REFLECTANCE_MAP;\n }\n if (f === 0) {\n const hasNonDefaultF0 = m.metallicF0Factor != null && Math.abs(m.metallicF0Factor - 1) > 1e-6;\n const mrc = m.metallicReflectanceColor;\n const hasNonDefaultColor = mrc != null && (mrc[0] !== 1 || mrc[1] !== 1 || mrc[2] !== 1);\n if (hasNonDefaultF0 || hasNonDefaultColor) {\n f2 |= PBR2_HAS_REFLECTANCE_FACTORS;\n }\n }\n if ((f !== 0 || f2 & PBR2_HAS_REFLECTANCE_FACTORS) && m.useOnlyMetallicFromMetallicReflectanceTexture) {\n f |= PBR_HAS_USE_ALPHA_ONLY_MR;\n }\n return { f, f2 };\n },\n frag(ctx) {\n const hasMR = (ctx._features & PBR_HAS_METALLIC_REFLECTANCE_MAP) !== 0;\n const hasR = (ctx._features & PBR_HAS_REFLECTANCE_MAP) !== 0;\n const hasFactors = (ctx._features2 & PBR2_HAS_REFLECTANCE_FACTORS) !== 0;\n if (!hasMR && !hasR && !hasFactors) {\n return null;\n }\n return createReflectanceFragment(hasMR, hasR, (ctx._features & PBR_HAS_USE_ALPHA_ONLY_MR) !== 0, (ctx._features2 & PBR2_HAS_UV2) !== 0);\n },\n writeUbo: writeReflectanceUBO as PbrExt[\"writeUbo\"],\n bind(ctx, entries, b) {\n if ((ctx._features & (PBR_HAS_METALLIC_REFLECTANCE_MAP | PBR_HAS_REFLECTANCE_MAP)) === 0) {\n return b;\n }\n const m = ctx._material as PbrMaterialProps;\n if (m.metallicReflectanceTexture) {\n entries.push({ binding: b++, resource: m.metallicReflectanceTexture.view });\n entries.push({ binding: b++, resource: m.metallicReflectanceTexture.sampler });\n }\n if (m.reflectanceTexture) {\n entries.push({ binding: b++, resource: m.reflectanceTexture.view });\n entries.push({ binding: b++, resource: m.reflectanceTexture.sampler });\n }\n return b;\n },\n textures(mat, t) {\n const m = mat as PbrMaterialProps;\n if (m.metallicReflectanceTexture) {\n t.push(m.metallicReflectanceTexture);\n }\n if (m.reflectanceTexture) {\n t.push(m.reflectanceTexture);\n }\n },\n};\n"],"names":[],"mappings":";AAgBA,MAAM,iBAAiB;AAOhB,SAAS,oBAAoB,MAAoB,UAA4B,SAA4C;AAC5H,MAAI,CAAC,QAAQ,IAAI,mBAAmB,GAAG;AACnC;AAAA,EACJ;AACA,QAAM,MAAM,QAAQ,IAAI,mBAAmB,IAAK;AAChD,OAAK,GAAG,IAAI,SAAS,qBAAqB;AAC1C,OAAK,MAAM,CAAC,IAAI,SAAS,oBAAoB;AAC7C,OAAK,MAAM,CAAC,IAAI,SAAS,kBAAkB,SAAS,oBAAoB;AACxE,QAAM,MAAM,SAAS;AACrB,OAAK,MAAM,CAAC,IAAI,MAAM,IAAI,CAAC,IAAK;AAChC,OAAK,MAAM,CAAC,IAAI,MAAM,IAAI,CAAC,IAAK;AAChC,OAAK,MAAM,CAAC,IAAI,MAAM,IAAI,CAAC,IAAK;AACpC;AAQO,SAAS,0BACZ,2BACA,mBACA,gBACA,kBAA2B,OACb;AACd,QAAM,WAA0B,CAAA;AAChC,MAAI,2BAA2B;AAC3B,aAAS;AAAA,MACL,EAAE,OAAO,0BAA0B,OAAO,EAAE,OAAO,WAAW,cAAc,kBAAA,GAAqB,aAAa,eAAA;AAAA,MAC9G,EAAE,OAAO,iCAAiC,OAAO,EAAE,OAAO,WAAW,cAAc,aAAa,aAAa,eAAA;AAAA,IAAe;AAAA,EAEpI;AACA,MAAI,mBAAmB;AACnB,aAAS;AAAA,MACL,EAAE,OAAO,kBAAkB,OAAO,EAAE,OAAO,WAAW,cAAc,kBAAA,GAAqB,aAAa,eAAA;AAAA,MACtG,EAAE,OAAO,yBAAyB,OAAO,EAAE,OAAO,WAAW,cAAc,aAAa,aAAa,eAAA;AAAA,IAAe;AAAA,EAE5H;AAGA,MAAI,SAAS;AAAA;AAEb,MAAI,mBAAmB;AACnB,cAAU;AAAA;AAAA;AAAA;AAAA,EAId;AACA,MAAI,2BAA2B;AAC3B,QAAI,CAAC,gBAAgB;AACjB,gBAAU;AAAA;AAAA;AAAA;AAAA;AAAA,IAKd,OAAO;AACH,gBAAU;AAAA;AAAA;AAAA;AAAA,IAId;AAAA,EACJ;AACA,YAAU;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AASV,SAAO;AAAA,IACH,KAAK;AAAA,IAEL,YAAY;AAAA,MACR,EAAE,OAAO,qBAAqB,OAAO,MAAA;AAAA,MACrC,EAAE,OAAO,oBAAoB,OAAO,MAAA;AAAA,MACpC,EAAE,OAAO,kBAAkB,OAAO,MAAA;AAAA,MAClC,EAAE,OAAO,WAAW,OAAO,MAAA;AAAA,MAC3B,EAAE,OAAO,4BAA4B,OAAO,YAAA;AAAA,MAC5C,EAAE,OAAO,WAAW,OAAO,MAAA;AAAA,IAAM;AAAA,IAGrC,WAAW;AAAA,IAEX,gBAAgB;AAAA,MACZ,IAAI;AAAA,MACJ,IAAI,kBACE,2HACA;AAAA,IAAA;AAAA,EACV;AAER;AAGO,MAAM,SAAiB;AAAA,EAC1B,IAAI;AAAA,EACJ,OAAO;AAAA,EACP,OAAO,KAAK;AACR,UAAM,IAAI;AACV,QAAI,IAAI;AACR,QAAI,KAAK;AACT,QAAI,EAAE,4BAA4B;AAC9B,WAAK;AAAA,IACT;AACA,QAAI,EAAE,oBAAoB;AACtB,WAAK;AAAA,IACT;AACA,QAAI,MAAM,GAAG;AACT,YAAM,kBAAkB,EAAE,oBAAoB,QAAQ,KAAK,IAAI,EAAE,mBAAmB,CAAC,IAAI;AACzF,YAAM,MAAM,EAAE;AACd,YAAM,qBAAqB,OAAO,SAAS,IAAI,CAAC,MAAM,KAAK,IAAI,CAAC,MAAM,KAAK,IAAI,CAAC,MAAM;AACtF,UAAI,mBAAmB,oBAAoB;AACvC,cAAM;AAAA,MACV;AAAA,IACJ;AACA,SAAK,MAAM,KAAK,KAAK,iCAAiC,EAAE,+CAA+C;AACnG,WAAK;AAAA,IACT;AACA,WAAO,EAAE,GAAG,GAAA;AAAA,EAChB;AAAA,EACA,KAAK,KAAK;AACN,UAAM,SAAS,IAAI,YAAY,sCAAsC;AACrE,UAAM,QAAQ,IAAI,YAAY,6BAA6B;AAC3D,UAAM,cAAc,IAAI,aAAa,kCAAkC;AACvE,QAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,YAAY;AAChC,aAAO;AAAA,IACX;AACA,WAAO,0BAA0B,OAAO,OAAO,IAAI,YAAY,+BAA+B,IAAI,IAAI,aAAa,kBAAkB,CAAC;AAAA,EAC1I;AAAA,EACA,UAAU;AAAA,EACV,KAAK,KAAK,SAAS,GAAG;AAClB,SAAK,IAAI,aAAa,mCAAmC,8BAA8B,GAAG;AACtF,aAAO;AAAA,IACX;AACA,UAAM,IAAI,IAAI;AACd,QAAI,EAAE,4BAA4B;AAC9B,cAAQ,KAAK,EAAE,SAAS,KAAK,UAAU,EAAE,2BAA2B,MAAM;AAC1E,cAAQ,KAAK,EAAE,SAAS,KAAK,UAAU,EAAE,2BAA2B,SAAS;AAAA,IACjF;AACA,QAAI,EAAE,oBAAoB;AACtB,cAAQ,KAAK,EAAE,SAAS,KAAK,UAAU,EAAE,mBAAmB,MAAM;AAClE,cAAQ,KAAK,EAAE,SAAS,KAAK,UAAU,EAAE,mBAAmB,SAAS;AAAA,IACzE;AACA,WAAO;AAAA,EACX;AAAA,EACA,SAAS,KAAK,GAAG;AACb,UAAM,IAAI;AACV,QAAI,EAAE,4BAA4B;AAC9B,QAAE,KAAK,EAAE,0BAA0B;AAAA,IACvC;AACA,QAAI,EAAE,oBAAoB;AACtB,QAAE,KAAK,EAAE,kBAAkB;AAAA,IAC/B;AAAA,EACJ;AACJ;"}
@@ -1,4 +1,4 @@
1
- import { T as TU } from "./index-C-tEgwbZ.js";
1
+ import { T as TU } from "./index-BgY3QEzL.js";
2
2
  const WGSL = `override f:bool=false;@group(0)@binding(0)var t:texture_2d<f32>;@group(0)@binding(1)var o:texture_storage_2d<rgba16float,write>;@compute @workgroup_size(8,8)fn main(@builtin(global_invocation_id)g:vec3u){let d=textureDimensions(t);if(any(g.xy>=d)){return;}let c=textureLoad(t,vec2u(g.x,select(g.y,d.y-1u-g.y,f)),0);textureStore(o,g.xy,vec4f(pow(c.rgb,vec3f(2.2))/max(c.a,1.0/255.0),1));}`;
3
3
  let _device = null;
4
4
  let _module = null;
@@ -108,4 +108,4 @@ export {
108
108
  decodeBrdfPng,
109
109
  uploadCubemapRGBD
110
110
  };
111
- //# sourceMappingURL=rgbd-decode-DkiiiIlt.js.map
111
+ //# sourceMappingURL=rgbd-decode-duTlXMWd.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"rgbd-decode-DkiiiIlt.js","sources":["../src/loader-env/rgbd-decode.ts"],"sourcesContent":["/** RGBD decoder — decodes Babylon BRDF PNG and .env cubemap faces into rgba16float. */\n\nimport { TU } from \"../engine/gpu-flags.js\";\nimport type { EngineContext } from \"../engine/engine.js\";\n\nconst WGSL = `override f:bool=false;@group(0)@binding(0)var t:texture_2d<f32>;@group(0)@binding(1)var o:texture_storage_2d<rgba16float,write>;@compute @workgroup_size(8,8)fn main(@builtin(global_invocation_id)g:vec3u){let d=textureDimensions(t);if(any(g.xy>=d)){return;}let c=textureLoad(t,vec2u(g.x,select(g.y,d.y-1u-g.y,f)),0);textureStore(o,g.xy,vec4f(pow(c.rgb,vec3f(2.2))/max(c.a,1.0/255.0),1));}`;\n\nlet _device: GPUDevice | null = null;\nlet _module: GPUShaderModule | null = null;\nlet _noFlip: GPUComputePipeline | null = null;\nlet _flip: GPUComputePipeline | null = null;\n\nfunction getPipeline(device: GPUDevice, flipY: boolean): GPUComputePipeline {\n if (device !== _device) {\n _device = device;\n _module = device.createShaderModule({ code: WGSL });\n _noFlip = null;\n _flip = null;\n }\n const slot = flipY ? _flip : _noFlip;\n if (slot) {\n return slot;\n }\n const p = device.createComputePipeline({\n layout: \"auto\",\n compute: { module: _module!, entryPoint: \"main\", constants: { f: flipY ? 1 : 0 } },\n });\n if (flipY) {\n _flip = p;\n } else {\n _noFlip = p;\n }\n return p;\n}\n\nfunction makeBindGroup(device: GPUDevice, pipeline: GPUComputePipeline, inView: GPUTextureView, outView: GPUTextureView): GPUBindGroup {\n return device.createBindGroup({\n layout: pipeline.getBindGroupLayout(0),\n entries: [\n { binding: 0, resource: inView },\n { binding: 1, resource: outView },\n ],\n });\n}\n\nfunction encodeDispatch(encoder: GPUCommandEncoder, pipeline: GPUComputePipeline, bg: GPUBindGroup, w: number, h: number): void {\n const pass = encoder.beginComputePass();\n pass.setPipeline(pipeline);\n pass.setBindGroup(0, bg);\n pass.dispatchWorkgroups(Math.ceil(w / 8), Math.ceil(h / 8));\n pass.end();\n}\n\n/** Decode a single RGBD PNG (e.g. BRDF LUT) `->` rgba16float 2D texture. No Y-flip. */\nexport function decodeBrdfPng(engine: EngineContext, image: ImageBitmap): GPUTexture {\n const device = engine._device;\n const pipeline = getPipeline(device, false);\n const w = image.width;\n const h = image.height;\n const inputTex = device.createTexture({\n size: { width: w, height: h },\n format: \"rgba8unorm\",\n usage: TU.TEXTURE_BINDING | TU.COPY_DST | TU.RENDER_ATTACHMENT,\n });\n device.queue.copyExternalImageToTexture({ source: image, flipY: false }, { texture: inputTex, premultipliedAlpha: false }, { width: w, height: h });\n const texture = device.createTexture({\n size: { width: w, height: h },\n format: \"rgba16float\",\n usage: TU.TEXTURE_BINDING | TU.STORAGE_BINDING,\n });\n const bg = makeBindGroup(device, pipeline, inputTex.createView(), texture.createView());\n const enc = device.createCommandEncoder();\n encodeDispatch(enc, pipeline, bg, w, h);\n device.queue.submit([enc.finish()]);\n inputTex.destroy();\n return texture;\n}\n\n/** Decode and upload a RGBD cubemap (6 faces × N mips) → rgba16float cube texture.\n * Y-flipped on read (BJS uploads cubemap faces with invertY=true). */\nexport function uploadCubemapRGBD(engine: EngineContext, images: ImageBitmap[], width: number, mipCount: number): GPUTexture {\n const device = engine._device;\n const pipeline = getPipeline(device, true);\n\n const texture = device.createTexture({\n size: { width, height: width, depthOrArrayLayers: 6 },\n format: \"rgba16float\",\n mipLevelCount: mipCount,\n usage: TU.TEXTURE_BINDING | TU.COPY_DST | TU.COPY_SRC | TU.RENDER_ATTACHMENT,\n dimension: \"2d\",\n });\n\n for (let mip = 0; mip < mipCount; mip++) {\n const mipSize = Math.max(1, width >> mip);\n\n const inputTex = device.createTexture({\n size: { width: mipSize, height: mipSize },\n format: \"rgba8unorm\",\n usage: TU.TEXTURE_BINDING | TU.COPY_DST | TU.RENDER_ATTACHMENT,\n });\n\n const outputTex = device.createTexture({\n size: { width: mipSize, height: mipSize },\n format: \"rgba16float\",\n usage: TU.STORAGE_BINDING | TU.COPY_SRC,\n });\n\n const bindGroup = makeBindGroup(device, pipeline, inputTex.createView(), outputTex.createView());\n\n for (let face = 0; face < 6; face++) {\n const idx = mip * 6 + face;\n if (idx >= images.length) {\n break;\n }\n\n device.queue.copyExternalImageToTexture({ source: images[idx]!, flipY: false }, { texture: inputTex, premultipliedAlpha: false }, { width: mipSize, height: mipSize });\n\n const encoder = device.createCommandEncoder();\n encodeDispatch(encoder, pipeline, bindGroup, mipSize, mipSize);\n encoder.copyTextureToTexture({ texture: outputTex }, { texture, origin: { x: 0, y: 0, z: face }, mipLevel: mip }, { width: mipSize, height: mipSize });\n\n // One submit per face ensures sequential hazards on the reused input/output.\n device.queue.submit([encoder.finish()]);\n }\n\n inputTex.destroy();\n outputTex.destroy();\n }\n\n return texture;\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"rgbd-decode-duTlXMWd.js","sources":["../src/loader-env/rgbd-decode.ts"],"sourcesContent":["/** RGBD decoder — decodes Babylon BRDF PNG and .env cubemap faces into rgba16float. */\n\nimport { TU } from \"../engine/gpu-flags.js\";\nimport type { EngineContext } from \"../engine/engine.js\";\n\nconst WGSL = `override f:bool=false;@group(0)@binding(0)var t:texture_2d<f32>;@group(0)@binding(1)var o:texture_storage_2d<rgba16float,write>;@compute @workgroup_size(8,8)fn main(@builtin(global_invocation_id)g:vec3u){let d=textureDimensions(t);if(any(g.xy>=d)){return;}let c=textureLoad(t,vec2u(g.x,select(g.y,d.y-1u-g.y,f)),0);textureStore(o,g.xy,vec4f(pow(c.rgb,vec3f(2.2))/max(c.a,1.0/255.0),1));}`;\n\nlet _device: GPUDevice | null = null;\nlet _module: GPUShaderModule | null = null;\nlet _noFlip: GPUComputePipeline | null = null;\nlet _flip: GPUComputePipeline | null = null;\n\nfunction getPipeline(device: GPUDevice, flipY: boolean): GPUComputePipeline {\n if (device !== _device) {\n _device = device;\n _module = device.createShaderModule({ code: WGSL });\n _noFlip = null;\n _flip = null;\n }\n const slot = flipY ? _flip : _noFlip;\n if (slot) {\n return slot;\n }\n const p = device.createComputePipeline({\n layout: \"auto\",\n compute: { module: _module!, entryPoint: \"main\", constants: { f: flipY ? 1 : 0 } },\n });\n if (flipY) {\n _flip = p;\n } else {\n _noFlip = p;\n }\n return p;\n}\n\nfunction makeBindGroup(device: GPUDevice, pipeline: GPUComputePipeline, inView: GPUTextureView, outView: GPUTextureView): GPUBindGroup {\n return device.createBindGroup({\n layout: pipeline.getBindGroupLayout(0),\n entries: [\n { binding: 0, resource: inView },\n { binding: 1, resource: outView },\n ],\n });\n}\n\nfunction encodeDispatch(encoder: GPUCommandEncoder, pipeline: GPUComputePipeline, bg: GPUBindGroup, w: number, h: number): void {\n const pass = encoder.beginComputePass();\n pass.setPipeline(pipeline);\n pass.setBindGroup(0, bg);\n pass.dispatchWorkgroups(Math.ceil(w / 8), Math.ceil(h / 8));\n pass.end();\n}\n\n/** Decode a single RGBD PNG (e.g. BRDF LUT) `->` rgba16float 2D texture. No Y-flip. */\nexport function decodeBrdfPng(engine: EngineContext, image: ImageBitmap): GPUTexture {\n const device = engine._device;\n const pipeline = getPipeline(device, false);\n const w = image.width;\n const h = image.height;\n const inputTex = device.createTexture({\n size: { width: w, height: h },\n format: \"rgba8unorm\",\n usage: TU.TEXTURE_BINDING | TU.COPY_DST | TU.RENDER_ATTACHMENT,\n });\n device.queue.copyExternalImageToTexture({ source: image, flipY: false }, { texture: inputTex, premultipliedAlpha: false }, { width: w, height: h });\n const texture = device.createTexture({\n size: { width: w, height: h },\n format: \"rgba16float\",\n usage: TU.TEXTURE_BINDING | TU.STORAGE_BINDING,\n });\n const bg = makeBindGroup(device, pipeline, inputTex.createView(), texture.createView());\n const enc = device.createCommandEncoder();\n encodeDispatch(enc, pipeline, bg, w, h);\n device.queue.submit([enc.finish()]);\n inputTex.destroy();\n return texture;\n}\n\n/** Decode and upload a RGBD cubemap (6 faces × N mips) → rgba16float cube texture.\n * Y-flipped on read (BJS uploads cubemap faces with invertY=true). */\nexport function uploadCubemapRGBD(engine: EngineContext, images: ImageBitmap[], width: number, mipCount: number): GPUTexture {\n const device = engine._device;\n const pipeline = getPipeline(device, true);\n\n const texture = device.createTexture({\n size: { width, height: width, depthOrArrayLayers: 6 },\n format: \"rgba16float\",\n mipLevelCount: mipCount,\n usage: TU.TEXTURE_BINDING | TU.COPY_DST | TU.COPY_SRC | TU.RENDER_ATTACHMENT,\n dimension: \"2d\",\n });\n\n for (let mip = 0; mip < mipCount; mip++) {\n const mipSize = Math.max(1, width >> mip);\n\n const inputTex = device.createTexture({\n size: { width: mipSize, height: mipSize },\n format: \"rgba8unorm\",\n usage: TU.TEXTURE_BINDING | TU.COPY_DST | TU.RENDER_ATTACHMENT,\n });\n\n const outputTex = device.createTexture({\n size: { width: mipSize, height: mipSize },\n format: \"rgba16float\",\n usage: TU.STORAGE_BINDING | TU.COPY_SRC,\n });\n\n const bindGroup = makeBindGroup(device, pipeline, inputTex.createView(), outputTex.createView());\n\n for (let face = 0; face < 6; face++) {\n const idx = mip * 6 + face;\n if (idx >= images.length) {\n break;\n }\n\n device.queue.copyExternalImageToTexture({ source: images[idx]!, flipY: false }, { texture: inputTex, premultipliedAlpha: false }, { width: mipSize, height: mipSize });\n\n const encoder = device.createCommandEncoder();\n encodeDispatch(encoder, pipeline, bindGroup, mipSize, mipSize);\n encoder.copyTextureToTexture({ texture: outputTex }, { texture, origin: { x: 0, y: 0, z: face }, mipLevel: mip }, { width: mipSize, height: mipSize });\n\n // One submit per face ensures sequential hazards on the reused input/output.\n device.queue.submit([encoder.finish()]);\n }\n\n inputTex.destroy();\n outputTex.destroy();\n }\n\n return texture;\n}\n"],"names":[],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- import { B as BU, T as TU } from "./index-C-tEgwbZ.js";
1
+ import { B as BU, T as TU } from "./index-BgY3QEzL.js";
2
2
  function alignBytesPerRow(width) {
3
3
  return Math.ceil(width * 4 / 256) * 256;
4
4
  }
@@ -89,4 +89,4 @@ export {
89
89
  createCapturePreFrame,
90
90
  createCaptureService
91
91
  };
92
- //# sourceMappingURL=screenshot-readback-avr_tYGZ.js.map
92
+ //# sourceMappingURL=screenshot-readback-DnxR4rhp.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"screenshot-readback-avr_tYGZ.js","sources":["../src/engine/screenshot-readback.ts"],"sourcesContent":["import type { SurfaceContext } from \"./surface.js\";\nimport type { Screenshot } from \"./screenshot.js\";\nimport { BU, TU } from \"./gpu-flags.js\";\n\n/** @internal Per-frame readback hook driven by `renderFrame` once `captureScreenshot` has\n * lazily loaded this module and installed it on `surface._captureService`. Records the\n * surface's swapchain copy for any queued capture requests into the frame's encoder. */\nexport type CaptureService = (surface: SurfaceContext, encoder: GPUCommandEncoder) => void;\n\n/** @internal Pre-acquire hook driven by `renderFrame` (installed alongside `_captureService`).\n * Called before a surface's frame swapchain texture is acquired; reconfigures that surface's\n * swapchain with COPY_SRC the first time a capture is queued. */\nexport type CapturePreFrame = (surface: SurfaceContext) => void;\n\n/** A single readback in flight: the buffer the frame's copy lands in, plus the dimensions /\n * padding needed to unpack it, and the requests waiting on this frame. */\ninterface PendingReadback {\n buffer: GPUBuffer;\n width: number;\n height: number;\n bytesPerRow: number;\n bgra: boolean;\n reqs: ReadonlyArray<{ resolve: (s: Screenshot) => void; reject: (e: unknown) => void }>;\n}\n\n/** copyTextureToBuffer requires the per-row stride to be a multiple of 256 bytes. */\nfunction alignBytesPerRow(width: number): number {\n return Math.ceil((width * 4) / 256) * 256;\n}\n\n/** Pre-acquire hook. Called by `renderFrame` for each surface BEFORE `_refreshScRT` acquires\n * that surface's frame swapchain texture. On the first queued capture it reconfigures the\n * surface's swapchain with COPY_SRC so the just-acquired texture is copyable. Reconfiguring\n * here (not after the scene has recorded) is mandatory: `configure()` expires the current\n * canvas texture, so doing it mid-frame would invalidate the recorded texture and fail the\n * submit. */\nfunction preFrame(surface: SurfaceContext): void {\n const queue = surface._captureQueue;\n if (!queue || queue.length === 0 || surface._swapchainCopySrc) {\n return;\n }\n surface._swapchainCopySrc = true;\n surface._context.configure({ device: surface.engine._device, format: surface.format, alphaMode: surface._alphaMode, usage: TU.RENDER_ATTACHMENT | TU.COPY_SRC });\n}\n\n/** The readback hook. Called once per surface per frame after the contexts have recorded (so the\n * surface's swapchain texture holds this frame) and before the encoder is finished.\n *\n * By the time this runs the swapchain is already COPY_SRC-capable: `preFrame` reconfigured it\n * before the frame's texture was acquired, so the copy can be recorded straight into this\n * frame's encoder. */\nfunction service(surface: SurfaceContext, encoder: GPUCommandEncoder): void {\n const queue = surface._captureQueue;\n if (!queue || queue.length === 0) {\n return;\n }\n // The swapchain only becomes copyable once `preFrame` has reconfigured it and `renderFrame`\n // has acquired a COPY_SRC texture; until then there is nothing copyable, so wait for the next\n // frame (the request stays queued).\n if (!surface._swapchainCopySrc) {\n return;\n }\n\n surface._captureQueue = undefined;\n\n const tex = surface.scRT._colorTexture;\n if (!tex) {\n const err = new Error(\"captureScreenshot: no swapchain texture available\");\n for (const r of queue) {\n r.reject(err);\n }\n return;\n }\n\n const width = surface.scRT._width;\n const height = surface.scRT._height;\n const bytesPerRow = alignBytesPerRow(width);\n const buffer = surface.engine._device.createBuffer({\n label: \"screenshot-readback\",\n size: bytesPerRow * height,\n usage: BU.COPY_DST | BU.MAP_READ,\n });\n encoder.copyTextureToBuffer({ texture: tex }, { buffer, bytesPerRow, rowsPerImage: height }, { width, height, depthOrArrayLayers: 1 });\n void finish({ buffer, width, height, bytesPerRow, bgra: surface.format.startsWith(\"bgra\"), reqs: queue });\n}\n\n/** Maps the staging buffer after submit, unpacks it into tightly-packed opaque RGBA8, and\n * resolves the waiting requests. Fire-and-forget: the map is async and resolves later. */\nasync function finish(pend: PendingReadback): Promise<void> {\n const { buffer, width, height, bytesPerRow, bgra, reqs } = pend;\n try {\n // Yield one microtask so `renderFrame` submits this frame's encoder (which holds the copy)\n // BEFORE we map the buffer: mapAsync moves the buffer to a pending-map state synchronously,\n // and a buffer pending map cannot be used by a command buffer in a submit — calling it before\n // the submit would invalidate the whole frame and read back an empty (all-black) buffer.\n await Promise.resolve();\n await buffer.mapAsync(GPUMapMode.READ);\n const src = new Uint8Array(buffer.getMappedRange());\n const out = new Uint8ClampedArray(width * height * 4);\n for (let y = 0; y < height; y++) {\n const srcRow = y * bytesPerRow;\n const dstRow = y * width * 4;\n for (let x = 0; x < width; x++) {\n const s = srcRow + x * 4;\n const d = dstRow + x * 4;\n if (bgra) {\n out[d] = src[s + 2]!;\n out[d + 1] = src[s + 1]!;\n out[d + 2] = src[s]!;\n } else {\n out[d] = src[s]!;\n out[d + 1] = src[s + 1]!;\n out[d + 2] = src[s + 2]!;\n }\n out[d + 3] = 255;\n }\n }\n buffer.unmap();\n buffer.destroy();\n const shot: Screenshot = { width, height, data: out };\n for (const r of reqs) {\n r.resolve(shot);\n }\n } catch (e) {\n try {\n buffer.destroy();\n } catch {\n /* already destroyed */\n }\n for (const r of reqs) {\n r.reject(e);\n }\n }\n}\n\n/** @internal Factory invoked by `captureScreenshot` after this module is dynamically imported.\n * Returns the per-frame readback hook installed on `surface._captureService`. */\nexport function createCaptureService(): CaptureService {\n return service;\n}\n\n/** @internal Factory invoked by `captureScreenshot` after this module is dynamically imported.\n * Returns the pre-acquire hook installed on `engine._capturePreFrame`. */\nexport function createCapturePreFrame(): CapturePreFrame {\n return preFrame;\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"screenshot-readback-DnxR4rhp.js","sources":["../src/engine/screenshot-readback.ts"],"sourcesContent":["import type { SurfaceContext } from \"./surface.js\";\nimport type { Screenshot } from \"./screenshot.js\";\nimport { BU, TU } from \"./gpu-flags.js\";\n\n/** @internal Per-frame readback hook driven by `renderFrame` once `captureScreenshot` has\n * lazily loaded this module and installed it on `surface._captureService`. Records the\n * surface's swapchain copy for any queued capture requests into the frame's encoder. */\nexport type CaptureService = (surface: SurfaceContext, encoder: GPUCommandEncoder) => void;\n\n/** @internal Pre-acquire hook driven by `renderFrame` (installed alongside `_captureService`).\n * Called before a surface's frame swapchain texture is acquired; reconfigures that surface's\n * swapchain with COPY_SRC the first time a capture is queued. */\nexport type CapturePreFrame = (surface: SurfaceContext) => void;\n\n/** A single readback in flight: the buffer the frame's copy lands in, plus the dimensions /\n * padding needed to unpack it, and the requests waiting on this frame. */\ninterface PendingReadback {\n buffer: GPUBuffer;\n width: number;\n height: number;\n bytesPerRow: number;\n bgra: boolean;\n reqs: ReadonlyArray<{ resolve: (s: Screenshot) => void; reject: (e: unknown) => void }>;\n}\n\n/** copyTextureToBuffer requires the per-row stride to be a multiple of 256 bytes. */\nfunction alignBytesPerRow(width: number): number {\n return Math.ceil((width * 4) / 256) * 256;\n}\n\n/** Pre-acquire hook. Called by `renderFrame` for each surface BEFORE `_refreshScRT` acquires\n * that surface's frame swapchain texture. On the first queued capture it reconfigures the\n * surface's swapchain with COPY_SRC so the just-acquired texture is copyable. Reconfiguring\n * here (not after the scene has recorded) is mandatory: `configure()` expires the current\n * canvas texture, so doing it mid-frame would invalidate the recorded texture and fail the\n * submit. */\nfunction preFrame(surface: SurfaceContext): void {\n const queue = surface._captureQueue;\n if (!queue || queue.length === 0 || surface._swapchainCopySrc) {\n return;\n }\n surface._swapchainCopySrc = true;\n surface._context.configure({ device: surface.engine._device, format: surface.format, alphaMode: surface._alphaMode, usage: TU.RENDER_ATTACHMENT | TU.COPY_SRC });\n}\n\n/** The readback hook. Called once per surface per frame after the contexts have recorded (so the\n * surface's swapchain texture holds this frame) and before the encoder is finished.\n *\n * By the time this runs the swapchain is already COPY_SRC-capable: `preFrame` reconfigured it\n * before the frame's texture was acquired, so the copy can be recorded straight into this\n * frame's encoder. */\nfunction service(surface: SurfaceContext, encoder: GPUCommandEncoder): void {\n const queue = surface._captureQueue;\n if (!queue || queue.length === 0) {\n return;\n }\n // The swapchain only becomes copyable once `preFrame` has reconfigured it and `renderFrame`\n // has acquired a COPY_SRC texture; until then there is nothing copyable, so wait for the next\n // frame (the request stays queued).\n if (!surface._swapchainCopySrc) {\n return;\n }\n\n surface._captureQueue = undefined;\n\n const tex = surface.scRT._colorTexture;\n if (!tex) {\n const err = new Error(\"captureScreenshot: no swapchain texture available\");\n for (const r of queue) {\n r.reject(err);\n }\n return;\n }\n\n const width = surface.scRT._width;\n const height = surface.scRT._height;\n const bytesPerRow = alignBytesPerRow(width);\n const buffer = surface.engine._device.createBuffer({\n label: \"screenshot-readback\",\n size: bytesPerRow * height,\n usage: BU.COPY_DST | BU.MAP_READ,\n });\n encoder.copyTextureToBuffer({ texture: tex }, { buffer, bytesPerRow, rowsPerImage: height }, { width, height, depthOrArrayLayers: 1 });\n void finish({ buffer, width, height, bytesPerRow, bgra: surface.format.startsWith(\"bgra\"), reqs: queue });\n}\n\n/** Maps the staging buffer after submit, unpacks it into tightly-packed opaque RGBA8, and\n * resolves the waiting requests. Fire-and-forget: the map is async and resolves later. */\nasync function finish(pend: PendingReadback): Promise<void> {\n const { buffer, width, height, bytesPerRow, bgra, reqs } = pend;\n try {\n // Yield one microtask so `renderFrame` submits this frame's encoder (which holds the copy)\n // BEFORE we map the buffer: mapAsync moves the buffer to a pending-map state synchronously,\n // and a buffer pending map cannot be used by a command buffer in a submit — calling it before\n // the submit would invalidate the whole frame and read back an empty (all-black) buffer.\n await Promise.resolve();\n await buffer.mapAsync(GPUMapMode.READ);\n const src = new Uint8Array(buffer.getMappedRange());\n const out = new Uint8ClampedArray(width * height * 4);\n for (let y = 0; y < height; y++) {\n const srcRow = y * bytesPerRow;\n const dstRow = y * width * 4;\n for (let x = 0; x < width; x++) {\n const s = srcRow + x * 4;\n const d = dstRow + x * 4;\n if (bgra) {\n out[d] = src[s + 2]!;\n out[d + 1] = src[s + 1]!;\n out[d + 2] = src[s]!;\n } else {\n out[d] = src[s]!;\n out[d + 1] = src[s + 1]!;\n out[d + 2] = src[s + 2]!;\n }\n out[d + 3] = 255;\n }\n }\n buffer.unmap();\n buffer.destroy();\n const shot: Screenshot = { width, height, data: out };\n for (const r of reqs) {\n r.resolve(shot);\n }\n } catch (e) {\n try {\n buffer.destroy();\n } catch {\n /* already destroyed */\n }\n for (const r of reqs) {\n r.reject(e);\n }\n }\n}\n\n/** @internal Factory invoked by `captureScreenshot` after this module is dynamically imported.\n * Returns the per-frame readback hook installed on `surface._captureService`. */\nexport function createCaptureService(): CaptureService {\n return service;\n}\n\n/** @internal Factory invoked by `captureScreenshot` after this module is dynamically imported.\n * Returns the pre-acquire hook installed on `engine._capturePreFrame`. */\nexport function createCapturePreFrame(): CapturePreFrame {\n return preFrame;\n}\n"],"names":[],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- import { o as computeUboLayout, q as SCENE_UBO_WGSL } from "./index-C-tEgwbZ.js";
1
+ import { o as computeUboLayout, q as SCENE_UBO_WGSL } from "./index-BgY3QEzL.js";
2
2
  const STAGE_VERTEX = 1;
3
3
  const STAGE_FRAGMENT = 2;
4
4
  function topoSort(fragments) {
@@ -290,4 +290,4 @@ ${varyBody}
290
290
  export {
291
291
  composeShader as c
292
292
  };
293
- //# sourceMappingURL=shader-composer-CZagsJDS.js.map
293
+ //# sourceMappingURL=shader-composer-CBy2i8nU.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"shader-composer-CZagsJDS.js","sources":["../src/shader/shader-composer.ts"],"sourcesContent":["/**\n * Shader Composer — assembles ShaderFragment[] + ShaderTemplate into\n * final WGSL source + GPU layout descriptors. Pure function, no global state.\n * All shader text comes from template + fragment modules.\n */\nimport type { BindingDecl, ComposedShader, FragmentSlot, ShaderFragment, ShaderTemplate, VertexAttribute, VertexSlot, Varying } from \"./fragment-types.js\";\nimport { computeUboLayout } from \"./ubo-layout.js\";\nimport { SCENE_UBO_WGSL } from \"./scene-uniforms.js\";\n\nconst STAGE_VERTEX = 0x1;\nconst STAGE_FRAGMENT = 0x2;\n\nfunction topoSort(fragments: readonly ShaderFragment[]): ShaderFragment[] {\n const byId = new Map<string, ShaderFragment>();\n for (const f of fragments) {\n if (byId.has(f._id)) {\n throw Error();\n }\n byId.set(f._id, f);\n }\n const inDeg = new Map<string, number>();\n const deps = new Map<string, string[]>();\n for (const f of fragments) {\n if (!inDeg.has(f._id)) {\n inDeg.set(f._id, 0);\n }\n for (const d of f._dependencies ?? []) {\n if (!byId.has(d)) {\n throw Error();\n }\n inDeg.set(f._id, (inDeg.get(f._id) ?? 0) + 1);\n let arr = deps.get(d);\n if (!arr) {\n arr = [];\n deps.set(d, arr);\n }\n arr.push(f._id);\n }\n }\n const q: string[] = [];\n for (const [id, d] of inDeg) {\n if (d === 0) {\n q.push(id);\n }\n }\n q.sort();\n const out: ShaderFragment[] = [];\n let qi = 0;\n while (qi < q.length) {\n const id = q[qi++]!;\n out.push(byId.get(id)!);\n for (const d of deps.get(id) ?? []) {\n const nd = (inDeg.get(d) ?? 1) - 1;\n inDeg.set(d, nd);\n if (nd === 0) {\n let i = qi;\n while (i < q.length && q[i]! < d) {\n i++;\n }\n q.splice(i, 0, d);\n }\n }\n }\n if (out.length !== fragments.length) {\n throw Error();\n }\n return out;\n}\n\nfunction dedup<T extends { _name: string }>(base: readonly T[], extra: readonly T[]): T[] {\n const seen = new Set<string>();\n const all: T[] = [];\n for (const v of base) {\n if (!seen.has(v._name)) {\n seen.add(v._name);\n all.push(v);\n }\n }\n for (const v of extra) {\n if (!seen.has(v._name)) {\n seen.add(v._name);\n all.push(v);\n }\n }\n return all;\n}\n\nfunction bglEntry(binding: number, decl: BindingDecl): GPUBindGroupLayoutEntry {\n const e: GPUBindGroupLayoutEntry = { binding, visibility: decl._visibility };\n switch (decl._type._kind) {\n case \"uniform-buffer\":\n e.buffer = { type: \"uniform\" };\n break;\n case \"texture\": {\n const def = decl._type._textureType === \"texture_depth_2d\" ? \"depth\" : decl._type._textureType === \"texture_2d<u32>\" ? \"uint\" : \"float\";\n e.texture = {\n sampleType: (decl._type._sampleType ?? def) as GPUTextureSampleType,\n viewDimension: decl._type._textureType.includes(\"array\") ? \"2d-array\" : decl._type._textureType.includes(\"cube\") ? \"cube\" : \"2d\",\n };\n break;\n }\n case \"sampler\":\n e.sampler = {\n type: decl._type._samplerType === \"sampler_comparison\" ? \"comparison\" : decl._type._samplerType === \"sampler_non_filtering\" ? \"non-filtering\" : \"filtering\",\n };\n break;\n case \"storage-texture\":\n e.storageTexture = { access: decl._type._access as GPUStorageTextureAccess, format: decl._type._format as GPUTextureFormat };\n break;\n }\n return e;\n}\n\nfunction declWGSL(g: number, b: number, d: BindingDecl): string {\n switch (d._type._kind) {\n case \"uniform-buffer\":\n return `@group(${g})@binding(${b}) var<uniform> ${d._name}:${d._name}Uniforms;`;\n case \"texture\":\n return `@group(${g})@binding(${b}) var ${d._name}:${d._type._textureType};`;\n case \"sampler\":\n return `@group(${g})@binding(${b}) var ${d._name}:${d._type._samplerType === \"sampler_non_filtering\" ? \"sampler\" : d._type._samplerType};`;\n case \"storage-texture\":\n return `@group(${g})@binding(${b}) var ${d._name}:texture_storage_2d<${d._type._format},${d._type._access}>;`;\n }\n}\n\nconst SLOT_RE = /\\/\\*([A-Z_0-9]+)\\*\\//g;\nfunction injectSlots(tpl: string, sorted: readonly ShaderFragment[], key: \"_fragmentSlots\" | \"_vertexSlots\"): string {\n return tpl.replace(SLOT_RE, (_, slot: string) => {\n const parts: string[] = [];\n for (const f of sorted) {\n const s = f[key] as Partial<Record<FragmentSlot | VertexSlot, string>> | undefined;\n if (s?.[slot as FragmentSlot | VertexSlot]) {\n parts.push(s[slot as FragmentSlot | VertexSlot]!);\n }\n }\n return parts.join(\"\\n\");\n });\n}\n\nexport function composeShader(template: ShaderTemplate, fragments: readonly ShaderFragment[]): ComposedShader {\n const sorted = topoSort(fragments);\n\n // Collect fragment data\n const fragAttrs: VertexAttribute[] = [];\n const fragVaryings: Varying[] = [];\n const helpers: string[] = [];\n const vHelpers: string[] = [];\n const vBuiltins: string[] = [];\n for (const f of sorted) {\n if (f._vertexAttributes) {\n fragAttrs.push(...f._vertexAttributes);\n }\n if (f._varyings) {\n fragVaryings.push(...f._varyings);\n }\n if (f._helperFunctions) {\n helpers.push(f._helperFunctions);\n }\n if (f._vertexHelperFunctions) {\n vHelpers.push(f._vertexHelperFunctions);\n }\n for (const b of f._vertexBuiltins ?? []) {\n vBuiltins.push(`@builtin(${b._builtin}) ${b._name}:${b._type},`);\n }\n }\n\n // Vertex attributes + layouts\n const allAttrs = dedup(template._baseVertexAttributes, fragAttrs);\n const inputLines: string[] = [];\n const _vertexBufferLayouts: GPUVertexBufferLayout[] = [];\n const groups = new Map<string, { loc: number; off: number; fmt: GPUVertexFormat }[]>();\n const firstOfGroup = new Map<string, VertexAttribute>();\n for (let i = 0; i < allAttrs.length; i++) {\n const a = allAttrs[i]!;\n inputLines.push(`@location(${i}) ${a._name}:${a._type},`);\n if (a._bufferGroup) {\n if (!groups.has(a._bufferGroup)) {\n groups.set(a._bufferGroup, []);\n firstOfGroup.set(a._bufferGroup, a);\n }\n groups.get(a._bufferGroup)!.push({ loc: i, off: a._offset ?? 0, fmt: a._gpuFormat });\n } else {\n _vertexBufferLayouts.push({\n arrayStride: a._arrayStride,\n stepMode: a._stepMode ?? \"vertex\",\n attributes: [{ shaderLocation: i, offset: a._offset ?? 0, format: a._gpuFormat }],\n });\n }\n }\n for (const [grp, attrs] of groups) {\n const f = firstOfGroup.get(grp)!;\n _vertexBufferLayouts.push({\n arrayStride: f._arrayStride,\n stepMode: f._stepMode ?? \"vertex\",\n attributes: attrs.map((a) => ({ shaderLocation: a.loc, offset: a.off, format: a.fmt })),\n });\n }\n let nextLoc = allAttrs.length;\n for (const f of sorted) {\n if (f._pipelineVertexBuffers) {\n const r = f._pipelineVertexBuffers(nextLoc);\n _vertexBufferLayouts.push(...r._buffers);\n nextLoc = r._nextLoc;\n }\n }\n\n // Varyings\n const allVary = dedup(template._baseVaryings, fragVaryings);\n const varyBody = `@builtin(position) clipPos:vec4f,\\n` + allVary.map((v, i) => `@location(${i}) ${v._name}:${v._type},`).join(\"\\n\");\n\n // UBO layouts\n const hasMaterialUbo = !!(template._baseMaterialUboFields && template._baseMaterialUboFields.length > 0);\n const meshFields = [...template._baseMeshUboFields];\n const materialFields = hasMaterialUbo ? [...template._baseMaterialUboFields] : [];\n for (const f of sorted) {\n if (f._uboFields?.length) {\n (hasMaterialUbo ? materialFields : meshFields).push(...f._uboFields);\n }\n }\n const _meshUboSpec = computeUboLayout(meshFields);\n const _materialUboSpec = hasMaterialUbo ? computeUboLayout(materialFields) : undefined;\n\n // Bindings\n const meshBGL: GPUBindGroupLayoutEntry[] = [{ binding: 0, visibility: STAGE_VERTEX | STAGE_FRAGMENT, buffer: { type: \"uniform\" } }];\n if (hasMaterialUbo) {\n meshBGL.push({ binding: 1, visibility: STAGE_FRAGMENT, buffer: { type: \"uniform\" } });\n }\n const shadowBGL: GPUBindGroupLayoutEntry[] = [];\n const vDecls: string[] = [];\n const fDecls: string[] = [];\n let mb = hasMaterialUbo ? 2 : 1,\n sb = 0;\n\n function addBinding(d: BindingDecl, _isVertex: boolean) {\n const isShadow = d._group === \"shadow\";\n const b = isShadow ? sb++ : mb++;\n const g = isShadow ? 2 : 1;\n (isShadow ? shadowBGL : meshBGL).push(bglEntry(b, d));\n const w = declWGSL(g, b, d);\n if (d._visibility & STAGE_VERTEX) {\n vDecls.push(w);\n }\n if (d._visibility & STAGE_FRAGMENT) {\n fDecls.push(w);\n }\n }\n\n for (const d of template._baseVertexBindings ?? []) {\n addBinding(d, true);\n }\n for (const f of sorted) {\n for (const d of f._vertexBindings ?? []) {\n addBinding(d, true);\n }\n }\n for (const d of template._baseBindings ?? []) {\n addBinding(d, false);\n }\n for (const f of sorted) {\n for (const d of (f._bindings ?? []).filter((b) => (b._group ?? \"mesh\") === \"mesh\")) {\n addBinding(d, false);\n }\n }\n for (const f of sorted) {\n for (const d of (f._bindings ?? []).filter((b) => b._group === \"shadow\")) {\n addBinding(d, false);\n }\n }\n\n const _fragmentKey = sorted.map((f) => f._id).join(\"|\");\n const vParams = (vBuiltins.length ? vBuiltins.join(\"\\n\") + \"\\n\" : \"\") + inputLines.join(\"\\n\");\n const meshStruct = `struct MeshUniforms{\\n${_meshUboSpec._structBody}\\n}`;\n const materialStruct = _materialUboSpec ? `\\nstruct MaterialUniforms{\\n${_materialUboSpec._structBody}\\n}\\n@group(1)@binding(1) var<uniform> material:MaterialUniforms;` : \"\";\n\n let _vertexWGSL = template._vertexTemplate;\n _vertexWGSL = _vertexWGSL.replace(\"/*SU*/\", SCENE_UBO_WGSL);\n _vertexWGSL = _vertexWGSL.replace(\"/*MU*/\", meshStruct);\n _vertexWGSL = _vertexWGSL.replace(\"/*VI*/\", `struct VertexInput{\\n${inputLines.join(\"\\n\")}\\n}`);\n _vertexWGSL = _vertexWGSL.replace(\"/*VO*/\", `struct VertexOutput{\\n${varyBody}\\n}`);\n _vertexWGSL = _vertexWGSL.replace(\"/*VD*/\", vDecls.join(\"\\n\"));\n _vertexWGSL = _vertexWGSL.replace(\"/*VP*/\", vParams);\n _vertexWGSL = _vertexWGSL.replace(\"/*VH*/\", vHelpers.join(\"\\n\"));\n // These dynamic keys are reserved from Terser property mangling in bundle-scenes-core.ts.\n _vertexWGSL = injectSlots(_vertexWGSL, sorted, \"_vertexSlots\");\n\n let _fragmentWGSL = template._fragmentTemplate;\n _fragmentWGSL = _fragmentWGSL.replace(\"/*SU*/\", SCENE_UBO_WGSL);\n _fragmentWGSL = _fragmentWGSL.replace(\"/*MU*/\", meshStruct + materialStruct);\n _fragmentWGSL = _fragmentWGSL.replace(\"/*FI*/\", `struct FragmentInput{\\n${varyBody}\\n}`);\n _fragmentWGSL = _fragmentWGSL.replace(\"/*HF*/\", helpers.join(\"\\n\"));\n _fragmentWGSL = _fragmentWGSL.replace(\"/*FB*/\", fDecls.join(\"\\n\"));\n _fragmentWGSL = injectSlots(_fragmentWGSL, sorted, \"_fragmentSlots\");\n\n const _meshBGLDescriptor = { entries: meshBGL };\n const _shadowBGLDescriptor = shadowBGL.length ? { entries: shadowBGL } : null;\n\n return {\n _vertexWGSL,\n _fragmentWGSL,\n _meshBGLDescriptor,\n _shadowBGLDescriptor,\n _vertexBufferLayouts,\n _meshUboSpec,\n _materialUboSpec,\n _fragmentKey,\n };\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"shader-composer-CBy2i8nU.js","sources":["../src/shader/shader-composer.ts"],"sourcesContent":["/**\n * Shader Composer — assembles ShaderFragment[] + ShaderTemplate into\n * final WGSL source + GPU layout descriptors. Pure function, no global state.\n * All shader text comes from template + fragment modules.\n */\nimport type { BindingDecl, ComposedShader, FragmentSlot, ShaderFragment, ShaderTemplate, VertexAttribute, VertexSlot, Varying } from \"./fragment-types.js\";\nimport { computeUboLayout } from \"./ubo-layout.js\";\nimport { SCENE_UBO_WGSL } from \"./scene-uniforms.js\";\n\nconst STAGE_VERTEX = 0x1;\nconst STAGE_FRAGMENT = 0x2;\n\nfunction topoSort(fragments: readonly ShaderFragment[]): ShaderFragment[] {\n const byId = new Map<string, ShaderFragment>();\n for (const f of fragments) {\n if (byId.has(f._id)) {\n throw Error();\n }\n byId.set(f._id, f);\n }\n const inDeg = new Map<string, number>();\n const deps = new Map<string, string[]>();\n for (const f of fragments) {\n if (!inDeg.has(f._id)) {\n inDeg.set(f._id, 0);\n }\n for (const d of f._dependencies ?? []) {\n if (!byId.has(d)) {\n throw Error();\n }\n inDeg.set(f._id, (inDeg.get(f._id) ?? 0) + 1);\n let arr = deps.get(d);\n if (!arr) {\n arr = [];\n deps.set(d, arr);\n }\n arr.push(f._id);\n }\n }\n const q: string[] = [];\n for (const [id, d] of inDeg) {\n if (d === 0) {\n q.push(id);\n }\n }\n q.sort();\n const out: ShaderFragment[] = [];\n let qi = 0;\n while (qi < q.length) {\n const id = q[qi++]!;\n out.push(byId.get(id)!);\n for (const d of deps.get(id) ?? []) {\n const nd = (inDeg.get(d) ?? 1) - 1;\n inDeg.set(d, nd);\n if (nd === 0) {\n let i = qi;\n while (i < q.length && q[i]! < d) {\n i++;\n }\n q.splice(i, 0, d);\n }\n }\n }\n if (out.length !== fragments.length) {\n throw Error();\n }\n return out;\n}\n\nfunction dedup<T extends { _name: string }>(base: readonly T[], extra: readonly T[]): T[] {\n const seen = new Set<string>();\n const all: T[] = [];\n for (const v of base) {\n if (!seen.has(v._name)) {\n seen.add(v._name);\n all.push(v);\n }\n }\n for (const v of extra) {\n if (!seen.has(v._name)) {\n seen.add(v._name);\n all.push(v);\n }\n }\n return all;\n}\n\nfunction bglEntry(binding: number, decl: BindingDecl): GPUBindGroupLayoutEntry {\n const e: GPUBindGroupLayoutEntry = { binding, visibility: decl._visibility };\n switch (decl._type._kind) {\n case \"uniform-buffer\":\n e.buffer = { type: \"uniform\" };\n break;\n case \"texture\": {\n const def = decl._type._textureType === \"texture_depth_2d\" ? \"depth\" : decl._type._textureType === \"texture_2d<u32>\" ? \"uint\" : \"float\";\n e.texture = {\n sampleType: (decl._type._sampleType ?? def) as GPUTextureSampleType,\n viewDimension: decl._type._textureType.includes(\"array\") ? \"2d-array\" : decl._type._textureType.includes(\"cube\") ? \"cube\" : \"2d\",\n };\n break;\n }\n case \"sampler\":\n e.sampler = {\n type: decl._type._samplerType === \"sampler_comparison\" ? \"comparison\" : decl._type._samplerType === \"sampler_non_filtering\" ? \"non-filtering\" : \"filtering\",\n };\n break;\n case \"storage-texture\":\n e.storageTexture = { access: decl._type._access as GPUStorageTextureAccess, format: decl._type._format as GPUTextureFormat };\n break;\n }\n return e;\n}\n\nfunction declWGSL(g: number, b: number, d: BindingDecl): string {\n switch (d._type._kind) {\n case \"uniform-buffer\":\n return `@group(${g})@binding(${b}) var<uniform> ${d._name}:${d._name}Uniforms;`;\n case \"texture\":\n return `@group(${g})@binding(${b}) var ${d._name}:${d._type._textureType};`;\n case \"sampler\":\n return `@group(${g})@binding(${b}) var ${d._name}:${d._type._samplerType === \"sampler_non_filtering\" ? \"sampler\" : d._type._samplerType};`;\n case \"storage-texture\":\n return `@group(${g})@binding(${b}) var ${d._name}:texture_storage_2d<${d._type._format},${d._type._access}>;`;\n }\n}\n\nconst SLOT_RE = /\\/\\*([A-Z_0-9]+)\\*\\//g;\nfunction injectSlots(tpl: string, sorted: readonly ShaderFragment[], key: \"_fragmentSlots\" | \"_vertexSlots\"): string {\n return tpl.replace(SLOT_RE, (_, slot: string) => {\n const parts: string[] = [];\n for (const f of sorted) {\n const s = f[key] as Partial<Record<FragmentSlot | VertexSlot, string>> | undefined;\n if (s?.[slot as FragmentSlot | VertexSlot]) {\n parts.push(s[slot as FragmentSlot | VertexSlot]!);\n }\n }\n return parts.join(\"\\n\");\n });\n}\n\nexport function composeShader(template: ShaderTemplate, fragments: readonly ShaderFragment[]): ComposedShader {\n const sorted = topoSort(fragments);\n\n // Collect fragment data\n const fragAttrs: VertexAttribute[] = [];\n const fragVaryings: Varying[] = [];\n const helpers: string[] = [];\n const vHelpers: string[] = [];\n const vBuiltins: string[] = [];\n for (const f of sorted) {\n if (f._vertexAttributes) {\n fragAttrs.push(...f._vertexAttributes);\n }\n if (f._varyings) {\n fragVaryings.push(...f._varyings);\n }\n if (f._helperFunctions) {\n helpers.push(f._helperFunctions);\n }\n if (f._vertexHelperFunctions) {\n vHelpers.push(f._vertexHelperFunctions);\n }\n for (const b of f._vertexBuiltins ?? []) {\n vBuiltins.push(`@builtin(${b._builtin}) ${b._name}:${b._type},`);\n }\n }\n\n // Vertex attributes + layouts\n const allAttrs = dedup(template._baseVertexAttributes, fragAttrs);\n const inputLines: string[] = [];\n const _vertexBufferLayouts: GPUVertexBufferLayout[] = [];\n const groups = new Map<string, { loc: number; off: number; fmt: GPUVertexFormat }[]>();\n const firstOfGroup = new Map<string, VertexAttribute>();\n for (let i = 0; i < allAttrs.length; i++) {\n const a = allAttrs[i]!;\n inputLines.push(`@location(${i}) ${a._name}:${a._type},`);\n if (a._bufferGroup) {\n if (!groups.has(a._bufferGroup)) {\n groups.set(a._bufferGroup, []);\n firstOfGroup.set(a._bufferGroup, a);\n }\n groups.get(a._bufferGroup)!.push({ loc: i, off: a._offset ?? 0, fmt: a._gpuFormat });\n } else {\n _vertexBufferLayouts.push({\n arrayStride: a._arrayStride,\n stepMode: a._stepMode ?? \"vertex\",\n attributes: [{ shaderLocation: i, offset: a._offset ?? 0, format: a._gpuFormat }],\n });\n }\n }\n for (const [grp, attrs] of groups) {\n const f = firstOfGroup.get(grp)!;\n _vertexBufferLayouts.push({\n arrayStride: f._arrayStride,\n stepMode: f._stepMode ?? \"vertex\",\n attributes: attrs.map((a) => ({ shaderLocation: a.loc, offset: a.off, format: a.fmt })),\n });\n }\n let nextLoc = allAttrs.length;\n for (const f of sorted) {\n if (f._pipelineVertexBuffers) {\n const r = f._pipelineVertexBuffers(nextLoc);\n _vertexBufferLayouts.push(...r._buffers);\n nextLoc = r._nextLoc;\n }\n }\n\n // Varyings\n const allVary = dedup(template._baseVaryings, fragVaryings);\n const varyBody = `@builtin(position) clipPos:vec4f,\\n` + allVary.map((v, i) => `@location(${i}) ${v._name}:${v._type},`).join(\"\\n\");\n\n // UBO layouts\n const hasMaterialUbo = !!(template._baseMaterialUboFields && template._baseMaterialUboFields.length > 0);\n const meshFields = [...template._baseMeshUboFields];\n const materialFields = hasMaterialUbo ? [...template._baseMaterialUboFields] : [];\n for (const f of sorted) {\n if (f._uboFields?.length) {\n (hasMaterialUbo ? materialFields : meshFields).push(...f._uboFields);\n }\n }\n const _meshUboSpec = computeUboLayout(meshFields);\n const _materialUboSpec = hasMaterialUbo ? computeUboLayout(materialFields) : undefined;\n\n // Bindings\n const meshBGL: GPUBindGroupLayoutEntry[] = [{ binding: 0, visibility: STAGE_VERTEX | STAGE_FRAGMENT, buffer: { type: \"uniform\" } }];\n if (hasMaterialUbo) {\n meshBGL.push({ binding: 1, visibility: STAGE_FRAGMENT, buffer: { type: \"uniform\" } });\n }\n const shadowBGL: GPUBindGroupLayoutEntry[] = [];\n const vDecls: string[] = [];\n const fDecls: string[] = [];\n let mb = hasMaterialUbo ? 2 : 1,\n sb = 0;\n\n function addBinding(d: BindingDecl, _isVertex: boolean) {\n const isShadow = d._group === \"shadow\";\n const b = isShadow ? sb++ : mb++;\n const g = isShadow ? 2 : 1;\n (isShadow ? shadowBGL : meshBGL).push(bglEntry(b, d));\n const w = declWGSL(g, b, d);\n if (d._visibility & STAGE_VERTEX) {\n vDecls.push(w);\n }\n if (d._visibility & STAGE_FRAGMENT) {\n fDecls.push(w);\n }\n }\n\n for (const d of template._baseVertexBindings ?? []) {\n addBinding(d, true);\n }\n for (const f of sorted) {\n for (const d of f._vertexBindings ?? []) {\n addBinding(d, true);\n }\n }\n for (const d of template._baseBindings ?? []) {\n addBinding(d, false);\n }\n for (const f of sorted) {\n for (const d of (f._bindings ?? []).filter((b) => (b._group ?? \"mesh\") === \"mesh\")) {\n addBinding(d, false);\n }\n }\n for (const f of sorted) {\n for (const d of (f._bindings ?? []).filter((b) => b._group === \"shadow\")) {\n addBinding(d, false);\n }\n }\n\n const _fragmentKey = sorted.map((f) => f._id).join(\"|\");\n const vParams = (vBuiltins.length ? vBuiltins.join(\"\\n\") + \"\\n\" : \"\") + inputLines.join(\"\\n\");\n const meshStruct = `struct MeshUniforms{\\n${_meshUboSpec._structBody}\\n}`;\n const materialStruct = _materialUboSpec ? `\\nstruct MaterialUniforms{\\n${_materialUboSpec._structBody}\\n}\\n@group(1)@binding(1) var<uniform> material:MaterialUniforms;` : \"\";\n\n let _vertexWGSL = template._vertexTemplate;\n _vertexWGSL = _vertexWGSL.replace(\"/*SU*/\", SCENE_UBO_WGSL);\n _vertexWGSL = _vertexWGSL.replace(\"/*MU*/\", meshStruct);\n _vertexWGSL = _vertexWGSL.replace(\"/*VI*/\", `struct VertexInput{\\n${inputLines.join(\"\\n\")}\\n}`);\n _vertexWGSL = _vertexWGSL.replace(\"/*VO*/\", `struct VertexOutput{\\n${varyBody}\\n}`);\n _vertexWGSL = _vertexWGSL.replace(\"/*VD*/\", vDecls.join(\"\\n\"));\n _vertexWGSL = _vertexWGSL.replace(\"/*VP*/\", vParams);\n _vertexWGSL = _vertexWGSL.replace(\"/*VH*/\", vHelpers.join(\"\\n\"));\n // These dynamic keys are reserved from Terser property mangling in bundle-scenes-core.ts.\n _vertexWGSL = injectSlots(_vertexWGSL, sorted, \"_vertexSlots\");\n\n let _fragmentWGSL = template._fragmentTemplate;\n _fragmentWGSL = _fragmentWGSL.replace(\"/*SU*/\", SCENE_UBO_WGSL);\n _fragmentWGSL = _fragmentWGSL.replace(\"/*MU*/\", meshStruct + materialStruct);\n _fragmentWGSL = _fragmentWGSL.replace(\"/*FI*/\", `struct FragmentInput{\\n${varyBody}\\n}`);\n _fragmentWGSL = _fragmentWGSL.replace(\"/*HF*/\", helpers.join(\"\\n\"));\n _fragmentWGSL = _fragmentWGSL.replace(\"/*FB*/\", fDecls.join(\"\\n\"));\n _fragmentWGSL = injectSlots(_fragmentWGSL, sorted, \"_fragmentSlots\");\n\n const _meshBGLDescriptor = { entries: meshBGL };\n const _shadowBGLDescriptor = shadowBGL.length ? { entries: shadowBGL } : null;\n\n return {\n _vertexWGSL,\n _fragmentWGSL,\n _meshBGLDescriptor,\n _shadowBGLDescriptor,\n _vertexBufferLayouts,\n _meshUboSpec,\n _materialUboSpec,\n _fragmentKey,\n };\n}\n"],"names":[],"mappings":";AASA,MAAM,eAAe;AACrB,MAAM,iBAAiB;AAEvB,SAAS,SAAS,WAAwD;AACtE,QAAM,2BAAW,IAAA;AACjB,aAAW,KAAK,WAAW;AACvB,QAAI,KAAK,IAAI,EAAE,GAAG,GAAG;AACjB,YAAM,MAAA;AAAA,IACV;AACA,SAAK,IAAI,EAAE,KAAK,CAAC;AAAA,EACrB;AACA,QAAM,4BAAY,IAAA;AAClB,QAAM,2BAAW,IAAA;AACjB,aAAW,KAAK,WAAW;AACvB,QAAI,CAAC,MAAM,IAAI,EAAE,GAAG,GAAG;AACnB,YAAM,IAAI,EAAE,KAAK,CAAC;AAAA,IACtB;AACA,eAAW,KAAK,EAAE,iBAAiB,CAAA,GAAI;AACnC,UAAI,CAAC,KAAK,IAAI,CAAC,GAAG;AACd,cAAM,MAAA;AAAA,MACV;AACA,YAAM,IAAI,EAAE,MAAM,MAAM,IAAI,EAAE,GAAG,KAAK,KAAK,CAAC;AAC5C,UAAI,MAAM,KAAK,IAAI,CAAC;AACpB,UAAI,CAAC,KAAK;AACN,cAAM,CAAA;AACN,aAAK,IAAI,GAAG,GAAG;AAAA,MACnB;AACA,UAAI,KAAK,EAAE,GAAG;AAAA,IAClB;AAAA,EACJ;AACA,QAAM,IAAc,CAAA;AACpB,aAAW,CAAC,IAAI,CAAC,KAAK,OAAO;AACzB,QAAI,MAAM,GAAG;AACT,QAAE,KAAK,EAAE;AAAA,IACb;AAAA,EACJ;AACA,IAAE,KAAA;AACF,QAAM,MAAwB,CAAA;AAC9B,MAAI,KAAK;AACT,SAAO,KAAK,EAAE,QAAQ;AAClB,UAAM,KAAK,EAAE,IAAI;AACjB,QAAI,KAAK,KAAK,IAAI,EAAE,CAAE;AACtB,eAAW,KAAK,KAAK,IAAI,EAAE,KAAK,CAAA,GAAI;AAChC,YAAM,MAAM,MAAM,IAAI,CAAC,KAAK,KAAK;AACjC,YAAM,IAAI,GAAG,EAAE;AACf,UAAI,OAAO,GAAG;AACV,YAAI,IAAI;AACR,eAAO,IAAI,EAAE,UAAU,EAAE,CAAC,IAAK,GAAG;AAC9B;AAAA,QACJ;AACA,UAAE,OAAO,GAAG,GAAG,CAAC;AAAA,MACpB;AAAA,IACJ;AAAA,EACJ;AACA,MAAI,IAAI,WAAW,UAAU,QAAQ;AACjC,UAAM,MAAA;AAAA,EACV;AACA,SAAO;AACX;AAEA,SAAS,MAAmC,MAAoB,OAA0B;AACtF,QAAM,2BAAW,IAAA;AACjB,QAAM,MAAW,CAAA;AACjB,aAAW,KAAK,MAAM;AAClB,QAAI,CAAC,KAAK,IAAI,EAAE,KAAK,GAAG;AACpB,WAAK,IAAI,EAAE,KAAK;AAChB,UAAI,KAAK,CAAC;AAAA,IACd;AAAA,EACJ;AACA,aAAW,KAAK,OAAO;AACnB,QAAI,CAAC,KAAK,IAAI,EAAE,KAAK,GAAG;AACpB,WAAK,IAAI,EAAE,KAAK;AAChB,UAAI,KAAK,CAAC;AAAA,IACd;AAAA,EACJ;AACA,SAAO;AACX;AAEA,SAAS,SAAS,SAAiB,MAA4C;AAC3E,QAAM,IAA6B,EAAE,SAAS,YAAY,KAAK,YAAA;AAC/D,UAAQ,KAAK,MAAM,OAAA;AAAA,IACf,KAAK;AACD,QAAE,SAAS,EAAE,MAAM,UAAA;AACnB;AAAA,IACJ,KAAK,WAAW;AACZ,YAAM,MAAM,KAAK,MAAM,iBAAiB,qBAAqB,UAAU,KAAK,MAAM,iBAAiB,oBAAoB,SAAS;AAChI,QAAE,UAAU;AAAA,QACR,YAAa,KAAK,MAAM,eAAe;AAAA,QACvC,eAAe,KAAK,MAAM,aAAa,SAAS,OAAO,IAAI,aAAa,KAAK,MAAM,aAAa,SAAS,MAAM,IAAI,SAAS;AAAA,MAAA;AAEhI;AAAA,IACJ;AAAA,IACA,KAAK;AACD,QAAE,UAAU;AAAA,QACR,MAAM,KAAK,MAAM,iBAAiB,uBAAuB,eAAe,KAAK,MAAM,iBAAiB,0BAA0B,kBAAkB;AAAA,MAAA;AAEpJ;AAAA,IACJ,KAAK;AACD,QAAE,iBAAiB,EAAE,QAAQ,KAAK,MAAM,SAAoC,QAAQ,KAAK,MAAM,QAAA;AAC/F;AAAA,EAAA;AAER,SAAO;AACX;AAEA,SAAS,SAAS,GAAW,GAAW,GAAwB;AAC5D,UAAQ,EAAE,MAAM,OAAA;AAAA,IACZ,KAAK;AACD,aAAO,UAAU,CAAC,aAAa,CAAC,kBAAkB,EAAE,KAAK,IAAI,EAAE,KAAK;AAAA,IACxE,KAAK;AACD,aAAO,UAAU,CAAC,aAAa,CAAC,SAAS,EAAE,KAAK,IAAI,EAAE,MAAM,YAAY;AAAA,IAC5E,KAAK;AACD,aAAO,UAAU,CAAC,aAAa,CAAC,SAAS,EAAE,KAAK,IAAI,EAAE,MAAM,iBAAiB,0BAA0B,YAAY,EAAE,MAAM,YAAY;AAAA,IAC3I,KAAK;AACD,aAAO,UAAU,CAAC,aAAa,CAAC,SAAS,EAAE,KAAK,uBAAuB,EAAE,MAAM,OAAO,IAAI,EAAE,MAAM,OAAO;AAAA,EAAA;AAErH;AAEA,MAAM,UAAU;AAChB,SAAS,YAAY,KAAa,QAAmC,KAAgD;AACjH,SAAO,IAAI,QAAQ,SAAS,CAAC,GAAG,SAAiB;AAC7C,UAAM,QAAkB,CAAA;AACxB,eAAW,KAAK,QAAQ;AACpB,YAAM,IAAI,EAAE,GAAG;AACf,UAAI,uBAAI,OAAoC;AACxC,cAAM,KAAK,EAAE,IAAiC,CAAE;AAAA,MACpD;AAAA,IACJ;AACA,WAAO,MAAM,KAAK,IAAI;AAAA,EAC1B,CAAC;AACL;AAEO,SAAS,cAAc,UAA0B,WAAsD;;AAC1G,QAAM,SAAS,SAAS,SAAS;AAGjC,QAAM,YAA+B,CAAA;AACrC,QAAM,eAA0B,CAAA;AAChC,QAAM,UAAoB,CAAA;AAC1B,QAAM,WAAqB,CAAA;AAC3B,QAAM,YAAsB,CAAA;AAC5B,aAAW,KAAK,QAAQ;AACpB,QAAI,EAAE,mBAAmB;AACrB,gBAAU,KAAK,GAAG,EAAE,iBAAiB;AAAA,IACzC;AACA,QAAI,EAAE,WAAW;AACb,mBAAa,KAAK,GAAG,EAAE,SAAS;AAAA,IACpC;AACA,QAAI,EAAE,kBAAkB;AACpB,cAAQ,KAAK,EAAE,gBAAgB;AAAA,IACnC;AACA,QAAI,EAAE,wBAAwB;AAC1B,eAAS,KAAK,EAAE,sBAAsB;AAAA,IAC1C;AACA,eAAW,KAAK,EAAE,mBAAmB,CAAA,GAAI;AACrC,gBAAU,KAAK,YAAY,EAAE,QAAQ,KAAK,EAAE,KAAK,IAAI,EAAE,KAAK,GAAG;AAAA,IACnE;AAAA,EACJ;AAGA,QAAM,WAAW,MAAM,SAAS,uBAAuB,SAAS;AAChE,QAAM,aAAuB,CAAA;AAC7B,QAAM,uBAAgD,CAAA;AACtD,QAAM,6BAAa,IAAA;AACnB,QAAM,mCAAmB,IAAA;AACzB,WAAS,IAAI,GAAG,IAAI,SAAS,QAAQ,KAAK;AACtC,UAAM,IAAI,SAAS,CAAC;AACpB,eAAW,KAAK,aAAa,CAAC,KAAK,EAAE,KAAK,IAAI,EAAE,KAAK,GAAG;AACxD,QAAI,EAAE,cAAc;AAChB,UAAI,CAAC,OAAO,IAAI,EAAE,YAAY,GAAG;AAC7B,eAAO,IAAI,EAAE,cAAc,CAAA,CAAE;AAC7B,qBAAa,IAAI,EAAE,cAAc,CAAC;AAAA,MACtC;AACA,aAAO,IAAI,EAAE,YAAY,EAAG,KAAK,EAAE,KAAK,GAAG,KAAK,EAAE,WAAW,GAAG,KAAK,EAAE,YAAY;AAAA,IACvF,OAAO;AACH,2BAAqB,KAAK;AAAA,QACtB,aAAa,EAAE;AAAA,QACf,UAAU,EAAE,aAAa;AAAA,QACzB,YAAY,CAAC,EAAE,gBAAgB,GAAG,QAAQ,EAAE,WAAW,GAAG,QAAQ,EAAE,WAAA,CAAY;AAAA,MAAA,CACnF;AAAA,IACL;AAAA,EACJ;AACA,aAAW,CAAC,KAAK,KAAK,KAAK,QAAQ;AAC/B,UAAM,IAAI,aAAa,IAAI,GAAG;AAC9B,yBAAqB,KAAK;AAAA,MACtB,aAAa,EAAE;AAAA,MACf,UAAU,EAAE,aAAa;AAAA,MACzB,YAAY,MAAM,IAAI,CAAC,OAAO,EAAE,gBAAgB,EAAE,KAAK,QAAQ,EAAE,KAAK,QAAQ,EAAE,MAAM;AAAA,IAAA,CACzF;AAAA,EACL;AACA,MAAI,UAAU,SAAS;AACvB,aAAW,KAAK,QAAQ;AACpB,QAAI,EAAE,wBAAwB;AAC1B,YAAM,IAAI,EAAE,uBAAuB,OAAO;AAC1C,2BAAqB,KAAK,GAAG,EAAE,QAAQ;AACvC,gBAAU,EAAE;AAAA,IAChB;AAAA,EACJ;AAGA,QAAM,UAAU,MAAM,SAAS,eAAe,YAAY;AAC1D,QAAM,WAAW;AAAA,IAAwC,QAAQ,IAAI,CAAC,GAAG,MAAM,aAAa,CAAC,KAAK,EAAE,KAAK,IAAI,EAAE,KAAK,GAAG,EAAE,KAAK,IAAI;AAGlI,QAAM,iBAAiB,CAAC,EAAE,SAAS,0BAA0B,SAAS,uBAAuB,SAAS;AACtG,QAAM,aAAa,CAAC,GAAG,SAAS,kBAAkB;AAClD,QAAM,iBAAiB,iBAAiB,CAAC,GAAG,SAAS,sBAAsB,IAAI,CAAA;AAC/E,aAAW,KAAK,QAAQ;AACpB,SAAI,OAAE,eAAF,mBAAc,QAAQ;AACtB,OAAC,iBAAiB,iBAAiB,YAAY,KAAK,GAAG,EAAE,UAAU;AAAA,IACvE;AAAA,EACJ;AACA,QAAM,eAAe,iBAAiB,UAAU;AAChD,QAAM,mBAAmB,iBAAiB,iBAAiB,cAAc,IAAI;AAG7E,QAAM,UAAqC,CAAC,EAAE,SAAS,GAAG,YAAY,eAAe,gBAAgB,QAAQ,EAAE,MAAM,UAAA,GAAa;AAClI,MAAI,gBAAgB;AAChB,YAAQ,KAAK,EAAE,SAAS,GAAG,YAAY,gBAAgB,QAAQ,EAAE,MAAM,UAAA,EAAU,CAAG;AAAA,EACxF;AACA,QAAM,YAAuC,CAAA;AAC7C,QAAM,SAAmB,CAAA;AACzB,QAAM,SAAmB,CAAA;AACzB,MAAI,KAAK,iBAAiB,IAAI,GAC1B,KAAK;AAET,WAAS,WAAW,GAAgB,WAAoB;AACpD,UAAM,WAAW,EAAE,WAAW;AAC9B,UAAM,IAAI,WAAW,OAAO;AAC5B,UAAM,IAAI,WAAW,IAAI;AACzB,KAAC,WAAW,YAAY,SAAS,KAAK,SAAS,GAAG,CAAC,CAAC;AACpD,UAAM,IAAI,SAAS,GAAG,GAAG,CAAC;AAC1B,QAAI,EAAE,cAAc,cAAc;AAC9B,aAAO,KAAK,CAAC;AAAA,IACjB;AACA,QAAI,EAAE,cAAc,gBAAgB;AAChC,aAAO,KAAK,CAAC;AAAA,IACjB;AAAA,EACJ;AAEA,aAAW,KAAK,SAAS,uBAAuB,CAAA,GAAI;AAChD,eAAW,CAAO;AAAA,EACtB;AACA,aAAW,KAAK,QAAQ;AACpB,eAAW,KAAK,EAAE,mBAAmB,CAAA,GAAI;AACrC,iBAAW,CAAO;AAAA,IACtB;AAAA,EACJ;AACA,aAAW,KAAK,SAAS,iBAAiB,CAAA,GAAI;AAC1C,eAAW,CAAQ;AAAA,EACvB;AACA,aAAW,KAAK,QAAQ;AACpB,eAAW,MAAM,EAAE,aAAa,CAAA,GAAI,OAAO,CAAC,OAAO,EAAE,UAAU,YAAY,MAAM,GAAG;AAChF,iBAAW,CAAQ;AAAA,IACvB;AAAA,EACJ;AACA,aAAW,KAAK,QAAQ;AACpB,eAAW,MAAM,EAAE,aAAa,CAAA,GAAI,OAAO,CAAC,MAAM,EAAE,WAAW,QAAQ,GAAG;AACtE,iBAAW,CAAQ;AAAA,IACvB;AAAA,EACJ;AAEA,QAAM,eAAe,OAAO,IAAI,CAAC,MAAM,EAAE,GAAG,EAAE,KAAK,GAAG;AACtD,QAAM,WAAW,UAAU,SAAS,UAAU,KAAK,IAAI,IAAI,OAAO,MAAM,WAAW,KAAK,IAAI;AAC5F,QAAM,aAAa;AAAA,EAAyB,aAAa,WAAW;AAAA;AACpE,QAAM,iBAAiB,mBAAmB;AAAA;AAAA,EAA+B,iBAAiB,WAAW;AAAA;AAAA,gEAAsE;AAE3K,MAAI,cAAc,SAAS;AAC3B,gBAAc,YAAY,QAAQ,UAAU,cAAc;AAC1D,gBAAc,YAAY,QAAQ,UAAU,UAAU;AACtD,gBAAc,YAAY,QAAQ,UAAU;AAAA,EAAwB,WAAW,KAAK,IAAI,CAAC;AAAA,EAAK;AAC9F,gBAAc,YAAY,QAAQ,UAAU;AAAA,EAAyB,QAAQ;AAAA,EAAK;AAClF,gBAAc,YAAY,QAAQ,UAAU,OAAO,KAAK,IAAI,CAAC;AAC7D,gBAAc,YAAY,QAAQ,UAAU,OAAO;AACnD,gBAAc,YAAY,QAAQ,UAAU,SAAS,KAAK,IAAI,CAAC;AAE/D,gBAAc,YAAY,aAAa,QAAQ,cAAc;AAE7D,MAAI,gBAAgB,SAAS;AAC7B,kBAAgB,cAAc,QAAQ,UAAU,cAAc;AAC9D,kBAAgB,cAAc,QAAQ,UAAU,aAAa,cAAc;AAC3E,kBAAgB,cAAc,QAAQ,UAAU;AAAA,EAA0B,QAAQ;AAAA,EAAK;AACvF,kBAAgB,cAAc,QAAQ,UAAU,QAAQ,KAAK,IAAI,CAAC;AAClE,kBAAgB,cAAc,QAAQ,UAAU,OAAO,KAAK,IAAI,CAAC;AACjE,kBAAgB,YAAY,eAAe,QAAQ,gBAAgB;AAEnE,QAAM,qBAAqB,EAAE,SAAS,QAAA;AACtC,QAAM,uBAAuB,UAAU,SAAS,EAAE,SAAS,cAAc;AAEzE,SAAO;AAAA,IACH;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EAAA;AAER;"}
@@ -1,4 +1,4 @@
1
- import { y as targetSignatureKey, A as getSceneBindGroupLayout, bR as _isShaderSystemUniform, o as computeUboLayout, q as SCENE_UBO_WGSL, S as SS, $ as createEmptyUniformBuffer, a as F32, ay as acquireTexture, az as releaseTexture, e as U8, bS as getEffectiveAspectRatio, J as getViewMatrix, K as getProjectionMatrix, bQ as getViewProjectionMatrix, bg as mat4MultiplyInto, U as U32, bT as I32, B as BU } from "./index-C-tEgwbZ.js";
1
+ import { y as targetSignatureKey, A as getSceneBindGroupLayout, bT as _isShaderSystemUniform, o as computeUboLayout, q as SCENE_UBO_WGSL, S as SS, $ as createEmptyUniformBuffer, a as F32, aA as acquireTexture, aB as releaseTexture, e as U8, bU as getEffectiveAspectRatio, J as getViewMatrix, K as getProjectionMatrix, bS as getViewProjectionMatrix, bi as mat4MultiplyInto, U as U32, bV as I32, B as BU } from "./index-BgY3QEzL.js";
2
2
  const SHADER_STAGE_ALL = SS.VERTEX | SS.FRAGMENT;
3
3
  function getOrCreateShaderPipelineBindings(engine, material) {
4
4
  const state = material;
@@ -214,11 +214,11 @@ async function buildShaderGroup(scene, meshes) {
214
214
  if (!meshes.some((m) => !!m.thinInstances)) {
215
215
  return buildShaderMaterialRenderables(scene, meshes);
216
216
  }
217
- const mod = await import("./shader-thin-instance-CkQ8rrfH.js");
217
+ const mod = await import("./shader-thin-instance-CsDo3ULk.js");
218
218
  const cull = meshes.some((m) => {
219
219
  var _a;
220
220
  return !!((_a = m.thinInstances) == null ? void 0 : _a._gpuCullingEnabled);
221
- }) ? await import("./thin-instance-cull-binding-DwZi7mlE.js") : void 0;
221
+ }) ? await import("./thin-instance-cull-binding-BNC5JiGw.js") : void 0;
222
222
  return mod.buildShaderRenderablesWithInstancing(
223
223
  scene,
224
224
  meshes,
@@ -595,4 +595,4 @@ export {
595
595
  buildShaderGroup,
596
596
  buildShaderMaterialRenderables
597
597
  };
598
- //# sourceMappingURL=shader-renderable-D5sbgzxt.js.map
598
+ //# sourceMappingURL=shader-renderable-DVMVD6zP.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"shader-renderable-D5sbgzxt.js","sources":["../src/material/shader/shader-pipeline.ts","../src/material/shader/shader-renderable.ts"],"sourcesContent":["import { SS } from \"../../engine/gpu-flags.js\";\nimport type { EngineContext } from \"../../engine/engine.js\";\nimport type { RenderTargetSignature } from \"../../engine/render-target.js\";\nimport { targetSignatureKey } from \"../../engine/render-target.js\";\nimport { getSceneBindGroupLayout } from \"../../render/scene-helpers.js\";\nimport { SCENE_UBO_WGSL } from \"../../shader/scene-uniforms.js\";\nimport { computeUboLayout } from \"../../shader/ubo-layout.js\";\nimport type { UboField, UboSpec } from \"../../shader/fragment-types.js\";\nimport type { ShaderAttributeName, ShaderMaterial, ShaderSamplerDecl, ShaderUniformDecl } from \"./shader-material.js\";\nimport { _isShaderSystemUniform } from \"./shader-material.js\";\n\nexport interface ShaderPipelineBindings {\n readonly group1BGL: GPUBindGroupLayout;\n readonly systemSpec: UboSpec;\n readonly customSpec: UboSpec | null;\n readonly vertexBuffers: readonly GPUVertexBufferLayout[];\n readonly pipelines: Map<string, GPURenderPipeline>;\n}\n\ninterface ShaderMaterialPipelineState extends ShaderMaterial {\n _shaderDevice?: GPUDevice;\n _shaderBindings?: ShaderPipelineBindings;\n _shaderCustomUbo?: GPUBuffer | null;\n _shaderCustomSpec?: UboSpec | null;\n _shaderCustomData?: ArrayBuffer | null;\n _shaderCustomVersion?: number;\n}\n\nconst SHADER_STAGE_ALL = SS.VERTEX | SS.FRAGMENT;\n\nexport function getOrCreateShaderPipelineBindings(engine: EngineContext, material: ShaderMaterial): ShaderPipelineBindings {\n const state = material as ShaderMaterialPipelineState;\n if (state._shaderBindings && state._shaderDevice === engine._device) {\n return state._shaderBindings;\n }\n\n state._shaderDevice = engine._device;\n const systemFields = material.uniformDecls.filter((u) => _isShaderSystemUniform(u.name)).map(toUboField);\n const customFields = material.uniformDecls.filter((u) => !_isShaderSystemUniform(u.name)).map(toUboField);\n const systemSpec = computeUboLayout(systemFields.length > 0 ? systemFields : [{ _name: \"_pad\", _type: \"vec4<f32>\" }]);\n const customSpec = customFields.length > 0 ? computeUboLayout(customFields) : null;\n const group1BGL = engine._device.createBindGroupLayout({\n label: \"shader-material-group1\",\n entries: buildBindGroupLayoutEntries(material.samplerDecls, material.storageBufferDecls, customSpec !== null),\n });\n const bindings: ShaderPipelineBindings = {\n group1BGL,\n systemSpec,\n customSpec,\n vertexBuffers: material.attributes.map(attributeLayout),\n pipelines: new Map(),\n };\n state._shaderBindings = bindings;\n state._shaderCustomSpec = customSpec;\n state._shaderCustomUbo = null;\n state._shaderCustomData = null;\n state._shaderCustomVersion = -1;\n return bindings;\n}\n\nexport function getOrCreateShaderPipeline(\n engine: EngineContext,\n sig: RenderTargetSignature,\n material: ShaderMaterial,\n bindings: ShaderPipelineBindings,\n variantKey = \"\",\n vertexBuffers: readonly GPUVertexBufferLayout[] = bindings.vertexBuffers,\n instanceAttrs = \"\"\n): GPURenderPipeline {\n // `variantKey`, `vertexBuffers` and `instanceAttrs` default to the\n // non-instanced pipeline — byte-for-byte identical behaviour to before\n // instancing existed. The dynamically-imported thin-instance module is the\n // only caller that passes non-default values, so no instancing logic runs\n // for non-instanced scenes.\n const key = `${targetSignatureKey(sig)}${variantKey}`;\n const cached = bindings.pipelines.get(key);\n if (cached) {\n return cached;\n }\n const device = engine._device;\n const prelude = buildShaderPrelude(material, bindings.systemSpec, bindings.customSpec, instanceAttrs);\n const vertModule = device.createShaderModule({ label: `${material.name ?? \"shader\"}-vertex`, code: `${prelude}\\n${material.vertexSource}` });\n const wantsFragment = !!sig._colorFormat || material.depthOnlyFragment;\n const fragModule = wantsFragment ? device.createShaderModule({ label: `${material.name ?? \"shader\"}-fragment`, code: `${prelude}\\n${material.fragmentSource}` }) : null;\n const colorTarget: GPUColorTargetState | null = sig._colorFormat\n ? {\n format: sig._colorFormat,\n ...(material.needAlphaBlending\n ? {\n blend:\n material.blendMode === \"additive\"\n ? ({\n color: { srcFactor: \"src-alpha\", dstFactor: \"one\", operation: \"add\" },\n alpha: { srcFactor: \"one\", dstFactor: \"one\", operation: \"add\" },\n } satisfies GPUBlendState)\n : ({\n color: { srcFactor: \"src-alpha\", dstFactor: \"one-minus-src-alpha\", operation: \"add\" },\n alpha: { srcFactor: \"one\", dstFactor: \"one-minus-src-alpha\", operation: \"add\" },\n } satisfies GPUBlendState),\n }\n : {}),\n }\n : null;\n\n const pipeline = device.createRenderPipeline({\n label: `${material.name ?? \"shader\"}-pipeline`,\n layout: device.createPipelineLayout({ bindGroupLayouts: [getSceneBindGroupLayout(engine), bindings.group1BGL] }),\n vertex: { module: vertModule, entryPoint: \"mainVertex\", buffers: vertexBuffers as GPUVertexBufferLayout[] },\n ...(fragModule ? { fragment: { module: fragModule, entryPoint: \"mainFragment\", targets: colorTarget ? [colorTarget] : [] } } : {}),\n ...(sig._depthStencilFormat\n ? {\n depthStencil: {\n format: sig._depthStencilFormat,\n // The target's declared depth convention wins over the material default: a depth-only\n // caster authored for the forward-Z shadow map (\"less-equal\") must still depth-test\n // correctly when drawn into a reverse-Z camera depth prepass that declares\n // \"greater-equal\" — otherwise every fragment fails against the 0-cleared buffer.\n depthCompare: sig._depthCompare ?? material.depthCompare,\n depthWriteEnabled: material.needAlphaBlending ? false : material.depthWrite,\n ...(material.depthBias ? { depthBias: material.depthBias } : {}),\n ...(material.depthBiasSlopeScale ? { depthBiasSlopeScale: material.depthBiasSlopeScale } : {}),\n },\n }\n : {}),\n multisample: { count: sig._sampleCount },\n primitive: { topology: \"triangle-list\", cullMode: material.backFaceCulling ? \"back\" : \"none\", frontFace: \"ccw\" },\n });\n bindings.pipelines.set(key, pipeline);\n return pipeline;\n}\n\nfunction toUboField(decl: ShaderUniformDecl): UboField {\n return { _name: decl.name, _type: decl.type };\n}\n\nfunction buildBindGroupLayoutEntries(\n samplers: readonly ShaderSamplerDecl[],\n storageBuffers: readonly { name: string; type: string }[],\n hasCustomUbo: boolean\n): GPUBindGroupLayoutEntry[] {\n const entries: GPUBindGroupLayoutEntry[] = [{ binding: 0, visibility: SHADER_STAGE_ALL, buffer: { type: \"uniform\" } }];\n let nextBinding = 1;\n if (hasCustomUbo) {\n entries.push({ binding: nextBinding++, visibility: SHADER_STAGE_ALL, buffer: { type: \"uniform\" } });\n }\n for (const sampler of samplers) {\n const isArray = sampler.viewDimension === \"2d-array\";\n const sampleType = sampler.comparison === true ? \"depth\" : (sampler.sampleType ?? \"float\");\n entries.push({\n binding: nextBinding++,\n visibility: SHADER_STAGE_ALL,\n texture: {\n sampleType,\n viewDimension: isArray ? \"2d-array\" : \"2d\",\n },\n });\n entries.push({\n binding: nextBinding++,\n visibility: SHADER_STAGE_ALL,\n sampler: { type: sampler.comparison === true ? \"comparison\" : sampleType === \"float\" ? \"filtering\" : \"non-filtering\" },\n });\n }\n for (const _storage of storageBuffers) {\n entries.push({\n binding: nextBinding++,\n visibility: SHADER_STAGE_ALL,\n buffer: { type: \"read-only-storage\" },\n });\n }\n return entries;\n}\n\nfunction attributeLayout(name: ShaderAttributeName, shaderLocation: number): GPUVertexBufferLayout {\n switch (name) {\n case \"position\":\n case \"normal\":\n return { arrayStride: 12, attributes: [{ shaderLocation, offset: 0, format: \"float32x3\" }] };\n case \"uv\":\n case \"uv2\":\n return { arrayStride: 8, attributes: [{ shaderLocation, offset: 0, format: \"float32x2\" }] };\n case \"tangent\":\n case \"color\":\n return { arrayStride: 16, attributes: [{ shaderLocation, offset: 0, format: \"float32x4\" }] };\n }\n}\n\nfunction buildShaderPrelude(material: ShaderMaterial, systemSpec: UboSpec, customSpec: UboSpec | null, instanceAttrs = \"\"): string {\n let wgsl = `${SCENE_UBO_WGSL}\nstruct ShaderSystemUniforms {\n${systemSpec._structBody}\n}\n@group(1) @binding(0) var<uniform> shaderSystem: ShaderSystemUniforms;\n`;\n if (customSpec) {\n wgsl += `struct ShaderUniforms {\n${customSpec._structBody}\n}\n@group(1) @binding(1) var<uniform> shaderUniforms: ShaderUniforms;\n`;\n }\n let nextBinding = customSpec ? 2 : 1;\n for (const sampler of material.samplerDecls) {\n const isArray = sampler.viewDimension === \"2d-array\";\n const isDepth = sampler.comparison === true || sampler.sampleType === \"depth\";\n const texType = isDepth ? (isArray ? \"texture_depth_2d_array\" : \"texture_depth_2d\") : isArray ? \"texture_2d_array<f32>\" : \"texture_2d<f32>\";\n const samplerType = sampler.comparison === true ? \"sampler_comparison\" : \"sampler\";\n wgsl += `@group(1) @binding(${nextBinding++}) var ${sampler.name}: ${texType};\n@group(1) @binding(${nextBinding++}) var ${sampler.name}Sampler: ${samplerType};\n`;\n }\n for (const storage of material.storageBufferDecls) {\n wgsl += `@group(1) @binding(${nextBinding++}) var<storage, read> ${storage.name}: ${storage.type};\n`;\n }\n for (const define of material.defines) {\n wgsl += `const ${define.name}: ${typeof define.value === \"boolean\" ? \"bool\" : \"f32\"} = ${formatDefineValue(define.value)};\n`;\n }\n wgsl += `struct VertexInput {\n`;\n for (let i = 0; i < material.attributes.length; i++) {\n const attr = material.attributes[i]!;\n wgsl += `@location(${i}) ${attr}: ${attributeWgslType(attr)},\n`;\n }\n wgsl += instanceAttrs;\n wgsl += `};\n`;\n return wgsl;\n}\n\nfunction formatDefineValue(value: boolean | number): string {\n if (typeof value === \"boolean\") {\n return value ? \"true\" : \"false\";\n }\n if (Number.isInteger(value)) {\n return `${value}.0`;\n }\n return String(value);\n}\n\nfunction attributeWgslType(name: ShaderAttributeName): string {\n switch (name) {\n case \"position\":\n case \"normal\":\n return \"vec3<f32>\";\n case \"uv\":\n case \"uv2\":\n return \"vec2<f32>\";\n case \"tangent\":\n case \"color\":\n return \"vec4<f32>\";\n }\n}\n","import { F32, U32, I32, U8 } from \"../../engine/typed-arrays.js\";\nimport { BU } from \"../../engine/gpu-flags.js\";\nimport type { EngineContext } from \"../../engine/engine.js\";\nimport type { SceneContext } from \"../../scene/scene.js\";\nimport type { Mesh, MeshGPU } from \"../../mesh/mesh.js\";\nimport type { MeshGroupBuildResult, Renderable, DrawUpdateContext } from \"../../render/renderable.js\";\nimport type { Material } from \"../material.js\";\nimport type { Texture2D } from \"../../texture/texture-2d.js\";\nimport { createEmptyUniformBuffer } from \"../../resource/gpu-buffers.js\";\nimport { acquireTexture, releaseTexture } from \"../../resource/gpu-pool.js\";\nimport { getEffectiveAspectRatio, getProjectionMatrix, getViewMatrix, getViewProjectionMatrix } from \"../../camera/camera.js\";\nimport type { Camera } from \"../../camera/camera.js\";\nimport { mat4MultiplyInto } from \"../../math/mat4-multiply-into.js\";\nimport type { UboSpec } from \"../../shader/fragment-types.js\";\nimport type { ShaderAttributeName, ShaderMaterial, ShaderUniformType } from \"./shader-material.js\";\nimport type { ShaderPipelineBindings } from \"./shader-pipeline.js\";\nimport { _isShaderSystemUniform } from \"./shader-material.js\";\nimport { getOrCreateShaderPipeline, getOrCreateShaderPipelineBindings } from \"./shader-pipeline.js\";\n\n/** @internal Exported as a type only (zero runtime bytes) for the dynamically-imported\n * thin-instance builder. */\nexport interface ShaderPacket {\n readonly mesh: Mesh;\n readonly systemUBO: GPUBuffer;\n readonly systemData: Float32Array;\n /** @internal */\n _bindGroup: GPUBindGroup;\n /** @internal */\n _lastResourceVersion: number;\n /** @internal */\n _boundTextures: Texture2D[];\n /** @internal */\n _boundStorageBuffers: GPUBuffer[];\n /** @internal Set when the owning mesh is removed and this packet's GPU resources are\n * destroyed. A combined (multi-mesh) renderable keeps every packet in its\n * closure, so update()/draw() must skip disposed packets to avoid writing to\n * or submitting an already-destroyed systemUBO / vertex buffer. */\n _disposed?: boolean;\n /** @internal Back-reference to the combined renderable's packet array, so disposal can\n * splice this packet out and stop retaining/iterating dead chunk state every\n * frame (set only for merged opaque renderables). */\n _owner?: ShaderPacket[];\n}\n\ninterface ShaderMaterialRenderState extends ShaderMaterial {\n _shaderBindings?: ShaderPipelineBindings;\n _shaderCustomUbo?: GPUBuffer | null;\n _shaderCustomSpec?: UboSpec | null;\n _shaderCustomData?: ArrayBuffer | null;\n _shaderCustomVersion?: number;\n}\n\n/** @internal */\nexport type ShaderRenderPass = GPURenderPassEncoder | GPURenderBundleEncoder;\n\nexport function buildShaderMaterialRenderables(scene: SceneContext, meshes: Mesh[]): MeshGroupBuildResult {\n const renderables: Renderable[] = [];\n\n const rebuildSingle = (s: SceneContext, mesh: Mesh, materialOverride?: Material): Renderable =>\n buildSingleShaderRenderable(s, mesh, (materialOverride ?? mesh.material) as ShaderMaterial, materialOverride != null);\n\n const byMaterial = new Map<ShaderMaterial, Mesh[]>();\n for (const mesh of meshes) {\n const material = mesh.material as ShaderMaterial;\n let list = byMaterial.get(material);\n if (!list) {\n list = [];\n byMaterial.set(material, list);\n }\n list.push(mesh);\n }\n\n for (const [material, matMeshes] of byMaterial) {\n const built = buildMaterialRenderables(scene, material, matMeshes);\n renderables.push(...built);\n }\n\n return { renderables, rebuildSingle };\n}\n\n/** Async group entry point. Non-instanced ShaderMaterial scenes (the common case)\n * take the synchronous fast path and pull in zero instancing code. When at least\n * one mesh uses thin instances, the instancing module is dynamically imported and\n * the renderable helpers it needs are handed to it as positional arguments — NOT\n * module exports — so those helpers keep their mangled names in this chunk (an\n * export would de-mangle them, growing every ShaderMaterial scene's bundle). */\nexport async function buildShaderGroup(scene: SceneContext, meshes: Mesh[]): Promise<MeshGroupBuildResult> {\n if (!meshes.some((m) => !!m.thinInstances)) {\n return buildShaderMaterialRenderables(scene, meshes);\n }\n const mod = await import(\"./shader-thin-instance.js\");\n const cull = meshes.some((m) => !!m.thinInstances?._gpuCullingEnabled) ? await import(\"../../mesh/thin-instance-cull-binding.js\") : undefined;\n return mod.buildShaderRenderablesWithInstancing(\n scene,\n meshes,\n buildShaderMaterialRenderables,\n createPacket,\n updatePacket,\n updateCustomUbo,\n getAttrBuffer,\n getOrCreateShaderPipeline,\n getOrCreateShaderPipelineBindings,\n cull\n );\n}\n\nfunction buildSingleShaderRenderable(scene: SceneContext, mesh: Mesh, material: ShaderMaterial, isOverride: boolean): Renderable {\n return buildMaterialRenderables(scene, material, [mesh], isOverride)[0]!;\n}\n\nfunction buildMaterialRenderables(scene: SceneContext, material: ShaderMaterial, meshes: readonly Mesh[], isOverride = false): Renderable[] {\n const engine = scene.surface.engine;\n const bindings = getOrCreateShaderPipelineBindings(engine, material);\n ensureCustomUbo(engine, material, bindings.customSpec);\n const packets = meshes.map((mesh) => createPacket(scene, material, bindings.systemSpec, mesh));\n const isTransparent = material.needAlphaBlending;\n if (isTransparent) {\n return packets.map((packet) => createTransparentRenderable(scene, material, packet, isOverride));\n }\n return [createOpaqueRenderable(scene, material, packets, isOverride)];\n}\n\nfunction createPacket(scene: SceneContext, material: ShaderMaterial, systemSpec: UboSpec, mesh: Mesh): ShaderPacket {\n const engine = scene.surface.engine;\n const systemUBO = createEmptyUniformBuffer(engine, systemSpec._totalBytes, \"shader-system-ubo\");\n const systemData = new F32(systemSpec._totalBytes / 4);\n writeSystemUniforms(systemData, systemSpec, material, mesh, scene.camera, engine.canvas.width || 1, engine.canvas.height || 1);\n engine._device.queue.writeBuffer(systemUBO, 0, systemData);\n const packet: ShaderPacket = {\n mesh,\n systemUBO,\n systemData,\n _bindGroup: createShaderBindGroup(engine, material, systemUBO),\n _lastResourceVersion: material._resourceVersion,\n _boundTextures: collectShaderTextures(material),\n _boundStorageBuffers: collectShaderStorageBuffers(material),\n };\n for (const tex of packet._boundTextures) {\n acquireTexture(tex);\n }\n registerMeshTextureDisposer(scene, mesh, packet);\n return packet;\n}\n\nfunction createOpaqueRenderable(scene: SceneContext, material: ShaderMaterial, packets: readonly ShaderPacket[], isOverride: boolean): Renderable {\n // Only merged renderables (>1 mesh) can outlive an individual packet's mesh,\n // so give those packets a back-reference enabling disposal-time compaction.\n if (packets.length > 1) {\n for (const packet of packets) {\n packet._owner = packets as ShaderPacket[];\n }\n }\n const update = (context: DrawUpdateContext): void => {\n updateCustomUbo(scene.surface.engine, material);\n for (const packet of packets) {\n if (packet._disposed) {\n continue;\n }\n if (!isOverride && packet.mesh.material !== material) {\n continue;\n }\n updatePacket(scene, material, packet, context);\n }\n };\n const draw = (pass: ShaderRenderPass, engine: EngineContext): number => {\n let draws = 0;\n for (const packet of packets) {\n if (packet._disposed) {\n continue;\n }\n if (!isOverride && packet.mesh.material !== material) {\n continue;\n }\n drawPacket(pass, engine, material, packet);\n draws++;\n }\n return draws;\n };\n const r: Renderable = {\n order: packets.length === 1 ? (packets[0]!.mesh.renderOrder ?? 100) : Math.min(...packets.map((p) => p.mesh.renderOrder ?? 100)),\n isTransparent: false,\n mesh: packets.length === 1 ? packets[0]!.mesh : undefined,\n bind(eng, sig) {\n const bindings = getOrCreateShaderPipelineBindings(eng, material);\n return { renderable: r, pipeline: getOrCreateShaderPipeline(eng, sig, material, bindings), update, draw: (pass) => draw(pass, eng) };\n },\n };\n return r;\n}\n\nfunction createTransparentRenderable(scene: SceneContext, material: ShaderMaterial, packet: ShaderPacket, isOverride: boolean): Renderable {\n const wm = packet.mesh.worldMatrix as unknown as ArrayLike<number>;\n const sortCenter: [number, number, number] = [wm[12]!, wm[13]!, wm[14]!];\n const update = (context: DrawUpdateContext): void => {\n if (packet._disposed) {\n return;\n }\n if (!isOverride && packet.mesh.material !== material) {\n return;\n }\n updateCustomUbo(scene.surface.engine, material);\n updatePacket(scene, material, packet, context);\n const m = packet.mesh.worldMatrix as unknown as ArrayLike<number>;\n sortCenter[0] = m[12]!;\n sortCenter[1] = m[13]!;\n sortCenter[2] = m[14]!;\n };\n const draw = (pass: ShaderRenderPass, engine: EngineContext): number => {\n if (packet._disposed) {\n return 0;\n }\n if (!isOverride && packet.mesh.material !== material) {\n return 0;\n }\n drawPacket(pass, engine, material, packet);\n return 1;\n };\n const r: Renderable = {\n order: packet.mesh.renderOrder ?? 200,\n isTransparent: true,\n _transmissive: material.transmissive,\n mesh: packet.mesh,\n _worldCenter: sortCenter,\n bind(eng, sig) {\n const bindings = getOrCreateShaderPipelineBindings(eng, material);\n return { renderable: r, pipeline: getOrCreateShaderPipeline(eng, sig, material, bindings), update, draw: (pass) => draw(pass, eng) };\n },\n };\n return r;\n}\n\nfunction updatePacket(scene: SceneContext, material: ShaderMaterial, packet: ShaderPacket, context: DrawUpdateContext): void {\n const engine = scene.surface.engine;\n const state = material as ShaderMaterialRenderState;\n writeSystemUniforms(packet.systemData, state._shaderBindings!.systemSpec, material, packet.mesh, context._camera ?? scene.camera, context.targetWidth, context.targetHeight);\n engine._device.queue.writeBuffer(packet.systemUBO, 0, packet.systemData as Float32Array<ArrayBuffer>);\n if (packet._lastResourceVersion !== material._resourceVersion) {\n for (const tex of packet._boundTextures) {\n releaseTexture(tex);\n }\n packet._bindGroup = createShaderBindGroup(engine, material, packet.systemUBO);\n packet._boundTextures = collectShaderTextures(material);\n packet._boundStorageBuffers = collectShaderStorageBuffers(material);\n for (const tex of packet._boundTextures) {\n acquireTexture(tex);\n }\n packet._lastResourceVersion = material._resourceVersion;\n }\n}\n\nfunction drawPacket(pass: ShaderRenderPass, engine: EngineContext, material: ShaderMaterial, packet: ShaderPacket): void {\n const gpu = packet.mesh._gpu;\n for (let i = 0; i < material.attributes.length; i++) {\n pass.setVertexBuffer(i, getAttrBuffer(engine, gpu, material.attributes[i]!));\n }\n pass.setIndexBuffer(gpu.indexBuffer, gpu.indexFormat);\n pass.setBindGroup(1, packet._bindGroup);\n pass.drawIndexed(gpu.indexCount);\n}\n\nfunction ensureCustomUbo(engine: EngineContext, material: ShaderMaterial, customSpec: UboSpec | null): void {\n const state = material as ShaderMaterialRenderState;\n if (!customSpec) {\n state._shaderCustomUbo = null;\n state._shaderCustomData = null;\n state._shaderCustomVersion = material._uniformVersion;\n return;\n }\n if (state._shaderCustomUbo && state._shaderCustomData) {\n updateCustomUbo(engine, material);\n return;\n }\n state._shaderCustomUbo = createEmptyUniformBuffer(engine, customSpec._totalBytes, \"shader-custom-ubo\");\n state._shaderCustomData = new ArrayBuffer(customSpec._totalBytes);\n state._shaderCustomVersion = -1;\n updateCustomUbo(engine, material);\n}\n\nfunction updateCustomUbo(engine: EngineContext, material: ShaderMaterial): void {\n const state = material as ShaderMaterialRenderState;\n const customSpec = state._shaderCustomSpec;\n const customUbo = state._shaderCustomUbo;\n const customData = state._shaderCustomData;\n if (!customSpec || !customUbo || !customData || state._shaderCustomVersion === material._uniformVersion) {\n return;\n }\n const bytes = new U8(customData);\n bytes.fill(0);\n for (const [name, slot] of material._uniformValues) {\n if (_isShaderSystemUniform(name)) {\n continue;\n }\n const offset = customSpec._offsets.get(name);\n if (offset !== undefined) {\n writeTypedValue(customData, offset, slot.decl.type, slot.value);\n }\n }\n engine._device.queue.writeBuffer(customUbo, 0, bytes);\n state._shaderCustomVersion = material._uniformVersion;\n}\n\nfunction writeTypedValue(data: ArrayBuffer, offset: number, type: ShaderUniformType, value: Float32Array): void {\n if (type === \"u32\") {\n new U32(data, offset, 1)[0] = value[0]!;\n return;\n }\n if (type === \"i32\") {\n new I32(data, offset, 1)[0] = value[0]!;\n return;\n }\n new F32(data, offset, value.length).set(value);\n}\n\nfunction createShaderBindGroup(engine: EngineContext, material: ShaderMaterial, systemUBO: GPUBuffer): GPUBindGroup {\n const bindings = getOrCreateShaderPipelineBindings(engine, material);\n const entries: GPUBindGroupEntry[] = [{ binding: 0, resource: { buffer: systemUBO } }];\n let nextBinding = 1;\n if (bindings.customSpec) {\n ensureCustomUbo(engine, material, bindings.customSpec);\n entries.push({ binding: nextBinding++, resource: { buffer: (material as ShaderMaterialRenderState)._shaderCustomUbo! } });\n }\n for (const sampler of material.samplerDecls) {\n const slot = material._textureSlots.get(sampler.name);\n const tex = slot?.current;\n if (!tex) {\n throw new Error(`ShaderMaterial: sampler \"${sampler.name}\" has no Texture2D. Call setShaderTexture() before rendering.`);\n }\n entries.push({ binding: nextBinding++, resource: tex.view }, { binding: nextBinding++, resource: tex.sampler });\n }\n for (const storage of material.storageBufferDecls) {\n const slot = material._storageBufferSlots.get(storage.name);\n const buffer = slot?.current;\n if (!buffer) {\n throw new Error(`ShaderMaterial: storage buffer \"${storage.name}\" has no GPUBuffer. Call setShaderStorageBuffer() before rendering.`);\n }\n entries.push({ binding: nextBinding++, resource: { buffer } });\n }\n return engine._device.createBindGroup({ label: \"shader-material-bg\", layout: bindings.group1BGL, entries });\n}\n\nfunction collectShaderTextures(material: ShaderMaterial): Texture2D[] {\n const textures: Texture2D[] = [];\n for (const slot of material._textureSlots.values()) {\n if (slot.current) {\n textures.push(slot.current);\n }\n }\n return textures;\n}\n\nfunction collectShaderStorageBuffers(material: ShaderMaterial): GPUBuffer[] {\n const buffers: GPUBuffer[] = [];\n for (const slot of material._storageBufferSlots.values()) {\n if (slot.current) {\n buffers.push(slot.current);\n }\n }\n return buffers;\n}\n\nfunction registerMeshTextureDisposer(scene: SceneContext, mesh: Mesh, packet: ShaderPacket): void {\n const list = scene._meshDisposables.get(mesh) ?? [];\n list.push(() => {\n packet._disposed = true;\n if (packet._owner) {\n const oi = packet._owner.indexOf(packet);\n if (oi >= 0) {\n packet._owner.splice(oi, 1);\n }\n packet._owner = undefined;\n }\n packet.systemUBO.destroy();\n for (const tex of packet._boundTextures) {\n releaseTexture(tex);\n }\n packet._boundTextures = [];\n packet._boundStorageBuffers = [];\n });\n scene._meshDisposables.set(mesh, list);\n}\n\nfunction writeSystemUniforms(data: Float32Array, spec: UboSpec, material: ShaderMaterial, mesh: Mesh, camera: Camera | null, targetWidth: number, targetHeight: number): void {\n data.fill(0);\n const world = mesh.worldMatrix as unknown as Float32Array;\n const aspect = camera ? getEffectiveAspectRatio(camera, targetWidth, targetHeight) : 1;\n const view = camera ? (getViewMatrix(camera) as unknown as Float32Array) : null;\n const projection = camera ? (getProjectionMatrix(camera, aspect) as unknown as Float32Array) : null;\n const viewProjection = camera ? (getViewProjectionMatrix(camera, aspect) as unknown as Float32Array) : null;\n for (const uniform of material.uniformDecls) {\n if (!_isShaderSystemUniform(uniform.name)) {\n continue;\n }\n const offset = spec._offsets.get(uniform.name);\n if (offset === undefined) {\n continue;\n }\n const f = offset / 4;\n switch (uniform.name) {\n case \"world\":\n data.set(world, f);\n break;\n case \"view\":\n if (view) {\n data.set(view, f);\n }\n break;\n case \"projection\":\n if (projection) {\n data.set(projection, f);\n }\n break;\n case \"viewProjection\":\n if (viewProjection) {\n data.set(viewProjection, f);\n }\n break;\n case \"worldView\":\n if (view) {\n mat4MultiplyInto(data, f, view, 0, world, 0);\n }\n break;\n case \"worldViewProjection\":\n if (viewProjection) {\n mat4MultiplyInto(data, f, viewProjection, 0, world, 0);\n }\n break;\n case \"cameraPosition\":\n if (camera) {\n const wm = camera.worldMatrix as unknown as ArrayLike<number>;\n data[f] = wm[12]!;\n data[f + 1] = wm[13]!;\n data[f + 2] = wm[14]!;\n }\n break;\n case \"screenSize\":\n data[f] = targetWidth;\n data[f + 1] = targetHeight;\n break;\n case \"alphaCutoff\":\n data[f] = material._uniformValues.get(\"alphaCutoff\")?.value[0] ?? 0.4;\n break;\n }\n }\n}\n\nlet zeroAttrCache: WeakMap<object, Map<string, GPUBuffer>> | null = null;\n\nfunction getZeroAttrBuffer(engine: EngineContext, gpu: MeshGPU, name: string): GPUBuffer {\n if (!zeroAttrCache) {\n zeroAttrCache = new WeakMap();\n }\n let cache = zeroAttrCache.get(gpu as unknown as object);\n if (!cache) {\n cache = new Map();\n zeroAttrCache.set(gpu as unknown as object, cache);\n }\n const existing = cache.get(name);\n if (existing) {\n return existing;\n }\n const vertexCount = gpu.positionBuffer.size / 12;\n const stride = name === \"uv\" || name === \"uv2\" ? 8 : name === \"normal\" ? 12 : 16;\n const buffer = engine._device.createBuffer({ label: `shader-zero-${name}`, size: vertexCount * stride, usage: BU.VERTEX | BU.COPY_DST });\n cache.set(name, buffer);\n return buffer;\n}\n\nfunction getAttrBuffer(engine: EngineContext, gpu: MeshGPU, name: ShaderAttributeName): GPUBuffer {\n switch (name) {\n case \"position\":\n return gpu.positionBuffer;\n case \"normal\":\n return gpu.normalBuffer ?? getZeroAttrBuffer(engine, gpu, \"normal\");\n case \"uv\":\n return gpu.uvBuffer ?? getZeroAttrBuffer(engine, gpu, \"uv\");\n case \"uv2\":\n return gpu.uv2Buffer ?? getZeroAttrBuffer(engine, gpu, \"uv2\");\n case \"tangent\":\n return gpu.tangentBuffer ?? getZeroAttrBuffer(engine, gpu, \"tangent\");\n case \"color\":\n return gpu.colorBuffer ?? getZeroAttrBuffer(engine, gpu, \"color\");\n }\n}\n"],"names":[],"mappings":";AA4BA,MAAM,mBAAmB,GAAG,SAAS,GAAG;AAEjC,SAAS,kCAAkC,QAAuB,UAAkD;AACvH,QAAM,QAAQ;AACd,MAAI,MAAM,mBAAmB,MAAM,kBAAkB,OAAO,SAAS;AACjE,WAAO,MAAM;AAAA,EACjB;AAEA,QAAM,gBAAgB,OAAO;AAC7B,QAAM,eAAe,SAAS,aAAa,OAAO,CAAC,MAAM,uBAAuB,EAAE,IAAI,CAAC,EAAE,IAAI,UAAU;AACvG,QAAM,eAAe,SAAS,aAAa,OAAO,CAAC,MAAM,CAAC,uBAAuB,EAAE,IAAI,CAAC,EAAE,IAAI,UAAU;AACxG,QAAM,aAAa,iBAAiB,aAAa,SAAS,IAAI,eAAe,CAAC,EAAE,OAAO,QAAQ,OAAO,YAAA,CAAa,CAAC;AACpH,QAAM,aAAa,aAAa,SAAS,IAAI,iBAAiB,YAAY,IAAI;AAC9E,QAAM,YAAY,OAAO,QAAQ,sBAAsB;AAAA,IACnD,OAAO;AAAA,IACP,SAAS,4BAA4B,SAAS,cAAc,SAAS,oBAAoB,eAAe,IAAI;AAAA,EAAA,CAC/G;AACD,QAAM,WAAmC;AAAA,IACrC;AAAA,IACA;AAAA,IACA;AAAA,IACA,eAAe,SAAS,WAAW,IAAI,eAAe;AAAA,IACtD,+BAAe,IAAA;AAAA,EAAI;AAEvB,QAAM,kBAAkB;AACxB,QAAM,oBAAoB;AAC1B,QAAM,mBAAmB;AACzB,QAAM,oBAAoB;AAC1B,QAAM,uBAAuB;AAC7B,SAAO;AACX;AAEO,SAAS,0BACZ,QACA,KACA,UACA,UACA,aAAa,IACb,gBAAkD,SAAS,eAC3D,gBAAgB,IACC;AAMjB,QAAM,MAAM,GAAG,mBAAmB,GAAG,CAAC,GAAG,UAAU;AACnD,QAAM,SAAS,SAAS,UAAU,IAAI,GAAG;AACzC,MAAI,QAAQ;AACR,WAAO;AAAA,EACX;AACA,QAAM,SAAS,OAAO;AACtB,QAAM,UAAU,mBAAmB,UAAU,SAAS,YAAY,SAAS,YAAY,aAAa;AACpG,QAAM,aAAa,OAAO,mBAAmB,EAAE,OAAO,GAAG,SAAS,QAAQ,QAAQ,WAAW,MAAM,GAAG,OAAO;AAAA,EAAK,SAAS,YAAY,IAAI;AAC3I,QAAM,gBAAgB,CAAC,CAAC,IAAI,gBAAgB,SAAS;AACrD,QAAM,aAAa,gBAAgB,OAAO,mBAAmB,EAAE,OAAO,GAAG,SAAS,QAAQ,QAAQ,aAAa,MAAM,GAAG,OAAO;AAAA,EAAK,SAAS,cAAc,GAAA,CAAI,IAAI;AACnK,QAAM,cAA0C,IAAI,eAC9C;AAAA,IACI,QAAQ,IAAI;AAAA,IACZ,GAAI,SAAS,oBACP;AAAA,MACI,OACI,SAAS,cAAc,aAChB;AAAA,QACG,OAAO,EAAE,WAAW,aAAa,WAAW,OAAO,WAAW,MAAA;AAAA,QAC9D,OAAO,EAAE,WAAW,OAAO,WAAW,OAAO,WAAW,MAAA;AAAA,MAAM,IAEjE;AAAA,QACG,OAAO,EAAE,WAAW,aAAa,WAAW,uBAAuB,WAAW,MAAA;AAAA,QAC9E,OAAO,EAAE,WAAW,OAAO,WAAW,uBAAuB,WAAW,MAAA;AAAA,MAAM;AAAA,IAClF,IAEd,CAAA;AAAA,EAAC,IAEX;AAEN,QAAM,WAAW,OAAO,qBAAqB;AAAA,IACzC,OAAO,GAAG,SAAS,QAAQ,QAAQ;AAAA,IACnC,QAAQ,OAAO,qBAAqB,EAAE,kBAAkB,CAAC,wBAAwB,MAAM,GAAG,SAAS,SAAS,GAAG;AAAA,IAC/G,QAAQ,EAAE,QAAQ,YAAY,YAAY,cAAc,SAAS,cAAA;AAAA,IACjE,GAAI,aAAa,EAAE,UAAU,EAAE,QAAQ,YAAY,YAAY,gBAAgB,SAAS,cAAc,CAAC,WAAW,IAAI,CAAA,EAAC,EAAE,IAAM,CAAA;AAAA,IAC/H,GAAI,IAAI,sBACF;AAAA,MACI,cAAc;AAAA,QACV,QAAQ,IAAI;AAAA;AAAA;AAAA;AAAA;AAAA,QAKZ,cAAc,IAAI,iBAAiB,SAAS;AAAA,QAC5C,mBAAmB,SAAS,oBAAoB,QAAQ,SAAS;AAAA,QACjE,GAAI,SAAS,YAAY,EAAE,WAAW,SAAS,UAAA,IAAc,CAAA;AAAA,QAC7D,GAAI,SAAS,sBAAsB,EAAE,qBAAqB,SAAS,oBAAA,IAAwB,CAAA;AAAA,MAAC;AAAA,IAChG,IAEJ,CAAA;AAAA,IACN,aAAa,EAAE,OAAO,IAAI,aAAA;AAAA,IAC1B,WAAW,EAAE,UAAU,iBAAiB,UAAU,SAAS,kBAAkB,SAAS,QAAQ,WAAW,MAAA;AAAA,EAAM,CAClH;AACD,WAAS,UAAU,IAAI,KAAK,QAAQ;AACpC,SAAO;AACX;AAEA,SAAS,WAAW,MAAmC;AACnD,SAAO,EAAE,OAAO,KAAK,MAAM,OAAO,KAAK,KAAA;AAC3C;AAEA,SAAS,4BACL,UACA,gBACA,cACyB;AACzB,QAAM,UAAqC,CAAC,EAAE,SAAS,GAAG,YAAY,kBAAkB,QAAQ,EAAE,MAAM,UAAA,EAAU,CAAG;AACrH,MAAI,cAAc;AAClB,MAAI,cAAc;AACd,YAAQ,KAAK,EAAE,SAAS,eAAe,YAAY,kBAAkB,QAAQ,EAAE,MAAM,UAAA,EAAU,CAAG;AAAA,EACtG;AACA,aAAW,WAAW,UAAU;AAC5B,UAAM,UAAU,QAAQ,kBAAkB;AAC1C,UAAM,aAAa,QAAQ,eAAe,OAAO,UAAW,QAAQ,cAAc;AAClF,YAAQ,KAAK;AAAA,MACT,SAAS;AAAA,MACT,YAAY;AAAA,MACZ,SAAS;AAAA,QACL;AAAA,QACA,eAAe,UAAU,aAAa;AAAA,MAAA;AAAA,IAC1C,CACH;AACD,YAAQ,KAAK;AAAA,MACT,SAAS;AAAA,MACT,YAAY;AAAA,MACZ,SAAS,EAAE,MAAM,QAAQ,eAAe,OAAO,eAAe,eAAe,UAAU,cAAc,gBAAA;AAAA,IAAgB,CACxH;AAAA,EACL;AACA,aAAW,YAAY,gBAAgB;AACnC,YAAQ,KAAK;AAAA,MACT,SAAS;AAAA,MACT,YAAY;AAAA,MACZ,QAAQ,EAAE,MAAM,oBAAA;AAAA,IAAoB,CACvC;AAAA,EACL;AACA,SAAO;AACX;AAEA,SAAS,gBAAgB,MAA2B,gBAA+C;AAC/F,UAAQ,MAAA;AAAA,IACJ,KAAK;AAAA,IACL,KAAK;AACD,aAAO,EAAE,aAAa,IAAI,YAAY,CAAC,EAAE,gBAAgB,QAAQ,GAAG,QAAQ,YAAA,CAAa,EAAA;AAAA,IAC7F,KAAK;AAAA,IACL,KAAK;AACD,aAAO,EAAE,aAAa,GAAG,YAAY,CAAC,EAAE,gBAAgB,QAAQ,GAAG,QAAQ,YAAA,CAAa,EAAA;AAAA,IAC5F,KAAK;AAAA,IACL,KAAK;AACD,aAAO,EAAE,aAAa,IAAI,YAAY,CAAC,EAAE,gBAAgB,QAAQ,GAAG,QAAQ,YAAA,CAAa,EAAA;AAAA,EAAE;AAEvG;AAEA,SAAS,mBAAmB,UAA0B,YAAqB,YAA4B,gBAAgB,IAAY;AAC/H,MAAI,OAAO,GAAG,cAAc;AAAA;AAAA,EAE9B,WAAW,WAAW;AAAA;AAAA;AAAA;AAIpB,MAAI,YAAY;AACZ,YAAQ;AAAA,EACd,WAAW,WAAW;AAAA;AAAA;AAAA;AAAA,EAIpB;AACA,MAAI,cAAc,aAAa,IAAI;AACnC,aAAW,WAAW,SAAS,cAAc;AACzC,UAAM,UAAU,QAAQ,kBAAkB;AAC1C,UAAM,UAAU,QAAQ,eAAe,QAAQ,QAAQ,eAAe;AACtE,UAAM,UAAU,UAAW,UAAU,2BAA2B,qBAAsB,UAAU,0BAA0B;AAC1H,UAAM,cAAc,QAAQ,eAAe,OAAO,uBAAuB;AACzE,YAAQ,sBAAsB,aAAa,SAAS,QAAQ,IAAI,KAAK,OAAO;AAAA,qBAC/D,aAAa,SAAS,QAAQ,IAAI,YAAY,WAAW;AAAA;AAAA,EAE1E;AACA,aAAW,WAAW,SAAS,oBAAoB;AAC/C,YAAQ,sBAAsB,aAAa,wBAAwB,QAAQ,IAAI,KAAK,QAAQ,IAAI;AAAA;AAAA,EAEpG;AACA,aAAW,UAAU,SAAS,SAAS;AACnC,YAAQ,SAAS,OAAO,IAAI,KAAK,OAAO,OAAO,UAAU,YAAY,SAAS,KAAK,MAAM,kBAAkB,OAAO,KAAK,CAAC;AAAA;AAAA,EAE5H;AACA,UAAQ;AAAA;AAER,WAAS,IAAI,GAAG,IAAI,SAAS,WAAW,QAAQ,KAAK;AACjD,UAAM,OAAO,SAAS,WAAW,CAAC;AAClC,YAAQ,aAAa,CAAC,KAAK,IAAI,KAAK,kBAAkB,IAAI,CAAC;AAAA;AAAA,EAE/D;AACA,UAAQ;AACR,UAAQ;AAAA;AAER,SAAO;AACX;AAEA,SAAS,kBAAkB,OAAiC;AACxD,MAAI,OAAO,UAAU,WAAW;AAC5B,WAAO,QAAQ,SAAS;AAAA,EAC5B;AACA,MAAI,OAAO,UAAU,KAAK,GAAG;AACzB,WAAO,GAAG,KAAK;AAAA,EACnB;AACA,SAAO,OAAO,KAAK;AACvB;AAEA,SAAS,kBAAkB,MAAmC;AAC1D,UAAQ,MAAA;AAAA,IACJ,KAAK;AAAA,IACL,KAAK;AACD,aAAO;AAAA,IACX,KAAK;AAAA,IACL,KAAK;AACD,aAAO;AAAA,IACX,KAAK;AAAA,IACL,KAAK;AACD,aAAO;AAAA,EAAA;AAEnB;ACtMO,SAAS,+BAA+B,OAAqB,QAAsC;AACtG,QAAM,cAA4B,CAAA;AAElC,QAAM,gBAAgB,CAAC,GAAiB,MAAY,qBAChD,4BAA4B,GAAG,MAAO,oBAAoB,KAAK,UAA6B,oBAAoB,IAAI;AAExH,QAAM,iCAAiB,IAAA;AACvB,aAAW,QAAQ,QAAQ;AACvB,UAAM,WAAW,KAAK;AACtB,QAAI,OAAO,WAAW,IAAI,QAAQ;AAClC,QAAI,CAAC,MAAM;AACP,aAAO,CAAA;AACP,iBAAW,IAAI,UAAU,IAAI;AAAA,IACjC;AACA,SAAK,KAAK,IAAI;AAAA,EAClB;AAEA,aAAW,CAAC,UAAU,SAAS,KAAK,YAAY;AAC5C,UAAM,QAAQ,yBAAyB,OAAO,UAAU,SAAS;AACjE,gBAAY,KAAK,GAAG,KAAK;AAAA,EAC7B;AAEA,SAAO,EAAE,aAAa,cAAA;AAC1B;AAQA,eAAsB,iBAAiB,OAAqB,QAA+C;AACvG,MAAI,CAAC,OAAO,KAAK,CAAC,MAAM,CAAC,CAAC,EAAE,aAAa,GAAG;AACxC,WAAO,+BAA+B,OAAO,MAAM;AAAA,EACvD;AACA,QAAM,MAAM,MAAM,OAAO,oCAA2B;AACpD,QAAM,OAAO,OAAO,KAAK,CAAC;;AAAM,YAAC,GAAC,OAAE,kBAAF,mBAAiB;AAAA,GAAkB,IAAI,MAAM,OAAO,0CAA0C,IAAI;AACpI,SAAO,IAAI;AAAA,IACP;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EAAA;AAER;AAEA,SAAS,4BAA4B,OAAqB,MAAY,UAA0B,YAAiC;AAC7H,SAAO,yBAAyB,OAAO,UAAU,CAAC,IAAI,GAAG,UAAU,EAAE,CAAC;AAC1E;AAEA,SAAS,yBAAyB,OAAqB,UAA0B,QAAyB,aAAa,OAAqB;AACxI,QAAM,SAAS,MAAM,QAAQ;AAC7B,QAAM,WAAW,kCAAkC,QAAQ,QAAQ;AACnE,kBAAgB,QAAQ,UAAU,SAAS,UAAU;AACrD,QAAM,UAAU,OAAO,IAAI,CAAC,SAAS,aAAa,OAAO,UAAU,SAAS,YAAY,IAAI,CAAC;AAC7F,QAAM,gBAAgB,SAAS;AAC/B,MAAI,eAAe;AACf,WAAO,QAAQ,IAAI,CAAC,WAAW,4BAA4B,OAAO,UAAU,QAAQ,UAAU,CAAC;AAAA,EACnG;AACA,SAAO,CAAC,uBAAuB,OAAO,UAAU,SAAS,UAAU,CAAC;AACxE;AAEA,SAAS,aAAa,OAAqB,UAA0B,YAAqB,MAA0B;AAChH,QAAM,SAAS,MAAM,QAAQ;AAC7B,QAAM,YAAY,yBAAyB,QAAQ,WAAW,aAAa,mBAAmB;AAC9F,QAAM,aAAa,IAAI,IAAI,WAAW,cAAc,CAAC;AACrD,sBAAoB,YAAY,YAAY,UAAU,MAAM,MAAM,QAAQ,OAAO,OAAO,SAAS,GAAG,OAAO,OAAO,UAAU,CAAC;AAC7H,SAAO,QAAQ,MAAM,YAAY,WAAW,GAAG,UAAU;AACzD,QAAM,SAAuB;AAAA,IACzB;AAAA,IACA;AAAA,IACA;AAAA,IACA,YAAY,sBAAsB,QAAQ,UAAU,SAAS;AAAA,IAC7D,sBAAsB,SAAS;AAAA,IAC/B,gBAAgB,sBAAsB,QAAQ;AAAA,IAC9C,sBAAsB,4BAA4B,QAAQ;AAAA,EAAA;AAE9D,aAAW,OAAO,OAAO,gBAAgB;AACrC,mBAAe,GAAG;AAAA,EACtB;AACA,8BAA4B,OAAO,MAAM,MAAM;AAC/C,SAAO;AACX;AAEA,SAAS,uBAAuB,OAAqB,UAA0B,SAAkC,YAAiC;AAG9I,MAAI,QAAQ,SAAS,GAAG;AACpB,eAAW,UAAU,SAAS;AAC1B,aAAO,SAAS;AAAA,IACpB;AAAA,EACJ;AACA,QAAM,SAAS,CAAC,YAAqC;AACjD,oBAAgB,MAAM,QAAQ,QAAQ,QAAQ;AAC9C,eAAW,UAAU,SAAS;AAC1B,UAAI,OAAO,WAAW;AAClB;AAAA,MACJ;AACA,UAAI,CAAC,cAAc,OAAO,KAAK,aAAa,UAAU;AAClD;AAAA,MACJ;AACA,mBAAa,OAAO,UAAU,QAAQ,OAAO;AAAA,IACjD;AAAA,EACJ;AACA,QAAM,OAAO,CAAC,MAAwB,WAAkC;AACpE,QAAI,QAAQ;AACZ,eAAW,UAAU,SAAS;AAC1B,UAAI,OAAO,WAAW;AAClB;AAAA,MACJ;AACA,UAAI,CAAC,cAAc,OAAO,KAAK,aAAa,UAAU;AAClD;AAAA,MACJ;AACA,iBAAW,MAAM,QAAQ,UAAU,MAAM;AACzC;AAAA,IACJ;AACA,WAAO;AAAA,EACX;AACA,QAAM,IAAgB;AAAA,IAClB,OAAO,QAAQ,WAAW,IAAK,QAAQ,CAAC,EAAG,KAAK,eAAe,MAAO,KAAK,IAAI,GAAG,QAAQ,IAAI,CAAC,MAAM,EAAE,KAAK,eAAe,GAAG,CAAC;AAAA,IAC/H,eAAe;AAAA,IACf,MAAM,QAAQ,WAAW,IAAI,QAAQ,CAAC,EAAG,OAAO;AAAA,IAChD,KAAK,KAAK,KAAK;AACX,YAAM,WAAW,kCAAkC,KAAK,QAAQ;AAChE,aAAO,EAAE,YAAY,GAAG,UAAU,0BAA0B,KAAK,KAAK,UAAU,QAAQ,GAAG,QAAQ,MAAM,CAAC,SAAS,KAAK,MAAM,GAAG,EAAA;AAAA,IACrI;AAAA,EAAA;AAEJ,SAAO;AACX;AAEA,SAAS,4BAA4B,OAAqB,UAA0B,QAAsB,YAAiC;AACvI,QAAM,KAAK,OAAO,KAAK;AACvB,QAAM,aAAuC,CAAC,GAAG,EAAE,GAAI,GAAG,EAAE,GAAI,GAAG,EAAE,CAAE;AACvE,QAAM,SAAS,CAAC,YAAqC;AACjD,QAAI,OAAO,WAAW;AAClB;AAAA,IACJ;AACA,QAAI,CAAC,cAAc,OAAO,KAAK,aAAa,UAAU;AAClD;AAAA,IACJ;AACA,oBAAgB,MAAM,QAAQ,QAAQ,QAAQ;AAC9C,iBAAa,OAAO,UAAU,QAAQ,OAAO;AAC7C,UAAM,IAAI,OAAO,KAAK;AACtB,eAAW,CAAC,IAAI,EAAE,EAAE;AACpB,eAAW,CAAC,IAAI,EAAE,EAAE;AACpB,eAAW,CAAC,IAAI,EAAE,EAAE;AAAA,EACxB;AACA,QAAM,OAAO,CAAC,MAAwB,WAAkC;AACpE,QAAI,OAAO,WAAW;AAClB,aAAO;AAAA,IACX;AACA,QAAI,CAAC,cAAc,OAAO,KAAK,aAAa,UAAU;AAClD,aAAO;AAAA,IACX;AACA,eAAW,MAAM,QAAQ,UAAU,MAAM;AACzC,WAAO;AAAA,EACX;AACA,QAAM,IAAgB;AAAA,IAClB,OAAO,OAAO,KAAK,eAAe;AAAA,IAClC,eAAe;AAAA,IACf,eAAe,SAAS;AAAA,IACxB,MAAM,OAAO;AAAA,IACb,cAAc;AAAA,IACd,KAAK,KAAK,KAAK;AACX,YAAM,WAAW,kCAAkC,KAAK,QAAQ;AAChE,aAAO,EAAE,YAAY,GAAG,UAAU,0BAA0B,KAAK,KAAK,UAAU,QAAQ,GAAG,QAAQ,MAAM,CAAC,SAAS,KAAK,MAAM,GAAG,EAAA;AAAA,IACrI;AAAA,EAAA;AAEJ,SAAO;AACX;AAEA,SAAS,aAAa,OAAqB,UAA0B,QAAsB,SAAkC;AACzH,QAAM,SAAS,MAAM,QAAQ;AAC7B,QAAM,QAAQ;AACd,sBAAoB,OAAO,YAAY,MAAM,gBAAiB,YAAY,UAAU,OAAO,MAAM,QAAQ,WAAW,MAAM,QAAQ,QAAQ,aAAa,QAAQ,YAAY;AAC3K,SAAO,QAAQ,MAAM,YAAY,OAAO,WAAW,GAAG,OAAO,UAAuC;AACpG,MAAI,OAAO,yBAAyB,SAAS,kBAAkB;AAC3D,eAAW,OAAO,OAAO,gBAAgB;AACrC,qBAAe,GAAG;AAAA,IACtB;AACA,WAAO,aAAa,sBAAsB,QAAQ,UAAU,OAAO,SAAS;AAC5E,WAAO,iBAAiB,sBAAsB,QAAQ;AACtD,WAAO,uBAAuB,4BAA4B,QAAQ;AAClE,eAAW,OAAO,OAAO,gBAAgB;AACrC,qBAAe,GAAG;AAAA,IACtB;AACA,WAAO,uBAAuB,SAAS;AAAA,EAC3C;AACJ;AAEA,SAAS,WAAW,MAAwB,QAAuB,UAA0B,QAA4B;AACrH,QAAM,MAAM,OAAO,KAAK;AACxB,WAAS,IAAI,GAAG,IAAI,SAAS,WAAW,QAAQ,KAAK;AACjD,SAAK,gBAAgB,GAAG,cAAc,QAAQ,KAAK,SAAS,WAAW,CAAC,CAAE,CAAC;AAAA,EAC/E;AACA,OAAK,eAAe,IAAI,aAAa,IAAI,WAAW;AACpD,OAAK,aAAa,GAAG,OAAO,UAAU;AACtC,OAAK,YAAY,IAAI,UAAU;AACnC;AAEA,SAAS,gBAAgB,QAAuB,UAA0B,YAAkC;AACxG,QAAM,QAAQ;AACd,MAAI,CAAC,YAAY;AACb,UAAM,mBAAmB;AACzB,UAAM,oBAAoB;AAC1B,UAAM,uBAAuB,SAAS;AACtC;AAAA,EACJ;AACA,MAAI,MAAM,oBAAoB,MAAM,mBAAmB;AACnD,oBAAgB,QAAQ,QAAQ;AAChC;AAAA,EACJ;AACA,QAAM,mBAAmB,yBAAyB,QAAQ,WAAW,aAAa,mBAAmB;AACrG,QAAM,oBAAoB,IAAI,YAAY,WAAW,WAAW;AAChE,QAAM,uBAAuB;AAC7B,kBAAgB,QAAQ,QAAQ;AACpC;AAEA,SAAS,gBAAgB,QAAuB,UAAgC;AAC5E,QAAM,QAAQ;AACd,QAAM,aAAa,MAAM;AACzB,QAAM,YAAY,MAAM;AACxB,QAAM,aAAa,MAAM;AACzB,MAAI,CAAC,cAAc,CAAC,aAAa,CAAC,cAAc,MAAM,yBAAyB,SAAS,iBAAiB;AACrG;AAAA,EACJ;AACA,QAAM,QAAQ,IAAI,GAAG,UAAU;AAC/B,QAAM,KAAK,CAAC;AACZ,aAAW,CAAC,MAAM,IAAI,KAAK,SAAS,gBAAgB;AAChD,QAAI,uBAAuB,IAAI,GAAG;AAC9B;AAAA,IACJ;AACA,UAAM,SAAS,WAAW,SAAS,IAAI,IAAI;AAC3C,QAAI,WAAW,QAAW;AACtB,sBAAgB,YAAY,QAAQ,KAAK,KAAK,MAAM,KAAK,KAAK;AAAA,IAClE;AAAA,EACJ;AACA,SAAO,QAAQ,MAAM,YAAY,WAAW,GAAG,KAAK;AACpD,QAAM,uBAAuB,SAAS;AAC1C;AAEA,SAAS,gBAAgB,MAAmB,QAAgB,MAAyB,OAA2B;AAC5G,MAAI,SAAS,OAAO;AAChB,QAAI,IAAI,MAAM,QAAQ,CAAC,EAAE,CAAC,IAAI,MAAM,CAAC;AACrC;AAAA,EACJ;AACA,MAAI,SAAS,OAAO;AAChB,QAAI,IAAI,MAAM,QAAQ,CAAC,EAAE,CAAC,IAAI,MAAM,CAAC;AACrC;AAAA,EACJ;AACA,MAAI,IAAI,MAAM,QAAQ,MAAM,MAAM,EAAE,IAAI,KAAK;AACjD;AAEA,SAAS,sBAAsB,QAAuB,UAA0B,WAAoC;AAChH,QAAM,WAAW,kCAAkC,QAAQ,QAAQ;AACnE,QAAM,UAA+B,CAAC,EAAE,SAAS,GAAG,UAAU,EAAE,QAAQ,UAAA,GAAa;AACrF,MAAI,cAAc;AAClB,MAAI,SAAS,YAAY;AACrB,oBAAgB,QAAQ,UAAU,SAAS,UAAU;AACrD,YAAQ,KAAK,EAAE,SAAS,eAAe,UAAU,EAAE,QAAS,SAAuC,iBAAA,GAAqB;AAAA,EAC5H;AACA,aAAW,WAAW,SAAS,cAAc;AACzC,UAAM,OAAO,SAAS,cAAc,IAAI,QAAQ,IAAI;AACpD,UAAM,MAAM,6BAAM;AAClB,QAAI,CAAC,KAAK;AACN,YAAM,IAAI,MAAM,4BAA4B,QAAQ,IAAI,+DAA+D;AAAA,IAC3H;AACA,YAAQ,KAAK,EAAE,SAAS,eAAe,UAAU,IAAI,KAAA,GAAQ,EAAE,SAAS,eAAe,UAAU,IAAI,SAAS;AAAA,EAClH;AACA,aAAW,WAAW,SAAS,oBAAoB;AAC/C,UAAM,OAAO,SAAS,oBAAoB,IAAI,QAAQ,IAAI;AAC1D,UAAM,SAAS,6BAAM;AACrB,QAAI,CAAC,QAAQ;AACT,YAAM,IAAI,MAAM,mCAAmC,QAAQ,IAAI,qEAAqE;AAAA,IACxI;AACA,YAAQ,KAAK,EAAE,SAAS,eAAe,UAAU,EAAE,OAAA,GAAU;AAAA,EACjE;AACA,SAAO,OAAO,QAAQ,gBAAgB,EAAE,OAAO,sBAAsB,QAAQ,SAAS,WAAW,SAAS;AAC9G;AAEA,SAAS,sBAAsB,UAAuC;AAClE,QAAM,WAAwB,CAAA;AAC9B,aAAW,QAAQ,SAAS,cAAc,OAAA,GAAU;AAChD,QAAI,KAAK,SAAS;AACd,eAAS,KAAK,KAAK,OAAO;AAAA,IAC9B;AAAA,EACJ;AACA,SAAO;AACX;AAEA,SAAS,4BAA4B,UAAuC;AACxE,QAAM,UAAuB,CAAA;AAC7B,aAAW,QAAQ,SAAS,oBAAoB,OAAA,GAAU;AACtD,QAAI,KAAK,SAAS;AACd,cAAQ,KAAK,KAAK,OAAO;AAAA,IAC7B;AAAA,EACJ;AACA,SAAO;AACX;AAEA,SAAS,4BAA4B,OAAqB,MAAY,QAA4B;AAC9F,QAAM,OAAO,MAAM,iBAAiB,IAAI,IAAI,KAAK,CAAA;AACjD,OAAK,KAAK,MAAM;AACZ,WAAO,YAAY;AACnB,QAAI,OAAO,QAAQ;AACf,YAAM,KAAK,OAAO,OAAO,QAAQ,MAAM;AACvC,UAAI,MAAM,GAAG;AACT,eAAO,OAAO,OAAO,IAAI,CAAC;AAAA,MAC9B;AACA,aAAO,SAAS;AAAA,IACpB;AACA,WAAO,UAAU,QAAA;AACjB,eAAW,OAAO,OAAO,gBAAgB;AACrC,qBAAe,GAAG;AAAA,IACtB;AACA,WAAO,iBAAiB,CAAA;AACxB,WAAO,uBAAuB,CAAA;AAAA,EAClC,CAAC;AACD,QAAM,iBAAiB,IAAI,MAAM,IAAI;AACzC;AAEA,SAAS,oBAAoB,MAAoB,MAAe,UAA0B,MAAY,QAAuB,aAAqB,cAA4B;;AAC1K,OAAK,KAAK,CAAC;AACX,QAAM,QAAQ,KAAK;AACnB,QAAM,SAAS,SAAS,wBAAwB,QAAQ,aAAa,YAAY,IAAI;AACrF,QAAM,OAAO,SAAU,cAAc,MAAM,IAAgC;AAC3E,QAAM,aAAa,SAAU,oBAAoB,QAAQ,MAAM,IAAgC;AAC/F,QAAM,iBAAiB,SAAU,wBAAwB,QAAQ,MAAM,IAAgC;AACvG,aAAW,WAAW,SAAS,cAAc;AACzC,QAAI,CAAC,uBAAuB,QAAQ,IAAI,GAAG;AACvC;AAAA,IACJ;AACA,UAAM,SAAS,KAAK,SAAS,IAAI,QAAQ,IAAI;AAC7C,QAAI,WAAW,QAAW;AACtB;AAAA,IACJ;AACA,UAAM,IAAI,SAAS;AACnB,YAAQ,QAAQ,MAAA;AAAA,MACZ,KAAK;AACD,aAAK,IAAI,OAAO,CAAC;AACjB;AAAA,MACJ,KAAK;AACD,YAAI,MAAM;AACN,eAAK,IAAI,MAAM,CAAC;AAAA,QACpB;AACA;AAAA,MACJ,KAAK;AACD,YAAI,YAAY;AACZ,eAAK,IAAI,YAAY,CAAC;AAAA,QAC1B;AACA;AAAA,MACJ,KAAK;AACD,YAAI,gBAAgB;AAChB,eAAK,IAAI,gBAAgB,CAAC;AAAA,QAC9B;AACA;AAAA,MACJ,KAAK;AACD,YAAI,MAAM;AACN,2BAAiB,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC;AAAA,QAC/C;AACA;AAAA,MACJ,KAAK;AACD,YAAI,gBAAgB;AAChB,2BAAiB,MAAM,GAAG,gBAAgB,GAAG,OAAO,CAAC;AAAA,QACzD;AACA;AAAA,MACJ,KAAK;AACD,YAAI,QAAQ;AACR,gBAAM,KAAK,OAAO;AAClB,eAAK,CAAC,IAAI,GAAG,EAAE;AACf,eAAK,IAAI,CAAC,IAAI,GAAG,EAAE;AACnB,eAAK,IAAI,CAAC,IAAI,GAAG,EAAE;AAAA,QACvB;AACA;AAAA,MACJ,KAAK;AACD,aAAK,CAAC,IAAI;AACV,aAAK,IAAI,CAAC,IAAI;AACd;AAAA,MACJ,KAAK;AACD,aAAK,CAAC,MAAI,cAAS,eAAe,IAAI,aAAa,MAAzC,mBAA4C,MAAM,OAAM;AAClE;AAAA,IAAA;AAAA,EAEZ;AACJ;AAEA,IAAI,gBAAgE;AAEpE,SAAS,kBAAkB,QAAuB,KAAc,MAAyB;AACrF,MAAI,CAAC,eAAe;AAChB,wCAAoB,QAAA;AAAA,EACxB;AACA,MAAI,QAAQ,cAAc,IAAI,GAAwB;AACtD,MAAI,CAAC,OAAO;AACR,gCAAY,IAAA;AACZ,kBAAc,IAAI,KAA0B,KAAK;AAAA,EACrD;AACA,QAAM,WAAW,MAAM,IAAI,IAAI;AAC/B,MAAI,UAAU;AACV,WAAO;AAAA,EACX;AACA,QAAM,cAAc,IAAI,eAAe,OAAO;AAC9C,QAAM,SAAS,SAAS,QAAQ,SAAS,QAAQ,IAAI,SAAS,WAAW,KAAK;AAC9E,QAAM,SAAS,OAAO,QAAQ,aAAa,EAAE,OAAO,eAAe,IAAI,IAAI,MAAM,cAAc,QAAQ,OAAO,GAAG,SAAS,GAAG,UAAU;AACvI,QAAM,IAAI,MAAM,MAAM;AACtB,SAAO;AACX;AAEA,SAAS,cAAc,QAAuB,KAAc,MAAsC;AAC9F,UAAQ,MAAA;AAAA,IACJ,KAAK;AACD,aAAO,IAAI;AAAA,IACf,KAAK;AACD,aAAO,IAAI,gBAAgB,kBAAkB,QAAQ,KAAK,QAAQ;AAAA,IACtE,KAAK;AACD,aAAO,IAAI,YAAY,kBAAkB,QAAQ,KAAK,IAAI;AAAA,IAC9D,KAAK;AACD,aAAO,IAAI,aAAa,kBAAkB,QAAQ,KAAK,KAAK;AAAA,IAChE,KAAK;AACD,aAAO,IAAI,iBAAiB,kBAAkB,QAAQ,KAAK,SAAS;AAAA,IACxE,KAAK;AACD,aAAO,IAAI,eAAe,kBAAkB,QAAQ,KAAK,OAAO;AAAA,EAAA;AAE5E;"}
1
+ {"version":3,"file":"shader-renderable-DVMVD6zP.js","sources":["../src/material/shader/shader-pipeline.ts","../src/material/shader/shader-renderable.ts"],"sourcesContent":["import { SS } from \"../../engine/gpu-flags.js\";\nimport type { EngineContext } from \"../../engine/engine.js\";\nimport type { RenderTargetSignature } from \"../../engine/render-target.js\";\nimport { targetSignatureKey } from \"../../engine/render-target.js\";\nimport { getSceneBindGroupLayout } from \"../../render/scene-helpers.js\";\nimport { SCENE_UBO_WGSL } from \"../../shader/scene-uniforms.js\";\nimport { computeUboLayout } from \"../../shader/ubo-layout.js\";\nimport type { UboField, UboSpec } from \"../../shader/fragment-types.js\";\nimport type { ShaderAttributeName, ShaderMaterial, ShaderSamplerDecl, ShaderUniformDecl } from \"./shader-material.js\";\nimport { _isShaderSystemUniform } from \"./shader-material.js\";\n\nexport interface ShaderPipelineBindings {\n readonly group1BGL: GPUBindGroupLayout;\n readonly systemSpec: UboSpec;\n readonly customSpec: UboSpec | null;\n readonly vertexBuffers: readonly GPUVertexBufferLayout[];\n readonly pipelines: Map<string, GPURenderPipeline>;\n}\n\ninterface ShaderMaterialPipelineState extends ShaderMaterial {\n _shaderDevice?: GPUDevice;\n _shaderBindings?: ShaderPipelineBindings;\n _shaderCustomUbo?: GPUBuffer | null;\n _shaderCustomSpec?: UboSpec | null;\n _shaderCustomData?: ArrayBuffer | null;\n _shaderCustomVersion?: number;\n}\n\nconst SHADER_STAGE_ALL = SS.VERTEX | SS.FRAGMENT;\n\nexport function getOrCreateShaderPipelineBindings(engine: EngineContext, material: ShaderMaterial): ShaderPipelineBindings {\n const state = material as ShaderMaterialPipelineState;\n if (state._shaderBindings && state._shaderDevice === engine._device) {\n return state._shaderBindings;\n }\n\n state._shaderDevice = engine._device;\n const systemFields = material.uniformDecls.filter((u) => _isShaderSystemUniform(u.name)).map(toUboField);\n const customFields = material.uniformDecls.filter((u) => !_isShaderSystemUniform(u.name)).map(toUboField);\n const systemSpec = computeUboLayout(systemFields.length > 0 ? systemFields : [{ _name: \"_pad\", _type: \"vec4<f32>\" }]);\n const customSpec = customFields.length > 0 ? computeUboLayout(customFields) : null;\n const group1BGL = engine._device.createBindGroupLayout({\n label: \"shader-material-group1\",\n entries: buildBindGroupLayoutEntries(material.samplerDecls, material.storageBufferDecls, customSpec !== null),\n });\n const bindings: ShaderPipelineBindings = {\n group1BGL,\n systemSpec,\n customSpec,\n vertexBuffers: material.attributes.map(attributeLayout),\n pipelines: new Map(),\n };\n state._shaderBindings = bindings;\n state._shaderCustomSpec = customSpec;\n state._shaderCustomUbo = null;\n state._shaderCustomData = null;\n state._shaderCustomVersion = -1;\n return bindings;\n}\n\nexport function getOrCreateShaderPipeline(\n engine: EngineContext,\n sig: RenderTargetSignature,\n material: ShaderMaterial,\n bindings: ShaderPipelineBindings,\n variantKey = \"\",\n vertexBuffers: readonly GPUVertexBufferLayout[] = bindings.vertexBuffers,\n instanceAttrs = \"\"\n): GPURenderPipeline {\n // `variantKey`, `vertexBuffers` and `instanceAttrs` default to the\n // non-instanced pipeline — byte-for-byte identical behaviour to before\n // instancing existed. The dynamically-imported thin-instance module is the\n // only caller that passes non-default values, so no instancing logic runs\n // for non-instanced scenes.\n const key = `${targetSignatureKey(sig)}${variantKey}`;\n const cached = bindings.pipelines.get(key);\n if (cached) {\n return cached;\n }\n const device = engine._device;\n const prelude = buildShaderPrelude(material, bindings.systemSpec, bindings.customSpec, instanceAttrs);\n const vertModule = device.createShaderModule({ label: `${material.name ?? \"shader\"}-vertex`, code: `${prelude}\\n${material.vertexSource}` });\n const wantsFragment = !!sig._colorFormat || material.depthOnlyFragment;\n const fragModule = wantsFragment ? device.createShaderModule({ label: `${material.name ?? \"shader\"}-fragment`, code: `${prelude}\\n${material.fragmentSource}` }) : null;\n const colorTarget: GPUColorTargetState | null = sig._colorFormat\n ? {\n format: sig._colorFormat,\n ...(material.needAlphaBlending\n ? {\n blend:\n material.blendMode === \"additive\"\n ? ({\n color: { srcFactor: \"src-alpha\", dstFactor: \"one\", operation: \"add\" },\n alpha: { srcFactor: \"one\", dstFactor: \"one\", operation: \"add\" },\n } satisfies GPUBlendState)\n : ({\n color: { srcFactor: \"src-alpha\", dstFactor: \"one-minus-src-alpha\", operation: \"add\" },\n alpha: { srcFactor: \"one\", dstFactor: \"one-minus-src-alpha\", operation: \"add\" },\n } satisfies GPUBlendState),\n }\n : {}),\n }\n : null;\n\n const pipeline = device.createRenderPipeline({\n label: `${material.name ?? \"shader\"}-pipeline`,\n layout: device.createPipelineLayout({ bindGroupLayouts: [getSceneBindGroupLayout(engine), bindings.group1BGL] }),\n vertex: { module: vertModule, entryPoint: \"mainVertex\", buffers: vertexBuffers as GPUVertexBufferLayout[] },\n ...(fragModule ? { fragment: { module: fragModule, entryPoint: \"mainFragment\", targets: colorTarget ? [colorTarget] : [] } } : {}),\n ...(sig._depthStencilFormat\n ? {\n depthStencil: {\n format: sig._depthStencilFormat,\n // The target's declared depth convention wins over the material default: a depth-only\n // caster authored for the forward-Z shadow map (\"less-equal\") must still depth-test\n // correctly when drawn into a reverse-Z camera depth prepass that declares\n // \"greater-equal\" — otherwise every fragment fails against the 0-cleared buffer.\n depthCompare: sig._depthCompare ?? material.depthCompare,\n depthWriteEnabled: material.needAlphaBlending ? false : material.depthWrite,\n ...(material.depthBias ? { depthBias: material.depthBias } : {}),\n ...(material.depthBiasSlopeScale ? { depthBiasSlopeScale: material.depthBiasSlopeScale } : {}),\n },\n }\n : {}),\n multisample: { count: sig._sampleCount },\n primitive: { topology: \"triangle-list\", cullMode: material.backFaceCulling ? \"back\" : \"none\", frontFace: \"ccw\" },\n });\n bindings.pipelines.set(key, pipeline);\n return pipeline;\n}\n\nfunction toUboField(decl: ShaderUniformDecl): UboField {\n return { _name: decl.name, _type: decl.type };\n}\n\nfunction buildBindGroupLayoutEntries(\n samplers: readonly ShaderSamplerDecl[],\n storageBuffers: readonly { name: string; type: string }[],\n hasCustomUbo: boolean\n): GPUBindGroupLayoutEntry[] {\n const entries: GPUBindGroupLayoutEntry[] = [{ binding: 0, visibility: SHADER_STAGE_ALL, buffer: { type: \"uniform\" } }];\n let nextBinding = 1;\n if (hasCustomUbo) {\n entries.push({ binding: nextBinding++, visibility: SHADER_STAGE_ALL, buffer: { type: \"uniform\" } });\n }\n for (const sampler of samplers) {\n const isArray = sampler.viewDimension === \"2d-array\";\n const sampleType = sampler.comparison === true ? \"depth\" : (sampler.sampleType ?? \"float\");\n entries.push({\n binding: nextBinding++,\n visibility: SHADER_STAGE_ALL,\n texture: {\n sampleType,\n viewDimension: isArray ? \"2d-array\" : \"2d\",\n },\n });\n entries.push({\n binding: nextBinding++,\n visibility: SHADER_STAGE_ALL,\n sampler: { type: sampler.comparison === true ? \"comparison\" : sampleType === \"float\" ? \"filtering\" : \"non-filtering\" },\n });\n }\n for (const _storage of storageBuffers) {\n entries.push({\n binding: nextBinding++,\n visibility: SHADER_STAGE_ALL,\n buffer: { type: \"read-only-storage\" },\n });\n }\n return entries;\n}\n\nfunction attributeLayout(name: ShaderAttributeName, shaderLocation: number): GPUVertexBufferLayout {\n switch (name) {\n case \"position\":\n case \"normal\":\n return { arrayStride: 12, attributes: [{ shaderLocation, offset: 0, format: \"float32x3\" }] };\n case \"uv\":\n case \"uv2\":\n return { arrayStride: 8, attributes: [{ shaderLocation, offset: 0, format: \"float32x2\" }] };\n case \"tangent\":\n case \"color\":\n return { arrayStride: 16, attributes: [{ shaderLocation, offset: 0, format: \"float32x4\" }] };\n }\n}\n\nfunction buildShaderPrelude(material: ShaderMaterial, systemSpec: UboSpec, customSpec: UboSpec | null, instanceAttrs = \"\"): string {\n let wgsl = `${SCENE_UBO_WGSL}\nstruct ShaderSystemUniforms {\n${systemSpec._structBody}\n}\n@group(1) @binding(0) var<uniform> shaderSystem: ShaderSystemUniforms;\n`;\n if (customSpec) {\n wgsl += `struct ShaderUniforms {\n${customSpec._structBody}\n}\n@group(1) @binding(1) var<uniform> shaderUniforms: ShaderUniforms;\n`;\n }\n let nextBinding = customSpec ? 2 : 1;\n for (const sampler of material.samplerDecls) {\n const isArray = sampler.viewDimension === \"2d-array\";\n const isDepth = sampler.comparison === true || sampler.sampleType === \"depth\";\n const texType = isDepth ? (isArray ? \"texture_depth_2d_array\" : \"texture_depth_2d\") : isArray ? \"texture_2d_array<f32>\" : \"texture_2d<f32>\";\n const samplerType = sampler.comparison === true ? \"sampler_comparison\" : \"sampler\";\n wgsl += `@group(1) @binding(${nextBinding++}) var ${sampler.name}: ${texType};\n@group(1) @binding(${nextBinding++}) var ${sampler.name}Sampler: ${samplerType};\n`;\n }\n for (const storage of material.storageBufferDecls) {\n wgsl += `@group(1) @binding(${nextBinding++}) var<storage, read> ${storage.name}: ${storage.type};\n`;\n }\n for (const define of material.defines) {\n wgsl += `const ${define.name}: ${typeof define.value === \"boolean\" ? \"bool\" : \"f32\"} = ${formatDefineValue(define.value)};\n`;\n }\n wgsl += `struct VertexInput {\n`;\n for (let i = 0; i < material.attributes.length; i++) {\n const attr = material.attributes[i]!;\n wgsl += `@location(${i}) ${attr}: ${attributeWgslType(attr)},\n`;\n }\n wgsl += instanceAttrs;\n wgsl += `};\n`;\n return wgsl;\n}\n\nfunction formatDefineValue(value: boolean | number): string {\n if (typeof value === \"boolean\") {\n return value ? \"true\" : \"false\";\n }\n if (Number.isInteger(value)) {\n return `${value}.0`;\n }\n return String(value);\n}\n\nfunction attributeWgslType(name: ShaderAttributeName): string {\n switch (name) {\n case \"position\":\n case \"normal\":\n return \"vec3<f32>\";\n case \"uv\":\n case \"uv2\":\n return \"vec2<f32>\";\n case \"tangent\":\n case \"color\":\n return \"vec4<f32>\";\n }\n}\n","import { F32, U32, I32, U8 } from \"../../engine/typed-arrays.js\";\nimport { BU } from \"../../engine/gpu-flags.js\";\nimport type { EngineContext } from \"../../engine/engine.js\";\nimport type { SceneContext } from \"../../scene/scene.js\";\nimport type { Mesh, MeshGPU } from \"../../mesh/mesh.js\";\nimport type { MeshGroupBuildResult, Renderable, DrawUpdateContext } from \"../../render/renderable.js\";\nimport type { Material } from \"../material.js\";\nimport type { Texture2D } from \"../../texture/texture-2d.js\";\nimport { createEmptyUniformBuffer } from \"../../resource/gpu-buffers.js\";\nimport { acquireTexture, releaseTexture } from \"../../resource/gpu-pool.js\";\nimport { getEffectiveAspectRatio, getProjectionMatrix, getViewMatrix, getViewProjectionMatrix } from \"../../camera/camera.js\";\nimport type { Camera } from \"../../camera/camera.js\";\nimport { mat4MultiplyInto } from \"../../math/mat4-multiply-into.js\";\nimport type { UboSpec } from \"../../shader/fragment-types.js\";\nimport type { ShaderAttributeName, ShaderMaterial, ShaderUniformType } from \"./shader-material.js\";\nimport type { ShaderPipelineBindings } from \"./shader-pipeline.js\";\nimport { _isShaderSystemUniform } from \"./shader-material.js\";\nimport { getOrCreateShaderPipeline, getOrCreateShaderPipelineBindings } from \"./shader-pipeline.js\";\n\n/** @internal Exported as a type only (zero runtime bytes) for the dynamically-imported\n * thin-instance builder. */\nexport interface ShaderPacket {\n readonly mesh: Mesh;\n readonly systemUBO: GPUBuffer;\n readonly systemData: Float32Array;\n /** @internal */\n _bindGroup: GPUBindGroup;\n /** @internal */\n _lastResourceVersion: number;\n /** @internal */\n _boundTextures: Texture2D[];\n /** @internal */\n _boundStorageBuffers: GPUBuffer[];\n /** @internal Set when the owning mesh is removed and this packet's GPU resources are\n * destroyed. A combined (multi-mesh) renderable keeps every packet in its\n * closure, so update()/draw() must skip disposed packets to avoid writing to\n * or submitting an already-destroyed systemUBO / vertex buffer. */\n _disposed?: boolean;\n /** @internal Back-reference to the combined renderable's packet array, so disposal can\n * splice this packet out and stop retaining/iterating dead chunk state every\n * frame (set only for merged opaque renderables). */\n _owner?: ShaderPacket[];\n}\n\ninterface ShaderMaterialRenderState extends ShaderMaterial {\n _shaderBindings?: ShaderPipelineBindings;\n _shaderCustomUbo?: GPUBuffer | null;\n _shaderCustomSpec?: UboSpec | null;\n _shaderCustomData?: ArrayBuffer | null;\n _shaderCustomVersion?: number;\n}\n\n/** @internal */\nexport type ShaderRenderPass = GPURenderPassEncoder | GPURenderBundleEncoder;\n\nexport function buildShaderMaterialRenderables(scene: SceneContext, meshes: Mesh[]): MeshGroupBuildResult {\n const renderables: Renderable[] = [];\n\n const rebuildSingle = (s: SceneContext, mesh: Mesh, materialOverride?: Material): Renderable =>\n buildSingleShaderRenderable(s, mesh, (materialOverride ?? mesh.material) as ShaderMaterial, materialOverride != null);\n\n const byMaterial = new Map<ShaderMaterial, Mesh[]>();\n for (const mesh of meshes) {\n const material = mesh.material as ShaderMaterial;\n let list = byMaterial.get(material);\n if (!list) {\n list = [];\n byMaterial.set(material, list);\n }\n list.push(mesh);\n }\n\n for (const [material, matMeshes] of byMaterial) {\n const built = buildMaterialRenderables(scene, material, matMeshes);\n renderables.push(...built);\n }\n\n return { renderables, rebuildSingle };\n}\n\n/** Async group entry point. Non-instanced ShaderMaterial scenes (the common case)\n * take the synchronous fast path and pull in zero instancing code. When at least\n * one mesh uses thin instances, the instancing module is dynamically imported and\n * the renderable helpers it needs are handed to it as positional arguments — NOT\n * module exports — so those helpers keep their mangled names in this chunk (an\n * export would de-mangle them, growing every ShaderMaterial scene's bundle). */\nexport async function buildShaderGroup(scene: SceneContext, meshes: Mesh[]): Promise<MeshGroupBuildResult> {\n if (!meshes.some((m) => !!m.thinInstances)) {\n return buildShaderMaterialRenderables(scene, meshes);\n }\n const mod = await import(\"./shader-thin-instance.js\");\n const cull = meshes.some((m) => !!m.thinInstances?._gpuCullingEnabled) ? await import(\"../../mesh/thin-instance-cull-binding.js\") : undefined;\n return mod.buildShaderRenderablesWithInstancing(\n scene,\n meshes,\n buildShaderMaterialRenderables,\n createPacket,\n updatePacket,\n updateCustomUbo,\n getAttrBuffer,\n getOrCreateShaderPipeline,\n getOrCreateShaderPipelineBindings,\n cull\n );\n}\n\nfunction buildSingleShaderRenderable(scene: SceneContext, mesh: Mesh, material: ShaderMaterial, isOverride: boolean): Renderable {\n return buildMaterialRenderables(scene, material, [mesh], isOverride)[0]!;\n}\n\nfunction buildMaterialRenderables(scene: SceneContext, material: ShaderMaterial, meshes: readonly Mesh[], isOverride = false): Renderable[] {\n const engine = scene.surface.engine;\n const bindings = getOrCreateShaderPipelineBindings(engine, material);\n ensureCustomUbo(engine, material, bindings.customSpec);\n const packets = meshes.map((mesh) => createPacket(scene, material, bindings.systemSpec, mesh));\n const isTransparent = material.needAlphaBlending;\n if (isTransparent) {\n return packets.map((packet) => createTransparentRenderable(scene, material, packet, isOverride));\n }\n return [createOpaqueRenderable(scene, material, packets, isOverride)];\n}\n\nfunction createPacket(scene: SceneContext, material: ShaderMaterial, systemSpec: UboSpec, mesh: Mesh): ShaderPacket {\n const engine = scene.surface.engine;\n const systemUBO = createEmptyUniformBuffer(engine, systemSpec._totalBytes, \"shader-system-ubo\");\n const systemData = new F32(systemSpec._totalBytes / 4);\n writeSystemUniforms(systemData, systemSpec, material, mesh, scene.camera, engine.canvas.width || 1, engine.canvas.height || 1);\n engine._device.queue.writeBuffer(systemUBO, 0, systemData);\n const packet: ShaderPacket = {\n mesh,\n systemUBO,\n systemData,\n _bindGroup: createShaderBindGroup(engine, material, systemUBO),\n _lastResourceVersion: material._resourceVersion,\n _boundTextures: collectShaderTextures(material),\n _boundStorageBuffers: collectShaderStorageBuffers(material),\n };\n for (const tex of packet._boundTextures) {\n acquireTexture(tex);\n }\n registerMeshTextureDisposer(scene, mesh, packet);\n return packet;\n}\n\nfunction createOpaqueRenderable(scene: SceneContext, material: ShaderMaterial, packets: readonly ShaderPacket[], isOverride: boolean): Renderable {\n // Only merged renderables (>1 mesh) can outlive an individual packet's mesh,\n // so give those packets a back-reference enabling disposal-time compaction.\n if (packets.length > 1) {\n for (const packet of packets) {\n packet._owner = packets as ShaderPacket[];\n }\n }\n const update = (context: DrawUpdateContext): void => {\n updateCustomUbo(scene.surface.engine, material);\n for (const packet of packets) {\n if (packet._disposed) {\n continue;\n }\n if (!isOverride && packet.mesh.material !== material) {\n continue;\n }\n updatePacket(scene, material, packet, context);\n }\n };\n const draw = (pass: ShaderRenderPass, engine: EngineContext): number => {\n let draws = 0;\n for (const packet of packets) {\n if (packet._disposed) {\n continue;\n }\n if (!isOverride && packet.mesh.material !== material) {\n continue;\n }\n drawPacket(pass, engine, material, packet);\n draws++;\n }\n return draws;\n };\n const r: Renderable = {\n order: packets.length === 1 ? (packets[0]!.mesh.renderOrder ?? 100) : Math.min(...packets.map((p) => p.mesh.renderOrder ?? 100)),\n isTransparent: false,\n mesh: packets.length === 1 ? packets[0]!.mesh : undefined,\n bind(eng, sig) {\n const bindings = getOrCreateShaderPipelineBindings(eng, material);\n return { renderable: r, pipeline: getOrCreateShaderPipeline(eng, sig, material, bindings), update, draw: (pass) => draw(pass, eng) };\n },\n };\n return r;\n}\n\nfunction createTransparentRenderable(scene: SceneContext, material: ShaderMaterial, packet: ShaderPacket, isOverride: boolean): Renderable {\n const wm = packet.mesh.worldMatrix as unknown as ArrayLike<number>;\n const sortCenter: [number, number, number] = [wm[12]!, wm[13]!, wm[14]!];\n const update = (context: DrawUpdateContext): void => {\n if (packet._disposed) {\n return;\n }\n if (!isOverride && packet.mesh.material !== material) {\n return;\n }\n updateCustomUbo(scene.surface.engine, material);\n updatePacket(scene, material, packet, context);\n const m = packet.mesh.worldMatrix as unknown as ArrayLike<number>;\n sortCenter[0] = m[12]!;\n sortCenter[1] = m[13]!;\n sortCenter[2] = m[14]!;\n };\n const draw = (pass: ShaderRenderPass, engine: EngineContext): number => {\n if (packet._disposed) {\n return 0;\n }\n if (!isOverride && packet.mesh.material !== material) {\n return 0;\n }\n drawPacket(pass, engine, material, packet);\n return 1;\n };\n const r: Renderable = {\n order: packet.mesh.renderOrder ?? 200,\n isTransparent: true,\n _transmissive: material.transmissive,\n mesh: packet.mesh,\n _worldCenter: sortCenter,\n bind(eng, sig) {\n const bindings = getOrCreateShaderPipelineBindings(eng, material);\n return { renderable: r, pipeline: getOrCreateShaderPipeline(eng, sig, material, bindings), update, draw: (pass) => draw(pass, eng) };\n },\n };\n return r;\n}\n\nfunction updatePacket(scene: SceneContext, material: ShaderMaterial, packet: ShaderPacket, context: DrawUpdateContext): void {\n const engine = scene.surface.engine;\n const state = material as ShaderMaterialRenderState;\n writeSystemUniforms(packet.systemData, state._shaderBindings!.systemSpec, material, packet.mesh, context._camera ?? scene.camera, context.targetWidth, context.targetHeight);\n engine._device.queue.writeBuffer(packet.systemUBO, 0, packet.systemData as Float32Array<ArrayBuffer>);\n if (packet._lastResourceVersion !== material._resourceVersion) {\n for (const tex of packet._boundTextures) {\n releaseTexture(tex);\n }\n packet._bindGroup = createShaderBindGroup(engine, material, packet.systemUBO);\n packet._boundTextures = collectShaderTextures(material);\n packet._boundStorageBuffers = collectShaderStorageBuffers(material);\n for (const tex of packet._boundTextures) {\n acquireTexture(tex);\n }\n packet._lastResourceVersion = material._resourceVersion;\n }\n}\n\nfunction drawPacket(pass: ShaderRenderPass, engine: EngineContext, material: ShaderMaterial, packet: ShaderPacket): void {\n const gpu = packet.mesh._gpu;\n for (let i = 0; i < material.attributes.length; i++) {\n pass.setVertexBuffer(i, getAttrBuffer(engine, gpu, material.attributes[i]!));\n }\n pass.setIndexBuffer(gpu.indexBuffer, gpu.indexFormat);\n pass.setBindGroup(1, packet._bindGroup);\n pass.drawIndexed(gpu.indexCount);\n}\n\nfunction ensureCustomUbo(engine: EngineContext, material: ShaderMaterial, customSpec: UboSpec | null): void {\n const state = material as ShaderMaterialRenderState;\n if (!customSpec) {\n state._shaderCustomUbo = null;\n state._shaderCustomData = null;\n state._shaderCustomVersion = material._uniformVersion;\n return;\n }\n if (state._shaderCustomUbo && state._shaderCustomData) {\n updateCustomUbo(engine, material);\n return;\n }\n state._shaderCustomUbo = createEmptyUniformBuffer(engine, customSpec._totalBytes, \"shader-custom-ubo\");\n state._shaderCustomData = new ArrayBuffer(customSpec._totalBytes);\n state._shaderCustomVersion = -1;\n updateCustomUbo(engine, material);\n}\n\nfunction updateCustomUbo(engine: EngineContext, material: ShaderMaterial): void {\n const state = material as ShaderMaterialRenderState;\n const customSpec = state._shaderCustomSpec;\n const customUbo = state._shaderCustomUbo;\n const customData = state._shaderCustomData;\n if (!customSpec || !customUbo || !customData || state._shaderCustomVersion === material._uniformVersion) {\n return;\n }\n const bytes = new U8(customData);\n bytes.fill(0);\n for (const [name, slot] of material._uniformValues) {\n if (_isShaderSystemUniform(name)) {\n continue;\n }\n const offset = customSpec._offsets.get(name);\n if (offset !== undefined) {\n writeTypedValue(customData, offset, slot.decl.type, slot.value);\n }\n }\n engine._device.queue.writeBuffer(customUbo, 0, bytes);\n state._shaderCustomVersion = material._uniformVersion;\n}\n\nfunction writeTypedValue(data: ArrayBuffer, offset: number, type: ShaderUniformType, value: Float32Array): void {\n if (type === \"u32\") {\n new U32(data, offset, 1)[0] = value[0]!;\n return;\n }\n if (type === \"i32\") {\n new I32(data, offset, 1)[0] = value[0]!;\n return;\n }\n new F32(data, offset, value.length).set(value);\n}\n\nfunction createShaderBindGroup(engine: EngineContext, material: ShaderMaterial, systemUBO: GPUBuffer): GPUBindGroup {\n const bindings = getOrCreateShaderPipelineBindings(engine, material);\n const entries: GPUBindGroupEntry[] = [{ binding: 0, resource: { buffer: systemUBO } }];\n let nextBinding = 1;\n if (bindings.customSpec) {\n ensureCustomUbo(engine, material, bindings.customSpec);\n entries.push({ binding: nextBinding++, resource: { buffer: (material as ShaderMaterialRenderState)._shaderCustomUbo! } });\n }\n for (const sampler of material.samplerDecls) {\n const slot = material._textureSlots.get(sampler.name);\n const tex = slot?.current;\n if (!tex) {\n throw new Error(`ShaderMaterial: sampler \"${sampler.name}\" has no Texture2D. Call setShaderTexture() before rendering.`);\n }\n entries.push({ binding: nextBinding++, resource: tex.view }, { binding: nextBinding++, resource: tex.sampler });\n }\n for (const storage of material.storageBufferDecls) {\n const slot = material._storageBufferSlots.get(storage.name);\n const buffer = slot?.current;\n if (!buffer) {\n throw new Error(`ShaderMaterial: storage buffer \"${storage.name}\" has no GPUBuffer. Call setShaderStorageBuffer() before rendering.`);\n }\n entries.push({ binding: nextBinding++, resource: { buffer } });\n }\n return engine._device.createBindGroup({ label: \"shader-material-bg\", layout: bindings.group1BGL, entries });\n}\n\nfunction collectShaderTextures(material: ShaderMaterial): Texture2D[] {\n const textures: Texture2D[] = [];\n for (const slot of material._textureSlots.values()) {\n if (slot.current) {\n textures.push(slot.current);\n }\n }\n return textures;\n}\n\nfunction collectShaderStorageBuffers(material: ShaderMaterial): GPUBuffer[] {\n const buffers: GPUBuffer[] = [];\n for (const slot of material._storageBufferSlots.values()) {\n if (slot.current) {\n buffers.push(slot.current);\n }\n }\n return buffers;\n}\n\nfunction registerMeshTextureDisposer(scene: SceneContext, mesh: Mesh, packet: ShaderPacket): void {\n const list = scene._meshDisposables.get(mesh) ?? [];\n list.push(() => {\n packet._disposed = true;\n if (packet._owner) {\n const oi = packet._owner.indexOf(packet);\n if (oi >= 0) {\n packet._owner.splice(oi, 1);\n }\n packet._owner = undefined;\n }\n packet.systemUBO.destroy();\n for (const tex of packet._boundTextures) {\n releaseTexture(tex);\n }\n packet._boundTextures = [];\n packet._boundStorageBuffers = [];\n });\n scene._meshDisposables.set(mesh, list);\n}\n\nfunction writeSystemUniforms(data: Float32Array, spec: UboSpec, material: ShaderMaterial, mesh: Mesh, camera: Camera | null, targetWidth: number, targetHeight: number): void {\n data.fill(0);\n const world = mesh.worldMatrix as unknown as Float32Array;\n const aspect = camera ? getEffectiveAspectRatio(camera, targetWidth, targetHeight) : 1;\n const view = camera ? (getViewMatrix(camera) as unknown as Float32Array) : null;\n const projection = camera ? (getProjectionMatrix(camera, aspect) as unknown as Float32Array) : null;\n const viewProjection = camera ? (getViewProjectionMatrix(camera, aspect) as unknown as Float32Array) : null;\n for (const uniform of material.uniformDecls) {\n if (!_isShaderSystemUniform(uniform.name)) {\n continue;\n }\n const offset = spec._offsets.get(uniform.name);\n if (offset === undefined) {\n continue;\n }\n const f = offset / 4;\n switch (uniform.name) {\n case \"world\":\n data.set(world, f);\n break;\n case \"view\":\n if (view) {\n data.set(view, f);\n }\n break;\n case \"projection\":\n if (projection) {\n data.set(projection, f);\n }\n break;\n case \"viewProjection\":\n if (viewProjection) {\n data.set(viewProjection, f);\n }\n break;\n case \"worldView\":\n if (view) {\n mat4MultiplyInto(data, f, view, 0, world, 0);\n }\n break;\n case \"worldViewProjection\":\n if (viewProjection) {\n mat4MultiplyInto(data, f, viewProjection, 0, world, 0);\n }\n break;\n case \"cameraPosition\":\n if (camera) {\n const wm = camera.worldMatrix as unknown as ArrayLike<number>;\n data[f] = wm[12]!;\n data[f + 1] = wm[13]!;\n data[f + 2] = wm[14]!;\n }\n break;\n case \"screenSize\":\n data[f] = targetWidth;\n data[f + 1] = targetHeight;\n break;\n case \"alphaCutoff\":\n data[f] = material._uniformValues.get(\"alphaCutoff\")?.value[0] ?? 0.4;\n break;\n }\n }\n}\n\nlet zeroAttrCache: WeakMap<object, Map<string, GPUBuffer>> | null = null;\n\nfunction getZeroAttrBuffer(engine: EngineContext, gpu: MeshGPU, name: string): GPUBuffer {\n if (!zeroAttrCache) {\n zeroAttrCache = new WeakMap();\n }\n let cache = zeroAttrCache.get(gpu as unknown as object);\n if (!cache) {\n cache = new Map();\n zeroAttrCache.set(gpu as unknown as object, cache);\n }\n const existing = cache.get(name);\n if (existing) {\n return existing;\n }\n const vertexCount = gpu.positionBuffer.size / 12;\n const stride = name === \"uv\" || name === \"uv2\" ? 8 : name === \"normal\" ? 12 : 16;\n const buffer = engine._device.createBuffer({ label: `shader-zero-${name}`, size: vertexCount * stride, usage: BU.VERTEX | BU.COPY_DST });\n cache.set(name, buffer);\n return buffer;\n}\n\nfunction getAttrBuffer(engine: EngineContext, gpu: MeshGPU, name: ShaderAttributeName): GPUBuffer {\n switch (name) {\n case \"position\":\n return gpu.positionBuffer;\n case \"normal\":\n return gpu.normalBuffer ?? getZeroAttrBuffer(engine, gpu, \"normal\");\n case \"uv\":\n return gpu.uvBuffer ?? getZeroAttrBuffer(engine, gpu, \"uv\");\n case \"uv2\":\n return gpu.uv2Buffer ?? getZeroAttrBuffer(engine, gpu, \"uv2\");\n case \"tangent\":\n return gpu.tangentBuffer ?? getZeroAttrBuffer(engine, gpu, \"tangent\");\n case \"color\":\n return gpu.colorBuffer ?? getZeroAttrBuffer(engine, gpu, \"color\");\n }\n}\n"],"names":[],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- import { syncThinInstanceBuffers } from "./thin-instance-gpu-uY2NOv0J.js";
1
+ import { syncThinInstanceBuffers } from "./thin-instance-gpu-C1DGstap.js";
2
2
  function instanceVertexLayouts(baseLocation, hasColor) {
3
3
  const layouts = [
4
4
  {
@@ -147,4 +147,4 @@ function buildShaderRenderablesWithInstancing(scene, meshes, buildPlain, createP
147
147
  export {
148
148
  buildShaderRenderablesWithInstancing
149
149
  };
150
- //# sourceMappingURL=shader-thin-instance-CkQ8rrfH.js.map
150
+ //# sourceMappingURL=shader-thin-instance-CsDo3ULk.js.map