@babylonjs/lite 0.2.0 → 1.0.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 (249) hide show
  1. package/{_mat4-storage-f64-Bvh5TymE.js → _mat4-storage-f64-CjDoht2w.js} +3 -2
  2. package/_mat4-storage-f64-CjDoht2w.js.map +1 -0
  3. package/{alpha-test-fragment-BCChpzaV.js → alpha-test-fragment-B7DjSnF7.js} +2 -2
  4. package/{alpha-test-fragment-BCChpzaV.js.map → alpha-test-fragment-B7DjSnF7.js.map} +1 -1
  5. package/assets/splat-sort-worker-DT3eybMZ.js.map +1 -0
  6. package/{background-dds-skybox-ZjrSIxrT.js → background-dds-skybox-BEX309u3.js} +13 -13
  7. package/background-dds-skybox-BEX309u3.js.map +1 -0
  8. package/{background-ground-B2Mie-MI.js → background-ground-BU0HOcM4.js} +19 -19
  9. package/background-ground-BU0HOcM4.js.map +1 -0
  10. package/{background-hdr-skybox-DDRJYuT2.js → background-hdr-skybox--RRRic_K.js} +10 -10
  11. package/background-hdr-skybox--RRRic_K.js.map +1 -0
  12. package/{background-solid-skybox-fjXlnWaD.js → background-solid-skybox-BrH2fXSu.js} +11 -12
  13. package/background-solid-skybox-BrH2fXSu.js.map +1 -0
  14. package/{billboard-renderable-DKmlOgbM.js → billboard-renderable-BHWryAeC.js} +46 -10
  15. package/billboard-renderable-BHWryAeC.js.map +1 -0
  16. package/{clamp-block-CxRBPlUq.js → clamp-block-DqbwnQGW.js} +2 -2
  17. package/{clamp-block-CxRBPlUq.js.map → clamp-block-DqbwnQGW.js.map} +1 -1
  18. package/{clearcoat-fragment-KbZAa0TA.js → clearcoat-fragment-D6FSCie1.js} +2 -2
  19. package/{clearcoat-fragment-KbZAa0TA.js.map → clearcoat-fragment-D6FSCie1.js.map} +1 -1
  20. package/{create-skeleton-BBI5urcj.js → create-skeleton-D_uplboC.js} +9 -9
  21. package/create-skeleton-D_uplboC.js.map +1 -0
  22. package/{cubemap-skybox-material-DvW81drX.js → cubemap-skybox-material-DQcMMdf-.js} +6 -7
  23. package/cubemap-skybox-material-DQcMMdf-.js.map +1 -0
  24. package/{curve-block-Dh_xdUj-.js → curve-block-21rT0JjG.js} +2 -2
  25. package/{curve-block-Dh_xdUj-.js.map → curve-block-21rT0JjG.js.map} +1 -1
  26. package/{emissive-fragment-DD8cvHyx.js → emissive-fragment-C5FtBs3y.js} +3 -3
  27. package/emissive-fragment-C5FtBs3y.js.map +1 -0
  28. package/{esm-shadow-view-DYAc62Kl.js → esm-shadow-view-Cl3rPGof.js} +2 -2
  29. package/{esm-shadow-view-DYAc62Kl.js.map → esm-shadow-view-Cl3rPGof.js.map} +1 -1
  30. package/{esm-shadow-view-DHVS9r7H.js → esm-shadow-view-Gtd1LWRP.js} +2 -2
  31. package/{esm-shadow-view-DHVS9r7H.js.map → esm-shadow-view-Gtd1LWRP.js.map} +1 -1
  32. package/{esm-shadow-view-15S4JK6p.js → esm-shadow-view-c5YV4Eg9.js} +2 -2
  33. package/{esm-shadow-view-15S4JK6p.js.map → esm-shadow-view-c5YV4Eg9.js.map} +1 -1
  34. package/{gaussian-splatting-pipeline-sh-BvkUhA9V.js → gaussian-splatting-pipeline-sh-7J31V23x.js} +19 -19
  35. package/gaussian-splatting-pipeline-sh-7J31V23x.js.map +1 -0
  36. package/geometry-texture-output-dXk4E9uu.js +41 -0
  37. package/geometry-texture-output-dXk4E9uu.js.map +1 -0
  38. package/geometry-view-BsFJpBJa.js +404 -0
  39. package/geometry-view-BsFJpBJa.js.map +1 -0
  40. package/{gltf-animation-KnPzeOIY.js → gltf-animation-K_zZxj_d.js} +6 -6
  41. package/gltf-animation-K_zZxj_d.js.map +1 -0
  42. package/{gltf-ext-basisu-kmth3UWX.js → gltf-ext-basisu-CDbPclzZ.js} +48 -16
  43. package/gltf-ext-basisu-CDbPclzZ.js.map +1 -0
  44. package/{gltf-ext-node-visibility-BjRRd6si.js → gltf-ext-node-visibility-DXCJEYr6.js} +2 -2
  45. package/{gltf-ext-node-visibility-BjRRd6si.js.map → gltf-ext-node-visibility-DXCJEYr6.js.map} +1 -1
  46. package/{gltf-ext-quantization-CpZyLDIz.js → gltf-ext-quantization-CvHI_0Vg.js} +4 -3
  47. package/gltf-ext-quantization-CvHI_0Vg.js.map +1 -0
  48. package/{gltf-ext-uv-transform-MHmR-YyM.js → gltf-ext-uv-transform-DgYazJBs.js} +2 -2
  49. package/{gltf-ext-uv-transform-MHmR-YyM.js.map → gltf-ext-uv-transform-DgYazJBs.js.map} +1 -1
  50. package/{gltf-feature-animation-pointer-rFqLfbO_.js → gltf-feature-animation-pointer-D1RJRFBw.js} +9 -9
  51. package/gltf-feature-animation-pointer-D1RJRFBw.js.map +1 -0
  52. package/{gltf-feature-animations-DikONdzi.js → gltf-feature-animations-Cmc1uoIu.js} +2 -2
  53. package/{gltf-feature-animations-DikONdzi.js.map → gltf-feature-animations-Cmc1uoIu.js.map} +1 -1
  54. package/{gltf-feature-draco-yGSMGTE3.js → gltf-feature-draco-CKKzT5E3.js} +6 -5
  55. package/gltf-feature-draco-CKKzT5E3.js.map +1 -0
  56. package/{gltf-feature-gpu-instancing-Cj1XjmM6.js → gltf-feature-gpu-instancing-n87SO6Vh.js} +4 -4
  57. package/gltf-feature-gpu-instancing-n87SO6Vh.js.map +1 -0
  58. package/{gltf-feature-lights-punctual-C-0SlGmD.js → gltf-feature-lights-punctual-Ckm3ciL8.js} +5 -5
  59. package/{gltf-feature-lights-punctual-C-0SlGmD.js.map → gltf-feature-lights-punctual-Ckm3ciL8.js.map} +1 -1
  60. package/{gltf-feature-meshopt-Des96YFI.js → gltf-feature-meshopt-DLC4SF1E.js} +7 -6
  61. package/gltf-feature-meshopt-DLC4SF1E.js.map +1 -0
  62. package/{gltf-feature-morph-BAcY14XU.js → gltf-feature-morph-Cjtu7hYa.js} +4 -4
  63. package/gltf-feature-morph-Cjtu7hYa.js.map +1 -0
  64. package/{gltf-feature-registry-97sY_x5O.js → gltf-feature-registry-C63Hjp9w.js} +15 -15
  65. package/{gltf-feature-registry-97sY_x5O.js.map → gltf-feature-registry-C63Hjp9w.js.map} +1 -1
  66. package/{gltf-feature-skeleton-lVjkDfIU.js → gltf-feature-skeleton-DKbOGidp.js} +3 -3
  67. package/{gltf-feature-skeleton-lVjkDfIU.js.map → gltf-feature-skeleton-DKbOGidp.js.map} +1 -1
  68. package/{gltf-feature-variants-BphF4JmV.js → gltf-feature-variants-Cmzu0O0e.js} +2 -2
  69. package/{gltf-feature-variants-BphF4JmV.js.map → gltf-feature-variants-Cmzu0O0e.js.map} +1 -1
  70. package/{gltf-glb-parser-D6UZWFuC.js → gltf-glb-parser-Cj5MHS-v.js} +5 -4
  71. package/gltf-glb-parser-Cj5MHS-v.js.map +1 -0
  72. package/{gltf-interleave-C9eBqH_F.js → gltf-interleave-gHf9_t0i.js} +14 -14
  73. package/gltf-interleave-gHf9_t0i.js.map +1 -0
  74. package/{gltf-pbr-builder-ext-DPC0zg_u.js → gltf-pbr-builder-ext-edNcjwPf.js} +5 -5
  75. package/gltf-pbr-builder-ext-edNcjwPf.js.map +1 -0
  76. package/{gltf-variants-CnBEZr0o.js → gltf-variants-CPxNdtP4.js} +4 -4
  77. package/{gltf-variants-CnBEZr0o.js.map → gltf-variants-CPxNdtP4.js.map} +1 -1
  78. package/{gs-picking-pipeline-Bx8LTav6.js → gs-picking-pipeline-DYaW_Lg3.js} +14 -14
  79. package/gs-picking-pipeline-DYaW_Lg3.js.map +1 -0
  80. package/havok-floating-origin-Dr-18Nds.js +198 -0
  81. package/havok-floating-origin-Dr-18Nds.js.map +1 -0
  82. package/index-CLElg2Bo.js +39209 -0
  83. package/index-CLElg2Bo.js.map +1 -0
  84. package/index-CYZDclhF.js +918 -0
  85. package/index-CYZDclhF.js.map +1 -0
  86. package/index-SMJ67XwT.js +3330 -0
  87. package/index-SMJ67XwT.js.map +1 -0
  88. package/index.d.ts +2007 -105
  89. package/index.js +446 -322
  90. package/{input-block-Coi_aZwl.js → input-block-DqEedWF2.js} +2 -2
  91. package/{input-block-Coi_aZwl.js.map → input-block-DqEedWF2.js.map} +1 -1
  92. package/{iridescence-fragment-DwZcCTdD.js → iridescence-fragment-BHU59-gQ.js} +2 -2
  93. package/{iridescence-fragment-DwZcCTdD.js.map → iridescence-fragment-BHU59-gQ.js.map} +1 -1
  94. package/{light-block-Np_h5gPI.js → light-block-Bv37V8vl.js} +2 -2
  95. package/{light-block-Np_h5gPI.js.map → light-block-Bv37V8vl.js.map} +1 -1
  96. package/{loop-block-BFkLFYGm.js → loop-block-qTg8vb99.js} +2 -2
  97. package/{loop-block-BFkLFYGm.js.map → loop-block-qTg8vb99.js.map} +1 -1
  98. package/{morph-fragment-DqH-w61u.js → morph-fragment-BRCUr2wQ.js} +2 -2
  99. package/{morph-fragment-DqH-w61u.js.map → morph-fragment-BRCUr2wQ.js.map} +1 -1
  100. package/{multilight-wgsl-B9Mf9d-q.js → multilight-wgsl-DMeppAdZ.js} +2 -2
  101. package/{multilight-wgsl-B9Mf9d-q.js.map → multilight-wgsl-DMeppAdZ.js.map} +1 -1
  102. package/{node-env-BPZXZzBf.js → node-env-Bc559GmY.js} +6 -5
  103. package/node-env-Bc559GmY.js.map +1 -0
  104. package/node-geometry-view-COmWsRXK.js +291 -0
  105. package/node-geometry-view-COmWsRXK.js.map +1 -0
  106. package/{node-registry-extra-compat-Ch7ApZHF.js → node-registry-extra-compat-dWrv7gpS.js} +2 -2
  107. package/{node-registry-extra-compat-Ch7ApZHF.js.map → node-registry-extra-compat-dWrv7gpS.js.map} +1 -1
  108. package/{node-registry-extra-math-6ezzTkPj.js → node-registry-extra-math-Bn854sX9.js} +2 -2
  109. package/{node-registry-extra-math-6ezzTkPj.js.map → node-registry-extra-math-Bn854sX9.js.map} +1 -1
  110. package/{node-renderable-CS0CmsSp.js → node-renderable-B5G8WcdH.js} +15 -13
  111. package/node-renderable-B5G8WcdH.js.map +1 -0
  112. package/{node-shadow-CpnrdvtJ.js → node-shadow-CVIUlNf0.js} +7 -7
  113. package/node-shadow-CVIUlNf0.js.map +1 -0
  114. package/{normal-map-fragment-DradEMl-.js → normal-map-fragment-CQSxhjCy.js} +2 -2
  115. package/{normal-map-fragment-DradEMl-.js.map → normal-map-fragment-CQSxhjCy.js.map} +1 -1
  116. package/package.json +3 -10
  117. package/{parse-camera-CgV4bWc0.js → parse-camera-pBRT_6i5.js} +2 -2
  118. package/{parse-camera-CgV4bWc0.js.map → parse-camera-pBRT_6i5.js.map} +1 -1
  119. package/pbr-geometry-view-NiZY_juX.js +491 -0
  120. package/pbr-geometry-view-NiZY_juX.js.map +1 -0
  121. package/{pbr-metallic-roughness-block-BFwZj2Nw.js → pbr-metallic-roughness-block-JBSi-tQN.js} +2 -2
  122. package/{pbr-metallic-roughness-block-BFwZj2Nw.js.map → pbr-metallic-roughness-block-JBSi-tQN.js.map} +1 -1
  123. package/{pbr-metallic-roughness-block-full-5t0HT3xl.js → pbr-metallic-roughness-block-full-Ta9lR2cz.js} +2 -2
  124. package/{pbr-metallic-roughness-block-full-5t0HT3xl.js.map → pbr-metallic-roughness-block-full-Ta9lR2cz.js.map} +1 -1
  125. package/{pbr-mr-helper-core-R5tOZ8Ap.js → pbr-mr-helper-core-BVWNR08D.js} +2 -2
  126. package/{pbr-mr-helper-core-R5tOZ8Ap.js.map → pbr-mr-helper-core-BVWNR08D.js.map} +1 -1
  127. package/{pbr-refraction-Dd11HnaI.js → pbr-refraction-C9FvFmAp.js} +2 -2
  128. package/{pbr-refraction-Dd11HnaI.js.map → pbr-refraction-C9FvFmAp.js.map} +1 -1
  129. package/{pbr-renderable-BHAdF5Vw.js → pbr-renderable-DzUF2QIk.js} +60 -42
  130. package/pbr-renderable-DzUF2QIk.js.map +1 -0
  131. package/{pbr-shadow-fragment-BxUrFJYZ.js → pbr-shadow-fragment-CnqnbGYS.js} +2 -2
  132. package/{pbr-shadow-fragment-BxUrFJYZ.js.map → pbr-shadow-fragment-CnqnbGYS.js.map} +1 -1
  133. package/{pbr-tracking-D6i3yPb7.js → pbr-tracking-3tU1kqea.js} +2 -2
  134. package/{pbr-tracking-D6i3yPb7.js.map → pbr-tracking-3tU1kqea.js.map} +1 -1
  135. package/{pbr-transmission-ext-Dll8EYwE.js → pbr-transmission-ext-BcLjRxfB.js} +2 -2
  136. package/{pbr-transmission-ext-Dll8EYwE.js.map → pbr-transmission-ext-BcLjRxfB.js.map} +1 -1
  137. package/recast-navigation.wasm-DG_0AFuk.js +8706 -0
  138. package/recast-navigation.wasm-DG_0AFuk.js.map +1 -0
  139. package/recast-navigation.wasm-compat-C-Bf2ylB.js +8692 -0
  140. package/recast-navigation.wasm-compat-C-Bf2ylB.js.map +1 -0
  141. package/{reflectance-fragment-ejMJ4O1o.js → reflectance-fragment-Dbpgw3Jt.js} +2 -2
  142. package/{reflectance-fragment-ejMJ4O1o.js.map → reflectance-fragment-Dbpgw3Jt.js.map} +1 -1
  143. package/{rgbd-decode-DCvzUYeI.js → rgbd-decode-DoyUquy3.js} +7 -6
  144. package/rgbd-decode-DoyUquy3.js.map +1 -0
  145. package/{scene-material-swap-C2ykv55W.js → scene-material-swap-nNUH4nGn.js} +11 -4
  146. package/scene-material-swap-nNUH4nGn.js.map +1 -0
  147. package/screenshot-readback-D0Sj9qq3.js +92 -0
  148. package/screenshot-readback-D0Sj9qq3.js.map +1 -0
  149. package/{mesh-features-BAJpbMog.js → shader-composer-BUD_pSX4.js} +3 -54
  150. package/shader-composer-BUD_pSX4.js.map +1 -0
  151. package/{shader-renderable-BMf_vvO0.js → shader-renderable-D7-RyVxa.js} +25 -19
  152. package/shader-renderable-D7-RyVxa.js.map +1 -0
  153. package/{shader-thin-instance-5_WUfi3m.js → shader-thin-instance-DuBotxDO.js} +4 -4
  154. package/shader-thin-instance-DuBotxDO.js.map +1 -0
  155. package/{sheen-fragment-CS6z29Fs.js → sheen-fragment-1MkEMcbc.js} +2 -2
  156. package/{sheen-fragment-CS6z29Fs.js.map → sheen-fragment-1MkEMcbc.js.map} +1 -1
  157. package/{singlelight-directional-wgsl-4MIgZMeC.js → singlelight-directional-wgsl-BsV8G456.js} +2 -2
  158. package/{singlelight-directional-wgsl-4MIgZMeC.js.map → singlelight-directional-wgsl-BsV8G456.js.map} +1 -1
  159. package/{singlelight-hemispheric-wgsl-CK-GUYWe.js → singlelight-hemispheric-wgsl-Bo0jKlW5.js} +2 -2
  160. package/{singlelight-hemispheric-wgsl-CK-GUYWe.js.map → singlelight-hemispheric-wgsl-Bo0jKlW5.js.map} +1 -1
  161. package/{singlelight-point-wgsl-CYtzqCbP.js → singlelight-point-wgsl-DV39UP5Y.js} +2 -2
  162. package/{singlelight-point-wgsl-CYtzqCbP.js.map → singlelight-point-wgsl-DV39UP5Y.js.map} +1 -1
  163. package/{singlelight-spot-wgsl-DVbaVufF.js → singlelight-spot-wgsl-yg3od6vL.js} +2 -2
  164. package/{singlelight-spot-wgsl-DVbaVufF.js.map → singlelight-spot-wgsl-yg3od6vL.js.map} +1 -1
  165. package/{skeleton-fragment-BOVmc8YS.js → skeleton-fragment-DdxYG6kv.js} +2 -2
  166. package/{skeleton-fragment-BOVmc8YS.js.map → skeleton-fragment-DdxYG6kv.js.map} +1 -1
  167. package/{skybox-renderable-DDcCPSly.js → skybox-renderable-CJD4XmX5.js} +7 -8
  168. package/skybox-renderable-CJD4XmX5.js.map +1 -0
  169. package/{splat-ply-compressed-BahdBG1r.js → splat-ply-compressed-DHjyiVmI.js} +9 -8
  170. package/splat-ply-compressed-DHjyiVmI.js.map +1 -0
  171. package/{standard-renderable-D1bhoF0K.js → standard-pipeline-XTbHL7MY.js} +11 -202
  172. package/standard-pipeline-XTbHL7MY.js.map +1 -0
  173. package/standard-renderable-CREWLNHI.js +191 -0
  174. package/standard-renderable-CREWLNHI.js.map +1 -0
  175. package/{std-ambient-fragment-C6WNm8dQ.js → std-ambient-fragment-Bjx3VFrr.js} +2 -2
  176. package/{std-ambient-fragment-C6WNm8dQ.js.map → std-ambient-fragment-Bjx3VFrr.js.map} +1 -1
  177. package/{std-cube-reflection-fragment-Bqutpy2q.js → std-cube-reflection-fragment-y9WWdXUt.js} +2 -2
  178. package/{std-cube-reflection-fragment-Bqutpy2q.js.map → std-cube-reflection-fragment-y9WWdXUt.js.map} +1 -1
  179. package/{std-emissive-fragment-B-A83rqX.js → std-emissive-fragment-C8Lnmojh.js} +2 -2
  180. package/{std-emissive-fragment-B-A83rqX.js.map → std-emissive-fragment-C8Lnmojh.js.map} +1 -1
  181. package/{std-lightmap-fragment-Df7KJezh.js → std-lightmap-fragment-DFxGcoA5.js} +2 -2
  182. package/{std-lightmap-fragment-Df7KJezh.js.map → std-lightmap-fragment-DFxGcoA5.js.map} +1 -1
  183. package/{std-opacity-fragment-D9et2jip.js → std-opacity-fragment-EXzFWiSp.js} +2 -2
  184. package/{std-opacity-fragment-D9et2jip.js.map → std-opacity-fragment-EXzFWiSp.js.map} +1 -1
  185. package/{std-reflection-fragment-DBJeT-yg.js → std-reflection-fragment-BoJORqpG.js} +2 -2
  186. package/{std-reflection-fragment-DBJeT-yg.js.map → std-reflection-fragment-BoJORqpG.js.map} +1 -1
  187. package/{std-shadow-fragment-C6fD8rW-.js → std-shadow-fragment-Bq-Wc8UJ.js} +2 -2
  188. package/{std-shadow-fragment-C6fD8rW-.js.map → std-shadow-fragment-Bq-Wc8UJ.js.map} +1 -1
  189. package/{std-specular-fragment-C2ZOss-t.js → std-specular-fragment-CM5R5j2g.js} +2 -2
  190. package/{std-specular-fragment-C2ZOss-t.js.map → std-specular-fragment-CM5R5j2g.js.map} +1 -1
  191. package/{std-tracking-C4L4nQGc.js → std-tracking-Cif_wXeT.js} +2 -2
  192. package/{std-tracking-C4L4nQGc.js.map → std-tracking-Cif_wXeT.js.map} +1 -1
  193. package/{subsurface-fragment-C1H4ytqK.js → subsurface-fragment-BEaAXYXz.js} +2 -2
  194. package/{subsurface-fragment-C1H4ytqK.js.map → subsurface-fragment-BEaAXYXz.js.map} +1 -1
  195. package/swapchain-overlay-UCLilhbq.js +37 -0
  196. package/swapchain-overlay-UCLilhbq.js.map +1 -0
  197. package/{thin-instance-cull-binding-CCxrPNO6.js → thin-instance-cull-binding-DWKUt5ZN.js} +12 -12
  198. package/thin-instance-cull-binding-DWKUt5ZN.js.map +1 -0
  199. package/{thin-instance-gpu-E8DBd8XL.js → thin-instance-gpu-BDdRcNAh.js} +15 -7
  200. package/thin-instance-gpu-BDdRcNAh.js.map +1 -0
  201. package/{tracking-primitives-w4BVV9p9.js → tracking-primitives-CglRNTlX.js} +2 -2
  202. package/{tracking-primitives-w4BVV9p9.js.map → tracking-primitives-CglRNTlX.js.map} +1 -1
  203. package/{unlit-fragment-DU9_mhzZ.js → unlit-fragment-kxfZWlnp.js} +2 -2
  204. package/{unlit-fragment-DU9_mhzZ.js.map → unlit-fragment-kxfZWlnp.js.map} +1 -1
  205. package/_mat4-storage-f64-Bvh5TymE.js.map +0 -1
  206. package/assets/splat-sort-worker-Crg3CaCc.js.map +0 -1
  207. package/background-dds-skybox-ZjrSIxrT.js.map +0 -1
  208. package/background-ground-B2Mie-MI.js.map +0 -1
  209. package/background-hdr-skybox-DDRJYuT2.js.map +0 -1
  210. package/background-solid-skybox-fjXlnWaD.js.map +0 -1
  211. package/billboard-renderable-DKmlOgbM.js.map +0 -1
  212. package/create-skeleton-BBI5urcj.js.map +0 -1
  213. package/cubemap-skybox-material-DvW81drX.js.map +0 -1
  214. package/emissive-fragment-DD8cvHyx.js.map +0 -1
  215. package/gaussian-splatting-pipeline-sh-BvkUhA9V.js.map +0 -1
  216. package/gltf-animation-KnPzeOIY.js.map +0 -1
  217. package/gltf-ext-basisu-kmth3UWX.js.map +0 -1
  218. package/gltf-ext-quantization-CpZyLDIz.js.map +0 -1
  219. package/gltf-feature-animation-pointer-rFqLfbO_.js.map +0 -1
  220. package/gltf-feature-draco-yGSMGTE3.js.map +0 -1
  221. package/gltf-feature-gpu-instancing-Cj1XjmM6.js.map +0 -1
  222. package/gltf-feature-meshopt-Des96YFI.js.map +0 -1
  223. package/gltf-feature-morph-BAcY14XU.js.map +0 -1
  224. package/gltf-glb-parser-D6UZWFuC.js.map +0 -1
  225. package/gltf-interleave-C9eBqH_F.js.map +0 -1
  226. package/gltf-pbr-builder-ext-DPC0zg_u.js.map +0 -1
  227. package/gs-picking-pipeline-Bx8LTav6.js.map +0 -1
  228. package/index-B7Qhw0xL.js +0 -21232
  229. package/index-B7Qhw0xL.js.map +0 -1
  230. package/mesh-features-BAJpbMog.js.map +0 -1
  231. package/no-color-view-DsyLSL-W.js +0 -8
  232. package/no-color-view-DsyLSL-W.js.map +0 -1
  233. package/node-env-BPZXZzBf.js.map +0 -1
  234. package/node-registry-Bd-AlrgC.js +0 -190
  235. package/node-registry-Bd-AlrgC.js.map +0 -1
  236. package/node-renderable-CS0CmsSp.js.map +0 -1
  237. package/node-shadow-CpnrdvtJ.js.map +0 -1
  238. package/pbr-renderable-BHAdF5Vw.js.map +0 -1
  239. package/rgbd-decode-DCvzUYeI.js.map +0 -1
  240. package/scene-material-swap-C2ykv55W.js.map +0 -1
  241. package/shader-renderable-BMf_vvO0.js.map +0 -1
  242. package/shader-thin-instance-5_WUfi3m.js.map +0 -1
  243. package/skybox-renderable-DDcCPSly.js.map +0 -1
  244. package/splat-ply-compressed-BahdBG1r.js.map +0 -1
  245. package/standard-renderable-D1bhoF0K.js.map +0 -1
  246. package/swapchain-overlay-DcCSFDp7.js +0 -35
  247. package/swapchain-overlay-DcCSFDp7.js.map +0 -1
  248. package/thin-instance-cull-binding-CCxrPNO6.js.map +0 -1
  249. package/thin-instance-gpu-E8DBd8XL.js.map +0 -1
