@babylonjs/lite 0.1.1 → 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 (262) hide show
  1. package/_mat4-storage-f64-CjDoht2w.js +11 -0
  2. package/_mat4-storage-f64-CjDoht2w.js.map +1 -0
  3. package/{alpha-test-fragment-CUiHCw7W.js → alpha-test-fragment-B7DjSnF7.js} +2 -2
  4. package/{alpha-test-fragment-CUiHCw7W.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-yHTqabU3.js → background-dds-skybox-BEX309u3.js} +14 -14
  7. package/background-dds-skybox-BEX309u3.js.map +1 -0
  8. package/{background-ground-DIw6D3qf.js → background-ground-BU0HOcM4.js} +20 -20
  9. package/background-ground-BU0HOcM4.js.map +1 -0
  10. package/{background-hdr-skybox-c4uuTmkP.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-DPGBpPbm.js → background-solid-skybox-BrH2fXSu.js} +12 -13
  13. package/background-solid-skybox-BrH2fXSu.js.map +1 -0
  14. package/{billboard-renderable-D8mlVGCd.js → billboard-renderable-BHWryAeC.js} +46 -10
  15. package/billboard-renderable-BHWryAeC.js.map +1 -0
  16. package/{clamp-block-BdII67hT.js → clamp-block-DqbwnQGW.js} +2 -2
  17. package/{clamp-block-BdII67hT.js.map → clamp-block-DqbwnQGW.js.map} +1 -1
  18. package/{clearcoat-fragment-LCiG98Rf.js → clearcoat-fragment-D6FSCie1.js} +2 -2
  19. package/{clearcoat-fragment-LCiG98Rf.js.map → clearcoat-fragment-D6FSCie1.js.map} +1 -1
  20. package/{create-skeleton-C9JdIJnb.js → create-skeleton-D_uplboC.js} +9 -9
  21. package/create-skeleton-D_uplboC.js.map +1 -0
  22. package/{cubemap-skybox-material-DvXMVc4k.js → cubemap-skybox-material-DQcMMdf-.js} +6 -7
  23. package/cubemap-skybox-material-DQcMMdf-.js.map +1 -0
  24. package/{curve-block-BlJpXVYv.js → curve-block-21rT0JjG.js} +2 -2
  25. package/{curve-block-BlJpXVYv.js.map → curve-block-21rT0JjG.js.map} +1 -1
  26. package/{emissive-fragment-BnNvbBCw.js → emissive-fragment-C5FtBs3y.js} +3 -3
  27. package/emissive-fragment-C5FtBs3y.js.map +1 -0
  28. package/{esm-shadow-view-DN9HIaM4.js → esm-shadow-view-Cl3rPGof.js} +2 -2
  29. package/{esm-shadow-view-DN9HIaM4.js.map → esm-shadow-view-Cl3rPGof.js.map} +1 -1
  30. package/{esm-shadow-view-Dk9NFtLq.js → esm-shadow-view-Gtd1LWRP.js} +2 -2
  31. package/{esm-shadow-view-Dk9NFtLq.js.map → esm-shadow-view-Gtd1LWRP.js.map} +1 -1
  32. package/{esm-shadow-view-DGKdF1NI.js → esm-shadow-view-c5YV4Eg9.js} +2 -2
  33. package/{esm-shadow-view-DGKdF1NI.js.map → esm-shadow-view-c5YV4Eg9.js.map} +1 -1
  34. package/{gaussian-splatting-pipeline-sh-DgJl7l56.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-D7uyTyO3.js → gltf-animation-K_zZxj_d.js} +7 -7
  41. package/gltf-animation-K_zZxj_d.js.map +1 -0
  42. package/gltf-color-normalize-Qxl-9C48.js +29 -0
  43. package/gltf-color-normalize-Qxl-9C48.js.map +1 -0
  44. package/{gltf-ext-basisu-CPg5kPrx.js → gltf-ext-basisu-CDbPclzZ.js} +53 -18
  45. package/gltf-ext-basisu-CDbPclzZ.js.map +1 -0
  46. package/{gltf-ext-node-visibility-MafA9ot2.js → gltf-ext-node-visibility-DXCJEYr6.js} +2 -2
  47. package/{gltf-ext-node-visibility-MafA9ot2.js.map → gltf-ext-node-visibility-DXCJEYr6.js.map} +1 -1
  48. package/{gltf-ext-quantization-CpZyLDIz.js → gltf-ext-quantization-CvHI_0Vg.js} +4 -3
  49. package/gltf-ext-quantization-CvHI_0Vg.js.map +1 -0
  50. package/{gltf-ext-uv-transform-CE_-T1Tr.js → gltf-ext-uv-transform-DgYazJBs.js} +2 -2
  51. package/{gltf-ext-uv-transform-CE_-T1Tr.js.map → gltf-ext-uv-transform-DgYazJBs.js.map} +1 -1
  52. package/{gltf-feature-animation-pointer-BjpwOOqo.js → gltf-feature-animation-pointer-D1RJRFBw.js} +9 -9
  53. package/gltf-feature-animation-pointer-D1RJRFBw.js.map +1 -0
  54. package/{gltf-feature-animations-CCizegp8.js → gltf-feature-animations-Cmc1uoIu.js} +2 -2
  55. package/{gltf-feature-animations-CCizegp8.js.map → gltf-feature-animations-Cmc1uoIu.js.map} +1 -1
  56. package/{gltf-feature-draco-yGSMGTE3.js → gltf-feature-draco-CKKzT5E3.js} +6 -5
  57. package/gltf-feature-draco-CKKzT5E3.js.map +1 -0
  58. package/{gltf-feature-gpu-instancing-2e_CFQnl.js → gltf-feature-gpu-instancing-n87SO6Vh.js} +7 -6
  59. package/gltf-feature-gpu-instancing-n87SO6Vh.js.map +1 -0
  60. package/{gltf-feature-lights-punctual-DDDg4j0U.js → gltf-feature-lights-punctual-Ckm3ciL8.js} +5 -5
  61. package/{gltf-feature-lights-punctual-DDDg4j0U.js.map → gltf-feature-lights-punctual-Ckm3ciL8.js.map} +1 -1
  62. package/{gltf-feature-meshopt-Des96YFI.js → gltf-feature-meshopt-DLC4SF1E.js} +7 -6
  63. package/gltf-feature-meshopt-DLC4SF1E.js.map +1 -0
  64. package/{gltf-feature-morph-CKCw6tkX.js → gltf-feature-morph-Cjtu7hYa.js} +4 -4
  65. package/gltf-feature-morph-Cjtu7hYa.js.map +1 -0
  66. package/gltf-feature-registry-C63Hjp9w.js +59 -0
  67. package/gltf-feature-registry-C63Hjp9w.js.map +1 -0
  68. package/{gltf-feature-skeleton-D8hWLqi2.js → gltf-feature-skeleton-DKbOGidp.js} +3 -3
  69. package/{gltf-feature-skeleton-D8hWLqi2.js.map → gltf-feature-skeleton-DKbOGidp.js.map} +1 -1
  70. package/{gltf-feature-variants-Ds6v9byg.js → gltf-feature-variants-Cmzu0O0e.js} +2 -2
  71. package/{gltf-feature-variants-Ds6v9byg.js.map → gltf-feature-variants-Cmzu0O0e.js.map} +1 -1
  72. package/{gltf-glb-parser-D6UZWFuC.js → gltf-glb-parser-Cj5MHS-v.js} +5 -4
  73. package/gltf-glb-parser-Cj5MHS-v.js.map +1 -0
  74. package/{gltf-interleave-DGnUlz28.js → gltf-interleave-gHf9_t0i.js} +14 -14
  75. package/gltf-interleave-gHf9_t0i.js.map +1 -0
  76. package/gltf-normals-b2h74380.js +37 -0
  77. package/gltf-normals-b2h74380.js.map +1 -0
  78. package/{gltf-pbr-builder-ext-BFOxOCnQ.js → gltf-pbr-builder-ext-edNcjwPf.js} +5 -5
  79. package/gltf-pbr-builder-ext-edNcjwPf.js.map +1 -0
  80. package/{gltf-variants-DFbr8EES.js → gltf-variants-CPxNdtP4.js} +4 -4
  81. package/{gltf-variants-DFbr8EES.js.map → gltf-variants-CPxNdtP4.js.map} +1 -1
  82. package/{gs-picking-pipeline-DzfMASL9.js → gs-picking-pipeline-DYaW_Lg3.js} +14 -14
  83. package/gs-picking-pipeline-DYaW_Lg3.js.map +1 -0
  84. package/havok-floating-origin-Dr-18Nds.js +198 -0
  85. package/havok-floating-origin-Dr-18Nds.js.map +1 -0
  86. package/index-CLElg2Bo.js +39209 -0
  87. package/index-CLElg2Bo.js.map +1 -0
  88. package/index-CYZDclhF.js +918 -0
  89. package/index-CYZDclhF.js.map +1 -0
  90. package/index-SMJ67XwT.js +3330 -0
  91. package/index-SMJ67XwT.js.map +1 -0
  92. package/index.d.ts +2508 -119
  93. package/index.js +444 -302
  94. package/{input-block-DgAJBzN_.js → input-block-DqEedWF2.js} +2 -2
  95. package/{input-block-DgAJBzN_.js.map → input-block-DqEedWF2.js.map} +1 -1
  96. package/{iridescence-fragment-Gymp7or5.js → iridescence-fragment-BHU59-gQ.js} +2 -2
  97. package/{iridescence-fragment-Gymp7or5.js.map → iridescence-fragment-BHU59-gQ.js.map} +1 -1
  98. package/{light-block-B11ew7FA.js → light-block-Bv37V8vl.js} +2 -2
  99. package/{light-block-B11ew7FA.js.map → light-block-Bv37V8vl.js.map} +1 -1
  100. package/{loop-block-Bb23EOMb.js → loop-block-qTg8vb99.js} +2 -2
  101. package/{loop-block-Bb23EOMb.js.map → loop-block-qTg8vb99.js.map} +1 -1
  102. package/{morph-fragment-DOVo70gP.js → morph-fragment-BRCUr2wQ.js} +2 -2
  103. package/{morph-fragment-DOVo70gP.js.map → morph-fragment-BRCUr2wQ.js.map} +1 -1
  104. package/{multilight-wgsl-BGyiIOp3.js → multilight-wgsl-DMeppAdZ.js} +4 -4
  105. package/{multilight-wgsl-BGyiIOp3.js.map → multilight-wgsl-DMeppAdZ.js.map} +1 -1
  106. package/{node-env-BPZXZzBf.js → node-env-Bc559GmY.js} +6 -5
  107. package/node-env-Bc559GmY.js.map +1 -0
  108. package/node-geometry-view-COmWsRXK.js +291 -0
  109. package/node-geometry-view-COmWsRXK.js.map +1 -0
  110. package/{node-registry-extra-compat-Dhrw8fDQ.js → node-registry-extra-compat-dWrv7gpS.js} +2 -2
  111. package/{node-registry-extra-compat-Dhrw8fDQ.js.map → node-registry-extra-compat-dWrv7gpS.js.map} +1 -1
  112. package/{node-registry-extra-math-CsAHvIZo.js → node-registry-extra-math-Bn854sX9.js} +2 -2
  113. package/{node-registry-extra-math-CsAHvIZo.js.map → node-registry-extra-math-Bn854sX9.js.map} +1 -1
  114. package/{node-renderable-DlLIdBmd.js → node-renderable-B5G8WcdH.js} +41 -22
  115. package/node-renderable-B5G8WcdH.js.map +1 -0
  116. package/{node-shadow-DKrcqmNg.js → node-shadow-CVIUlNf0.js} +7 -7
  117. package/node-shadow-CVIUlNf0.js.map +1 -0
  118. package/{normal-map-fragment-DpsIXrJf.js → normal-map-fragment-CQSxhjCy.js} +3 -3
  119. package/{normal-map-fragment-DpsIXrJf.js.map → normal-map-fragment-CQSxhjCy.js.map} +1 -1
  120. package/pack-mat4-with-offset-BqB8Jqo7.js +37 -0
  121. package/pack-mat4-with-offset-BqB8Jqo7.js.map +1 -0
  122. package/package.json +3 -10
  123. package/{parse-camera-DM3oJJeT.js → parse-camera-pBRT_6i5.js} +2 -2
  124. package/{parse-camera-DM3oJJeT.js.map → parse-camera-pBRT_6i5.js.map} +1 -1
  125. package/pbr-fog-wgsl-BqdCid6r.js +8 -0
  126. package/pbr-fog-wgsl-BqdCid6r.js.map +1 -0
  127. package/pbr-geometry-view-NiZY_juX.js +491 -0
  128. package/pbr-geometry-view-NiZY_juX.js.map +1 -0
  129. package/{pbr-metallic-roughness-block-h_KAOZrW.js → pbr-metallic-roughness-block-JBSi-tQN.js} +2 -2
  130. package/{pbr-metallic-roughness-block-h_KAOZrW.js.map → pbr-metallic-roughness-block-JBSi-tQN.js.map} +1 -1
  131. package/{pbr-metallic-roughness-block-full-6vMm1Jk6.js → pbr-metallic-roughness-block-full-Ta9lR2cz.js} +2 -2
  132. package/{pbr-metallic-roughness-block-full-6vMm1Jk6.js.map → pbr-metallic-roughness-block-full-Ta9lR2cz.js.map} +1 -1
  133. package/{pbr-mr-helper-core-CIwm-T1G.js → pbr-mr-helper-core-BVWNR08D.js} +2 -2
  134. package/{pbr-mr-helper-core-CIwm-T1G.js.map → pbr-mr-helper-core-BVWNR08D.js.map} +1 -1
  135. package/{pbr-refraction-DGmMSa2v.js → pbr-refraction-C9FvFmAp.js} +2 -2
  136. package/{pbr-refraction-DGmMSa2v.js.map → pbr-refraction-C9FvFmAp.js.map} +1 -1
  137. package/{pbr-renderable-BJxUtPBb.js → pbr-renderable-DzUF2QIk.js} +118 -58
  138. package/pbr-renderable-DzUF2QIk.js.map +1 -0
  139. package/{pbr-shadow-fragment-LO9SlbJj.js → pbr-shadow-fragment-CnqnbGYS.js} +6 -1
  140. package/pbr-shadow-fragment-CnqnbGYS.js.map +1 -0
  141. package/{pbr-template-ext-8q7BcTDf.js → pbr-template-ext-CGgB2n2y.js} +3 -2
  142. package/{pbr-template-ext-8q7BcTDf.js.map → pbr-template-ext-CGgB2n2y.js.map} +1 -1
  143. package/{pbr-tracking-B3alzn91.js → pbr-tracking-3tU1kqea.js} +2 -2
  144. package/{pbr-tracking-B3alzn91.js.map → pbr-tracking-3tU1kqea.js.map} +1 -1
  145. package/pbr-transmission-ext-BcLjRxfB.js +190 -0
  146. package/pbr-transmission-ext-BcLjRxfB.js.map +1 -0
  147. package/recast-navigation.wasm-DG_0AFuk.js +8706 -0
  148. package/recast-navigation.wasm-DG_0AFuk.js.map +1 -0
  149. package/recast-navigation.wasm-compat-C-Bf2ylB.js +8692 -0
  150. package/recast-navigation.wasm-compat-C-Bf2ylB.js.map +1 -0
  151. package/{reflectance-fragment-BCrgPmrt.js → reflectance-fragment-Dbpgw3Jt.js} +2 -2
  152. package/{reflectance-fragment-BCrgPmrt.js.map → reflectance-fragment-Dbpgw3Jt.js.map} +1 -1
  153. package/{rgbd-decode-DCvzUYeI.js → rgbd-decode-DoyUquy3.js} +7 -6
  154. package/rgbd-decode-DoyUquy3.js.map +1 -0
  155. package/{scene-material-swap-C2ykv55W.js → scene-material-swap-nNUH4nGn.js} +11 -4
  156. package/scene-material-swap-nNUH4nGn.js.map +1 -0
  157. package/screenshot-readback-D0Sj9qq3.js +92 -0
  158. package/screenshot-readback-D0Sj9qq3.js.map +1 -0
  159. package/{mesh-features-BLENkYVt.js → shader-composer-BUD_pSX4.js} +7 -55
  160. package/shader-composer-BUD_pSX4.js.map +1 -0
  161. package/{shader-renderable-D-6796KR.js → shader-renderable-D7-RyVxa.js} +62 -27
  162. package/shader-renderable-D7-RyVxa.js.map +1 -0
  163. package/shader-thin-instance-DuBotxDO.js +150 -0
  164. package/shader-thin-instance-DuBotxDO.js.map +1 -0
  165. package/shadow-fragment-core-DHN2G6FI.js.map +1 -1
  166. package/{sheen-fragment-Dze2f7XJ.js → sheen-fragment-1MkEMcbc.js} +2 -2
  167. package/{sheen-fragment-Dze2f7XJ.js.map → sheen-fragment-1MkEMcbc.js.map} +1 -1
  168. package/{singlelight-directional-wgsl-CmUDZxwz.js → singlelight-directional-wgsl-BsV8G456.js} +2 -2
  169. package/{singlelight-directional-wgsl-CmUDZxwz.js.map → singlelight-directional-wgsl-BsV8G456.js.map} +1 -1
  170. package/{singlelight-hemispheric-wgsl-t-83IP_s.js → singlelight-hemispheric-wgsl-Bo0jKlW5.js} +2 -2
  171. package/{singlelight-hemispheric-wgsl-t-83IP_s.js.map → singlelight-hemispheric-wgsl-Bo0jKlW5.js.map} +1 -1
  172. package/{singlelight-point-wgsl-CLzULIYV.js → singlelight-point-wgsl-DV39UP5Y.js} +2 -2
  173. package/{singlelight-point-wgsl-CLzULIYV.js.map → singlelight-point-wgsl-DV39UP5Y.js.map} +1 -1
  174. package/{singlelight-spot-wgsl-DEEUrfVM.js → singlelight-spot-wgsl-yg3od6vL.js} +2 -2
  175. package/{singlelight-spot-wgsl-DEEUrfVM.js.map → singlelight-spot-wgsl-yg3od6vL.js.map} +1 -1
  176. package/{skeleton-fragment-B_XlFbtx.js → skeleton-fragment-DdxYG6kv.js} +2 -2
  177. package/{skeleton-fragment-B_XlFbtx.js.map → skeleton-fragment-DdxYG6kv.js.map} +1 -1
  178. package/{skybox-renderable-DDwzu-PT.js → skybox-renderable-CJD4XmX5.js} +8 -9
  179. package/skybox-renderable-CJD4XmX5.js.map +1 -0
  180. package/{splat-ply-compressed-BahdBG1r.js → splat-ply-compressed-DHjyiVmI.js} +9 -8
  181. package/splat-ply-compressed-DHjyiVmI.js.map +1 -0
  182. package/{standard-renderable-GjxL9xSf.js → standard-pipeline-XTbHL7MY.js} +12 -257
  183. package/standard-pipeline-XTbHL7MY.js.map +1 -0
  184. package/standard-renderable-CREWLNHI.js +191 -0
  185. package/standard-renderable-CREWLNHI.js.map +1 -0
  186. package/{std-ambient-fragment-BoUsD06w.js → std-ambient-fragment-Bjx3VFrr.js} +2 -2
  187. package/{std-ambient-fragment-BoUsD06w.js.map → std-ambient-fragment-Bjx3VFrr.js.map} +1 -1
  188. package/{std-cube-reflection-fragment-ulqc3bsP.js → std-cube-reflection-fragment-y9WWdXUt.js} +2 -2
  189. package/{std-cube-reflection-fragment-ulqc3bsP.js.map → std-cube-reflection-fragment-y9WWdXUt.js.map} +1 -1
  190. package/{std-emissive-fragment-DNGj1HdQ.js → std-emissive-fragment-C8Lnmojh.js} +2 -2
  191. package/{std-emissive-fragment-DNGj1HdQ.js.map → std-emissive-fragment-C8Lnmojh.js.map} +1 -1
  192. package/{std-lightmap-fragment-Bqj89aIe.js → std-lightmap-fragment-DFxGcoA5.js} +2 -2
  193. package/{std-lightmap-fragment-Bqj89aIe.js.map → std-lightmap-fragment-DFxGcoA5.js.map} +1 -1
  194. package/{std-opacity-fragment-KuPh5N2Z.js → std-opacity-fragment-EXzFWiSp.js} +2 -2
  195. package/{std-opacity-fragment-KuPh5N2Z.js.map → std-opacity-fragment-EXzFWiSp.js.map} +1 -1
  196. package/{std-reflection-fragment-BA5Ghn_M.js → std-reflection-fragment-BoJORqpG.js} +2 -2
  197. package/{std-reflection-fragment-BA5Ghn_M.js.map → std-reflection-fragment-BoJORqpG.js.map} +1 -1
  198. package/std-shadow-fragment-Bq-Wc8UJ.js +13 -0
  199. package/std-shadow-fragment-Bq-Wc8UJ.js.map +1 -0
  200. package/{std-specular-fragment-CE-6scqd.js → std-specular-fragment-CM5R5j2g.js} +2 -2
  201. package/{std-specular-fragment-CE-6scqd.js.map → std-specular-fragment-CM5R5j2g.js.map} +1 -1
  202. package/{std-tracking-CNKZ-hJN.js → std-tracking-Cif_wXeT.js} +2 -2
  203. package/{std-tracking-CNKZ-hJN.js.map → std-tracking-Cif_wXeT.js.map} +1 -1
  204. package/{subsurface-fragment-liM3y2-P.js → subsurface-fragment-BEaAXYXz.js} +2 -2
  205. package/{subsurface-fragment-liM3y2-P.js.map → subsurface-fragment-BEaAXYXz.js.map} +1 -1
  206. package/swapchain-overlay-UCLilhbq.js +37 -0
  207. package/swapchain-overlay-UCLilhbq.js.map +1 -0
  208. package/thin-instance-cull-binding-DWKUt5ZN.js +310 -0
  209. package/thin-instance-cull-binding-DWKUt5ZN.js.map +1 -0
  210. package/{thin-instance-gpu-C9Gv_Z1w.js → thin-instance-gpu-BDdRcNAh.js} +30 -5
  211. package/thin-instance-gpu-BDdRcNAh.js.map +1 -0
  212. package/{tracking-primitives-wgdBY85t.js → tracking-primitives-CglRNTlX.js} +2 -2
  213. package/{tracking-primitives-wgdBY85t.js.map → tracking-primitives-CglRNTlX.js.map} +1 -1
  214. package/{unlit-fragment-BIlhJpz6.js → unlit-fragment-kxfZWlnp.js} +2 -2
  215. package/{unlit-fragment-BIlhJpz6.js.map → unlit-fragment-kxfZWlnp.js.map} +1 -1
  216. package/{wgsl-helpers-DyzNzCeE.js → wgsl-helpers-D8sl1VVA.js} +4 -4
  217. package/{wgsl-helpers-DyzNzCeE.js.map → wgsl-helpers-D8sl1VVA.js.map} +1 -1
  218. package/assets/splat-sort-worker-Crg3CaCc.js.map +0 -1
  219. package/background-dds-skybox-yHTqabU3.js.map +0 -1
  220. package/background-ground-DIw6D3qf.js.map +0 -1
  221. package/background-hdr-skybox-c4uuTmkP.js.map +0 -1
  222. package/background-solid-skybox-DPGBpPbm.js.map +0 -1
  223. package/billboard-renderable-D8mlVGCd.js.map +0 -1
  224. package/create-skeleton-C9JdIJnb.js.map +0 -1
  225. package/cubemap-skybox-material-DvXMVc4k.js.map +0 -1
  226. package/emissive-fragment-BnNvbBCw.js.map +0 -1
  227. package/gaussian-splatting-pipeline-sh-DgJl7l56.js.map +0 -1
  228. package/gltf-animation-D7uyTyO3.js.map +0 -1
  229. package/gltf-ext-basisu-CPg5kPrx.js.map +0 -1
  230. package/gltf-ext-quantization-CpZyLDIz.js.map +0 -1
  231. package/gltf-feature-animation-pointer-BjpwOOqo.js.map +0 -1
  232. package/gltf-feature-draco-yGSMGTE3.js.map +0 -1
  233. package/gltf-feature-gpu-instancing-2e_CFQnl.js.map +0 -1
  234. package/gltf-feature-meshopt-Des96YFI.js.map +0 -1
  235. package/gltf-feature-morph-CKCw6tkX.js.map +0 -1
  236. package/gltf-glb-parser-D6UZWFuC.js.map +0 -1
  237. package/gltf-interleave-DGnUlz28.js.map +0 -1
  238. package/gltf-pbr-builder-ext-BFOxOCnQ.js.map +0 -1
  239. package/gs-picking-pipeline-DzfMASL9.js.map +0 -1
  240. package/index-C8HOR2sB.js +0 -19222
  241. package/index-C8HOR2sB.js.map +0 -1
  242. package/mesh-features-BLENkYVt.js.map +0 -1
  243. package/node-env-BPZXZzBf.js.map +0 -1
  244. package/node-registry-DwgC4yth.js +0 -190
  245. package/node-registry-DwgC4yth.js.map +0 -1
  246. package/node-renderable-DlLIdBmd.js.map +0 -1
  247. package/node-shadow-DKrcqmNg.js.map +0 -1
  248. package/pbr-renderable-BJxUtPBb.js.map +0 -1
  249. package/pbr-shadow-fragment-LO9SlbJj.js.map +0 -1
  250. package/pbr-transmission-ext-BxW4CEGu.js +0 -581
  251. package/pbr-transmission-ext-BxW4CEGu.js.map +0 -1
  252. package/rgbd-decode-DCvzUYeI.js.map +0 -1
  253. package/scene-material-swap-C2ykv55W.js.map +0 -1
  254. package/shader-renderable-D-6796KR.js.map +0 -1
  255. package/skybox-renderable-DDwzu-PT.js.map +0 -1
  256. package/splat-ply-compressed-BahdBG1r.js.map +0 -1
  257. package/standard-renderable-GjxL9xSf.js.map +0 -1
  258. package/std-shadow-fragment-FNQfrJuC.js +0 -8
  259. package/std-shadow-fragment-FNQfrJuC.js.map +0 -1
  260. package/swapchain-overlay-DcCSFDp7.js +0 -35
  261. package/swapchain-overlay-DcCSFDp7.js.map +0 -1
  262. package/thin-instance-gpu-C9Gv_Z1w.js.map +0 -1