@@ -1,4 +1,4 @@
1
- import { ae as PBR_HAS_METALLIC_REFLECTANCE_MAP, af as PBR_HAS_REFLECTANCE_MAP, ag as PBR2_HAS_REFLECTANCE_FACTORS, ah as PBR2_HAS_UV2, ai as PBR_HAS_USE_ALPHA_ONLY_MR } from "./index-B7Qhw0xL.js";
1
+ import { aJ as PBR_HAS_METALLIC_REFLECTANCE_MAP, aK as PBR_HAS_REFLECTANCE_MAP, aL as PBR2_HAS_REFLECTANCE_FACTORS, aM as PBR2_HAS_UV2, aN as PBR_HAS_USE_ALPHA_ONLY_MR } from "./index-CLElg2Bo.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-ejMJ4O1o.js.map
143
+ //# sourceMappingURL=reflectance-fragment-Dbpgw3Jt.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"reflectance-fragment-ejMJ4O1o.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-Dbpgw3Jt.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,3 +1,4 @@
1
+ import { T as TU } from "./index-CLElg2Bo.js";
1
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));}`;
2
3
  let _device = null;
3
4
  let _module = null;
@@ -49,13 +50,13 @@ function decodeBrdfPng(engine, image) {
49
50
  const inputTex = device.createTexture({
50
51
  size: { width: w, height: h },
51
52
  format: "rgba8unorm",
52
- usage: GPUTextureUsage.TEXTURE_BINDING | GPUTextureUsage.COPY_DST | GPUTextureUsage.RENDER_ATTACHMENT
53
+ usage: TU.TEXTURE_BINDING | TU.COPY_DST | TU.RENDER_ATTACHMENT
53
54
  });
54
55
  device.queue.copyExternalImageToTexture({ source: image, flipY: false }, { texture: inputTex, premultipliedAlpha: false }, { width: w, height: h });
55
56
  const texture = device.createTexture({
56
57
  size: { width: w, height: h },
57
58
  format: "rgba16float",
58
- usage: GPUTextureUsage.TEXTURE_BINDING | GPUTextureUsage.STORAGE_BINDING
59
+ usage: TU.TEXTURE_BINDING | TU.STORAGE_BINDING
59
60
  });
60
61
  const bg = makeBindGroup(device, pipeline, inputTex.createView(), texture.createView());
61
62
  const enc = device.createCommandEncoder();
@@ -71,7 +72,7 @@ function uploadCubemapRGBD(engine, images, width, mipCount) {
71
72
  size: { width, height: width, depthOrArrayLayers: 6 },
72
73
  format: "rgba16float",
73
74
  mipLevelCount: mipCount,
74
- usage: GPUTextureUsage.TEXTURE_BINDING | GPUTextureUsage.COPY_DST | GPUTextureUsage.COPY_SRC | GPUTextureUsage.RENDER_ATTACHMENT,
75
+ usage: TU.TEXTURE_BINDING | TU.COPY_DST | TU.COPY_SRC | TU.RENDER_ATTACHMENT,
75
76
  dimension: "2d"
76
77
  });
77
78
  for (let mip = 0; mip < mipCount; mip++) {
@@ -79,12 +80,12 @@ function uploadCubemapRGBD(engine, images, width, mipCount) {
79
80
  const inputTex = device.createTexture({
80
81
  size: { width: mipSize, height: mipSize },
81
82
  format: "rgba8unorm",
82
- usage: GPUTextureUsage.TEXTURE_BINDING | GPUTextureUsage.COPY_DST | GPUTextureUsage.RENDER_ATTACHMENT
83
+ usage: TU.TEXTURE_BINDING | TU.COPY_DST | TU.RENDER_ATTACHMENT
83
84
  });
84
85
  const outputTex = device.createTexture({
85
86
  size: { width: mipSize, height: mipSize },
86
87
  format: "rgba16float",
87
- usage: GPUTextureUsage.STORAGE_BINDING | GPUTextureUsage.COPY_SRC
88
+ usage: TU.STORAGE_BINDING | TU.COPY_SRC
88
89
  });
89
90
  const bindGroup = makeBindGroup(device, pipeline, inputTex.createView(), outputTex.createView());
90
91
  for (let face = 0; face < 6; face++) {
@@ -107,4 +108,4 @@ export {
107
108
  decodeBrdfPng,
108
109
  uploadCubemapRGBD
109
110
  };
110
- //# sourceMappingURL=rgbd-decode-DCvzUYeI.js.map
111
+ //# sourceMappingURL=rgbd-decode-DoyUquy3.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rgbd-decode-DoyUquy3.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,13 +1,20 @@
1
1
  function processMaterialSwaps(scene) {
2
2
  const q = scene._materialSwapQueue;
3
+ const device = scene.surface.engine._device;
3
4
  for (const mesh of q) {
4
5
  mesh._materialDirty = false;
5
6
  const old = scene._meshDisposables.get(mesh);
6
7
  if (old) {
7
- for (const fn of old) {
8
- fn();
9
- }
10
8
  scene._meshDisposables.delete(mesh);
9
+ void device.queue.onSubmittedWorkDone().then(() => {
10
+ try {
11
+ for (const fn of old) {
12
+ fn();
13
+ }
14
+ } catch {
15
+ }
16
+ }).catch(() => {
17
+ });
11
18
  }
12
19
  const mat = mesh.material;
13
20
  const builder = mat == null ? void 0 : mat._buildGroup;
@@ -31,4 +38,4 @@ function processMaterialSwaps(scene) {
31
38
  export {
32
39
  processMaterialSwaps
33
40
  };
34
- //# sourceMappingURL=scene-material-swap-C2ykv55W.js.map
41
+ //# sourceMappingURL=scene-material-swap-nNUH4nGn.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scene-material-swap-nNUH4nGn.js","sources":["../src/scene/scene-material-swap.ts"],"sourcesContent":["import type { SceneContext } from \"./scene-core.js\";\nimport type { Mesh } from \"../mesh/mesh.js\";\n\n/** @internal Drain _materialSwapQueue: dispose old resources and rebuild renderables. */\nexport function processMaterialSwaps(scene: SceneContext): void {\n const q = scene._materialSwapQueue;\n const device = scene.surface.engine._device;\n for (const mesh of q) {\n (mesh as Mesh)._materialDirty = false;\n const old = scene._meshDisposables.get(mesh);\n if (old) {\n scene._meshDisposables.delete(mesh);\n // These disposables free the OLD renderable's GPU resources (per-mesh/material UBOs, the\n // GPU-cull state buffers, texture releases). They must NOT run synchronously: the old buffers\n // may still be referenced by a frame already submitted to the GPU this tick, and destroying\n // them now hits the validation error \"Buffer used in submit while destroyed\" (seen when a\n // plugin / shadow-receiver variant change swaps a planted mesh's material — e.g. planting a\n // fern or agave). The new renderable is rebuilt below and replaces the old one, so nothing\n // records the old resources again; defer the teardown until the GPU has drained the\n // currently-submitted work (onSubmittedWorkDone). Mirrors resizeMeshGeometry.\n void device.queue\n .onSubmittedWorkDone()\n .then(() => {\n try {\n for (const fn of old) {\n fn();\n }\n } catch {\n // Device may have been lost/disposed before the deferred teardown ran.\n }\n })\n .catch(() => {});\n }\n\n const mat = mesh.material;\n const builder = mat?._buildGroup;\n if (!builder) {\n continue;\n }\n const rebuild = builder._rebuildSingle;\n if (!rebuild) {\n continue;\n }\n const renderable = rebuild(scene, mesh);\n // Insert by `order` so the renderable list stays sorted (frame-graph\n // tasks bucket opaque/direct/transparent at bind time).\n let i = scene._renderables.length;\n while (i > 0 && scene._renderables[i - 1]!.order > renderable.order) {\n i--;\n }\n scene._renderables.splice(i, 0, renderable);\n }\n q.length = 0;\n scene._renderableVersion++;\n}\n"],"names":[],"mappings":"AAIO,SAAS,qBAAqB,OAA2B;AAC5D,QAAM,IAAI,MAAM;AAChB,QAAM,SAAS,MAAM,QAAQ,OAAO;AACpC,aAAW,QAAQ,GAAG;AACjB,SAAc,iBAAiB;AAChC,UAAM,MAAM,MAAM,iBAAiB,IAAI,IAAI;AAC3C,QAAI,KAAK;AACL,YAAM,iBAAiB,OAAO,IAAI;AASlC,WAAK,OAAO,MACP,oBAAA,EACA,KAAK,MAAM;AACR,YAAI;AACA,qBAAW,MAAM,KAAK;AAClB,eAAA;AAAA,UACJ;AAAA,QACJ,QAAQ;AAAA,QAER;AAAA,MACJ,CAAC,EACA,MAAM,MAAM;AAAA,MAAC,CAAC;AAAA,IACvB;AAEA,UAAM,MAAM,KAAK;AACjB,UAAM,UAAU,2BAAK;AACrB,QAAI,CAAC,SAAS;AACV;AAAA,IACJ;AACA,UAAM,UAAU,QAAQ;AACxB,QAAI,CAAC,SAAS;AACV;AAAA,IACJ;AACA,UAAM,aAAa,QAAQ,OAAO,IAAI;AAGtC,QAAI,IAAI,MAAM,aAAa;AAC3B,WAAO,IAAI,KAAK,MAAM,aAAa,IAAI,CAAC,EAAG,QAAQ,WAAW,OAAO;AACjE;AAAA,IACJ;AACA,UAAM,aAAa,OAAO,GAAG,GAAG,UAAU;AAAA,EAC9C;AACA,IAAE,SAAS;AACX,QAAM;AACV;"}
@@ -0,0 +1,92 @@
1
+ import { B as BU, T as TU } from "./index-CLElg2Bo.js";
2
+ function alignBytesPerRow(width) {
3
+ return Math.ceil(width * 4 / 256) * 256;
4
+ }
5
+ function preFrame(surface) {
6
+ const queue = surface._captureQueue;
7
+ if (!queue || queue.length === 0 || surface._swapchainCopySrc) {
8
+ return;
9
+ }
10
+ surface._swapchainCopySrc = true;
11
+ surface._context.configure({ device: surface.engine._device, format: surface.format, alphaMode: surface._alphaMode, usage: TU.RENDER_ATTACHMENT | TU.COPY_SRC });
12
+ }
13
+ function service(surface, encoder) {
14
+ const queue = surface._captureQueue;
15
+ if (!queue || queue.length === 0) {
16
+ return;
17
+ }
18
+ if (!surface._swapchainCopySrc) {
19
+ return;
20
+ }
21
+ surface._captureQueue = void 0;
22
+ const tex = surface.scRT._colorTexture;
23
+ if (!tex) {
24
+ const err = new Error("captureScreenshot: no swapchain texture available");
25
+ for (const r of queue) {
26
+ r.reject(err);
27
+ }
28
+ return;
29
+ }
30
+ const width = surface.scRT._width;
31
+ const height = surface.scRT._height;
32
+ const bytesPerRow = alignBytesPerRow(width);
33
+ const buffer = surface.engine._device.createBuffer({
34
+ label: "screenshot-readback",
35
+ size: bytesPerRow * height,
36
+ usage: BU.COPY_DST | BU.MAP_READ
37
+ });
38
+ encoder.copyTextureToBuffer({ texture: tex }, { buffer, bytesPerRow, rowsPerImage: height }, { width, height, depthOrArrayLayers: 1 });
39
+ void finish({ buffer, width, height, bytesPerRow, bgra: surface.format.startsWith("bgra"), reqs: queue });
40
+ }
41
+ async function finish(pend) {
42
+ const { buffer, width, height, bytesPerRow, bgra, reqs } = pend;
43
+ try {
44
+ await Promise.resolve();
45
+ await buffer.mapAsync(GPUMapMode.READ);
46
+ const src = new Uint8Array(buffer.getMappedRange());
47
+ const out = new Uint8ClampedArray(width * height * 4);
48
+ for (let y = 0; y < height; y++) {
49
+ const srcRow = y * bytesPerRow;
50
+ const dstRow = y * width * 4;
51
+ for (let x = 0; x < width; x++) {
52
+ const s = srcRow + x * 4;
53
+ const d = dstRow + x * 4;
54
+ if (bgra) {
55
+ out[d] = src[s + 2];
56
+ out[d + 1] = src[s + 1];
57
+ out[d + 2] = src[s];
58
+ } else {
59
+ out[d] = src[s];
60
+ out[d + 1] = src[s + 1];
61
+ out[d + 2] = src[s + 2];
62
+ }
63
+ out[d + 3] = 255;
64
+ }
65
+ }
66
+ buffer.unmap();
67
+ buffer.destroy();
68
+ const shot = { width, height, data: out };
69
+ for (const r of reqs) {
70
+ r.resolve(shot);
71
+ }
72
+ } catch (e) {
73
+ try {
74
+ buffer.destroy();
75
+ } catch {
76
+ }
77
+ for (const r of reqs) {
78
+ r.reject(e);
79
+ }
80
+ }
81
+ }
82
+ function createCaptureService() {
83
+ return service;
84
+ }
85
+ function createCapturePreFrame() {
86
+ return preFrame;
87
+ }
88
+ export {
89
+ createCapturePreFrame,
90
+ createCaptureService
91
+ };
92
+ //# sourceMappingURL=screenshot-readback-D0Sj9qq3.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"screenshot-readback-D0Sj9qq3.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 { b1 as computeUboLayout, a$ as SCENE_UBO_WGSL } from "./index-B7Qhw0xL.js";
1
+ import { o as computeUboLayout, q as SCENE_UBO_WGSL } from "./index-CLElg2Bo.js";
2
2
  const STAGE_VERTEX = 1;
3
3
  const STAGE_FRAGMENT = 2;
4
4
  function topoSort(fragments) {
@@ -287,58 +287,7 @@ ${varyBody}
287
287
  _fragmentKey
288
288
  };
289
289
  }
290
- const MSH_HAS_TANGENTS = 1 << 0;
291
- const MSH_HAS_SKELETON = 1 << 1;
292
- const MSH_HAS_SKELETON_8 = 1 << 2;
293
- const MSH_HAS_MORPH_TARGETS = 1 << 3;
294
- const MSH_HAS_THIN_INSTANCES = 1 << 4;
295
- const MSH_HAS_INSTANCE_COLOR = 1 << 5;
296
- const MSH_HAS_VERTEX_COLOR = 1 << 6;
297
- const MSH_HAS_UV2 = 1 << 7;
298
- const MSH_RECEIVE_SHADOWS = 1 << 8;
299
- function _computeMeshFeatures(mesh, receiveShadows = false) {
300
- const gpu = mesh._gpu;
301
- let features = 0;
302
- if (gpu.tangentBuffer) {
303
- features |= MSH_HAS_TANGENTS;
304
- }
305
- if (mesh.skeleton) {
306
- features |= MSH_HAS_SKELETON;
307
- if (mesh.skeleton.joints1Buffer) {
308
- features |= MSH_HAS_SKELETON_8;
309
- }
310
- }
311
- if (mesh.morphTargets) {
312
- features |= MSH_HAS_MORPH_TARGETS;
313
- }
314
- if (mesh.thinInstances) {
315
- features |= MSH_HAS_THIN_INSTANCES;
316
- if (mesh.thinInstances.colors) {
317
- features |= MSH_HAS_INSTANCE_COLOR;
318
- }
319
- }
320
- if (gpu.colorBuffer) {
321
- features |= MSH_HAS_VERTEX_COLOR;
322
- }
323
- if (gpu.uv2Buffer) {
324
- features |= MSH_HAS_UV2;
325
- }
326
- if (receiveShadows) {
327
- features |= MSH_RECEIVE_SHADOWS;
328
- }
329
- return features;
330
- }
331
290
  export {
332
- MSH_HAS_SKELETON as M,
333
- _computeMeshFeatures as _,
334
- MSH_HAS_SKELETON_8 as a,
335
- MSH_HAS_MORPH_TARGETS as b,
336
- MSH_HAS_UV2 as c,
337
- MSH_HAS_TANGENTS as d,
338
- composeShader as e,
339
- MSH_RECEIVE_SHADOWS as f,
340
- MSH_HAS_THIN_INSTANCES as g,
341
- MSH_HAS_VERTEX_COLOR as h,
342
- MSH_HAS_INSTANCE_COLOR as i
291
+ composeShader as c
343
292
  };
344
- //# sourceMappingURL=mesh-features-BAJpbMog.js.map
293
+ //# sourceMappingURL=shader-composer-BUD_pSX4.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shader-composer-BUD_pSX4.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,5 +1,5 @@
1
- import { t as targetSignatureKey, j as getSceneBindGroupLayout, b3 as _isShaderSystemUniform, b1 as computeUboLayout, a$ as SCENE_UBO_WGSL, I as createEmptyUniformBuffer, b4 as acquireTexture, b5 as releaseTexture, b6 as getEffectiveAspectRatio, x as getViewMatrix, y as getProjectionMatrix, b2 as getViewProjectionMatrix, aH as mat4MultiplyInto } from "./index-B7Qhw0xL.js";
2
- const SHADER_STAGE_ALL = GPUShaderStage.VERTEX | GPUShaderStage.FRAGMENT;
1
+ import { x as targetSignatureKey, z as getSceneBindGroupLayout, bO as _isShaderSystemUniform, o as computeUboLayout, q as SCENE_UBO_WGSL, S as SS, _ as createEmptyUniformBuffer, a as F32, ax as acquireTexture, ay as releaseTexture, e as U8, bP as getEffectiveAspectRatio, I as getViewMatrix, J as getProjectionMatrix, bN as getViewProjectionMatrix, bd as mat4MultiplyInto, U as U32, bQ as I32, B as BU } from "./index-CLElg2Bo.js";
2
+ const SHADER_STAGE_ALL = SS.VERTEX | SS.FRAGMENT;
3
3
  function getOrCreateShaderPipelineBindings(engine, material) {
4
4
  const state = material;
5
5
  if (state._shaderBindings && state._shaderDevice === engine._device) {
@@ -60,12 +60,18 @@ ${material.fragmentSource}` }) : null;
60
60
  ...sig._depthStencilFormat ? {
61
61
  depthStencil: {
62
62
  format: sig._depthStencilFormat,
63
- depthCompare: material.depthCompare,
64
- depthWriteEnabled: material.needAlphaBlending ? false : material.depthWrite
63
+ // The target's declared depth convention wins over the material default: a depth-only
64
+ // caster authored for the forward-Z shadow map ("less-equal") must still depth-test
65
+ // correctly when drawn into a reverse-Z camera depth prepass that declares
66
+ // "greater-equal" — otherwise every fragment fails against the 0-cleared buffer.
67
+ depthCompare: sig._depthCompare ?? material.depthCompare,
68
+ depthWriteEnabled: material.needAlphaBlending ? false : material.depthWrite,
69
+ ...material.depthBias ? { depthBias: material.depthBias } : {},
70
+ ...material.depthBiasSlopeScale ? { depthBiasSlopeScale: material.depthBiasSlopeScale } : {}
65
71
  }
66
72
  } : {},
67
73
  multisample: { count: sig._sampleCount },
68
- primitive: { topology: "triangle-list", cullMode: material.backFaceCulling ? "back" : "none", frontFace: sig._flipY ? "cw" : "ccw" }
74
+ primitive: { topology: "triangle-list", cullMode: material.backFaceCulling ? "back" : "none", frontFace: "ccw" }
69
75
  });
70
76
  bindings.pipelines.set(key, pipeline);
71
77
  return pipeline;
@@ -196,11 +202,11 @@ async function buildShaderGroup(scene, meshes) {
196
202
  if (!meshes.some((m) => !!m.thinInstances)) {
197
203
  return buildShaderMaterialRenderables(scene, meshes);
198
204
  }
199
- const mod = await import("./shader-thin-instance-5_WUfi3m.js");
205
+ const mod = await import("./shader-thin-instance-DuBotxDO.js");
200
206
  const cull = meshes.some((m) => {
201
207
  var _a;
202
208
  return !!((_a = m.thinInstances) == null ? void 0 : _a._gpuCullingEnabled);
203
- }) ? await import("./thin-instance-cull-binding-CCxrPNO6.js") : void 0;
209
+ }) ? await import("./thin-instance-cull-binding-DWKUt5ZN.js") : void 0;
204
210
  return mod.buildShaderRenderablesWithInstancing(
205
211
  scene,
206
212
  meshes,
@@ -218,7 +224,7 @@ function buildSingleShaderRenderable(scene, mesh, material, isOverride) {
218
224
  return buildMaterialRenderables(scene, material, [mesh], isOverride)[0];
219
225
  }
220
226
  function buildMaterialRenderables(scene, material, meshes, isOverride = false) {
221
- const engine = scene.engine;
227
+ const engine = scene.surface.engine;
222
228
  const bindings = getOrCreateShaderPipelineBindings(engine, material);
223
229
  ensureCustomUbo(engine, material, bindings.customSpec);
224
230
  const packets = meshes.map((mesh) => createPacket(scene, material, bindings.systemSpec, mesh));
@@ -229,9 +235,9 @@ function buildMaterialRenderables(scene, material, meshes, isOverride = false) {
229
235
  return [createOpaqueRenderable(scene, material, packets, isOverride)];
230
236
  }
231
237
  function createPacket(scene, material, systemSpec, mesh) {
232
- const engine = scene.engine;
238
+ const engine = scene.surface.engine;
233
239
  const systemUBO = createEmptyUniformBuffer(engine, systemSpec._totalBytes, "shader-system-ubo");
234
- const systemData = new Float32Array(systemSpec._totalBytes / 4);
240
+ const systemData = new F32(systemSpec._totalBytes / 4);
235
241
  writeSystemUniforms(systemData, systemSpec, material, mesh, scene.camera, engine.canvas.width || 1, engine.canvas.height || 1);
236
242
  engine._device.queue.writeBuffer(systemUBO, 0, systemData);
237
243
  const packet = {
@@ -255,7 +261,7 @@ function createOpaqueRenderable(scene, material, packets, isOverride) {
255
261
  }
256
262
  }
257
263
  const update = (context) => {
258
- updateCustomUbo(scene.engine, material);
264
+ updateCustomUbo(scene.surface.engine, material);
259
265
  for (const packet of packets) {
260
266
  if (packet._disposed) {
261
267
  continue;
@@ -301,7 +307,7 @@ function createTransparentRenderable(scene, material, packet, isOverride) {
301
307
  if (!isOverride && packet.mesh.material !== material) {
302
308
  return;
303
309
  }
304
- updateCustomUbo(scene.engine, material);
310
+ updateCustomUbo(scene.surface.engine, material);
305
311
  updatePacket(scene, material, packet, context);
306
312
  const m = packet.mesh.worldMatrix;
307
313
  sortCenter[0] = m[12];
@@ -332,7 +338,7 @@ function createTransparentRenderable(scene, material, packet, isOverride) {
332
338
  return r;
333
339
  }
334
340
  function updatePacket(scene, material, packet, context) {
335
- const engine = scene.engine;
341
+ const engine = scene.surface.engine;
336
342
  const state = material;
337
343
  writeSystemUniforms(packet.systemData, state._shaderBindings.systemSpec, material, packet.mesh, context._camera ?? scene.camera, context.targetWidth, context.targetHeight);
338
344
  engine._device.queue.writeBuffer(packet.systemUBO, 0, packet.systemData);
@@ -382,7 +388,7 @@ function updateCustomUbo(engine, material) {
382
388
  if (!customSpec || !customUbo || !customData || state._shaderCustomVersion === material._uniformVersion) {
383
389
  return;
384
390
  }
385
- const bytes = new Uint8Array(customData);
391
+ const bytes = new U8(customData);
386
392
  bytes.fill(0);
387
393
  for (const [name, slot] of material._uniformValues) {
388
394
  if (_isShaderSystemUniform(name)) {
@@ -398,14 +404,14 @@ function updateCustomUbo(engine, material) {
398
404
  }
399
405
  function writeTypedValue(data, offset, type, value) {
400
406
  if (type === "u32") {
401
- new Uint32Array(data, offset, 1)[0] = value[0];
407
+ new U32(data, offset, 1)[0] = value[0];
402
408
  return;
403
409
  }
404
410
  if (type === "i32") {
405
- new Int32Array(data, offset, 1)[0] = value[0];
411
+ new I32(data, offset, 1)[0] = value[0];
406
412
  return;
407
413
  }
408
- new Float32Array(data, offset, value.length).set(value);
414
+ new F32(data, offset, value.length).set(value);
409
415
  }
410
416
  function createShaderBindGroup(engine, material, systemUBO) {
411
417
  const bindings = getOrCreateShaderPipelineBindings(engine, material);
@@ -533,7 +539,7 @@ function getZeroAttrBuffer(engine, gpu, name) {
533
539
  }
534
540
  const vertexCount = gpu.positionBuffer.size / 12;
535
541
  const stride = name === "uv" || name === "uv2" ? 8 : name === "normal" ? 12 : 16;
536
- const buffer = engine._device.createBuffer({ label: `shader-zero-${name}`, size: vertexCount * stride, usage: GPUBufferUsage.VERTEX | GPUBufferUsage.COPY_DST });
542
+ const buffer = engine._device.createBuffer({ label: `shader-zero-${name}`, size: vertexCount * stride, usage: BU.VERTEX | BU.COPY_DST });
537
543
  cache.set(name, buffer);
538
544
  return buffer;
539
545
  }
@@ -557,4 +563,4 @@ export {
557
563
  buildShaderGroup,
558
564
  buildShaderMaterialRenderables
559
565
  };
560
- //# sourceMappingURL=shader-renderable-BMf_vvO0.js.map
566
+ //# sourceMappingURL=shader-renderable-D7-RyVxa.js.map