@@ -0,0 +1,11 @@
1
+ import { F as F64 } from "./index-CLElg2Bo.js";
2
+ const MAT4_STORAGE_F64_BUILD_TAG = "@@MAT4_STORAGE_F64@@";
3
+ function allocateF64Mat4() {
4
+ return new F64(16);
5
+ }
6
+ allocateF64Mat4[MAT4_STORAGE_F64_BUILD_TAG] = true;
7
+ export {
8
+ MAT4_STORAGE_F64_BUILD_TAG,
9
+ allocateF64Mat4
10
+ };
11
+ //# sourceMappingURL=_mat4-storage-f64-CjDoht2w.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"_mat4-storage-f64-CjDoht2w.js","sources":["../src/math/_mat4-storage-f64.ts"],"sourcesContent":["import { F64 } from \"../engine/typed-arrays.js\";\nimport type { Mat4 } from \"./types.js\";\n\n/** @internal Build-time tag string used by `tests/bundle-content-no-f64.test.ts`\n * to assert this module is absent from HPM-off bundles. Bundlers (terser,\n * esbuild) do not rename string contents, so this constant survives\n * minification verbatim and is a reliable presence-marker.\n *\n * Embedded as a property assignment on the exported function below — terser\n * treats property assignments on exported bindings as observable side effects\n * and preserves them. A `void` expression-statement (e.g. `void TAG;`) does\n * NOT survive minification because the result is unused and the read can be\n * proven side-effect-free. */\nexport const MAT4_STORAGE_F64_BUILD_TAG = \"@@MAT4_STORAGE_F64@@\";\n\n/** @internal F64-backed Mat4 allocator. Only imported by createEngine\n * inside `if (options.useHighPrecisionMatrix)` (dynamic `await import`).\n * Tree-shaken out of HPM-off bundles. This module is the ONLY place in the\n * package that names `new Float64Array(16)`. */\nexport function allocateF64Mat4(): Mat4 {\n return new F64(16) as unknown as Mat4;\n}\n\n// Pin the build tag string into the emitted chunk so the bundle-content\n// assertion (tests/bundle-content-no-f64.test.ts) can grep for it. Property\n// assignment on an exported function is a side effect the minifier preserves.\n(allocateF64Mat4 as unknown as Record<string, true>)[MAT4_STORAGE_F64_BUILD_TAG] = true;\n"],"names":[],"mappings":";AAaO,MAAM,6BAA6B;AAMnC,SAAS,kBAAwB;AACpC,SAAO,IAAI,IAAI,EAAE;AACrB;AAKC,gBAAoD,0BAA0B,IAAI;"}
@@ -1,4 +1,4 @@
1
- import { ap as PBR_HAS_ALPHA_TEST } from "./index-C8HOR2sB.js";
1
+ import { aI as PBR_HAS_ALPHA_TEST } from "./index-CLElg2Bo.js";
2
2
  const pbrExt = {
3
3
  id: "alpha-test",
4
4
  phase: "fragment",
@@ -19,4 +19,4 @@ const pbrExt = {
19
19
  export {
20
20
  pbrExt
21
21
  };
22
- //# sourceMappingURL=alpha-test-fragment-CUiHCw7W.js.map
22
+ //# sourceMappingURL=alpha-test-fragment-B7DjSnF7.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"alpha-test-fragment-CUiHCw7W.js","sources":["../src/material/pbr/fragments/alpha-test-fragment.ts"],"sourcesContent":["import type { PbrMaterialProps } from \"../pbr-material.js\";\nimport type { PbrExt } from \"../pbr-flags.js\";\nimport { PBR_HAS_ALPHA_TEST } from \"../pbr-flag-bits.js\";\n\nexport const pbrExt: PbrExt = {\n id: \"alpha-test\",\n phase: \"fragment\",\n frag(ctx) {\n return ctx._features & PBR_HAS_ALPHA_TEST\n ? {\n _id: \"alpha-test\",\n _uboFields: [{ _name: \"alphaCutOff\", _type: \"f32\" }],\n _fragmentSlots: { AT: `if(alpha*material.materialAlpha<material.alphaCutOff){discard;}` },\n }\n : null;\n },\n writeUbo(data, mat, offsets) {\n const off = offsets.get(\"alphaCutOff\");\n if (off !== undefined) {\n data[off / 4] = (mat as PbrMaterialProps).alphaCutOff ?? 0;\n }\n },\n};\n"],"names":[],"mappings":";AAIO,MAAM,SAAiB;AAAA,EAC1B,IAAI;AAAA,EACJ,OAAO;AAAA,EACP,KAAK,KAAK;AACN,WAAO,IAAI,YAAY,qBACjB;AAAA,MACI,KAAK;AAAA,MACL,YAAY,CAAC,EAAE,OAAO,eAAe,OAAO,OAAO;AAAA,MACnD,gBAAgB,EAAE,IAAI,kEAAA;AAAA,IAAkE,IAE5F;AAAA,EACV;AAAA,EACA,SAAS,MAAM,KAAK,SAAS;AACzB,UAAM,MAAM,QAAQ,IAAI,aAAa;AACrC,QAAI,QAAQ,QAAW;AACnB,WAAK,MAAM,CAAC,IAAK,IAAyB,eAAe;AAAA,IAC7D;AAAA,EACJ;AACJ;"}
1
+ {"version":3,"file":"alpha-test-fragment-B7DjSnF7.js","sources":["../src/material/pbr/fragments/alpha-test-fragment.ts"],"sourcesContent":["import type { PbrMaterialProps } from \"../pbr-material.js\";\nimport type { PbrExt } from \"../pbr-flags.js\";\nimport { PBR_HAS_ALPHA_TEST } from \"../pbr-flag-bits.js\";\n\nexport const pbrExt: PbrExt = {\n id: \"alpha-test\",\n phase: \"fragment\",\n frag(ctx) {\n return ctx._features & PBR_HAS_ALPHA_TEST\n ? {\n _id: \"alpha-test\",\n _uboFields: [{ _name: \"alphaCutOff\", _type: \"f32\" }],\n _fragmentSlots: { AT: `if(alpha*material.materialAlpha<material.alphaCutOff){discard;}` },\n }\n : null;\n },\n writeUbo(data, mat, offsets) {\n const off = offsets.get(\"alphaCutOff\");\n if (off !== undefined) {\n data[off / 4] = (mat as PbrMaterialProps).alphaCutOff ?? 0;\n }\n },\n};\n"],"names":[],"mappings":";AAIO,MAAM,SAAiB;AAAA,EAC1B,IAAI;AAAA,EACJ,OAAO;AAAA,EACP,KAAK,KAAK;AACN,WAAO,IAAI,YAAY,qBACjB;AAAA,MACI,KAAK;AAAA,MACL,YAAY,CAAC,EAAE,OAAO,eAAe,OAAO,OAAO;AAAA,MACnD,gBAAgB,EAAE,IAAI,kEAAA;AAAA,IAAkE,IAE5F;AAAA,EACV;AAAA,EACA,SAAS,MAAM,KAAK,SAAS;AACzB,UAAM,MAAM,QAAQ,IAAI,aAAa;AACrC,QAAI,QAAQ,QAAW;AACnB,WAAK,MAAM,CAAC,IAAK,IAAyB,eAAe;AAAA,IAC7D;AAAA,EACJ;AACJ;"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"splat-sort-worker-DT3eybMZ.js","sources":["../src/engine/typed-arrays.ts","../src/loader-splat/splat-sort-worker.ts"],"sourcesContent":["/**\n * Short aliases for global typed-array / DataView constructors.\n *\n * These globals cannot be renamed by the minifier, so each `new Float32Array`\n * ships the full constructor name. Importing these aliases (mangled to a single\n * character per chunk) shrinks every `new`/`instanceof` use to a tiny token with\n * identical runtime semantics. Aliases are value-only and used solely in value\n * positions (construction / `instanceof`); type annotations keep the real names.\n */\nexport const F32 = Float32Array;\nexport const F64 = Float64Array;\nexport const U32 = Uint32Array;\nexport const I32 = Int32Array;\nexport const U16 = Uint16Array;\nexport const I16 = Int16Array;\nexport const U8 = Uint8Array;\nexport const I8 = Int8Array;\nexport const U8C = Uint8ClampedArray;\nexport const DV = DataView;\n","import { F32, U32 } from \"../engine/typed-arrays.js\";\n/** Splat sort worker.\n *\n * Vite import: `import SortWorker from './splat-sort-worker.ts?worker&inline'`.\n * The `?worker&inline` query keeps the bundled worker JS embedded as a base-64\n * blob in the splat scene chunk — it adds zero bytes to any other scene\n * because the whole `loader-splat/` module is dynamic-imported.\n *\n * Protocol\n * --------\n * Init (once): `{ p: Float32Array, n: number }`\n * — buffer is transferred and retained on the worker side.\n * — positions are in mesh-LOCAL space (stride 3, xyz per splat).\n * Sort (N×): `{ m: Float32Array(16), f: Float32Array(3), c: Float32Array(3), d: BigInt64Array }`\n * — depthMix is round-tripped via transferable; layout is\n * high-32 bits = packed depth (then bit-inverted), low-32 bits = splat index.\n * After sort, low-32 bits give the back-to-front order.\n *\n * Depth recipe (mirrors BJS `_CreateWorker`)\n * ------------------------------------------\n * Per-frame the main thread sends the mesh's world matrix, the camera's\n * world-space forward vector and the camera's world-space position. The\n * worker collapses these into 4 scalars (a, b, c, d) such that\n * depth = a*localX + b*localY + c*localZ + d\n * = cameraForward · (world · localPos - cameraPosition).\n * This is more robust than the previous `10000 - dot(view-row, pos)` recipe:\n * - it accounts for non-identity world matrices (BJS Lite previously ignored them);\n * - it has no magic reference value, so it doesn't lose precision when\n * depths are large or wrap signs when depths exceed the reference;\n * - the back-to-front order is produced by bit-inverting the high 32 bits\n * of each i64 slot (`~indices[2j+1]`) instead of subtracting depths from\n * a constant — this preserves the full float precision range. */\n\nlet positions: Float32Array | null = null;\nlet vertexCount = 0;\n\nself.onmessage = (e: MessageEvent) => {\n const data = e.data as {\n p?: Float32Array;\n n?: number;\n m?: Float32Array;\n f?: Float32Array;\n c?: Float32Array;\n d?: BigInt64Array;\n };\n\n if (data.p) {\n positions = data.p;\n vertexCount = data.n ?? 0;\n return;\n }\n\n if (!positions || !data.m || !data.f || !data.c || !data.d) {\n return;\n }\n\n const m = data.m;\n const cf = data.f;\n const cp = data.c;\n const depthMix = data.d;\n const indices = new U32(depthMix.buffer);\n const floatMix = new F32(depthMix.buffer);\n\n // Collapse cameraForward · (world · localPos - cameraPos) into (a*x + b*y + c*z + d).\n // Lite column-major: world's column k lives at indices [4k, 4k+1, 4k+2, 4k+3]\n // (the 4th row is always [0,0,0,1] for an affine matrix, so we skip m[3,7,11,15]).\n const camDot = cf[0]! * cp[0]! + cf[1]! * cp[1]! + cf[2]! * cp[2]!;\n const a = cf[0]! * m[0]! + cf[1]! * m[1]! + cf[2]! * m[2]!;\n const b = cf[0]! * m[4]! + cf[1]! * m[5]! + cf[2]! * m[6]!;\n const c = cf[0]! * m[8]! + cf[1]! * m[9]! + cf[2]! * m[10]!;\n const d = cf[0]! * m[12]! + cf[1]! * m[13]! + cf[2]! * m[14]! - camDot;\n\n for (let j = 0; j < vertexCount; j++) {\n indices[2 * j] = j;\n floatMix[2 * j + 1] = a * positions[3 * j]! + b * positions[3 * j + 1]! + c * positions[3 * j + 2]! + d;\n // Bit-invert the high 32 bits (where the depth float lives) so that\n // BigInt64Array.sort() yields back-to-front order without subtracting\n // depths from a constant (which would cap range and erode precision).\n indices[2 * j + 1] = ~indices[2 * j + 1]!;\n }\n\n depthMix.sort();\n\n (self as unknown as { postMessage: (m: unknown, t?: Transferable[]) => void }).postMessage({ d: depthMix }, [depthMix.buffer]);\n};\n"],"names":[],"mappings":";;AASO,QAAM,MAAM;AAEZ,QAAM,MAAM;ACsBnB,MAAI,YAAiC;AACrC,MAAI,cAAc;AAElB,OAAK,YAAY,CAAC,MAAoB;AAClC,UAAM,OAAO,EAAE;AASf,QAAI,KAAK,GAAG;AACR,kBAAY,KAAK;AACjB,oBAAc,KAAK,KAAK;AACxB;AAAA,IACJ;AAEA,QAAI,CAAC,aAAa,CAAC,KAAK,KAAK,CAAC,KAAK,KAAK,CAAC,KAAK,KAAK,CAAC,KAAK,GAAG;AACxD;AAAA,IACJ;AAEA,UAAM,IAAI,KAAK;AACf,UAAM,KAAK,KAAK;AAChB,UAAM,KAAK,KAAK;AAChB,UAAM,WAAW,KAAK;AACtB,UAAM,UAAU,IAAI,IAAI,SAAS,MAAM;AACvC,UAAM,WAAW,IAAI,IAAI,SAAS,MAAM;AAKxC,UAAM,SAAS,GAAG,CAAC,IAAK,GAAG,CAAC,IAAK,GAAG,CAAC,IAAK,GAAG,CAAC,IAAK,GAAG,CAAC,IAAK,GAAG,CAAC;AAChE,UAAM,IAAI,GAAG,CAAC,IAAK,EAAE,CAAC,IAAK,GAAG,CAAC,IAAK,EAAE,CAAC,IAAK,GAAG,CAAC,IAAK,EAAE,CAAC;AACxD,UAAM,IAAI,GAAG,CAAC,IAAK,EAAE,CAAC,IAAK,GAAG,CAAC,IAAK,EAAE,CAAC,IAAK,GAAG,CAAC,IAAK,EAAE,CAAC;AACxD,UAAM,IAAI,GAAG,CAAC,IAAK,EAAE,CAAC,IAAK,GAAG,CAAC,IAAK,EAAE,CAAC,IAAK,GAAG,CAAC,IAAK,EAAE,EAAE;AACzD,UAAM,IAAI,GAAG,CAAC,IAAK,EAAE,EAAE,IAAK,GAAG,CAAC,IAAK,EAAE,EAAE,IAAK,GAAG,CAAC,IAAK,EAAE,EAAE,IAAK;AAEhE,aAAS,IAAI,GAAG,IAAI,aAAa,KAAK;AAClC,cAAQ,IAAI,CAAC,IAAI;AACjB,eAAS,IAAI,IAAI,CAAC,IAAI,IAAI,UAAU,IAAI,CAAC,IAAK,IAAI,UAAU,IAAI,IAAI,CAAC,IAAK,IAAI,UAAU,IAAI,IAAI,CAAC,IAAK;AAItG,cAAQ,IAAI,IAAI,CAAC,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC;AAAA,IAC3C;AAEA,aAAS,KAAA;AAER,SAA8E,YAAY,EAAE,GAAG,YAAY,CAAC,SAAS,MAAM,CAAC;AAAA,EACjI;;"}
@@ -1,12 +1,12 @@
1
- import { e as createMappedBuffer, aO as getOrCreateSampler, aY as createUniformBuffer, aW as SCENE_UBO_WGSL } from "./index-C8HOR2sB.js";
2
- import { a as WGSL_DITHER, b as WGSL_NO_DITHER } from "./wgsl-helpers-DyzNzCeE.js";
3
- import { c as createCubemapSkyboxMaterial } from "./cubemap-skybox-material-DvXMVc4k.js";
1
+ import { a as F32, j as createMappedBuffer, B as BU, h as U16, bQ as I32, T as TU, e as U8, br as getOrCreateSampler, av as createUniformBuffer, q as SCENE_UBO_WGSL } from "./index-CLElg2Bo.js";
2
+ import { b as WGSL_DITHER, c as WGSL_NO_DITHER } from "./wgsl-helpers-D8sl1VVA.js";
3
+ import { c as createCubemapSkyboxMaterial } from "./cubemap-skybox-material-DQcMMdf-.js";
4
4
  const ddsSkyboxVertSrc = "// DDS Skybox Vertex Shader — standard world transform.\n// positionUVW uses local position for cube direction lookup.\n\nstruct MeshUniforms {\n world: mat4x4<f32>,\n};\n\n@group(1) @binding(0) var<uniform> mesh: MeshUniforms;\n\nstruct VertexOutput {\n @builtin(position) clipPos: vec4<f32>,\n @location(0) positionUVW: vec3<f32>,\n @location(1) positionW: vec3<f32>,\n};\n\n@vertex\nfn main(@location(0) position: vec3<f32>) -> VertexOutput {\n var output: VertexOutput;\n output.positionUVW = position;\n let worldPos = (mesh.world * vec4<f32>(position, 1.0)).xyz;\n output.positionW = worldPos;\n output.clipPos = scene.viewProjection * vec4<f32>(worldPos, 1.0);\n return output;\n}\n";
5
5
  const ddsSkyboxFragSrc = "// DDS Cube Skybox Fragment Shader — samples DDS cube texture with BJS image processing.\n// Used by scenes that load backgroundSkybox.dds (createDefaultEnvironment).\n// Pipeline: exposure → Reinhard tonemap → gamma → contrast → dither.\n\nstruct MeshUniforms {\n world: mat4x4<f32>,\n primaryColor: vec3<f32>,\n exposureLinear: f32,\n contrast: f32,\n _pad1: f32,\n _pad2: f32,\n _pad3: f32,\n};\n\n@group(1) @binding(0) var<uniform> mesh: MeshUniforms;\n@group(1) @binding(1) var envCubemap: texture_cube<f32>;\n@group(1) @binding(2) var envSampler: sampler;\n\nstruct FragmentInput {\n @location(0) positionUVW: vec3<f32>,\n @location(1) positionW: vec3<f32>,\n};\n\n@fragment\nfn main(input: FragmentInput) -> @location(0) vec4<f32> {\n let dir = normalize(input.positionUVW);\n var color = textureSampleLevel(envCubemap, envSampler, dir, 0.0).rgb;\n\n // BJS BackgroundMaterial: colorBase = reflectionColor.rgb * primaryColor.rgb\n color *= mesh.primaryColor;\n\n if (scene.vImageInfos.w >= 0.0) {\n // Exposure\n color *= mesh.exposureLinear;\n // Reinhard tonemap (matches BJS toneMappingType 0)\n color = 1.0 - exp2(-1.590579 * color);\n // Gamma\n color = pow(color, vec3<f32>(1.0 / 2.2));\n color = saturate(color);\n\n // Contrast\n let highContrast = color * color * (3.0 - 2.0 * color);\n color = mix(color, highContrast, mesh.contrast - 1.0);\n\n // Dithering (enableNoise=true, variance=0.5)\n color = color + vec3<f32>(dither(input.positionW.xy, 0.5));\n color = max(color, vec3<f32>(0.0));\n }\n\n return vec4<f32>(color, 1.0);\n}\n";
6
6
  const SKY_DDS_UNIFORM_SIZE = 96;
7
7
  const DEFAULT_SKY_URL = "https://assets.babylonjs.com/core/environments/backgroundSkybox.dds";
8
8
  function createSkyboxBuffers(engine, S) {
9
- const positions = new Float32Array([
9
+ const positions = new F32([
10
10
  S,
11
11
  -S,
12
12
  S,
@@ -80,7 +80,7 @@ function createSkyboxBuffers(engine, S) {
80
80
  -S,
81
81
  S
82
82
  ]);
83
- const indices = new Uint16Array([
83
+ const indices = new U16([
84
84
  2,
85
85
  1,
86
86
  0,
@@ -119,13 +119,13 @@ function createSkyboxBuffers(engine, S) {
119
119
  20
120
120
  ]);
121
121
  return {
122
- posBuffer: createMappedBuffer(engine, positions, GPUBufferUsage.VERTEX),
123
- idxBuffer: createMappedBuffer(engine, indices, GPUBufferUsage.INDEX),
122
+ posBuffer: createMappedBuffer(engine, positions, BU.VERTEX),
123
+ idxBuffer: createMappedBuffer(engine, indices, BU.INDEX),
124
124
  idxCount: 36
125
125
  };
126
126
  }
127
127
  function buildSkyboxWorldMatrix(rootPosition) {
128
- const world = new Float32Array(16);
128
+ const world = new F32(16);
129
129
  world[0] = 1;
130
130
  world[5] = 1;
131
131
  world[10] = 1;
@@ -136,7 +136,7 @@ function buildSkyboxWorldMatrix(rootPosition) {
136
136
  return world;
137
137
  }
138
138
  async function buildDdsSkyboxRenderable(scene, skyHalfSize, rootPosition, primaryColor, skyboxTextureUrl, enableNoise = true) {
139
- const engine = scene.engine;
139
+ const engine = scene.surface.engine;
140
140
  const skyboxWorld = buildSkyboxWorldMatrix(rootPosition);
141
141
  const skyBufs = createSkyboxBuffers(engine, skyHalfSize);
142
142
  const { cubeView, sampler } = await loadDdsCube(engine, skyboxTextureUrl ?? DEFAULT_SKY_URL);
@@ -164,7 +164,7 @@ async function buildDdsSkyboxRenderable(scene, skyHalfSize, rootPosition, primar
164
164
  return r;
165
165
  }
166
166
  function createDdsMeshUBO(engine, world, primaryColor, exposureLinear, contrast) {
167
- const data = new Float32Array(SKY_DDS_UNIFORM_SIZE / 4);
167
+ const data = new F32(SKY_DDS_UNIFORM_SIZE / 4);
168
168
  data.set(world, 0);
169
169
  data[16] = primaryColor[0];
170
170
  data[17] = primaryColor[1];
@@ -176,18 +176,18 @@ function createDdsMeshUBO(engine, world, primaryColor, exposureLinear, contrast)
176
176
  async function loadDdsCube(engine, url) {
177
177
  const device = engine._device;
178
178
  const buf = await (await fetch(url)).arrayBuffer();
179
- const header = new Int32Array(buf, 0, 32);
179
+ const header = new I32(buf, 0, 32);
180
180
  const width = header[3];
181
181
  const height = header[4];
182
182
  const mipCount = Math.max(header[7], 1);
183
183
  const dataOffset = header[21] === 808540228 ? 128 + 20 : 128;
184
- const raw = new Uint8Array(buf, dataOffset);
184
+ const raw = new U8(buf, dataOffset);
185
185
  const fmt = "rgba16float";
186
186
  const tex = device.createTexture({
187
187
  size: [width, height, 6],
188
188
  format: fmt,
189
189
  mipLevelCount: mipCount,
190
- usage: GPUTextureUsage.TEXTURE_BINDING | GPUTextureUsage.COPY_DST | GPUTextureUsage.RENDER_ATTACHMENT,
190
+ usage: TU.TEXTURE_BINDING | TU.COPY_DST | TU.RENDER_ATTACHMENT,
191
191
  dimension: "2d"
192
192
  });
193
193
  let offset = 0;
@@ -218,4 +218,4 @@ async function loadDdsCube(engine, url) {
218
218
  export {
219
219
  buildDdsSkyboxRenderable
220
220
  };
221
- //# sourceMappingURL=background-dds-skybox-yHTqabU3.js.map
221
+ //# sourceMappingURL=background-dds-skybox-BEX309u3.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"background-dds-skybox-BEX309u3.js","sources":["../shaders/skybox-dds.vertex.wgsl?raw","../shaders/skybox-dds.fragment.wgsl?raw","../src/material/pbr/background-dds-skybox.ts"],"sourcesContent":["export default \"// DDS Skybox Vertex Shader — standard world transform.\\n// positionUVW uses local position for cube direction lookup.\\n\\nstruct MeshUniforms {\\n world: mat4x4<f32>,\\n};\\n\\n@group(1) @binding(0) var<uniform> mesh: MeshUniforms;\\n\\nstruct VertexOutput {\\n @builtin(position) clipPos: vec4<f32>,\\n @location(0) positionUVW: vec3<f32>,\\n @location(1) positionW: vec3<f32>,\\n};\\n\\n@vertex\\nfn main(@location(0) position: vec3<f32>) -> VertexOutput {\\n var output: VertexOutput;\\n output.positionUVW = position;\\n let worldPos = (mesh.world * vec4<f32>(position, 1.0)).xyz;\\n output.positionW = worldPos;\\n output.clipPos = scene.viewProjection * vec4<f32>(worldPos, 1.0);\\n return output;\\n}\\n\"","export default \"// DDS Cube Skybox Fragment Shader — samples DDS cube texture with BJS image processing.\\n// Used by scenes that load backgroundSkybox.dds (createDefaultEnvironment).\\n// Pipeline: exposure → Reinhard tonemap → gamma → contrast → dither.\\n\\nstruct MeshUniforms {\\n world: mat4x4<f32>,\\n primaryColor: vec3<f32>,\\n exposureLinear: f32,\\n contrast: f32,\\n _pad1: f32,\\n _pad2: f32,\\n _pad3: f32,\\n};\\n\\n@group(1) @binding(0) var<uniform> mesh: MeshUniforms;\\n@group(1) @binding(1) var envCubemap: texture_cube<f32>;\\n@group(1) @binding(2) var envSampler: sampler;\\n\\nstruct FragmentInput {\\n @location(0) positionUVW: vec3<f32>,\\n @location(1) positionW: vec3<f32>,\\n};\\n\\n@fragment\\nfn main(input: FragmentInput) -> @location(0) vec4<f32> {\\n let dir = normalize(input.positionUVW);\\n var color = textureSampleLevel(envCubemap, envSampler, dir, 0.0).rgb;\\n\\n // BJS BackgroundMaterial: colorBase = reflectionColor.rgb * primaryColor.rgb\\n color *= mesh.primaryColor;\\n\\n if (scene.vImageInfos.w >= 0.0) {\\n // Exposure\\n color *= mesh.exposureLinear;\\n // Reinhard tonemap (matches BJS toneMappingType 0)\\n color = 1.0 - exp2(-1.590579 * color);\\n // Gamma\\n color = pow(color, vec3<f32>(1.0 / 2.2));\\n color = saturate(color);\\n\\n // Contrast\\n let highContrast = color * color * (3.0 - 2.0 * color);\\n color = mix(color, highContrast, mesh.contrast - 1.0);\\n\\n // Dithering (enableNoise=true, variance=0.5)\\n color = color + vec3<f32>(dither(input.positionW.xy, 0.5));\\n color = max(color, vec3<f32>(0.0));\\n }\\n\\n return vec4<f32>(color, 1.0);\\n}\\n\"","/** DDS cube skybox — lazy-loaded only when skyboxUrl ends with .dds.\n * Loads backgroundSkybox.dds and renders it with BJS image processing. */\n\nimport { F32, I32, U16, U8 } from \"../../engine/typed-arrays.js\";\nimport { TU, BU } from \"../../engine/gpu-flags.js\";\nimport type { SceneContext } from \"../../scene/scene.js\";\nimport type { EngineContext } from \"../../engine/engine.js\";\nimport type { Renderable } from \"../../render/renderable.js\";\nimport { getOrCreateSampler } from \"../../resource/gpu-pool.js\";\nimport { createMappedBuffer, createUniformBuffer } from \"../../resource/gpu-buffers.js\";\nimport { WGSL_DITHER, WGSL_NO_DITHER } from \"../../shader/wgsl-helpers.js\";\nimport { SCENE_UBO_WGSL } from \"../../shader/scene-uniforms.js\";\nimport { createCubemapSkyboxMaterial } from \"./cubemap-skybox-material.js\";\nimport ddsSkyboxVertSrc from \"../../../shaders/skybox-dds.vertex.wgsl?raw\";\nimport ddsSkyboxFragSrc from \"../../../shaders/skybox-dds.fragment.wgsl?raw\";\n\nconst SKY_DDS_UNIFORM_SIZE = 96;\nconst DEFAULT_SKY_URL = \"https://assets.babylonjs.com/core/environments/backgroundSkybox.dds\";\n\nfunction createSkyboxBuffers(engine: EngineContext, S: number): { posBuffer: GPUBuffer; idxBuffer: GPUBuffer; idxCount: number } {\n // prettier-ignore\n const positions = new F32([\n S,-S, S, -S,-S, S, -S, S, S, S, S, S,\n S, S,-S, -S, S,-S, -S,-S,-S, S,-S,-S,\n S, S,-S, S,-S,-S, S,-S, S, S, S, S,\n -S, S, S, -S,-S, S, -S,-S,-S, -S, S,-S,\n -S, S, S, -S, S,-S, S, S,-S, S, S, S,\n S,-S, S, S,-S,-S, -S,-S,-S, -S,-S, S,\n ]);\n // prettier-ignore\n const indices = new U16([\n 2, 1, 0, 3, 2, 0, 6, 5, 4, 7, 6, 4,\n 10, 9, 8, 11,10, 8, 14,13,12, 15,14,12,\n 18,17,16, 19,18,16, 22,21,20, 23,22,20,\n ]);\n return {\n posBuffer: createMappedBuffer(engine, positions, BU.VERTEX),\n idxBuffer: createMappedBuffer(engine, indices, BU.INDEX),\n idxCount: 36,\n };\n}\n\nfunction buildSkyboxWorldMatrix(rootPosition: [number, number, number]): Float32Array {\n const world = new F32(16);\n world[0] = 1;\n world[5] = 1;\n world[10] = 1;\n world[15] = 1;\n world[12] = rootPosition[0];\n world[13] = rootPosition[1];\n world[14] = rootPosition[2];\n return world;\n}\n\n/** Build a DDS cube skybox as a complete Renderable (order 0). */\nexport async function buildDdsSkyboxRenderable(\n scene: SceneContext,\n skyHalfSize: number,\n rootPosition: [number, number, number],\n primaryColor: [number, number, number],\n skyboxTextureUrl?: string,\n enableNoise = true\n): Promise<Renderable> {\n const engine = scene.surface.engine;\n\n const skyboxWorld = buildSkyboxWorldMatrix(rootPosition);\n\n const skyBufs = createSkyboxBuffers(engine, skyHalfSize);\n const { cubeView, sampler } = await loadDdsCube(engine, skyboxTextureUrl ?? DEFAULT_SKY_URL);\n\n const fragCode = SCENE_UBO_WGSL + (enableNoise ? WGSL_DITHER : WGSL_NO_DITHER) + ddsSkyboxFragSrc;\n const mat = createCubemapSkyboxMaterial(enableNoise ? \"skybox-dds\" : \"skybox-dds0\", SCENE_UBO_WGSL + ddsSkyboxVertSrc, fragCode);\n const ubo = createDdsMeshUBO(engine, skyboxWorld, primaryColor, scene.imageProcessing.exposure, scene.imageProcessing.contrast);\n const bindGroup = mat.createBindGroup(engine, ubo, cubeView, sampler);\n\n const r: Renderable = {\n order: 0,\n isTransparent: false,\n bind(eng, sig) {\n return {\n renderable: r,\n pipeline: mat.getPipeline(eng as EngineContext, sig),\n draw(pass) {\n pass.setBindGroup(1, bindGroup);\n pass.setVertexBuffer(0, skyBufs.posBuffer);\n pass.setIndexBuffer(skyBufs.idxBuffer, \"uint16\");\n pass.drawIndexed(skyBufs.idxCount);\n return 1;\n },\n };\n },\n };\n return r;\n}\n\n// ─── DDS Skybox UBO ──────────────────────────────────────────────────────────\n\nfunction createDdsMeshUBO(engine: EngineContext, world: Float32Array, primaryColor: [number, number, number], exposureLinear: number, contrast: number): GPUBuffer {\n const data = new F32(SKY_DDS_UNIFORM_SIZE / 4);\n data.set(world, 0);\n data[16] = primaryColor[0];\n data[17] = primaryColor[1];\n data[18] = primaryColor[2];\n data[19] = exposureLinear;\n data[20] = contrast;\n return createUniformBuffer(engine, data);\n}\n\n// ─── DDS Cube Texture Loader ─────────────────────────────────────────────────\n\n/** Load a DDS cube texture (rgba16float) and return a cube texture view + sampler.\n * Uploads only mip 0 from the DDS file and generates remaining mipmaps on the\n * GPU so that cube face edges blend seamlessly — matching BJS's behaviour. */\nasync function loadDdsCube(engine: EngineContext, url: string): Promise<{ cubeView: GPUTextureView; sampler: GPUSampler }> {\n const device = engine._device;\n const buf = await (await fetch(url)).arrayBuffer();\n const header = new I32(buf, 0, 32);\n const width = header[3]!;\n const height = header[4]!;\n const mipCount = Math.max(header[7]!, 1);\n\n // DDS pixel format offset 76..107 — for rgba16float, FourCC = 'DX10'\n // DDS_HEADER_DX10 at byte 128: dxgiFormat, resourceDimension, miscFlag, arraySize, etc.\n // For cube: miscFlag has RESOURCE_MISC_TEXTURECUBE (0x4), arraySize = 1 (6 faces in data)\n const dataOffset = header[21] === 0x30315844 /* 'DX10' */ ? 128 + 20 : 128;\n const raw = new U8(buf, dataOffset);\n\n const fmt: GPUTextureFormat = \"rgba16float\";\n const tex = device.createTexture({\n size: [width, height, 6],\n format: fmt,\n mipLevelCount: mipCount,\n usage: TU.TEXTURE_BINDING | TU.COPY_DST | TU.RENDER_ATTACHMENT,\n dimension: \"2d\",\n });\n\n // Upload all mip levels for each face from the DDS (face-major layout).\n // Even though the skybox shader samples mip 0 explicitly, uploading all\n // mips avoids the need for GPU-side mipmap generation.\n let offset = 0;\n for (let face = 0; face < 6; face++) {\n for (let m = 0; m < mipCount; m++) {\n const s = Math.max(width >> m, 1);\n device.queue.writeTexture(\n { texture: tex, origin: { x: 0, y: 0, z: face }, mipLevel: m },\n raw.buffer,\n { offset: raw.byteOffset + offset, bytesPerRow: s * 8 },\n { width: s, height: s }\n );\n offset += s * s * 8;\n }\n }\n\n const cubeView = tex.createView({ dimension: \"cube\" });\n const sampler = getOrCreateSampler(engine, {\n magFilter: \"linear\",\n minFilter: \"linear\",\n mipmapFilter: \"linear\",\n addressModeU: \"clamp-to-edge\",\n addressModeV: \"clamp-to-edge\",\n addressModeW: \"clamp-to-edge\",\n maxAnisotropy: 4,\n });\n\n return { cubeView, sampler };\n}\n"],"names":[],"mappings":"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"}
@@ -1,5 +1,5 @@
1
- import { b2 as getBilinearSampler, e as createMappedBuffer, aY as createUniformBuffer, D as targetSignatureKey, aW as SCENE_UBO_WGSL, F as getSceneBindGroupLayout } from "./index-C8HOR2sB.js";
2
- import { a as WGSL_DITHER, b as WGSL_NO_DITHER } from "./wgsl-helpers-DyzNzCeE.js";
1
+ import { a as F32, cb as getBilinearSampler, j as createMappedBuffer, B as BU, h as U16, av as createUniformBuffer, T as TU, e as U8, x as targetSignatureKey, q as SCENE_UBO_WGSL, z as getSceneBindGroupLayout, S as SS } from "./index-CLElg2Bo.js";
2
+ import { b as WGSL_DITHER, c as WGSL_NO_DITHER } from "./wgsl-helpers-D8sl1VVA.js";
3
3
  const groundVertSrc = "// Background Ground Vertex Shader\n// Matches BJS shd_15: DIFFUSE, OPACITYFRESNEL, PREMULTIPLYALPHA (no REFLECTION)\n\nstruct MeshUniforms {\n world: mat4x4<f32>,\n};\n\n@group(1) @binding(0) var<uniform> mesh: MeshUniforms;\n\nstruct VertexInput {\n @location(0) position: vec3<f32>,\n @location(1) normal: vec3<f32>,\n @location(2) uv: vec2<f32>,\n};\n\nstruct VertexOutput {\n @builtin(position) clipPos: vec4<f32>,\n @location(0) vPositionW: vec3<f32>,\n @location(1) vNormalW: vec3<f32>,\n @location(2) vUV: vec2<f32>,\n};\n\n@vertex\nfn main(input: VertexInput) -> VertexOutput {\n var output: VertexOutput;\n let finalWorld = mesh.world;\n let worldPos4 = finalWorld * vec4<f32>(input.position, 1.0);\n output.vPositionW = worldPos4.xyz;\n output.clipPos = scene.viewProjection * worldPos4;\n let normalWorld = mat3x3<f32>(finalWorld[0].xyz, finalWorld[1].xyz, finalWorld[2].xyz);\n output.vNormalW = normalize(normalWorld * input.normal);\n output.vUV = input.uv;\n return output;\n}\n";
4
4
  const groundFragSrc = "// Background Ground Fragment Shader\n// Matches BJS shd_16: DIFFUSE, OPACITYFRESNEL, PREMULTIPLYALPHA (no REFLECTION)\n// Verified via Spector.GPU capture of BJS scene 1\n\nstruct MeshUniforms {\n world: mat4x4<f32>,\n primaryColor: vec3<f32>,\n alpha: f32,\n backgroundCenter: vec3<f32>,\n _pad: f32,\n};\n@group(1) @binding(0) var<uniform> mesh: MeshUniforms;\n\n@group(1) @binding(1) var groundTexture: texture_2d<f32>;\n@group(1) @binding(2) var groundSampler: sampler;\n\nstruct FragmentInput {\n @location(0) vPositionW: vec3<f32>,\n @location(1) vNormalW: vec3<f32>,\n @location(2) vUV: vec2<f32>,\n};\n\n@fragment\nfn main(input: FragmentInput) -> @location(0) vec4<f32> {\n let normalW = normalize(input.vNormalW);\n\n // Sample diffuse texture (BJS backgroundGround.png: white RGB, radial alpha gradient)\n let diffuseMap = textureSample(groundTexture, groundSampler, input.vUV);\n\n // BJS: reflectionColor = vec4(1) (no REFLECTION define)\n let diffuseColor = diffuseMap.rgb;\n let colorBase = max(diffuseColor, vec3<f32>(0.0));\n let mainColor = mesh.primaryColor;\n let finalColor = colorBase * mainColor;\n\n // Alpha starts from material alpha, multiplied by texture alpha\n var finalAlpha = mesh.alpha * diffuseMap.a;\n\n // OPACITYFRESNEL — BJS shd_16 lines 367-370\n let viewAngleToFloor = dot(normalW, normalize(scene.vEyePosition.xyz - mesh.backgroundCenter));\n const startAngle: f32 = 0.1;\n let fadeFactor = clamp(viewAngleToFloor / startAngle, 0.0, 1.0);\n finalAlpha *= fadeFactor * fadeFactor;\n\n // Image processing (preserves alpha)\n var color = vec4<f32>(finalColor, finalAlpha);\n if (scene.vImageInfos.w >= 0.0) {\n color = applyImageProcessing(color);\n }\n\n // PREMULTIPLYALPHA — BJS shd_16 line 373\n color = vec4<f32>(color.rgb * color.a, color.a);\n\n // Dithering\n color = vec4<f32>(color.rgb + vec3<f32>(dither(input.vPositionW.xy, 0.5)), color.a);\n color = max(color, vec4<f32>(0.0));\n\n return color;\n}\n";
5
5
  const WGSL_IMAGE_PROCESSING = `
@@ -25,7 +25,7 @@ async function buildGroundRenderable(engine, groundSize, rootPosition, primaryCo
25
25
  const fragCode = SCENE_UBO_WGSL + WGSL_IMAGE_PROCESSING + (enableNoise ? WGSL_DITHER : WGSL_NO_DITHER) + groundFragSrc;
26
26
  const gndMat = createGroundMaterial(enableNoise, fragCode);
27
27
  const eps = 2220446049250313e-31;
28
- const groundWorld = new Float32Array(16);
28
+ const groundWorld = new F32(16);
29
29
  groundWorld[0] = 1;
30
30
  groundWorld[5] = eps;
31
31
  groundWorld[6] = -1;
@@ -75,9 +75,9 @@ function createGroundMaterial(enableNoise, fragCode) {
75
75
  _gndLayout = device.createBindGroupLayout({
76
76
  label: "ground-material",
77
77
  entries: [
78
- { binding: 0, visibility: GPUShaderStage.VERTEX | GPUShaderStage.FRAGMENT, buffer: { type: "uniform" } },
79
- { binding: 1, visibility: GPUShaderStage.FRAGMENT, texture: { sampleType: "float", viewDimension: "2d" } },
80
- { binding: 2, visibility: GPUShaderStage.FRAGMENT, sampler: { type: "filtering" } }
78
+ { binding: 0, visibility: SS.VERTEX | SS.FRAGMENT, buffer: { type: "uniform" } },
79
+ { binding: 1, visibility: SS.FRAGMENT, texture: { sampleType: "float", viewDimension: "2d" } },
80
+ { binding: 2, visibility: SS.FRAGMENT, sampler: { type: "filtering" } }
81
81
  ]
82
82
  });
83
83
  _gndCachedDevice = device;
@@ -129,7 +129,7 @@ function createGroundMaterial(enableNoise, fragCode) {
129
129
  depthWriteEnabled: false
130
130
  },
131
131
  multisample: { count: sig._sampleCount },
132
- primitive: { topology: "triangle-list", cullMode: "back", frontFace: sig._flipY ? "cw" : "ccw" }
132
+ primitive: { topology: "triangle-list", cullMode: "back", frontFace: "ccw" }
133
133
  });
134
134
  _gndPipelines.set(key, pipeline);
135
135
  return pipeline;
@@ -149,7 +149,7 @@ function createGroundMaterial(enableNoise, fragCode) {
149
149
  }
150
150
  function createGroundBuffers(engine, groundSize) {
151
151
  const h = groundSize / 2;
152
- const positions = new Float32Array([
152
+ const positions = new F32([
153
153
  -h,
154
154
  -h,
155
155
  0,
@@ -163,7 +163,7 @@ function createGroundBuffers(engine, groundSize) {
163
163
  h,
164
164
  0
165
165
  ]);
166
- const normals = new Float32Array([
166
+ const normals = new F32([
167
167
  0,
168
168
  0,
169
169
  1,
@@ -177,7 +177,7 @@ function createGroundBuffers(engine, groundSize) {
177
177
  0,
178
178
  1
179
179
  ]);
180
- const uvs = new Float32Array([
180
+ const uvs = new F32([
181
181
  0,
182
182
  0,
183
183
  1,
@@ -187,17 +187,17 @@ function createGroundBuffers(engine, groundSize) {
187
187
  0,
188
188
  1
189
189
  ]);
190
- const indices = new Uint16Array([0, 2, 1, 0, 3, 2]);
190
+ const indices = new U16([0, 2, 1, 0, 3, 2]);
191
191
  return {
192
- posBuffer: createMappedBuffer(engine, positions, GPUBufferUsage.VERTEX),
193
- normBuffer: createMappedBuffer(engine, normals, GPUBufferUsage.VERTEX),
194
- uvBuffer: createMappedBuffer(engine, uvs, GPUBufferUsage.VERTEX),
195
- idxBuffer: createMappedBuffer(engine, indices, GPUBufferUsage.INDEX),
192
+ posBuffer: createMappedBuffer(engine, positions, BU.VERTEX),
193
+ normBuffer: createMappedBuffer(engine, normals, BU.VERTEX),
194
+ uvBuffer: createMappedBuffer(engine, uvs, BU.VERTEX),
195
+ idxBuffer: createMappedBuffer(engine, indices, BU.INDEX),
196
196
  idxCount: 6
197
197
  };
198
198
  }
199
199
  function createBgMeshUBO(engine, world, primaryColor) {
200
- const data = new Float32Array(BG_MESH_UNIFORM_SIZE / 4);
200
+ const data = new F32(BG_MESH_UNIFORM_SIZE / 4);
201
201
  data.set(world, 0);
202
202
  data[16] = primaryColor[0];
203
203
  data[17] = primaryColor[1];
@@ -214,16 +214,16 @@ async function loadGroundTexture(engine, url, preloadedImage) {
214
214
  const tex2 = device.createTexture({
215
215
  size: [1, 1],
216
216
  format: "rgba8unorm",
217
- usage: GPUTextureUsage.TEXTURE_BINDING | GPUTextureUsage.COPY_DST
217
+ usage: TU.TEXTURE_BINDING | TU.COPY_DST
218
218
  });
219
- device.queue.writeTexture({ texture: tex2 }, new Uint8Array([255, 255, 255, 255]), { bytesPerRow: 4 }, [1, 1]);
219
+ device.queue.writeTexture({ texture: tex2 }, new U8([255, 255, 255, 255]), { bytesPerRow: 4 }, [1, 1]);
220
220
  return tex2;
221
221
  }
222
222
  const bmp = preloadedImage ? await preloadedImage : await fetch(url).then((r) => r.blob()).then((b) => createImageBitmap(b, { premultiplyAlpha: "none" }));
223
223
  const tex = device.createTexture({
224
224
  size: [bmp.width, bmp.height],
225
225
  format: "rgba8unorm",
226
- usage: GPUTextureUsage.TEXTURE_BINDING | GPUTextureUsage.COPY_DST | GPUTextureUsage.RENDER_ATTACHMENT
226
+ usage: TU.TEXTURE_BINDING | TU.COPY_DST | TU.RENDER_ATTACHMENT
227
227
  });
228
228
  device.queue.copyExternalImageToTexture({ source: bmp }, { texture: tex }, [bmp.width, bmp.height]);
229
229
  bmp.close();
@@ -232,4 +232,4 @@ async function loadGroundTexture(engine, url, preloadedImage) {
232
232
  export {
233
233
  buildGroundRenderable
234
234
  };
235
- //# sourceMappingURL=background-ground-DIw6D3qf.js.map
235
+ //# sourceMappingURL=background-ground-BU0HOcM4.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"background-ground-BU0HOcM4.js","sources":["../shaders/background.vertex.wgsl?raw","../shaders/background.ground.fragment.wgsl?raw","../src/material/pbr/background-ground.ts"],"sourcesContent":["export default \"// Background Ground Vertex Shader\\n// Matches BJS shd_15: DIFFUSE, OPACITYFRESNEL, PREMULTIPLYALPHA (no REFLECTION)\\n\\nstruct MeshUniforms {\\n world: mat4x4<f32>,\\n};\\n\\n@group(1) @binding(0) var<uniform> mesh: MeshUniforms;\\n\\nstruct VertexInput {\\n @location(0) position: vec3<f32>,\\n @location(1) normal: vec3<f32>,\\n @location(2) uv: vec2<f32>,\\n};\\n\\nstruct VertexOutput {\\n @builtin(position) clipPos: vec4<f32>,\\n @location(0) vPositionW: vec3<f32>,\\n @location(1) vNormalW: vec3<f32>,\\n @location(2) vUV: vec2<f32>,\\n};\\n\\n@vertex\\nfn main(input: VertexInput) -> VertexOutput {\\n var output: VertexOutput;\\n let finalWorld = mesh.world;\\n let worldPos4 = finalWorld * vec4<f32>(input.position, 1.0);\\n output.vPositionW = worldPos4.xyz;\\n output.clipPos = scene.viewProjection * worldPos4;\\n let normalWorld = mat3x3<f32>(finalWorld[0].xyz, finalWorld[1].xyz, finalWorld[2].xyz);\\n output.vNormalW = normalize(normalWorld * input.normal);\\n output.vUV = input.uv;\\n return output;\\n}\\n\"","export default \"// Background Ground Fragment Shader\\n// Matches BJS shd_16: DIFFUSE, OPACITYFRESNEL, PREMULTIPLYALPHA (no REFLECTION)\\n// Verified via Spector.GPU capture of BJS scene 1\\n\\nstruct MeshUniforms {\\n world: mat4x4<f32>,\\n primaryColor: vec3<f32>,\\n alpha: f32,\\n backgroundCenter: vec3<f32>,\\n _pad: f32,\\n};\\n@group(1) @binding(0) var<uniform> mesh: MeshUniforms;\\n\\n@group(1) @binding(1) var groundTexture: texture_2d<f32>;\\n@group(1) @binding(2) var groundSampler: sampler;\\n\\nstruct FragmentInput {\\n @location(0) vPositionW: vec3<f32>,\\n @location(1) vNormalW: vec3<f32>,\\n @location(2) vUV: vec2<f32>,\\n};\\n\\n@fragment\\nfn main(input: FragmentInput) -> @location(0) vec4<f32> {\\n let normalW = normalize(input.vNormalW);\\n\\n // Sample diffuse texture (BJS backgroundGround.png: white RGB, radial alpha gradient)\\n let diffuseMap = textureSample(groundTexture, groundSampler, input.vUV);\\n\\n // BJS: reflectionColor = vec4(1) (no REFLECTION define)\\n let diffuseColor = diffuseMap.rgb;\\n let colorBase = max(diffuseColor, vec3<f32>(0.0));\\n let mainColor = mesh.primaryColor;\\n let finalColor = colorBase * mainColor;\\n\\n // Alpha starts from material alpha, multiplied by texture alpha\\n var finalAlpha = mesh.alpha * diffuseMap.a;\\n\\n // OPACITYFRESNEL — BJS shd_16 lines 367-370\\n let viewAngleToFloor = dot(normalW, normalize(scene.vEyePosition.xyz - mesh.backgroundCenter));\\n const startAngle: f32 = 0.1;\\n let fadeFactor = clamp(viewAngleToFloor / startAngle, 0.0, 1.0);\\n finalAlpha *= fadeFactor * fadeFactor;\\n\\n // Image processing (preserves alpha)\\n var color = vec4<f32>(finalColor, finalAlpha);\\n if (scene.vImageInfos.w >= 0.0) {\\n color = applyImageProcessing(color);\\n }\\n\\n // PREMULTIPLYALPHA — BJS shd_16 line 373\\n color = vec4<f32>(color.rgb * color.a, color.a);\\n\\n // Dithering\\n color = vec4<f32>(color.rgb + vec3<f32>(dither(input.vPositionW.xy, 0.5)), color.a);\\n color = max(color, vec4<f32>(0.0));\\n\\n return color;\\n}\\n\"","/** Ground plane renderable — lazy-loaded only when a scene includes a ground.\n * Contains the ground material, mesh buffers, texture loading, and UBO creation.\n * Tree-shaken away from scenes that use `skipGround: true`. */\n\nimport { F32, U16, U8 } from \"../../engine/typed-arrays.js\";\nimport { TU, BU, SS } from \"../../engine/gpu-flags.js\";\nimport type { Mat4 } from \"../../math/types.js\";\nimport type { EngineContext } from \"../../engine/engine.js\";\nimport type { Renderable } from \"../../render/renderable.js\";\nimport type { RenderTargetSignature } from \"../../engine/render-target.js\";\nimport { getBilinearSampler } from \"../../resource/samplers.js\";\nimport { createUniformBuffer } from \"../../resource/gpu-buffers.js\";\nimport { getSceneBindGroupLayout } from \"../../render/scene-helpers.js\";\nimport { targetSignatureKey } from \"../../engine/render-target.js\";\nimport groundVertSrc from \"../../../shaders/background.vertex.wgsl?raw\";\nimport groundFragSrc from \"../../../shaders/background.ground.fragment.wgsl?raw\";\nimport { createMappedBuffer } from \"../../resource/gpu-buffers.js\";\nimport { SCENE_UBO_WGSL } from \"../../shader/scene-uniforms.js\";\nimport { WGSL_DITHER, WGSL_NO_DITHER } from \"../../shader/wgsl-helpers.js\";\n\n// ── Ground-frag-only WGSL helpers (kept here so scenes that don't load the ground\n// don't pay for the image-processing helper in the shared wgsl-helpers chunk). ──\n\n/** Image processing: exposure → Reinhard tonemap → gamma → contrast. */\nconst WGSL_IMAGE_PROCESSING = `\nfn applyImageProcessing(result: vec4<f32>) -> vec4<f32> {\nvar rgb = result.rgb;\nrgb *= scene.vImageInfos.x;\nconst tonemappingCalibration: f32 = 1.590579;\nrgb = 1.0 - exp2(-tonemappingCalibration * rgb);\nrgb = pow(rgb, vec3<f32>(1.0 / 2.2));\nrgb = clamp(rgb, vec3<f32>(0.0), vec3<f32>(1.0));\nlet highContrast = rgb * rgb * (3.0 - 2.0 * rgb);\nif (scene.vImageInfos.y < 1.0) {\nrgb = mix(vec3<f32>(0.5), rgb, scene.vImageInfos.y);\n} else {\nrgb = mix(rgb, highContrast, scene.vImageInfos.y - 1.0);\n}\nrgb = max(rgb, vec3<f32>(0.0));\nreturn vec4<f32>(rgb, result.a);\n}\n`;\n\nconst BG_MESH_UNIFORM_SIZE = 96; // mat4x4 + primaryColor vec3 + alpha + backgroundCenter vec3 + pad\n\n/** Build the ground renderable for a PBR environment scene. */\nexport async function buildGroundRenderable(\n engine: EngineContext,\n groundSize: number,\n rootPosition: [number, number, number],\n primaryColor: [number, number, number],\n groundTextureUrl?: string,\n groundImagePromise?: Promise<ImageBitmap>,\n enableNoise = true\n): Promise<Renderable> {\n const fragCode = SCENE_UBO_WGSL + WGSL_IMAGE_PROCESSING + (enableNoise ? WGSL_DITHER : WGSL_NO_DITHER) + groundFragSrc;\n const gndMat = createGroundMaterial(enableNoise, fragCode);\n\n // Ground world: rotated 90° X (XY→XZ), translated to rootPosition\n // Column-major for WGSL: ground quad in XY plane, normal +Z → world +Y\n // Offset Y by -0.01 to prevent z-fighting with scene floor geometry.\n const eps = 2.220446049250313e-16;\n const groundWorld = new F32(16);\n groundWorld[0] = 1;\n groundWorld[5] = eps;\n groundWorld[6] = -1;\n groundWorld[9] = 1;\n groundWorld[10] = eps;\n groundWorld[12] = rootPosition[0];\n groundWorld[13] = rootPosition[1];\n groundWorld[14] = rootPosition[2];\n groundWorld[15] = 1;\n\n const gndBufs = createGroundBuffers(engine, groundSize);\n const gndUBO = createBgMeshUBO(engine, groundWorld as unknown as Mat4, primaryColor);\n\n const groundTex = await loadGroundTexture(engine, groundTextureUrl, groundImagePromise);\n const groundTexView = groundTex.createView();\n const groundSamp = getBilinearSampler(engine);\n const gndBG = gndMat.createBindGroup(engine, gndUBO, groundTexView, groundSamp);\n\n const r: Renderable = {\n order: 200, // ground renders last (transparent)\n isTransparent: true,\n bind(eng, sig) {\n return {\n renderable: r,\n pipeline: gndMat.getPipeline(eng as EngineContext, sig),\n draw(pass) {\n pass.setBindGroup(1, gndBG);\n pass.setVertexBuffer(0, gndBufs.posBuffer);\n pass.setVertexBuffer(1, gndBufs.normBuffer);\n pass.setVertexBuffer(2, gndBufs.uvBuffer);\n pass.setIndexBuffer(gndBufs.idxBuffer, \"uint16\");\n pass.drawIndexed(gndBufs.idxCount);\n return 1;\n },\n };\n },\n };\n return r;\n}\n\n// ─── Ground Material ────────────────────────────────────────────────────────\n\ninterface GroundMaterial {\n getPipeline(engine: EngineContext, sig: RenderTargetSignature): GPURenderPipeline;\n createBindGroup(engine: EngineContext, meshUBO: GPUBuffer, groundTextureView: GPUTextureView, groundSampler: GPUSampler): GPUBindGroup;\n}\n\n/** Module-global pipeline cache — keyed by noise mode + full target signature (color/depth/samples/flipY).\n * All ground renderables share this cache. */\nconst _gndPipelines = new Map<string, GPURenderPipeline>();\nlet _gndLayout: GPUBindGroupLayout | null = null;\nlet _gndCachedDevice: GPUDevice | null = null;\n\nfunction createGroundMaterial(enableNoise: boolean, fragCode: string): GroundMaterial {\n function getLayout(engine: EngineContext): GPUBindGroupLayout {\n const device = engine._device;\n if (_gndLayout && _gndCachedDevice === device) {\n return _gndLayout;\n }\n _gndLayout = device.createBindGroupLayout({\n label: \"ground-material\",\n entries: [\n { binding: 0, visibility: SS.VERTEX | SS.FRAGMENT, buffer: { type: \"uniform\" } },\n { binding: 1, visibility: SS.FRAGMENT, texture: { sampleType: \"float\", viewDimension: \"2d\" } },\n { binding: 2, visibility: SS.FRAGMENT, sampler: { type: \"filtering\" } },\n ],\n });\n _gndCachedDevice = device;\n return _gndLayout;\n }\n\n return {\n getPipeline(engine, sig) {\n const device = engine._device;\n if (_gndCachedDevice !== device) {\n _gndPipelines.clear();\n _gndLayout = null;\n _gndCachedDevice = device;\n }\n const key = `${+enableNoise}|${targetSignatureKey(sig)}`;\n const cached = _gndPipelines.get(key);\n if (cached) {\n return cached;\n }\n const vertModule = device.createShaderModule({ code: SCENE_UBO_WGSL + groundVertSrc, label: \"ground-vert\" });\n const fragModule = device.createShaderModule({ code: fragCode, label: \"ground-frag\" });\n\n // Matches BJS rp_8: premultiplied alpha blend, depthWrite=false\n const pipeline = device.createRenderPipeline({\n label: \"ground-pipeline\",\n layout: device.createPipelineLayout({ bindGroupLayouts: [getSceneBindGroupLayout(engine), getLayout(engine)] }),\n vertex: {\n module: vertModule,\n entryPoint: \"main\",\n buffers: [\n { arrayStride: 12, attributes: [{ shaderLocation: 0, offset: 0, format: \"float32x3\" as GPUVertexFormat }] },\n { arrayStride: 12, attributes: [{ shaderLocation: 1, offset: 0, format: \"float32x3\" as GPUVertexFormat }] },\n { arrayStride: 8, attributes: [{ shaderLocation: 2, offset: 0, format: \"float32x2\" as GPUVertexFormat }] },\n ],\n },\n fragment: {\n module: fragModule,\n entryPoint: \"main\",\n targets: [\n {\n format: sig._colorFormat!,\n blend: {\n color: { srcFactor: \"one\", dstFactor: \"one-minus-src-alpha\", operation: \"add\" },\n alpha: { srcFactor: \"one\", dstFactor: \"one-minus-src-alpha\", operation: \"add\" },\n },\n },\n ],\n },\n depthStencil: {\n format: sig._depthStencilFormat ?? \"depth24plus-stencil8\",\n depthCompare: sig._depthCompare ?? \"greater-equal\",\n depthWriteEnabled: false,\n },\n multisample: { count: sig._sampleCount },\n primitive: { topology: \"triangle-list\", cullMode: \"back\", frontFace: \"ccw\" },\n });\n _gndPipelines.set(key, pipeline);\n return pipeline;\n },\n\n createBindGroup(engine, meshUBO, groundTextureView, groundSampler) {\n const device = engine._device;\n return device.createBindGroup({\n layout: getLayout(engine),\n entries: [\n { binding: 0, resource: { buffer: meshUBO } },\n { binding: 1, resource: groundTextureView },\n { binding: 2, resource: groundSampler },\n ],\n });\n },\n };\n}\n\n// ─── Ground Mesh Data ───────────────────────────────────────────────────────\n\n/** Ground quad (4 verts, 6 indices — matches BJS CreatePlane with BACKSIDE).\n * XY plane, normals +Z (become +Y after world rotation). */\nfunction createGroundBuffers(\n engine: EngineContext,\n groundSize: number\n): {\n posBuffer: GPUBuffer;\n normBuffer: GPUBuffer;\n uvBuffer: GPUBuffer;\n idxBuffer: GPUBuffer;\n idxCount: number;\n} {\n const h = groundSize / 2;\n // prettier-ignore\n const positions = new F32([\n -h, -h, 0,\n h, -h, 0,\n h, h, 0,\n -h, h, 0,\n ]);\n // prettier-ignore\n const normals = new F32([\n 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1,\n ]);\n // prettier-ignore\n const uvs = new F32([\n 0, 0, 1, 0, 1, 1, 0, 1,\n ]);\n // BACKSIDE winding\n // prettier-ignore\n const indices = new U16([0, 2, 1, 0, 3, 2]);\n\n return {\n posBuffer: createMappedBuffer(engine, positions, BU.VERTEX),\n normBuffer: createMappedBuffer(engine, normals, BU.VERTEX),\n uvBuffer: createMappedBuffer(engine, uvs, BU.VERTEX),\n idxBuffer: createMappedBuffer(engine, indices, BU.INDEX),\n idxCount: 6,\n };\n}\n\n// ─── Ground UBO ─────────────────────────────────────────────────────────────\n\nfunction createBgMeshUBO(engine: EngineContext, world: Mat4, primaryColor: [number, number, number]): GPUBuffer {\n const data = new F32(BG_MESH_UNIFORM_SIZE / 4);\n data.set(world, 0); // offset 0: world mat4x4\n data[16] = primaryColor[0]; // offset 64: primaryColor.r\n data[17] = primaryColor[1]; // offset 68: primaryColor.g\n data[18] = primaryColor[2]; // offset 72: primaryColor.b\n data[19] = 0.9; // offset 76: alpha (BJS default groundOpacity)\n data[20] = 0;\n data[21] = 0;\n data[22] = 0; // offset 80: backgroundCenter\n return createUniformBuffer(engine, data);\n}\n\n// ─── Ground Texture ─────────────────────────────────────────────────────────\n\n/** Load a ground diffuse texture from URL and upload to GPU.\n * Falls back to a 1×1 white pixel if no URL provided. */\nasync function loadGroundTexture(engine: EngineContext, url?: string, preloadedImage?: Promise<ImageBitmap>): Promise<GPUTexture> {\n const device = engine._device;\n if (!url) {\n const tex = device.createTexture({\n size: [1, 1],\n format: \"rgba8unorm\",\n usage: TU.TEXTURE_BINDING | TU.COPY_DST,\n });\n device.queue.writeTexture({ texture: tex }, new U8([255, 255, 255, 255]), { bytesPerRow: 4 }, [1, 1]);\n return tex;\n }\n // Use pre-fetched image if available (started early in loadEnvironment)\n const bmp = preloadedImage\n ? await preloadedImage\n : await fetch(url)\n .then((r) => r.blob())\n .then((b) => createImageBitmap(b, { premultiplyAlpha: \"none\" }));\n const tex = device.createTexture({\n size: [bmp.width, bmp.height],\n format: \"rgba8unorm\",\n usage: TU.TEXTURE_BINDING | TU.COPY_DST | TU.RENDER_ATTACHMENT,\n });\n device.queue.copyExternalImageToTexture({ source: bmp }, { texture: tex }, [bmp.width, bmp.height]);\n bmp.close();\n return tex;\n}\n"],"names":["tex"],"mappings":"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"}
@@ -1,10 +1,10 @@
1
- import { c as createCubemapSkyboxMaterial } from "./cubemap-skybox-material-DvXMVc4k.js";
1
+ import { a as F32, j as createMappedBuffer, B as BU, h as U16, av as createUniformBuffer, q as SCENE_UBO_WGSL } from "./index-CLElg2Bo.js";
2
+ import { c as createCubemapSkyboxMaterial } from "./cubemap-skybox-material-DQcMMdf-.js";
2
3
  import { s as skyboxVertSrc } from "./skybox.vertex-DJgi072W.js";
3
- import { e as createMappedBuffer, aY as createUniformBuffer, aW as SCENE_UBO_WGSL } from "./index-C8HOR2sB.js";
4
4
  const skyboxHdrFragSrc = "// HDR Skybox Fragment Shader — samples HDR environment cubemap with image processing.\n// Used when scene has an HDR environment rendered as the background.\n// Matches BJS BackgroundMaterial: cubemap at LOD 0 + exposure + gamma + contrast.\n\nstruct MeshUniforms {\n world: mat4x4<f32>,\n primaryColor: vec3<f32>,\n _pad: f32,\n skyOutputColor: vec3<f32>,\n _pad2: f32,\n exposureLinear: f32,\n contrast: f32,\n _pad3: f32,\n _pad4: f32,\n};\n\n@group(1) @binding(0) var<uniform> mesh: MeshUniforms;\n@group(1) @binding(1) var envCubemap: texture_cube<f32>;\n@group(1) @binding(2) var envSampler: sampler;\n\nstruct FragmentInput {\n @location(0) positionUVW: vec3<f32>,\n @location(1) positionW: vec3<f32>,\n};\n\n@fragment\nfn main(input: FragmentInput) -> @location(0) vec4<f32> {\n let dir = normalize(input.positionUVW);\n var color = textureSampleLevel(envCubemap, envSampler, dir, 0.0).rgb;\n\n // Image processing: exposure → gamma → contrast (matches BJS applyImageProcessing)\n color *= mesh.exposureLinear;\n color = pow(color, vec3<f32>(1.0 / 2.2));\n color = clamp(color, vec3<f32>(0.0), vec3<f32>(1.0));\n\n let highContrast = color * color * (3.0 - 2.0 * color);\n if (mesh.contrast < 1.0) { color = mix(vec3<f32>(0.5), color, mesh.contrast); }\n else { color = mix(color, highContrast, mesh.contrast - 1.0); }\n color = max(color, vec3<f32>(0.0));\n\n return vec4<f32>(color, 1.0);\n}\n";
5
5
  const SKY_HDR_UNIFORM_SIZE = 112;
6
6
  function createSkyboxBuffers(engine, S) {
7
- const positions = new Float32Array([
7
+ const positions = new F32([
8
8
  S,
9
9
  -S,
10
10
  S,
@@ -78,7 +78,7 @@ function createSkyboxBuffers(engine, S) {
78
78
  -S,
79
79
  S
80
80
  ]);
81
- const indices = new Uint16Array([
81
+ const indices = new U16([
82
82
  2,
83
83
  1,
84
84
  0,
@@ -117,13 +117,13 @@ function createSkyboxBuffers(engine, S) {
117
117
  20
118
118
  ]);
119
119
  return {
120
- posBuffer: createMappedBuffer(engine, positions, GPUBufferUsage.VERTEX),
121
- idxBuffer: createMappedBuffer(engine, indices, GPUBufferUsage.INDEX),
120
+ posBuffer: createMappedBuffer(engine, positions, BU.VERTEX),
121
+ idxBuffer: createMappedBuffer(engine, indices, BU.INDEX),
122
122
  idxCount: 36
123
123
  };
124
124
  }
125
125
  function buildSkyboxWorldMatrix(rootPosition) {
126
- const world = new Float32Array(16);
126
+ const world = new F32(16);
127
127
  world[0] = 1;
128
128
  world[5] = 1;
129
129
  world[10] = 1;
@@ -134,7 +134,7 @@ function buildSkyboxWorldMatrix(rootPosition) {
134
134
  return world;
135
135
  }
136
136
  function buildHdrSkyboxRenderable(scene, envTextures, skyHalfSize, rootPosition, primaryColor) {
137
- const engine = scene.engine;
137
+ const engine = scene.surface.engine;
138
138
  const skyboxWorld = buildSkyboxWorldMatrix(rootPosition);
139
139
  const cc = scene.clearColor;
140
140
  const skyBufs = createSkyboxBuffers(engine, skyHalfSize);
@@ -161,7 +161,7 @@ function buildHdrSkyboxRenderable(scene, envTextures, skyHalfSize, rootPosition,
161
161
  return r;
162
162
  }
163
163
  function createSkyHdrMeshUBO(engine, world, primaryColor, skyOutputColor, exposure, contrast) {
164
- const data = new Float32Array(SKY_HDR_UNIFORM_SIZE / 4);
164
+ const data = new F32(SKY_HDR_UNIFORM_SIZE / 4);
165
165
  data.set(world, 0);
166
166
  data[16] = primaryColor[0];
167
167
  data[17] = primaryColor[1];
@@ -176,4 +176,4 @@ function createSkyHdrMeshUBO(engine, world, primaryColor, skyOutputColor, exposu
176
176
  export {
177
177
  buildHdrSkyboxRenderable
178
178
  };
179
- //# sourceMappingURL=background-hdr-skybox-c4uuTmkP.js.map
179
+ //# sourceMappingURL=background-hdr-skybox--RRRic_K.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"background-hdr-skybox--RRRic_K.js","sources":["../shaders/skybox-hdr.fragment.wgsl?raw","../src/material/pbr/background-hdr-skybox.ts"],"sourcesContent":["export default \"// HDR Skybox Fragment Shader — samples HDR environment cubemap with image processing.\\n// Used when scene has an HDR environment rendered as the background.\\n// Matches BJS BackgroundMaterial: cubemap at LOD 0 + exposure + gamma + contrast.\\n\\nstruct MeshUniforms {\\n world: mat4x4<f32>,\\n primaryColor: vec3<f32>,\\n _pad: f32,\\n skyOutputColor: vec3<f32>,\\n _pad2: f32,\\n exposureLinear: f32,\\n contrast: f32,\\n _pad3: f32,\\n _pad4: f32,\\n};\\n\\n@group(1) @binding(0) var<uniform> mesh: MeshUniforms;\\n@group(1) @binding(1) var envCubemap: texture_cube<f32>;\\n@group(1) @binding(2) var envSampler: sampler;\\n\\nstruct FragmentInput {\\n @location(0) positionUVW: vec3<f32>,\\n @location(1) positionW: vec3<f32>,\\n};\\n\\n@fragment\\nfn main(input: FragmentInput) -> @location(0) vec4<f32> {\\n let dir = normalize(input.positionUVW);\\n var color = textureSampleLevel(envCubemap, envSampler, dir, 0.0).rgb;\\n\\n // Image processing: exposure → gamma → contrast (matches BJS applyImageProcessing)\\n color *= mesh.exposureLinear;\\n color = pow(color, vec3<f32>(1.0 / 2.2));\\n color = clamp(color, vec3<f32>(0.0), vec3<f32>(1.0));\\n\\n let highContrast = color * color * (3.0 - 2.0 * color);\\n if (mesh.contrast < 1.0) { color = mix(vec3<f32>(0.5), color, mesh.contrast); }\\n else { color = mix(color, highContrast, mesh.contrast - 1.0); }\\n color = max(color, vec3<f32>(0.0));\\n\\n return vec4<f32>(color, 1.0);\\n}\\n\"","/** HDR cubemap skybox — lazy-loaded only when useCubemapSkybox is true.\n * Contains the HDR skybox material, shader, UBO, and skybox geometry.\n * Self-contained: computes scene bounds and builds a full Renderable.\n * Tree-shaken away from scenes that use the default solid-color skybox. */\n\nimport { F32, U16 } from \"../../engine/typed-arrays.js\";\nimport { BU } from \"../../engine/gpu-flags.js\";\nimport type { SceneContext } from \"../../scene/scene.js\";\nimport type { EngineContext } from \"../../engine/engine.js\";\nimport type { EnvironmentTextures } from \"../../loader-env/load-env.js\";\n// Mat4 import removed: local world matrices stored as Float32Array.\nimport type { Renderable } from \"../../render/renderable.js\";\nimport { createCubemapSkyboxMaterial } from \"./cubemap-skybox-material.js\";\nimport skyboxVertSrc from \"../../../shaders/skybox.vertex.wgsl?raw\";\nimport skyboxHdrFragSrc from \"../../../shaders/skybox-hdr.fragment.wgsl?raw\";\nimport { SCENE_UBO_WGSL } from \"../../shader/scene-uniforms.js\";\nimport { createMappedBuffer, createUniformBuffer } from \"../../resource/gpu-buffers.js\";\n\nconst SKY_HDR_UNIFORM_SIZE = 112; // mat4x4 + primaryColor vec3 + pad + skyOutputColor vec3 + pad + exposure + contrast + pad2\n\nfunction createSkyboxBuffers(engine: EngineContext, S: number): { posBuffer: GPUBuffer; idxBuffer: GPUBuffer; idxCount: number } {\n // prettier-ignore\n const positions = new F32([\n S,-S, S, -S,-S, S, -S, S, S, S, S, S,\n S, S,-S, -S, S,-S, -S,-S,-S, S,-S,-S,\n S, S,-S, S,-S,-S, S,-S, S, S, S, S,\n -S, S, S, -S,-S, S, -S,-S,-S, -S, S,-S,\n -S, S, S, -S, S,-S, S, S,-S, S, S, S,\n S,-S, S, S,-S,-S, -S,-S,-S, -S,-S, S,\n ]);\n // prettier-ignore\n const indices = new U16([\n 2, 1, 0, 3, 2, 0, 6, 5, 4, 7, 6, 4,\n 10, 9, 8, 11,10, 8, 14,13,12, 15,14,12,\n 18,17,16, 19,18,16, 22,21,20, 23,22,20,\n ]);\n return {\n posBuffer: createMappedBuffer(engine, positions, BU.VERTEX),\n idxBuffer: createMappedBuffer(engine, indices, BU.INDEX),\n idxCount: 36,\n };\n}\n\nfunction buildSkyboxWorldMatrix(rootPosition: [number, number, number]): Float32Array {\n const world = new F32(16);\n world[0] = 1;\n world[5] = 1;\n world[10] = 1;\n world[15] = 1;\n world[12] = rootPosition[0];\n world[13] = rootPosition[1];\n world[14] = rootPosition[2];\n return world;\n}\n\n/** Build an HDR cubemap skybox as a complete Renderable (order 0). */\nexport function buildHdrSkyboxRenderable(\n scene: SceneContext,\n envTextures: EnvironmentTextures,\n skyHalfSize: number,\n rootPosition: [number, number, number],\n primaryColor: [number, number, number]\n): Renderable {\n const engine = scene.surface.engine;\n\n const skyboxWorld = buildSkyboxWorldMatrix(rootPosition);\n\n const cc = scene.clearColor;\n\n const skyBufs = createSkyboxBuffers(engine, skyHalfSize);\n const mat = createCubemapSkyboxMaterial(\"skybox-hdr\", SCENE_UBO_WGSL + skyboxVertSrc, skyboxHdrFragSrc);\n const ubo = createSkyHdrMeshUBO(engine, skyboxWorld, primaryColor, [cc.r, cc.g, cc.b], scene.imageProcessing.exposure, scene.imageProcessing.contrast);\n\n const bindGroup = mat.createBindGroup(engine, ubo, envTextures.specularCubeView!, envTextures.cubeSampler);\n\n const r: Renderable = {\n order: 0,\n isTransparent: false,\n bind(eng, sig) {\n return {\n renderable: r,\n pipeline: mat.getPipeline(eng as EngineContext, sig),\n draw(pass) {\n pass.setBindGroup(1, bindGroup);\n pass.setVertexBuffer(0, skyBufs.posBuffer);\n pass.setIndexBuffer(skyBufs.idxBuffer, \"uint16\");\n pass.drawIndexed(skyBufs.idxCount);\n return 1;\n },\n };\n },\n };\n return r;\n}\n\n// ─── HDR Skybox UBO ─────────────────────────────────────────────────────────────\n\nfunction createSkyHdrMeshUBO(\n engine: EngineContext,\n world: Float32Array,\n primaryColor: [number, number, number],\n skyOutputColor: [number, number, number],\n exposure: number,\n contrast: number\n): GPUBuffer {\n const data = new F32(SKY_HDR_UNIFORM_SIZE / 4);\n data.set(world, 0);\n data[16] = primaryColor[0];\n data[17] = primaryColor[1];\n data[18] = primaryColor[2];\n data[20] = skyOutputColor[0];\n data[21] = skyOutputColor[1];\n data[22] = skyOutputColor[2];\n data[24] = exposure; // exposureLinear\n data[25] = contrast; // contrast\n return createUniformBuffer(engine, data);\n}\n"],"names":[],"mappings":"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"}
@@ -1,10 +1,10 @@
1
+ import { a as F32, j as createMappedBuffer, B as BU, h as U16, av as createUniformBuffer, x as targetSignatureKey, q as SCENE_UBO_WGSL, y as createDefaultPipelineDescriptor, z as getSceneBindGroupLayout, bM as createSingleUniformBGL, S as SS } from "./index-CLElg2Bo.js";
1
2
  import { s as skyboxVertSrc } from "./skybox.vertex-DJgi072W.js";
2
- import { e as createMappedBuffer, aY as createUniformBuffer, D as targetSignatureKey, aW as SCENE_UBO_WGSL, E as createDefaultPipelineDescriptor, F as getSceneBindGroupLayout, aZ as createSingleUniformBGL } from "./index-C8HOR2sB.js";
3
- import { a as WGSL_DITHER } from "./wgsl-helpers-DyzNzCeE.js";
3
+ import { b as WGSL_DITHER } from "./wgsl-helpers-D8sl1VVA.js";
4
4
  const skyboxFragSrc = "// Skybox Fragment Shader — matches Babylon BackgroundMaterial\n// BJS loads a separate CDN skybox texture (backgroundSkybox.dds) that produces\n// exactly scene.clearColor when rendered through the BackgroundMaterial pipeline.\n// We replicate this by outputting the pre-computed clearColor directly from a UBO.\n\nstruct MeshUniforms {\n world: mat4x4<f32>,\n primaryColor: vec3<f32>,\n _pad: f32,\n // Pre-computed sRGB output color for the sky background (= scene.clearColor).\n skyOutputColor: vec3<f32>,\n _pad2: f32,\n};\n@group(1) @binding(0) var<uniform> mesh: MeshUniforms;\n\nstruct FragmentInput {\n @location(0) positionUVW: vec3<f32>,\n @location(1) positionW: vec3<f32>,\n};\n\n@fragment\nfn main(input: FragmentInput) -> @location(0) vec4<f32> {\n var result = vec4<f32>(mesh.skyOutputColor, 1.0);\n\n // Dithering (enableNoise=true, variance=0.5)\n result = vec4<f32>(result.rgb + vec3<f32>(dither(input.positionW.xy, 0.5)), result.a);\n result = max(result, vec4<f32>(0.0));\n\n return result;\n}\n";
5
5
  const SKY_MESH_UNIFORM_SIZE = 96;
6
6
  function createSkyboxBuffers(engine, S) {
7
- const positions = new Float32Array([
7
+ const positions = new F32([
8
8
  S,
9
9
  -S,
10
10
  S,
@@ -78,7 +78,7 @@ function createSkyboxBuffers(engine, S) {
78
78
  -S,
79
79
  S
80
80
  ]);
81
- const indices = new Uint16Array([
81
+ const indices = new U16([
82
82
  2,
83
83
  1,
84
84
  0,
@@ -117,13 +117,13 @@ function createSkyboxBuffers(engine, S) {
117
117
  20
118
118
  ]);
119
119
  return {
120
- posBuffer: createMappedBuffer(engine, positions, GPUBufferUsage.VERTEX),
121
- idxBuffer: createMappedBuffer(engine, indices, GPUBufferUsage.INDEX),
120
+ posBuffer: createMappedBuffer(engine, positions, BU.VERTEX),
121
+ idxBuffer: createMappedBuffer(engine, indices, BU.INDEX),
122
122
  idxCount: 36
123
123
  };
124
124
  }
125
125
  function buildSkyboxWorldMatrix(rootPosition) {
126
- const world = new Float32Array(16);
126
+ const world = new F32(16);
127
127
  world[0] = 1;
128
128
  world[5] = 1;
129
129
  world[10] = 1;
@@ -143,7 +143,7 @@ function createSkyboxMaterial() {
143
143
  if (_skyLayout && _skyCachedDevice === device) {
144
144
  return _skyLayout;
145
145
  }
146
- _skyLayout = createSingleUniformBGL(engine, "skybox-material", GPUShaderStage.VERTEX | GPUShaderStage.FRAGMENT);
146
+ _skyLayout = createSingleUniformBGL(engine, "skybox-material", SS.VERTEX | SS.FRAGMENT);
147
147
  return _skyLayout;
148
148
  }
149
149
  return {
@@ -173,8 +173,7 @@ function createSkyboxMaterial() {
173
173
  _depthStencilFormat: sig._depthStencilFormat,
174
174
  _depthCompare: sig._depthCompare,
175
175
  _msaaSamples: sig._sampleCount,
176
- _depthWriteEnabled: false,
177
- _flipY: sig._flipY
176
+ _depthWriteEnabled: false
178
177
  })
179
178
  );
180
179
  _skyPipelines.set(key, pipeline);
@@ -190,7 +189,7 @@ function createSkyboxMaterial() {
190
189
  };
191
190
  }
192
191
  function buildSolidSkyboxRenderable(scene, envTextures, skyHalfSize, rootPosition, primaryColor) {
193
- const engine = scene.engine;
192
+ const engine = scene.surface.engine;
194
193
  const skyboxWorld = buildSkyboxWorldMatrix(rootPosition);
195
194
  const cc = scene.clearColor;
196
195
  const skyBufs = createSkyboxBuffers(engine, skyHalfSize);
@@ -219,7 +218,7 @@ function buildSolidSkyboxRenderable(scene, envTextures, skyHalfSize, rootPositio
219
218
  return r;
220
219
  }
221
220
  function createSkyMeshUBO(engine, world, primaryColor, skyOutputColor) {
222
- const data = new Float32Array(SKY_MESH_UNIFORM_SIZE / 4);
221
+ const data = new F32(SKY_MESH_UNIFORM_SIZE / 4);
223
222
  data.set(world, 0);
224
223
  data[16] = primaryColor[0];
225
224
  data[17] = primaryColor[1];
@@ -232,4 +231,4 @@ function createSkyMeshUBO(engine, world, primaryColor, skyOutputColor) {
232
231
  export {
233
232
  buildSolidSkyboxRenderable
234
233
  };
235
- //# sourceMappingURL=background-solid-skybox-DPGBpPbm.js.map
234
+ //# sourceMappingURL=background-solid-skybox-BrH2fXSu.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"background-solid-skybox-BrH2fXSu.js","sources":["../shaders/skybox.fragment.wgsl?raw","../src/material/pbr/background-solid-skybox.ts"],"sourcesContent":["export default \"// Skybox Fragment Shader — matches Babylon BackgroundMaterial\\n// BJS loads a separate CDN skybox texture (backgroundSkybox.dds) that produces\\n// exactly scene.clearColor when rendered through the BackgroundMaterial pipeline.\\n// We replicate this by outputting the pre-computed clearColor directly from a UBO.\\n\\nstruct MeshUniforms {\\n world: mat4x4<f32>,\\n primaryColor: vec3<f32>,\\n _pad: f32,\\n // Pre-computed sRGB output color for the sky background (= scene.clearColor).\\n skyOutputColor: vec3<f32>,\\n _pad2: f32,\\n};\\n@group(1) @binding(0) var<uniform> mesh: MeshUniforms;\\n\\nstruct FragmentInput {\\n @location(0) positionUVW: vec3<f32>,\\n @location(1) positionW: vec3<f32>,\\n};\\n\\n@fragment\\nfn main(input: FragmentInput) -> @location(0) vec4<f32> {\\n var result = vec4<f32>(mesh.skyOutputColor, 1.0);\\n\\n // Dithering (enableNoise=true, variance=0.5)\\n result = vec4<f32>(result.rgb + vec3<f32>(dither(input.positionW.xy, 0.5)), result.a);\\n result = max(result, vec4<f32>(0.0));\\n\\n return result;\\n}\\n\"","/** Solid-color skybox renderable — the clear-color background used by PBR\n * environment scenes when no HDR/DDS skybox is provided.\n *\n * Dynamically imported from `background-renderable.ts` so scenes that pass\n * `skipSkybox: true` (or use a dyn-imported HDR/DDS skybox instead) don't\n * pay for the shader module or cube geometry. */\n\nimport { F32, U16 } from \"../../engine/typed-arrays.js\";\nimport { BU, SS } from \"../../engine/gpu-flags.js\";\nimport type { SceneContext } from \"../../scene/scene.js\";\nimport type { EngineContext } from \"../../engine/engine.js\";\nimport type { EnvironmentTextures } from \"../../loader-env/load-env.js\";\nimport type { Mat4 } from \"../../math/types.js\";\nimport type { Renderable } from \"../../render/renderable.js\";\nimport type { RenderTargetSignature } from \"../../engine/render-target.js\";\n\nimport skyboxVertSrc from \"../../../shaders/skybox.vertex.wgsl?raw\";\nimport skyboxFragSrc from \"../../../shaders/skybox.fragment.wgsl?raw\";\nimport { createDefaultPipelineDescriptor, getSceneBindGroupLayout } from \"../../render/scene-helpers.js\";\nimport { targetSignatureKey } from \"../../engine/render-target.js\";\nimport { WGSL_DITHER } from \"../../shader/wgsl-helpers.js\";\nimport { SCENE_UBO_WGSL } from \"../../shader/scene-uniforms.js\";\nimport { createMappedBuffer, createUniformBuffer } from \"../../resource/gpu-buffers.js\";\nimport { createSingleUniformBGL } from \"../../shader/bgl-helpers.js\";\n\nconst SKY_MESH_UNIFORM_SIZE = 96; // mat4x4 + primaryColor vec3 + pad + skyOutputColor vec3 + pad\n\nfunction createSkyboxBuffers(engine: EngineContext, S: number): { posBuffer: GPUBuffer; idxBuffer: GPUBuffer; idxCount: number } {\n // prettier-ignore\n const positions = new F32([\n S,-S, S, -S,-S, S, -S, S, S, S, S, S,\n S, S,-S, -S, S,-S, -S,-S,-S, S,-S,-S,\n S, S,-S, S,-S,-S, S,-S, S, S, S, S,\n -S, S, S, -S,-S, S, -S,-S,-S, -S, S,-S,\n -S, S, S, -S, S,-S, S, S,-S, S, S, S,\n S,-S, S, S,-S,-S, -S,-S,-S, -S,-S, S,\n ]);\n // prettier-ignore\n const indices = new U16([\n 2, 1, 0, 3, 2, 0, 6, 5, 4, 7, 6, 4,\n 10, 9, 8, 11,10, 8, 14,13,12, 15,14,12,\n 18,17,16, 19,18,16, 22,21,20, 23,22,20,\n ]);\n return {\n posBuffer: createMappedBuffer(engine, positions, BU.VERTEX),\n idxBuffer: createMappedBuffer(engine, indices, BU.INDEX),\n idxCount: 36,\n };\n}\n\nfunction buildSkyboxWorldMatrix(rootPosition: [number, number, number]): Float32Array {\n const world = new F32(16);\n world[0] = 1;\n world[5] = 1;\n world[10] = 1;\n world[15] = 1;\n world[12] = rootPosition[0];\n world[13] = rootPosition[1];\n world[14] = rootPosition[2];\n return world;\n}\n\ninterface SkyboxMaterial {\n getPipeline(engine: EngineContext, sig: RenderTargetSignature): GPURenderPipeline;\n createBindGroup(engine: EngineContext, meshUBO: GPUBuffer, env: EnvironmentTextures): GPUBindGroup;\n}\n\nconst SKYBOX_POS_BUFFER: GPUVertexBufferLayout[] = [{ arrayStride: 12, attributes: [{ shaderLocation: 0, offset: 0, format: \"float32x3\" as GPUVertexFormat }] }];\n\n/** Module-global pipeline cache shared by all solid-skybox renderables. */\nconst _skyPipelines = new Map<string, GPURenderPipeline>();\nlet _skyLayout: GPUBindGroupLayout | null = null;\nlet _skyCachedDevice: GPUDevice | null = null;\n\nfunction createSkyboxMaterial(): SkyboxMaterial {\n function getLayout(engine: EngineContext): GPUBindGroupLayout {\n const device = engine._device;\n if (_skyLayout && _skyCachedDevice === device) {\n return _skyLayout;\n }\n _skyLayout = createSingleUniformBGL(engine, \"skybox-material\", SS.VERTEX | SS.FRAGMENT);\n return _skyLayout;\n }\n\n return {\n getPipeline(_engine, sig) {\n const device = _engine._device;\n if (_skyCachedDevice !== device) {\n _skyPipelines.clear();\n _skyLayout = null;\n _skyCachedDevice = device;\n }\n const key = targetSignatureKey(sig);\n const cached = _skyPipelines.get(key);\n if (cached) {\n return cached;\n }\n const _vertModule = device.createShaderModule({ code: SCENE_UBO_WGSL + skyboxVertSrc, label: \"skybox-vert\" });\n const _fragModule = device.createShaderModule({ code: WGSL_DITHER + skyboxFragSrc, label: \"skybox-frag\" });\n\n const pipeline = device.createRenderPipeline(\n createDefaultPipelineDescriptor({\n _label: \"skybox-pipeline\",\n _engine,\n _bgls: [getSceneBindGroupLayout(_engine), getLayout(_engine)],\n _vertModule,\n _fragModule,\n _vertexBuffers: SKYBOX_POS_BUFFER,\n _format: sig._colorFormat!,\n _depthStencilFormat: sig._depthStencilFormat,\n _depthCompare: sig._depthCompare,\n _msaaSamples: sig._sampleCount,\n _depthWriteEnabled: false,\n })\n );\n _skyPipelines.set(key, pipeline);\n return pipeline;\n },\n\n createBindGroup(engine, meshUBO, _env) {\n const device = engine._device;\n return device.createBindGroup({\n layout: getLayout(engine),\n entries: [{ binding: 0, resource: { buffer: meshUBO } }],\n });\n },\n };\n}\n\nexport function buildSolidSkyboxRenderable(\n scene: SceneContext,\n envTextures: EnvironmentTextures,\n skyHalfSize: number,\n rootPosition: [number, number, number],\n primaryColor: [number, number, number]\n): Renderable {\n const engine = scene.surface.engine;\n const skyboxWorld = buildSkyboxWorldMatrix(rootPosition);\n const cc = scene.clearColor;\n const skyBufs = createSkyboxBuffers(engine, skyHalfSize);\n\n const skyMat = createSkyboxMaterial();\n const skyOutputColor: [number, number, number] = [cc.r, cc.g, cc.b];\n const skyUBO = createSkyMeshUBO(engine, skyboxWorld as unknown as Mat4, primaryColor, skyOutputColor);\n const skyBG = skyMat.createBindGroup(engine, skyUBO, envTextures);\n\n const r: Renderable = {\n order: 0, // skybox renders first (behind everything)\n isTransparent: false,\n bind(eng, sig) {\n return {\n renderable: r,\n pipeline: skyMat.getPipeline(eng as EngineContext, sig),\n draw(pass) {\n pass.setBindGroup(1, skyBG);\n pass.setVertexBuffer(0, skyBufs.posBuffer);\n pass.setIndexBuffer(skyBufs.idxBuffer, \"uint16\");\n pass.drawIndexed(skyBufs.idxCount);\n return 1;\n },\n };\n },\n };\n return r;\n}\n\nfunction createSkyMeshUBO(engine: EngineContext, world: Mat4, primaryColor: [number, number, number], skyOutputColor: [number, number, number]): GPUBuffer {\n const data = new F32(SKY_MESH_UNIFORM_SIZE / 4);\n data.set(world, 0);\n data[16] = primaryColor[0];\n data[17] = primaryColor[1];\n data[18] = primaryColor[2];\n data[20] = skyOutputColor[0];\n data[21] = skyOutputColor[1];\n data[22] = skyOutputColor[2];\n return createUniformBuffer(engine, data);\n}\n"],"names":[],"mappings":"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"}