@babylonjs/lite 0.2.0 → 1.0.1

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 (253) hide show
  1. package/{_mat4-storage-f64-Bvh5TymE.js → _mat4-storage-f64-BW9sTaVh.js} +3 -2
  2. package/_mat4-storage-f64-BW9sTaVh.js.map +1 -0
  3. package/{alpha-test-fragment-BCChpzaV.js → alpha-test-fragment-eUG971h3.js} +2 -2
  4. package/{alpha-test-fragment-BCChpzaV.js.map → alpha-test-fragment-eUG971h3.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-BwG0kYQP.js} +13 -13
  7. package/background-dds-skybox-BwG0kYQP.js.map +1 -0
  8. package/{background-ground-B2Mie-MI.js → background-ground-DiFpKJzF.js} +19 -19
  9. package/background-ground-DiFpKJzF.js.map +1 -0
  10. package/{background-hdr-skybox-DDRJYuT2.js → background-hdr-skybox-DIgJhvfj.js} +10 -10
  11. package/background-hdr-skybox-DIgJhvfj.js.map +1 -0
  12. package/{background-solid-skybox-fjXlnWaD.js → background-solid-skybox--fqHdan_.js} +11 -12
  13. package/background-solid-skybox--fqHdan_.js.map +1 -0
  14. package/{billboard-renderable-DKmlOgbM.js → billboard-renderable-HY2XCd52.js} +46 -10
  15. package/billboard-renderable-HY2XCd52.js.map +1 -0
  16. package/{clamp-block-CxRBPlUq.js → clamp-block-XHdUk2Va.js} +2 -2
  17. package/{clamp-block-CxRBPlUq.js.map → clamp-block-XHdUk2Va.js.map} +1 -1
  18. package/{clearcoat-fragment-KbZAa0TA.js → clearcoat-fragment-CHYw8MPB.js} +2 -2
  19. package/{clearcoat-fragment-KbZAa0TA.js.map → clearcoat-fragment-CHYw8MPB.js.map} +1 -1
  20. package/{create-skeleton-BBI5urcj.js → create-skeleton-9tdiUjRP.js} +9 -9
  21. package/create-skeleton-9tdiUjRP.js.map +1 -0
  22. package/{cubemap-skybox-material-DvW81drX.js → cubemap-skybox-material-DqQ0dyz8.js} +6 -7
  23. package/cubemap-skybox-material-DqQ0dyz8.js.map +1 -0
  24. package/{curve-block-Dh_xdUj-.js → curve-block-S27sXrJQ.js} +2 -2
  25. package/{curve-block-Dh_xdUj-.js.map → curve-block-S27sXrJQ.js.map} +1 -1
  26. package/{emissive-fragment-DD8cvHyx.js → emissive-fragment-CZMQ0_bF.js} +3 -3
  27. package/emissive-fragment-CZMQ0_bF.js.map +1 -0
  28. package/{esm-shadow-view-DHVS9r7H.js → esm-shadow-view-CUwxbnMR.js} +2 -2
  29. package/{esm-shadow-view-DHVS9r7H.js.map → esm-shadow-view-CUwxbnMR.js.map} +1 -1
  30. package/{esm-shadow-view-15S4JK6p.js → esm-shadow-view-Cl36rOrK.js} +2 -2
  31. package/{esm-shadow-view-15S4JK6p.js.map → esm-shadow-view-Cl36rOrK.js.map} +1 -1
  32. package/{esm-shadow-view-DYAc62Kl.js → esm-shadow-view-DKQ-FSoV.js} +2 -2
  33. package/{esm-shadow-view-DYAc62Kl.js.map → esm-shadow-view-DKQ-FSoV.js.map} +1 -1
  34. package/{gaussian-splatting-pipeline-sh-BvkUhA9V.js → gaussian-splatting-pipeline-sh-DDo7QQ8l.js} +19 -19
  35. package/gaussian-splatting-pipeline-sh-DDo7QQ8l.js.map +1 -0
  36. package/geometry-texture-output-BmuAquio.js +41 -0
  37. package/geometry-texture-output-BmuAquio.js.map +1 -0
  38. package/geometry-view-xWZmq799.js +404 -0
  39. package/geometry-view-xWZmq799.js.map +1 -0
  40. package/{gltf-animation-KnPzeOIY.js → gltf-animation-Bq7k_5HA.js} +6 -6
  41. package/gltf-animation-Bq7k_5HA.js.map +1 -0
  42. package/{gltf-ext-basisu-kmth3UWX.js → gltf-ext-basisu-C5teqxzQ.js} +43 -211
  43. package/gltf-ext-basisu-C5teqxzQ.js.map +1 -0
  44. package/{gltf-ext-node-visibility-BjRRd6si.js → gltf-ext-node-visibility-DnGTKkMf.js} +2 -2
  45. package/{gltf-ext-node-visibility-BjRRd6si.js.map → gltf-ext-node-visibility-DnGTKkMf.js.map} +1 -1
  46. package/{gltf-ext-quantization-CpZyLDIz.js → gltf-ext-quantization-DheC7FhB.js} +4 -3
  47. package/gltf-ext-quantization-DheC7FhB.js.map +1 -0
  48. package/{gltf-ext-uv-transform-MHmR-YyM.js → gltf-ext-uv-transform-DljdVllE.js} +2 -2
  49. package/{gltf-ext-uv-transform-MHmR-YyM.js.map → gltf-ext-uv-transform-DljdVllE.js.map} +1 -1
  50. package/{gltf-feature-animation-pointer-rFqLfbO_.js → gltf-feature-animation-pointer-DVhymFLK.js} +9 -9
  51. package/gltf-feature-animation-pointer-DVhymFLK.js.map +1 -0
  52. package/{gltf-feature-animations-DikONdzi.js → gltf-feature-animations-hxC3y3bJ.js} +2 -2
  53. package/{gltf-feature-animations-DikONdzi.js.map → gltf-feature-animations-hxC3y3bJ.js.map} +1 -1
  54. package/{gltf-feature-draco-yGSMGTE3.js → gltf-feature-draco-B7Q_cMUv.js} +6 -5
  55. package/gltf-feature-draco-B7Q_cMUv.js.map +1 -0
  56. package/{gltf-feature-gpu-instancing-Cj1XjmM6.js → gltf-feature-gpu-instancing-C7sRzWv7.js} +4 -4
  57. package/gltf-feature-gpu-instancing-C7sRzWv7.js.map +1 -0
  58. package/{gltf-feature-lights-punctual-C-0SlGmD.js → gltf-feature-lights-punctual-DF7kya14.js} +5 -5
  59. package/{gltf-feature-lights-punctual-C-0SlGmD.js.map → gltf-feature-lights-punctual-DF7kya14.js.map} +1 -1
  60. package/{gltf-feature-meshopt-Des96YFI.js → gltf-feature-meshopt-DRG9hEqT.js} +7 -6
  61. package/gltf-feature-meshopt-DRG9hEqT.js.map +1 -0
  62. package/{gltf-feature-morph-BAcY14XU.js → gltf-feature-morph-DZydYgWp.js} +4 -4
  63. package/gltf-feature-morph-DZydYgWp.js.map +1 -0
  64. package/{gltf-feature-registry-97sY_x5O.js → gltf-feature-registry-DeYdy3DV.js} +15 -15
  65. package/{gltf-feature-registry-97sY_x5O.js.map → gltf-feature-registry-DeYdy3DV.js.map} +1 -1
  66. package/{gltf-feature-skeleton-lVjkDfIU.js → gltf-feature-skeleton-B9och1W0.js} +3 -3
  67. package/{gltf-feature-skeleton-lVjkDfIU.js.map → gltf-feature-skeleton-B9och1W0.js.map} +1 -1
  68. package/{gltf-feature-variants-BphF4JmV.js → gltf-feature-variants-CY_Qft7f.js} +2 -2
  69. package/{gltf-feature-variants-BphF4JmV.js.map → gltf-feature-variants-CY_Qft7f.js.map} +1 -1
  70. package/{gltf-glb-parser-D6UZWFuC.js → gltf-glb-parser-CqOeXFOz.js} +5 -4
  71. package/gltf-glb-parser-CqOeXFOz.js.map +1 -0
  72. package/{gltf-interleave-C9eBqH_F.js → gltf-interleave-DWf27t-h.js} +14 -15
  73. package/gltf-interleave-DWf27t-h.js.map +1 -0
  74. package/{gltf-pbr-builder-ext-DPC0zg_u.js → gltf-pbr-builder-ext-DvFxuOqN.js} +5 -5
  75. package/gltf-pbr-builder-ext-DvFxuOqN.js.map +1 -0
  76. package/{gltf-variants-CnBEZr0o.js → gltf-variants-CUvzYGYX.js} +4 -4
  77. package/{gltf-variants-CnBEZr0o.js.map → gltf-variants-CUvzYGYX.js.map} +1 -1
  78. package/gpu-task-timer-Dgkff80h.js +236 -0
  79. package/gpu-task-timer-Dgkff80h.js.map +1 -0
  80. package/gpu-timer-CUpqT_hK.js +55 -0
  81. package/gpu-timer-CUpqT_hK.js.map +1 -0
  82. package/{gs-picking-pipeline-Bx8LTav6.js → gs-picking-pipeline-55sM5LzV.js} +14 -14
  83. package/gs-picking-pipeline-55sM5LzV.js.map +1 -0
  84. package/havok-floating-origin-5xp32P-C.js +198 -0
  85. package/havok-floating-origin-5xp32P-C.js.map +1 -0
  86. package/index-C-tEgwbZ.js +41056 -0
  87. package/index-C-tEgwbZ.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 +2490 -108
  93. package/index.js +476 -323
  94. package/{input-block-Coi_aZwl.js → input-block-DbRYCnet.js} +2 -2
  95. package/{input-block-Coi_aZwl.js.map → input-block-DbRYCnet.js.map} +1 -1
  96. package/{iridescence-fragment-DwZcCTdD.js → iridescence-fragment-S3Ko1jvC.js} +2 -2
  97. package/{iridescence-fragment-DwZcCTdD.js.map → iridescence-fragment-S3Ko1jvC.js.map} +1 -1
  98. package/{light-block-Np_h5gPI.js → light-block-CAqWkucp.js} +2 -2
  99. package/{light-block-Np_h5gPI.js.map → light-block-CAqWkucp.js.map} +1 -1
  100. package/{loop-block-BFkLFYGm.js → loop-block-ch-biPFY.js} +2 -2
  101. package/{loop-block-BFkLFYGm.js.map → loop-block-ch-biPFY.js.map} +1 -1
  102. package/{morph-fragment-DqH-w61u.js → morph-fragment-D9he3Ksk.js} +2 -2
  103. package/{morph-fragment-DqH-w61u.js.map → morph-fragment-D9he3Ksk.js.map} +1 -1
  104. package/{multilight-wgsl-B9Mf9d-q.js → multilight-wgsl-74aXpcJG.js} +2 -2
  105. package/{multilight-wgsl-B9Mf9d-q.js.map → multilight-wgsl-74aXpcJG.js.map} +1 -1
  106. package/{node-env-BPZXZzBf.js → node-env-B2bjGcMS.js} +6 -5
  107. package/node-env-B2bjGcMS.js.map +1 -0
  108. package/node-geometry-view-CSXlEAhG.js +291 -0
  109. package/node-geometry-view-CSXlEAhG.js.map +1 -0
  110. package/{node-registry-extra-compat-Ch7ApZHF.js → node-registry-extra-compat-BEQH_ksg.js} +2 -2
  111. package/{node-registry-extra-compat-Ch7ApZHF.js.map → node-registry-extra-compat-BEQH_ksg.js.map} +1 -1
  112. package/{node-registry-extra-math-6ezzTkPj.js → node-registry-extra-math-Bm32WBAa.js} +2 -2
  113. package/{node-registry-extra-math-6ezzTkPj.js.map → node-registry-extra-math-Bm32WBAa.js.map} +1 -1
  114. package/{node-renderable-CS0CmsSp.js → node-renderable-BMHny4tC.js} +15 -13
  115. package/node-renderable-BMHny4tC.js.map +1 -0
  116. package/{node-shadow-CpnrdvtJ.js → node-shadow-BRiz7CT1.js} +7 -7
  117. package/node-shadow-BRiz7CT1.js.map +1 -0
  118. package/{normal-map-fragment-DradEMl-.js → normal-map-fragment-sE3TjF4U.js} +2 -2
  119. package/{normal-map-fragment-DradEMl-.js.map → normal-map-fragment-sE3TjF4U.js.map} +1 -1
  120. package/package.json +3 -10
  121. package/{parse-camera-CgV4bWc0.js → parse-camera-CmZBS423.js} +2 -2
  122. package/{parse-camera-CgV4bWc0.js.map → parse-camera-CmZBS423.js.map} +1 -1
  123. package/pbr-geometry-view-T3vMABM8.js +491 -0
  124. package/pbr-geometry-view-T3vMABM8.js.map +1 -0
  125. package/{pbr-metallic-roughness-block-BFwZj2Nw.js → pbr-metallic-roughness-block-DbozMlHU.js} +2 -2
  126. package/{pbr-metallic-roughness-block-BFwZj2Nw.js.map → pbr-metallic-roughness-block-DbozMlHU.js.map} +1 -1
  127. package/{pbr-metallic-roughness-block-full-5t0HT3xl.js → pbr-metallic-roughness-block-full-CHC8w-Uv.js} +2 -2
  128. package/{pbr-metallic-roughness-block-full-5t0HT3xl.js.map → pbr-metallic-roughness-block-full-CHC8w-Uv.js.map} +1 -1
  129. package/{pbr-mr-helper-core-R5tOZ8Ap.js → pbr-mr-helper-core-DGRgbRXl.js} +2 -2
  130. package/{pbr-mr-helper-core-R5tOZ8Ap.js.map → pbr-mr-helper-core-DGRgbRXl.js.map} +1 -1
  131. package/{pbr-refraction-Dd11HnaI.js → pbr-refraction-CquDP9JO.js} +2 -2
  132. package/{pbr-refraction-Dd11HnaI.js.map → pbr-refraction-CquDP9JO.js.map} +1 -1
  133. package/{pbr-renderable-BHAdF5Vw.js → pbr-renderable-CaHKHU0g.js} +60 -42
  134. package/pbr-renderable-CaHKHU0g.js.map +1 -0
  135. package/{pbr-shadow-fragment-BxUrFJYZ.js → pbr-shadow-fragment-DmnNe6yz.js} +2 -2
  136. package/{pbr-shadow-fragment-BxUrFJYZ.js.map → pbr-shadow-fragment-DmnNe6yz.js.map} +1 -1
  137. package/{pbr-tracking-D6i3yPb7.js → pbr-tracking-Bo7RTANK.js} +2 -2
  138. package/{pbr-tracking-D6i3yPb7.js.map → pbr-tracking-Bo7RTANK.js.map} +1 -1
  139. package/{pbr-transmission-ext-Dll8EYwE.js → pbr-transmission-ext-CoGcJBGE.js} +2 -2
  140. package/{pbr-transmission-ext-Dll8EYwE.js.map → pbr-transmission-ext-CoGcJBGE.js.map} +1 -1
  141. package/recast-navigation.wasm-DG_0AFuk.js +8706 -0
  142. package/recast-navigation.wasm-DG_0AFuk.js.map +1 -0
  143. package/recast-navigation.wasm-compat-C-Bf2ylB.js +8692 -0
  144. package/recast-navigation.wasm-compat-C-Bf2ylB.js.map +1 -0
  145. package/{reflectance-fragment-ejMJ4O1o.js → reflectance-fragment-CExe6qDY.js} +2 -2
  146. package/{reflectance-fragment-ejMJ4O1o.js.map → reflectance-fragment-CExe6qDY.js.map} +1 -1
  147. package/{rgbd-decode-DCvzUYeI.js → rgbd-decode-DkiiiIlt.js} +7 -6
  148. package/rgbd-decode-DkiiiIlt.js.map +1 -0
  149. package/{scene-material-swap-C2ykv55W.js → scene-material-swap-4qM0tpBK.js} +11 -5
  150. package/scene-material-swap-4qM0tpBK.js.map +1 -0
  151. package/screenshot-readback-avr_tYGZ.js +92 -0
  152. package/screenshot-readback-avr_tYGZ.js.map +1 -0
  153. package/{mesh-features-BAJpbMog.js → shader-composer-CZagsJDS.js} +3 -54
  154. package/shader-composer-CZagsJDS.js.map +1 -0
  155. package/{shader-renderable-BMf_vvO0.js → shader-renderable-D5sbgzxt.js} +62 -24
  156. package/shader-renderable-D5sbgzxt.js.map +1 -0
  157. package/{shader-thin-instance-5_WUfi3m.js → shader-thin-instance-CkQ8rrfH.js} +4 -4
  158. package/shader-thin-instance-CkQ8rrfH.js.map +1 -0
  159. package/{sheen-fragment-CS6z29Fs.js → sheen-fragment-BEigjpTX.js} +2 -2
  160. package/{sheen-fragment-CS6z29Fs.js.map → sheen-fragment-BEigjpTX.js.map} +1 -1
  161. package/{singlelight-directional-wgsl-4MIgZMeC.js → singlelight-directional-wgsl-Ccsk-ys3.js} +2 -2
  162. package/{singlelight-directional-wgsl-4MIgZMeC.js.map → singlelight-directional-wgsl-Ccsk-ys3.js.map} +1 -1
  163. package/{singlelight-hemispheric-wgsl-CK-GUYWe.js → singlelight-hemispheric-wgsl-DL-jpc97.js} +2 -2
  164. package/{singlelight-hemispheric-wgsl-CK-GUYWe.js.map → singlelight-hemispheric-wgsl-DL-jpc97.js.map} +1 -1
  165. package/{singlelight-point-wgsl-CYtzqCbP.js → singlelight-point-wgsl-hYmiP6ys.js} +2 -2
  166. package/{singlelight-point-wgsl-CYtzqCbP.js.map → singlelight-point-wgsl-hYmiP6ys.js.map} +1 -1
  167. package/{singlelight-spot-wgsl-DVbaVufF.js → singlelight-spot-wgsl-DSjp1p1C.js} +2 -2
  168. package/{singlelight-spot-wgsl-DVbaVufF.js.map → singlelight-spot-wgsl-DSjp1p1C.js.map} +1 -1
  169. package/{skeleton-fragment-BOVmc8YS.js → skeleton-fragment-B__bUbPK.js} +2 -2
  170. package/{skeleton-fragment-BOVmc8YS.js.map → skeleton-fragment-B__bUbPK.js.map} +1 -1
  171. package/{skybox-renderable-DDcCPSly.js → skybox-renderable-BH6uUkal.js} +7 -8
  172. package/skybox-renderable-BH6uUkal.js.map +1 -0
  173. package/{splat-ply-compressed-BahdBG1r.js → splat-ply-compressed-BGNK6dnh.js} +9 -8
  174. package/splat-ply-compressed-BGNK6dnh.js.map +1 -0
  175. package/{standard-renderable-D1bhoF0K.js → standard-pipeline-BvFynkwL.js} +11 -202
  176. package/standard-pipeline-BvFynkwL.js.map +1 -0
  177. package/standard-renderable-1Q3zemys.js +191 -0
  178. package/standard-renderable-1Q3zemys.js.map +1 -0
  179. package/{std-ambient-fragment-C6WNm8dQ.js → std-ambient-fragment-__F1KTEu.js} +2 -2
  180. package/{std-ambient-fragment-C6WNm8dQ.js.map → std-ambient-fragment-__F1KTEu.js.map} +1 -1
  181. package/{std-cube-reflection-fragment-Bqutpy2q.js → std-cube-reflection-fragment-DidM0byH.js} +2 -2
  182. package/{std-cube-reflection-fragment-Bqutpy2q.js.map → std-cube-reflection-fragment-DidM0byH.js.map} +1 -1
  183. package/{std-emissive-fragment-B-A83rqX.js → std-emissive-fragment-Bj62X4Np.js} +2 -2
  184. package/{std-emissive-fragment-B-A83rqX.js.map → std-emissive-fragment-Bj62X4Np.js.map} +1 -1
  185. package/{std-lightmap-fragment-Df7KJezh.js → std-lightmap-fragment-DXvfWvKc.js} +2 -2
  186. package/{std-lightmap-fragment-Df7KJezh.js.map → std-lightmap-fragment-DXvfWvKc.js.map} +1 -1
  187. package/{std-opacity-fragment-D9et2jip.js → std-opacity-fragment-BzMMb1K_.js} +2 -2
  188. package/{std-opacity-fragment-D9et2jip.js.map → std-opacity-fragment-BzMMb1K_.js.map} +1 -1
  189. package/{std-reflection-fragment-DBJeT-yg.js → std-reflection-fragment-DC9Kvu1C.js} +2 -2
  190. package/{std-reflection-fragment-DBJeT-yg.js.map → std-reflection-fragment-DC9Kvu1C.js.map} +1 -1
  191. package/{std-shadow-fragment-C6fD8rW-.js → std-shadow-fragment-BnMHeF1-.js} +2 -2
  192. package/{std-shadow-fragment-C6fD8rW-.js.map → std-shadow-fragment-BnMHeF1-.js.map} +1 -1
  193. package/{std-specular-fragment-C2ZOss-t.js → std-specular-fragment-Bio681OG.js} +2 -2
  194. package/{std-specular-fragment-C2ZOss-t.js.map → std-specular-fragment-Bio681OG.js.map} +1 -1
  195. package/{std-tracking-C4L4nQGc.js → std-tracking-BTcrry2o.js} +2 -2
  196. package/{std-tracking-C4L4nQGc.js.map → std-tracking-BTcrry2o.js.map} +1 -1
  197. package/{subsurface-fragment-C1H4ytqK.js → subsurface-fragment-DpKib445.js} +2 -2
  198. package/{subsurface-fragment-C1H4ytqK.js.map → subsurface-fragment-DpKib445.js.map} +1 -1
  199. package/swapchain-overlay-UCLilhbq.js +37 -0
  200. package/swapchain-overlay-UCLilhbq.js.map +1 -0
  201. package/{thin-instance-cull-binding-CCxrPNO6.js → thin-instance-cull-binding-DwZi7mlE.js} +12 -12
  202. package/thin-instance-cull-binding-DwZi7mlE.js.map +1 -0
  203. package/{thin-instance-gpu-E8DBd8XL.js → thin-instance-gpu-uY2NOv0J.js} +15 -7
  204. package/thin-instance-gpu-uY2NOv0J.js.map +1 -0
  205. package/{tracking-primitives-w4BVV9p9.js → tracking-primitives-Ck5bgCuo.js} +2 -2
  206. package/{tracking-primitives-w4BVV9p9.js.map → tracking-primitives-Ck5bgCuo.js.map} +1 -1
  207. package/{unlit-fragment-DU9_mhzZ.js → unlit-fragment-nc6hu3Mw.js} +2 -2
  208. package/{unlit-fragment-DU9_mhzZ.js.map → unlit-fragment-nc6hu3Mw.js.map} +1 -1
  209. package/_mat4-storage-f64-Bvh5TymE.js.map +0 -1
  210. package/assets/splat-sort-worker-Crg3CaCc.js.map +0 -1
  211. package/background-dds-skybox-ZjrSIxrT.js.map +0 -1
  212. package/background-ground-B2Mie-MI.js.map +0 -1
  213. package/background-hdr-skybox-DDRJYuT2.js.map +0 -1
  214. package/background-solid-skybox-fjXlnWaD.js.map +0 -1
  215. package/billboard-renderable-DKmlOgbM.js.map +0 -1
  216. package/create-skeleton-BBI5urcj.js.map +0 -1
  217. package/cubemap-skybox-material-DvW81drX.js.map +0 -1
  218. package/emissive-fragment-DD8cvHyx.js.map +0 -1
  219. package/gaussian-splatting-pipeline-sh-BvkUhA9V.js.map +0 -1
  220. package/gltf-animation-KnPzeOIY.js.map +0 -1
  221. package/gltf-ext-basisu-kmth3UWX.js.map +0 -1
  222. package/gltf-ext-quantization-CpZyLDIz.js.map +0 -1
  223. package/gltf-feature-animation-pointer-rFqLfbO_.js.map +0 -1
  224. package/gltf-feature-draco-yGSMGTE3.js.map +0 -1
  225. package/gltf-feature-gpu-instancing-Cj1XjmM6.js.map +0 -1
  226. package/gltf-feature-meshopt-Des96YFI.js.map +0 -1
  227. package/gltf-feature-morph-BAcY14XU.js.map +0 -1
  228. package/gltf-glb-parser-D6UZWFuC.js.map +0 -1
  229. package/gltf-interleave-C9eBqH_F.js.map +0 -1
  230. package/gltf-pbr-builder-ext-DPC0zg_u.js.map +0 -1
  231. package/gs-picking-pipeline-Bx8LTav6.js.map +0 -1
  232. package/index-B7Qhw0xL.js +0 -21232
  233. package/index-B7Qhw0xL.js.map +0 -1
  234. package/mesh-features-BAJpbMog.js.map +0 -1
  235. package/no-color-view-DsyLSL-W.js +0 -8
  236. package/no-color-view-DsyLSL-W.js.map +0 -1
  237. package/node-env-BPZXZzBf.js.map +0 -1
  238. package/node-registry-Bd-AlrgC.js +0 -190
  239. package/node-registry-Bd-AlrgC.js.map +0 -1
  240. package/node-renderable-CS0CmsSp.js.map +0 -1
  241. package/node-shadow-CpnrdvtJ.js.map +0 -1
  242. package/pbr-renderable-BHAdF5Vw.js.map +0 -1
  243. package/rgbd-decode-DCvzUYeI.js.map +0 -1
  244. package/scene-material-swap-C2ykv55W.js.map +0 -1
  245. package/shader-renderable-BMf_vvO0.js.map +0 -1
  246. package/shader-thin-instance-5_WUfi3m.js.map +0 -1
  247. package/skybox-renderable-DDcCPSly.js.map +0 -1
  248. package/splat-ply-compressed-BahdBG1r.js.map +0 -1
  249. package/standard-renderable-D1bhoF0K.js.map +0 -1
  250. package/swapchain-overlay-DcCSFDp7.js +0 -35
  251. package/swapchain-overlay-DcCSFDp7.js.map +0 -1
  252. package/thin-instance-cull-binding-CCxrPNO6.js.map +0 -1
  253. package/thin-instance-gpu-E8DBd8XL.js.map +0 -1
@@ -1,4 +1,4 @@
1
- import { M as MSH_HAS_SKELETON, a as MSH_HAS_SKELETON_8 } from "./mesh-features-BAJpbMog.js";
1
+ import { b5 as MSH_HAS_SKELETON, b6 as MSH_HAS_SKELETON_8 } from "./index-C-tEgwbZ.js";
2
2
  const STAGE_VERTEX = 1;
3
3
  const SKELETON_HELPERS = `
4
4
  fn readMatrixFromRawSampler(smp: texture_2d<f32>, index: f32) -> mat4x4<f32> {
@@ -68,4 +68,4 @@ export {
68
68
  createSkeletonFragment,
69
69
  pbrExt
70
70
  };
71
- //# sourceMappingURL=skeleton-fragment-BOVmc8YS.js.map
71
+ //# sourceMappingURL=skeleton-fragment-B__bUbPK.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"skeleton-fragment-BOVmc8YS.js","sources":["../src/material/pbr/fragments/skeleton-fragment.ts"],"sourcesContent":["/**\n * Skeleton Fragment\n *\n * Vertex-stage skeletal animation: bone texture sampling + skinning matrix.\n * Only bundled when a scene has skeletal animation.\n * Supports 4-bone and 8-bone skinning.\n */\n\nimport type { ShaderFragment, VertexAttribute } from \"../../../shader/fragment-types.js\";\n\n// WebGPU shader stage constants\nconst STAGE_VERTEX = 0x1;\n\nconst SKELETON_HELPERS = `\nfn readMatrixFromRawSampler(smp: texture_2d<f32>, index: f32) -> mat4x4<f32> {\nlet offset = i32(index) * 4;\nlet m0 = textureLoad(smp, vec2<i32>(offset + 0, 0), 0);\nlet m1 = textureLoad(smp, vec2<i32>(offset + 1, 0), 0);\nlet m2 = textureLoad(smp, vec2<i32>(offset + 2, 0), 0);\nlet m3 = textureLoad(smp, vec2<i32>(offset + 3, 0), 0);\nreturn mat4x4f(m0, m1, m2, m3);\n}\n`;\n\nfunction makeSkinningCode(has8Bones: boolean): string {\n let code = `var influence: mat4x4<f32> = readMatrixFromRawSampler(boneSampler, f32(joints[0])) * weights[0];\ninfluence = influence + readMatrixFromRawSampler(boneSampler, f32(joints[1])) * weights[1];\ninfluence = influence + readMatrixFromRawSampler(boneSampler, f32(joints[2])) * weights[2];\ninfluence = influence + readMatrixFromRawSampler(boneSampler, f32(joints[3])) * weights[3];`;\n if (has8Bones) {\n code += `\ninfluence = influence + readMatrixFromRawSampler(boneSampler, f32(joints1[0])) * weights1[0];\ninfluence = influence + readMatrixFromRawSampler(boneSampler, f32(joints1[1])) * weights1[1];\ninfluence = influence + readMatrixFromRawSampler(boneSampler, f32(joints1[2])) * weights1[2];\ninfluence = influence + readMatrixFromRawSampler(boneSampler, f32(joints1[3])) * weights1[3];`;\n }\n code += `\\nfinalWorld = mesh.world * influence;`;\n return code;\n}\n\n/**\n * Create a skeleton fragment.\n * @param has8Bones - Whether to use 8-bone skinning (joints1/weights1).\n */\nexport function createSkeletonFragment(has8Bones: boolean): ShaderFragment {\n return {\n _id: \"skeleton\",\n\n _vertexAttributes: [\n { _name: \"joints\", _type: \"vec4<u32>\", _gpuFormat: \"uint32x4\" as GPUVertexFormat, _arrayStride: 16 },\n { _name: \"weights\", _type: \"vec4<f32>\", _gpuFormat: \"float32x4\" as GPUVertexFormat, _arrayStride: 16 },\n ...(has8Bones\n ? [\n { _name: \"joints1\", _type: \"vec4<u32>\", _gpuFormat: \"uint32x4\" as GPUVertexFormat, _arrayStride: 16 },\n { _name: \"weights1\", _type: \"vec4<f32>\", _gpuFormat: \"float32x4\" as GPUVertexFormat, _arrayStride: 16 },\n ]\n : []),\n ] as VertexAttribute[],\n\n _vertexBindings: [\n { _name: \"boneSampler\", _type: { _kind: \"texture\", _textureType: \"texture_2d<f32>\" as const, _sampleType: \"unfilterable-float\" as const }, _visibility: STAGE_VERTEX },\n ],\n\n _vertexHelperFunctions: SKELETON_HELPERS,\n\n _vertexSlots: {\n VW: makeSkinningCode(has8Bones),\n },\n };\n}\n\nimport type { PbrExt } from \"../pbr-flags.js\";\nimport { MSH_HAS_SKELETON, MSH_HAS_SKELETON_8 } from \"../../mesh-features.js\";\n\nexport const pbrExt: PbrExt = {\n id: \"skeleton\",\n phase: \"vertex\",\n frag(ctx) {\n if (!(ctx._meshFeatures & MSH_HAS_SKELETON)) {\n return null;\n }\n return createSkeletonFragment((ctx._meshFeatures & MSH_HAS_SKELETON_8) !== 0);\n },\n bind(ctx, entries, b) {\n const mesh = ctx._mesh as { skeleton?: { boneTexture: GPUTexture } } | undefined;\n if (!(ctx._meshFeatures & MSH_HAS_SKELETON) || !mesh?.skeleton) {\n return b;\n }\n entries.push({ binding: b++, resource: mesh.skeleton.boneTexture.createView() });\n return b;\n },\n};\n"],"names":[],"mappings":";AAWA,MAAM,eAAe;AAErB,MAAM,mBAAmB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAWzB,SAAS,iBAAiB,WAA4B;AAClD,MAAI,OAAO;AAAA;AAAA;AAAA;AAIX,MAAI,WAAW;AACX,YAAQ;AAAA;AAAA;AAAA;AAAA;AAAA,EAKZ;AACA,UAAQ;AAAA;AACR,SAAO;AACX;AAMO,SAAS,uBAAuB,WAAoC;AACvE,SAAO;AAAA,IACH,KAAK;AAAA,IAEL,mBAAmB;AAAA,MACf,EAAE,OAAO,UAAU,OAAO,aAAa,YAAY,YAA+B,cAAc,GAAA;AAAA,MAChG,EAAE,OAAO,WAAW,OAAO,aAAa,YAAY,aAAgC,cAAc,GAAA;AAAA,MAClG,GAAI,YACE;AAAA,QACI,EAAE,OAAO,WAAW,OAAO,aAAa,YAAY,YAA+B,cAAc,GAAA;AAAA,QACjG,EAAE,OAAO,YAAY,OAAO,aAAa,YAAY,aAAgC,cAAc,GAAA;AAAA,MAAG,IAE1G,CAAA;AAAA,IAAC;AAAA,IAGX,iBAAiB;AAAA,MACb,EAAE,OAAO,eAAe,OAAO,EAAE,OAAO,WAAW,cAAc,mBAA4B,aAAa,qBAAA,GAAiC,aAAa,aAAA;AAAA,IAAa;AAAA,IAGzK,wBAAwB;AAAA,IAExB,cAAc;AAAA,MACV,IAAI,iBAAiB,SAAS;AAAA,IAAA;AAAA,EAClC;AAER;AAKO,MAAM,SAAiB;AAAA,EAC1B,IAAI;AAAA,EACJ,OAAO;AAAA,EACP,KAAK,KAAK;AACN,QAAI,EAAE,IAAI,gBAAgB,mBAAmB;AACzC,aAAO;AAAA,IACX;AACA,WAAO,wBAAwB,IAAI,gBAAgB,wBAAwB,CAAC;AAAA,EAChF;AAAA,EACA,KAAK,KAAK,SAAS,GAAG;AAClB,UAAM,OAAO,IAAI;AACjB,QAAI,EAAE,IAAI,gBAAgB,qBAAqB,EAAC,6BAAM,WAAU;AAC5D,aAAO;AAAA,IACX;AACA,YAAQ,KAAK,EAAE,SAAS,KAAK,UAAU,KAAK,SAAS,YAAY,WAAA,EAAW,CAAG;AAC/E,WAAO;AAAA,EACX;AACJ;"}
1
+ {"version":3,"file":"skeleton-fragment-B__bUbPK.js","sources":["../src/material/pbr/fragments/skeleton-fragment.ts"],"sourcesContent":["/**\n * Skeleton Fragment\n *\n * Vertex-stage skeletal animation: bone texture sampling + skinning matrix.\n * Only bundled when a scene has skeletal animation.\n * Supports 4-bone and 8-bone skinning.\n */\n\nimport type { ShaderFragment, VertexAttribute } from \"../../../shader/fragment-types.js\";\n\n// WebGPU shader stage constants\nconst STAGE_VERTEX = 0x1;\n\nconst SKELETON_HELPERS = `\nfn readMatrixFromRawSampler(smp: texture_2d<f32>, index: f32) -> mat4x4<f32> {\nlet offset = i32(index) * 4;\nlet m0 = textureLoad(smp, vec2<i32>(offset + 0, 0), 0);\nlet m1 = textureLoad(smp, vec2<i32>(offset + 1, 0), 0);\nlet m2 = textureLoad(smp, vec2<i32>(offset + 2, 0), 0);\nlet m3 = textureLoad(smp, vec2<i32>(offset + 3, 0), 0);\nreturn mat4x4f(m0, m1, m2, m3);\n}\n`;\n\nfunction makeSkinningCode(has8Bones: boolean): string {\n let code = `var influence: mat4x4<f32> = readMatrixFromRawSampler(boneSampler, f32(joints[0])) * weights[0];\ninfluence = influence + readMatrixFromRawSampler(boneSampler, f32(joints[1])) * weights[1];\ninfluence = influence + readMatrixFromRawSampler(boneSampler, f32(joints[2])) * weights[2];\ninfluence = influence + readMatrixFromRawSampler(boneSampler, f32(joints[3])) * weights[3];`;\n if (has8Bones) {\n code += `\ninfluence = influence + readMatrixFromRawSampler(boneSampler, f32(joints1[0])) * weights1[0];\ninfluence = influence + readMatrixFromRawSampler(boneSampler, f32(joints1[1])) * weights1[1];\ninfluence = influence + readMatrixFromRawSampler(boneSampler, f32(joints1[2])) * weights1[2];\ninfluence = influence + readMatrixFromRawSampler(boneSampler, f32(joints1[3])) * weights1[3];`;\n }\n code += `\\nfinalWorld = mesh.world * influence;`;\n return code;\n}\n\n/**\n * Create a skeleton fragment.\n * @param has8Bones - Whether to use 8-bone skinning (joints1/weights1).\n */\nexport function createSkeletonFragment(has8Bones: boolean): ShaderFragment {\n return {\n _id: \"skeleton\",\n\n _vertexAttributes: [\n { _name: \"joints\", _type: \"vec4<u32>\", _gpuFormat: \"uint32x4\" as GPUVertexFormat, _arrayStride: 16 },\n { _name: \"weights\", _type: \"vec4<f32>\", _gpuFormat: \"float32x4\" as GPUVertexFormat, _arrayStride: 16 },\n ...(has8Bones\n ? [\n { _name: \"joints1\", _type: \"vec4<u32>\", _gpuFormat: \"uint32x4\" as GPUVertexFormat, _arrayStride: 16 },\n { _name: \"weights1\", _type: \"vec4<f32>\", _gpuFormat: \"float32x4\" as GPUVertexFormat, _arrayStride: 16 },\n ]\n : []),\n ] as VertexAttribute[],\n\n _vertexBindings: [\n { _name: \"boneSampler\", _type: { _kind: \"texture\", _textureType: \"texture_2d<f32>\" as const, _sampleType: \"unfilterable-float\" as const }, _visibility: STAGE_VERTEX },\n ],\n\n _vertexHelperFunctions: SKELETON_HELPERS,\n\n _vertexSlots: {\n VW: makeSkinningCode(has8Bones),\n },\n };\n}\n\nimport type { PbrExt } from \"../pbr-flags.js\";\nimport { MSH_HAS_SKELETON, MSH_HAS_SKELETON_8 } from \"../../mesh-features.js\";\n\nexport const pbrExt: PbrExt = {\n id: \"skeleton\",\n phase: \"vertex\",\n frag(ctx) {\n if (!(ctx._meshFeatures & MSH_HAS_SKELETON)) {\n return null;\n }\n return createSkeletonFragment((ctx._meshFeatures & MSH_HAS_SKELETON_8) !== 0);\n },\n bind(ctx, entries, b) {\n const mesh = ctx._mesh as { skeleton?: { boneTexture: GPUTexture } } | undefined;\n if (!(ctx._meshFeatures & MSH_HAS_SKELETON) || !mesh?.skeleton) {\n return b;\n }\n entries.push({ binding: b++, resource: mesh.skeleton.boneTexture.createView() });\n return b;\n },\n};\n"],"names":[],"mappings":";AAWA,MAAM,eAAe;AAErB,MAAM,mBAAmB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAWzB,SAAS,iBAAiB,WAA4B;AAClD,MAAI,OAAO;AAAA;AAAA;AAAA;AAIX,MAAI,WAAW;AACX,YAAQ;AAAA;AAAA;AAAA;AAAA;AAAA,EAKZ;AACA,UAAQ;AAAA;AACR,SAAO;AACX;AAMO,SAAS,uBAAuB,WAAoC;AACvE,SAAO;AAAA,IACH,KAAK;AAAA,IAEL,mBAAmB;AAAA,MACf,EAAE,OAAO,UAAU,OAAO,aAAa,YAAY,YAA+B,cAAc,GAAA;AAAA,MAChG,EAAE,OAAO,WAAW,OAAO,aAAa,YAAY,aAAgC,cAAc,GAAA;AAAA,MAClG,GAAI,YACE;AAAA,QACI,EAAE,OAAO,WAAW,OAAO,aAAa,YAAY,YAA+B,cAAc,GAAA;AAAA,QACjG,EAAE,OAAO,YAAY,OAAO,aAAa,YAAY,aAAgC,cAAc,GAAA;AAAA,MAAG,IAE1G,CAAA;AAAA,IAAC;AAAA,IAGX,iBAAiB;AAAA,MACb,EAAE,OAAO,eAAe,OAAO,EAAE,OAAO,WAAW,cAAc,mBAA4B,aAAa,qBAAA,GAAiC,aAAa,aAAA;AAAA,IAAa;AAAA,IAGzK,wBAAwB;AAAA,IAExB,cAAc;AAAA,MACV,IAAI,iBAAiB,SAAS;AAAA,IAAA;AAAA,EAClC;AAER;AAKO,MAAM,SAAiB;AAAA,EAC1B,IAAI;AAAA,EACJ,OAAO;AAAA,EACP,KAAK,KAAK;AACN,QAAI,EAAE,IAAI,gBAAgB,mBAAmB;AACzC,aAAO;AAAA,IACX;AACA,WAAO,wBAAwB,IAAI,gBAAgB,wBAAwB,CAAC;AAAA,EAChF;AAAA,EACA,KAAK,KAAK,SAAS,GAAG;AAClB,UAAM,OAAO,IAAI;AACjB,QAAI,EAAE,IAAI,gBAAgB,qBAAqB,EAAC,6BAAM,WAAU;AAC5D,aAAO;AAAA,IACX;AACA,YAAQ,KAAK,EAAE,SAAS,KAAK,UAAU,KAAK,SAAS,YAAY,WAAA,EAAW,CAAG;AAC/E,WAAO;AAAA,EACX;AACJ;"}
@@ -1,4 +1,4 @@
1
- import { a_ as createUniformBuffer, a$ as SCENE_UBO_WGSL, t as targetSignatureKey, h as createDefaultPipelineDescriptor, j as getSceneBindGroupLayout } from "./index-B7Qhw0xL.js";
1
+ import { S as SS, aw as createUniformBuffer, q as SCENE_UBO_WGSL, y as targetSignatureKey, z as createDefaultPipelineDescriptor, A as getSceneBindGroupLayout } from "./index-C-tEgwbZ.js";
2
2
  import { a as WGSL_FOG } from "./wgsl-helpers-D8sl1VVA.js";
3
3
  const skyVertSrc = "// Skybox CubeMap Vertex Shader\n// Passes object-space position (for cube texture lookup) and world-space position.\n\nstruct MeshUniforms {\n world: mat4x4<f32>,\n};\n@group(1) @binding(0) var<uniform> mesh: MeshUniforms;\n\nstruct VertexOutput {\n @builtin(position) clipPos: vec4<f32>,\n @location(0) vPositionW: vec3<f32>,\n @location(1) vPositionLocal: vec3<f32>,\n @location(2) vFogDistance: vec3<f32>,\n};\n\n@vertex\nfn main(\n @location(0) position: vec3<f32>,\n @location(1) normal: vec3<f32>,\n) -> VertexOutput {\n var out: VertexOutput;\n let worldPos = mesh.world * vec4<f32>(position, 1.0);\n out.vPositionW = worldPos.xyz;\n out.vPositionLocal = position;\n out.clipPos = scene.viewProjection * worldPos;\n out.vFogDistance = (scene.view * worldPos).xyz;\n return out;\n}\n";
4
4
  const skyFragSrc = "// Skybox CubeMap Fragment Shader\n// Samples cube texture using object-space position as lookup direction.\n// Matches Babylon StandardMaterial with REFLECTION + REFLECTIONMAP_SKYBOX.\n\n@group(1) @binding(1) var cubeTexture: texture_cube<f32>;\n@group(1) @binding(2) var cubeSampler: sampler;\n\nstruct FragmentInput {\n @location(0) vPositionW: vec3<f32>,\n @location(1) vPositionLocal: vec3<f32>,\n @location(2) vFogDistance: vec3<f32>,\n};\n\n@fragment\nfn main(input: FragmentInput) -> @location(0) vec4<f32> {\n // SKYBOX_MODE: use object-space position as cube lookup direction\n let lookupDir = normalize(input.vPositionLocal);\n var color = textureSample(cubeTexture, cubeSampler, lookupDir);\n\n // Apply fog\n if (scene.vFogInfos.x > 0.0) {\n let fog = calcFogFactor(input.vFogDistance);\n color = vec4<f32>(mix(scene.vFogColor.rgb, color.rgb, fog), color.a);\n }\n\n return color;\n}\n";
@@ -7,9 +7,9 @@ function buildSkyboxCubeMapGPU(engine, worldMatrix, cubeView, cubeSampler) {
7
7
  const meshBindGroupLayout = device.createBindGroupLayout({
8
8
  label: "skybox-cm-mesh",
9
9
  entries: [
10
- { binding: 0, visibility: GPUShaderStage.VERTEX, buffer: { type: "uniform" } },
11
- { binding: 1, visibility: GPUShaderStage.FRAGMENT, texture: { sampleType: "float", viewDimension: "cube" } },
12
- { binding: 2, visibility: GPUShaderStage.FRAGMENT, sampler: {} }
10
+ { binding: 0, visibility: SS.VERTEX, buffer: { type: "uniform" } },
11
+ { binding: 1, visibility: SS.FRAGMENT, texture: { sampleType: "float", viewDimension: "cube" } },
12
+ { binding: 2, visibility: SS.FRAGMENT, sampler: {} }
13
13
  ]
14
14
  });
15
15
  const meshUBO = createUniformBuffer(engine, worldMatrix);
@@ -45,8 +45,7 @@ function buildSkyboxCubeMapGPU(engine, worldMatrix, cubeView, cubeSampler) {
45
45
  _depthStencilFormat: sig._depthStencilFormat,
46
46
  _depthCompare: sig._depthCompare,
47
47
  _msaaSamples: sig._sampleCount,
48
- _cullMode: "none",
49
- _flipY: sig._flipY
48
+ _cullMode: "none"
50
49
  })
51
50
  );
52
51
  gpu.pipelines.set(key, pipeline);
@@ -62,7 +61,7 @@ function buildSkyboxCubeMapGPU(engine, worldMatrix, cubeView, cubeSampler) {
62
61
  return gpu;
63
62
  }
64
63
  function buildSkyboxRenderable(scene, skybox) {
65
- const engine = scene.engine;
64
+ const engine = scene.surface.engine;
66
65
  const gpu = buildSkyboxCubeMapGPU(engine, skybox.worldMatrix, skybox.cubeView, skybox.cubeSampler);
67
66
  const r = {
68
67
  order: 0,
@@ -89,4 +88,4 @@ function buildSkyboxRenderable(scene, skybox) {
89
88
  export {
90
89
  buildSkyboxRenderable
91
90
  };
92
- //# sourceMappingURL=skybox-renderable-DDcCPSly.js.map
91
+ //# sourceMappingURL=skybox-renderable-BH6uUkal.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skybox-renderable-BH6uUkal.js","sources":["../shaders/skybox-cubemap.vertex.wgsl?raw","../shaders/skybox-cubemap.fragment.wgsl?raw","../src/material/standard/skybox-cubemap.ts","../src/loader-skybox/skybox-renderable.ts"],"sourcesContent":["export default \"// Skybox CubeMap Vertex Shader\\n// Passes object-space position (for cube texture lookup) and world-space position.\\n\\nstruct MeshUniforms {\\n world: mat4x4<f32>,\\n};\\n@group(1) @binding(0) var<uniform> mesh: MeshUniforms;\\n\\nstruct VertexOutput {\\n @builtin(position) clipPos: vec4<f32>,\\n @location(0) vPositionW: vec3<f32>,\\n @location(1) vPositionLocal: vec3<f32>,\\n @location(2) vFogDistance: vec3<f32>,\\n};\\n\\n@vertex\\nfn main(\\n @location(0) position: vec3<f32>,\\n @location(1) normal: vec3<f32>,\\n) -> VertexOutput {\\n var out: VertexOutput;\\n let worldPos = mesh.world * vec4<f32>(position, 1.0);\\n out.vPositionW = worldPos.xyz;\\n out.vPositionLocal = position;\\n out.clipPos = scene.viewProjection * worldPos;\\n out.vFogDistance = (scene.view * worldPos).xyz;\\n return out;\\n}\\n\"","export default \"// Skybox CubeMap Fragment Shader\\n// Samples cube texture using object-space position as lookup direction.\\n// Matches Babylon StandardMaterial with REFLECTION + REFLECTIONMAP_SKYBOX.\\n\\n@group(1) @binding(1) var cubeTexture: texture_cube<f32>;\\n@group(1) @binding(2) var cubeSampler: sampler;\\n\\nstruct FragmentInput {\\n @location(0) vPositionW: vec3<f32>,\\n @location(1) vPositionLocal: vec3<f32>,\\n @location(2) vFogDistance: vec3<f32>,\\n};\\n\\n@fragment\\nfn main(input: FragmentInput) -> @location(0) vec4<f32> {\\n // SKYBOX_MODE: use object-space position as cube lookup direction\\n let lookupDir = normalize(input.vPositionLocal);\\n var color = textureSample(cubeTexture, cubeSampler, lookupDir);\\n\\n // Apply fog\\n if (scene.vFogInfos.x > 0.0) {\\n let fog = calcFogFactor(input.vFogDistance);\\n color = vec4<f32>(mix(scene.vFogColor.rgb, color.rgb, fog), color.a);\\n }\\n\\n return color;\\n}\\n\"","/**\n * Skybox CubeMap Material — renders a cube map on the inside of a box.\n * Material owns shaders (pillar 4c). Self-contained pipeline and bind groups.\n *\n * Used for StandardMaterial + CubeTexture(SKYBOX_MODE) in Babylon.\n * Renders backfaces (no culling → sees inside of box).\n */\n\nimport { SS } from \"../../engine/gpu-flags.js\";\nimport type { EngineContext } from \"../../engine/engine.js\";\nimport type { RenderTargetSignature } from \"../../engine/render-target.js\";\nimport skyVertSrc from \"../../../shaders/skybox-cubemap.vertex.wgsl?raw\";\nimport skyFragSrc from \"../../../shaders/skybox-cubemap.fragment.wgsl?raw\";\nimport { getSceneBindGroupLayout, createDefaultPipelineDescriptor } from \"../../render/scene-helpers.js\";\nimport { WGSL_FOG } from \"../../shader/wgsl-helpers.js\";\nimport { SCENE_UBO_WGSL } from \"../../shader/scene-uniforms.js\";\nimport { createUniformBuffer } from \"../../resource/gpu-buffers.js\";\nimport { targetSignatureKey } from \"../../engine/render-target.js\";\n\nexport interface SkyboxCubeMapGPU {\n /** Sig-keyed pipeline lookup (called from `bind()` once the target sig is known). */\n getPipeline(engine: EngineContext, sig: RenderTargetSignature): GPURenderPipeline;\n meshBindGroup: GPUBindGroup;\n meshUBO: GPUBuffer;\n meshBindGroupLayout: GPUBindGroupLayout;\n /** Pre-compiled shader modules — sig-independent. */\n vertModule: GPUShaderModule;\n fragModule: GPUShaderModule;\n /** Per-sig pipeline cache, owned by this skybox instance. */\n pipelines: Map<string, GPURenderPipeline>;\n}\n\n/**\n * Build the per-skybox GPU resources (mesh BGL + bind group + UBO + shader modules\n * + pipeline cache). The pipeline is created lazily by `getPipeline(engine, sig)`\n * once the target sig is known. The scene bind group is supplied per-pass by the\n * active RenderTask.\n */\nexport function buildSkyboxCubeMapGPU(engine: EngineContext, worldMatrix: Float32Array, cubeView: GPUTextureView, cubeSampler: GPUSampler): SkyboxCubeMapGPU {\n const device = engine._device;\n const meshBindGroupLayout = device.createBindGroupLayout({\n label: \"skybox-cm-mesh\",\n entries: [\n { binding: 0, visibility: SS.VERTEX, buffer: { type: \"uniform\" } },\n { binding: 1, visibility: SS.FRAGMENT, texture: { sampleType: \"float\", viewDimension: \"cube\" } },\n { binding: 2, visibility: SS.FRAGMENT, sampler: {} },\n ],\n });\n\n const meshUBO = createUniformBuffer(engine, worldMatrix);\n const meshBindGroup = device.createBindGroup({\n layout: meshBindGroupLayout,\n entries: [\n { binding: 0, resource: { buffer: meshUBO } },\n { binding: 1, resource: cubeView },\n { binding: 2, resource: cubeSampler },\n ],\n });\n\n const vertModule = device.createShaderModule({ code: SCENE_UBO_WGSL + skyVertSrc, label: \"skybox-cm-vert\" });\n const fragModule = device.createShaderModule({ code: SCENE_UBO_WGSL + WGSL_FOG + skyFragSrc, label: \"skybox-cm-frag\" });\n\n const gpu: SkyboxCubeMapGPU = {\n getPipeline(_engine, sig) {\n const key = targetSignatureKey(sig);\n const cached = gpu.pipelines.get(key);\n if (cached) {\n return cached;\n }\n const pipeline = _engine._device.createRenderPipeline(\n createDefaultPipelineDescriptor({\n _label: \"skybox-cubemap-pipeline\",\n _engine,\n _bgls: [getSceneBindGroupLayout(_engine), gpu.meshBindGroupLayout],\n _vertModule: gpu.vertModule,\n _fragModule: gpu.fragModule,\n _vertexBuffers: [\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 ],\n _format: sig._colorFormat!,\n _depthStencilFormat: sig._depthStencilFormat,\n _depthCompare: sig._depthCompare,\n _msaaSamples: sig._sampleCount,\n _cullMode: \"none\",\n })\n );\n gpu.pipelines.set(key, pipeline);\n return pipeline;\n },\n meshBindGroup,\n meshUBO,\n meshBindGroupLayout,\n vertModule,\n fragModule,\n pipelines: new Map(),\n };\n return gpu;\n}\n","/** Skybox renderable for cube-texture skyboxes (standard-material scenes).\n * Wraps the existing skybox-cubemap material into a Renderable. */\n\nimport type { SceneContext } from \"../scene/scene.js\";\nimport type { EngineContext } from \"../engine/engine.js\";\nimport type { SkyboxData } from \"./load-skybox.js\";\nimport type { Renderable } from \"../render/renderable.js\";\nimport { buildSkyboxCubeMapGPU } from \"../material/standard/skybox-cubemap.js\";\n\n/** Build a skybox Renderable from a SkyboxData (loaded via loadSkybox). */\nexport function buildSkyboxRenderable(scene: SceneContext, skybox: SkyboxData): Renderable {\n const engine = scene.surface.engine;\n\n const gpu = buildSkyboxCubeMapGPU(engine, skybox.worldMatrix, skybox.cubeView, skybox.cubeSampler);\n\n const r: Renderable = {\n order: 0, // skybox behind everything\n isTransparent: false,\n bind(eng, sig) {\n const pipeline = gpu.getPipeline(eng as EngineContext, sig);\n return {\n renderable: r,\n pipeline,\n draw(pass) {\n pass.setBindGroup(1, gpu.meshBindGroup);\n pass.setVertexBuffer(0, skybox.posBuffer);\n pass.setVertexBuffer(1, skybox.normBuffer);\n pass.setIndexBuffer(skybox.idxBuffer, \"uint32\");\n pass.drawIndexed(skybox.idxCount);\n return 1;\n },\n };\n },\n };\n return r;\n}\n"],"names":[],"mappings":"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"}
@@ -1,3 +1,4 @@
1
+ import { D as DV, e as U8, O as U8C, a as F32 } from "./index-C-tEgwbZ.js";
1
2
  const SH_C0 = 0.28209479177387814;
2
3
  const SQRT2 = Math.SQRT2;
3
4
  const ROW_OUTPUT_LENGTH = 32;
@@ -18,7 +19,7 @@ function shDegreeForIndex(i) {
18
19
  return 0;
19
20
  }
20
21
  function parseHeader(data) {
21
- const headerText = new TextDecoder().decode(new Uint8Array(data, 0, Math.min(data.byteLength, 1024 * 10)));
22
+ const headerText = new TextDecoder().decode(new U8(data, 0, Math.min(data.byteLength, 1024 * 10)));
22
23
  const headerEnd = "end_header\n";
23
24
  const idx = headerText.indexOf(headerEnd);
24
25
  if (idx < 0) {
@@ -224,7 +225,7 @@ function convertCompressedPlyToParsedSplat(data) {
224
225
  return { data };
225
226
  }
226
227
  const isCompressed = header.chunkCount > 0;
227
- const dv = new DataView(data, header.dataStart);
228
+ const dv = new DV(data, header.dataStart);
228
229
  const out = new ArrayBuffer(ROW_OUTPUT_LENGTH * header.vertexCount);
229
230
  const tmpPos = [0, 0, 0];
230
231
  const tmpScl = [0, 0, 0];
@@ -232,14 +233,14 @@ function convertCompressedPlyToParsedSplat(data) {
232
233
  const tmpQuat = [0, 0, 0, 1];
233
234
  const offsetRef = { value: 0 };
234
235
  const chunks = isCompressed ? readChunks(header, dv, offsetRef) : null;
235
- const shFlat = header.shDegree && header.shCoefficientCount ? new Uint8Array(header.shCoefficientCount * header.vertexCount) : null;
236
+ const shFlat = header.shDegree && header.shCoefficientCount ? new U8(header.shCoefficientCount * header.vertexCount) : null;
236
237
  const shBlockBase = header.rowChunkLength * header.chunkCount + header.vertexCount * header.rowVertexLength;
237
238
  const shDim = header.shCoefficientCount / 3;
238
239
  for (let i = 0; i < header.vertexCount; i++) {
239
- const position = new Float32Array(out, i * ROW_OUTPUT_LENGTH, 3);
240
- const scale = new Float32Array(out, i * ROW_OUTPUT_LENGTH + 12, 3);
241
- const rgba = new Uint8ClampedArray(out, i * ROW_OUTPUT_LENGTH + 24, 4);
242
- const rot = new Uint8ClampedArray(out, i * ROW_OUTPUT_LENGTH + 28, 4);
240
+ const position = new F32(out, i * ROW_OUTPUT_LENGTH, 3);
241
+ const scale = new F32(out, i * ROW_OUTPUT_LENGTH + 12, 3);
242
+ const rgba = new U8C(out, i * ROW_OUTPUT_LENGTH + 24, 4);
243
+ const rot = new U8C(out, i * ROW_OUTPUT_LENGTH + 28, 4);
243
244
  const chunk = chunks ? chunks[i >> 8] : null;
244
245
  let r0 = 255, r1 = 0, r2 = 0, r3 = 0;
245
246
  const plySH = shFlat ? new Array(header.shCoefficientCount) : null;
@@ -391,4 +392,4 @@ function convertCompressedPlyToParsedSplat(data) {
391
392
  export {
392
393
  convertCompressedPlyToParsedSplat
393
394
  };
394
- //# sourceMappingURL=splat-ply-compressed-BahdBG1r.js.map
395
+ //# sourceMappingURL=splat-ply-compressed-BGNK6dnh.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"splat-ply-compressed-BGNK6dnh.js","sources":["../src/loader-splat/splat-ply-compressed.ts"],"sourcesContent":["/** Compressed-PLY + SH parser (separate from `splat-ply-parser.ts` so the\n * standard PLY path stays small enough to fit scene 120's bundle ceiling).\n *\n * Compressed PLY layout (BJS / PlayCanvas convention):\n * • `element chunk K` — K records of 12 floats:\n * min_x..z, max_x..z, min_scale_*, max_scale_*, min_r..b, max_r..b\n * • `element vertex N` — N rows of `packed_position`/`_rotation`/`_scale`/\n * `_color` (uint32 each); chunkIndex = `vertexIndex >> 8`.\n * • `element sh M` — properties define SH bytes laid out in a\n * *trailing* block (absolute offset `chunkBytes + vertexBytes`).\n *\n * Standard PLY with per-vertex `f_rest_*` properties also routes through\n * this parser so SH evaluation stays paired with the rest of the SH\n * pipeline.\n *\n * Returns the same `ParsedSplat` contract as `convertPlyToSplat` (flat SH\n * byte layout — see `splat-data.ts` for the exact convention). */\n\nimport { F32, U8C, U8, DV } from \"../engine/typed-arrays.js\";\nimport type { ParsedSplat } from \"./splat-data.js\";\n\nconst SH_C0 = 0.28209479177387814;\nconst SQRT2 = Math.SQRT2;\nconst ROW_OUTPUT_LENGTH = 32;\n\nconst TYPE_SIZE: Record<string, number> = { double: 8, int: 4, uint: 4, float: 4, short: 2, ushort: 2, uchar: 1 };\n\nconst enum Section {\n Vertex = 0,\n Chunk = 1,\n SH = 2,\n Unused = 3,\n}\n\ninterface PlyProp {\n name: string;\n type: string;\n offset: number;\n}\n\ninterface PlyHeader {\n vertexCount: number;\n chunkCount: number;\n rowVertexLength: number;\n rowChunkLength: number;\n vertexProps: PlyProp[];\n chunkProps: PlyProp[];\n shProps: PlyProp[];\n shDegree: number;\n shCoefficientCount: number;\n dataStart: number;\n}\n\nfunction shDegreeForIndex(i: number): number {\n if (i >= 71) {\n return 4;\n }\n if (i >= 44) {\n return 3;\n }\n if (i >= 23) {\n return 2;\n }\n if (i >= 8) {\n return 1;\n }\n return 0;\n}\n\nfunction parseHeader(data: ArrayBuffer): PlyHeader | null {\n const headerText = new TextDecoder().decode(new U8(data, 0, Math.min(data.byteLength, 1024 * 10)));\n const headerEnd = \"end_header\\n\";\n const idx = headerText.indexOf(headerEnd);\n if (idx < 0) {\n return null;\n }\n const vmatch = /element vertex (\\d+)\\n/.exec(headerText);\n if (!vmatch) {\n return null;\n }\n const vertexCount = parseInt(vmatch[1]!, 10);\n const cmatch = /element chunk (\\d+)\\n/.exec(headerText);\n const chunkCount = cmatch ? parseInt(cmatch[1]!, 10) : 0;\n let section: Section = Section.Chunk;\n let rowVertex = 0;\n let rowChunk = 0;\n const vertexProps: PlyProp[] = [];\n const chunkProps: PlyProp[] = [];\n const shProps: PlyProp[] = [];\n let shDegree = 0;\n for (const line of headerText.slice(0, idx).split(\"\\n\")) {\n if (line.startsWith(\"element \")) {\n const [, kind] = line.split(\" \");\n section = kind === \"chunk\" ? Section.Chunk : kind === \"vertex\" ? Section.Vertex : kind === \"sh\" ? Section.SH : Section.Unused;\n continue;\n }\n if (!line.startsWith(\"property \")) {\n continue;\n }\n const [, type, name] = line.split(\" \");\n if (!type || !name || TYPE_SIZE[type] === undefined) {\n return null;\n }\n const sz = TYPE_SIZE[type]!;\n if (section === Section.Chunk) {\n chunkProps.push({ name, type, offset: rowChunk });\n rowChunk += sz;\n } else if (section === Section.Vertex) {\n vertexProps.push({ name, type, offset: rowVertex });\n rowVertex += sz;\n if (name.startsWith(\"f_rest_\")) {\n shDegree = Math.max(shDegree, shDegreeForIndex(parseInt(name.slice(7), 10)));\n }\n } else if (section === Section.SH) {\n shProps.push({ name, type, offset: 0 });\n if (name.startsWith(\"f_rest_\")) {\n shDegree = Math.max(shDegree, shDegreeForIndex(parseInt(name.slice(7), 10)));\n }\n }\n }\n const shCoefficientCount = shDegree ? ((shDegree + 1) * (shDegree + 1) - 1) * 3 : 0;\n return {\n vertexCount,\n chunkCount,\n rowVertexLength: rowVertex,\n rowChunkLength: rowChunk,\n vertexProps,\n chunkProps,\n shProps,\n shDegree,\n shCoefficientCount,\n dataStart: idx + headerEnd.length,\n };\n}\n\ninterface CompressedChunk {\n minX: number;\n minY: number;\n minZ: number;\n maxX: number;\n maxY: number;\n maxZ: number;\n minSX: number;\n minSY: number;\n minSZ: number;\n maxSX: number;\n maxSY: number;\n maxSZ: number;\n minR: number;\n minG: number;\n minB: number;\n maxR: number;\n maxG: number;\n maxB: number;\n}\n\nfunction readChunks(header: PlyHeader, dv: DataView, offsetRef: { value: number }): CompressedChunk[] {\n const out: CompressedChunk[] = [];\n for (let i = 0; i < header.chunkCount; i++) {\n const c: CompressedChunk = {\n minX: 0,\n minY: 0,\n minZ: 0,\n maxX: 0,\n maxY: 0,\n maxZ: 0,\n minSX: 0,\n minSY: 0,\n minSZ: 0,\n maxSX: 0,\n maxSY: 0,\n maxSZ: 0,\n minR: 0,\n minG: 0,\n minB: 0,\n maxR: 1,\n maxG: 1,\n maxB: 1,\n };\n for (const p of header.chunkProps) {\n if (p.type !== \"float\") {\n continue;\n }\n const v = dv.getFloat32(offsetRef.value + p.offset, true);\n switch (p.name) {\n case \"min_x\":\n c.minX = v;\n break;\n case \"min_y\":\n c.minY = v;\n break;\n case \"min_z\":\n c.minZ = v;\n break;\n case \"max_x\":\n c.maxX = v;\n break;\n case \"max_y\":\n c.maxY = v;\n break;\n case \"max_z\":\n c.maxZ = v;\n break;\n case \"min_scale_x\":\n c.minSX = v;\n break;\n case \"min_scale_y\":\n c.minSY = v;\n break;\n case \"min_scale_z\":\n c.minSZ = v;\n break;\n case \"max_scale_x\":\n c.maxSX = v;\n break;\n case \"max_scale_y\":\n c.maxSY = v;\n break;\n case \"max_scale_z\":\n c.maxSZ = v;\n break;\n case \"min_r\":\n c.minR = v;\n break;\n case \"min_g\":\n c.minG = v;\n break;\n case \"min_b\":\n c.minB = v;\n break;\n case \"max_r\":\n c.maxR = v;\n break;\n case \"max_g\":\n c.maxG = v;\n break;\n case \"max_b\":\n c.maxB = v;\n break;\n }\n }\n out.push(c);\n offsetRef.value += header.rowChunkLength;\n }\n return out;\n}\n\nconst lerp = (a: number, b: number, t: number): number => a + (b - a) * t;\nconst clamp255 = (v: number): number => (v < 0 ? 0 : v > 255 ? 255 : v);\n\n/** Unpack a uint32 as 11-10-11 bits → three normalized floats in [0,1]. */\nfunction unpack111011(value: number, out: [number, number, number]): void {\n out[0] = ((value >>> 21) & 0x7ff) / 0x7ff;\n out[1] = ((value >>> 11) & 0x3ff) / 0x3ff;\n out[2] = (value & 0x7ff) / 0x7ff;\n}\n\n/** Unpack a uint32 as 4 bytes (R,G,B,A normalized to [0,1]). */\nfunction unpack8888(value: number, out: [number, number, number, number]): void {\n out[0] = ((value >>> 24) & 0xff) / 0xff;\n out[1] = ((value >>> 16) & 0xff) / 0xff;\n out[2] = ((value >>> 8) & 0xff) / 0xff;\n out[3] = (value & 0xff) / 0xff;\n}\n\n/** Unpack a uint32 as (2-bit largest index, 3×10-bit components). Returns\n * quaternion as [x, y, z, w] matching BJS `Quaternion.set(x, y, z, w)`. */\nfunction unpackRot(value: number, out: [number, number, number, number]): void {\n const norm = 1.0 / (SQRT2 * 0.5);\n const a = (((value >>> 20) & 0x3ff) / 0x3ff - 0.5) * norm;\n const b = (((value >>> 10) & 0x3ff) / 0x3ff - 0.5) * norm;\n const c = ((value & 0x3ff) / 0x3ff - 0.5) * norm;\n const m = Math.sqrt(Math.max(0, 1.0 - (a * a + b * b + c * c)));\n switch (value >>> 30) {\n case 0:\n out[0] = a;\n out[1] = b;\n out[2] = c;\n out[3] = m;\n break;\n case 1:\n out[0] = m;\n out[1] = b;\n out[2] = c;\n out[3] = a;\n break;\n case 2:\n out[0] = b;\n out[1] = m;\n out[2] = c;\n out[3] = a;\n break;\n default:\n out[0] = b;\n out[1] = c;\n out[2] = m;\n out[3] = a;\n break;\n }\n}\n\n/** Decode a compressed PLY (or a standard PLY with `f_rest_*` SH properties)\n * into a `ParsedSplat`. Dynamic-imported from `load-splat.ts` when\n * `isPlyCompressedOrSH(data)` is true, so the standard-PLY path remains\n * bundle-lean. */\nexport function convertCompressedPlyToParsedSplat(data: ArrayBuffer): ParsedSplat {\n const header = parseHeader(data);\n if (!header) {\n return { data };\n }\n\n const isCompressed = header.chunkCount > 0;\n const dv = new DV(data, header.dataStart);\n const out = new ArrayBuffer(ROW_OUTPUT_LENGTH * header.vertexCount);\n\n const tmpPos: [number, number, number] = [0, 0, 0];\n const tmpScl: [number, number, number] = [0, 0, 0];\n const tmpRgba: [number, number, number, number] = [0, 0, 0, 0];\n const tmpQuat: [number, number, number, number] = [0, 0, 0, 1];\n\n const offsetRef = { value: 0 };\n const chunks = isCompressed ? readChunks(header, dv, offsetRef) : null;\n\n const shFlat = header.shDegree && header.shCoefficientCount ? new U8(header.shCoefficientCount * header.vertexCount) : null;\n const shBlockBase = header.rowChunkLength * header.chunkCount + header.vertexCount * header.rowVertexLength;\n const shDim = header.shCoefficientCount / 3;\n\n for (let i = 0; i < header.vertexCount; i++) {\n const position = new F32(out, i * ROW_OUTPUT_LENGTH, 3);\n const scale = new F32(out, i * ROW_OUTPUT_LENGTH + 12, 3);\n const rgba = new U8C(out, i * ROW_OUTPUT_LENGTH + 24, 4);\n const rot = new U8C(out, i * ROW_OUTPUT_LENGTH + 28, 4);\n const chunk = chunks ? chunks[i >> 8] : null;\n\n let r0 = 255,\n r1 = 0,\n r2 = 0,\n r3 = 0;\n const plySH = shFlat ? new Array<number>(header.shCoefficientCount) : null;\n\n for (const prop of header.vertexProps) {\n let value: number;\n switch (prop.type) {\n case \"float\":\n value = dv.getFloat32(offsetRef.value + prop.offset, true);\n break;\n case \"int\":\n value = dv.getInt32(offsetRef.value + prop.offset, true);\n break;\n case \"uint\":\n value = dv.getUint32(offsetRef.value + prop.offset, true);\n break;\n case \"uchar\":\n value = dv.getUint8(offsetRef.value + prop.offset);\n break;\n case \"short\":\n value = dv.getInt16(offsetRef.value + prop.offset, true);\n break;\n case \"ushort\":\n value = dv.getUint16(offsetRef.value + prop.offset, true);\n break;\n case \"double\":\n value = dv.getFloat64(offsetRef.value + prop.offset, true);\n break;\n default:\n continue;\n }\n switch (prop.name) {\n case \"packed_position\":\n unpack111011(value, tmpPos);\n position[0] = lerp(chunk!.minX, chunk!.maxX, tmpPos[0]);\n position[1] = lerp(chunk!.minY, chunk!.maxY, tmpPos[1]);\n position[2] = lerp(chunk!.minZ, chunk!.maxZ, tmpPos[2]);\n break;\n case \"packed_rotation\":\n unpackRot(value, tmpQuat);\n r0 = tmpQuat[3];\n r1 = tmpQuat[0];\n r2 = tmpQuat[1];\n r3 = tmpQuat[2];\n break;\n case \"packed_scale\":\n unpack111011(value, tmpScl);\n scale[0] = Math.exp(lerp(chunk!.minSX, chunk!.maxSX, tmpScl[0]));\n scale[1] = Math.exp(lerp(chunk!.minSY, chunk!.maxSY, tmpScl[1]));\n scale[2] = Math.exp(lerp(chunk!.minSZ, chunk!.maxSZ, tmpScl[2]));\n break;\n case \"packed_color\":\n unpack8888(value, tmpRgba);\n rgba[0] = lerp(chunk!.minR, chunk!.maxR, tmpRgba[0]) * 255;\n rgba[1] = lerp(chunk!.minG, chunk!.maxG, tmpRgba[1]) * 255;\n rgba[2] = lerp(chunk!.minB, chunk!.maxB, tmpRgba[2]) * 255;\n rgba[3] = tmpRgba[3] * 255;\n break;\n case \"x\":\n position[0] = value;\n break;\n case \"y\":\n position[1] = value;\n break;\n case \"z\":\n position[2] = value;\n break;\n case \"scale_0\":\n scale[0] = Math.exp(value);\n break;\n case \"scale_1\":\n scale[1] = Math.exp(value);\n break;\n case \"scale_2\":\n scale[2] = Math.exp(value);\n break;\n case \"red\":\n case \"diffuse_red\":\n rgba[0] = value;\n break;\n case \"green\":\n case \"diffuse_green\":\n rgba[1] = value;\n break;\n case \"blue\":\n case \"diffuse_blue\":\n rgba[2] = value;\n break;\n case \"f_dc_0\":\n rgba[0] = (0.5 + SH_C0 * value) * 255;\n break;\n case \"f_dc_1\":\n rgba[1] = (0.5 + SH_C0 * value) * 255;\n break;\n case \"f_dc_2\":\n rgba[2] = (0.5 + SH_C0 * value) * 255;\n break;\n case \"f_dc_3\":\n rgba[3] = (0.5 + SH_C0 * value) * 255;\n break;\n case \"opacity\":\n rgba[3] = (1 / (1 + Math.exp(-value))) * 255;\n break;\n case \"rot_0\":\n r0 = value;\n break;\n case \"rot_1\":\n r1 = value;\n break;\n case \"rot_2\":\n r2 = value;\n break;\n case \"rot_3\":\n r3 = value;\n break;\n default:\n if (plySH && prop.name.startsWith(\"f_rest_\")) {\n const shIdx = parseInt(prop.name.slice(7), 10);\n plySH[shIdx] = clamp255(value * 127.5 + 127.5);\n }\n break;\n }\n }\n\n // Compressed PLY: SH bytes live in a trailing block keyed by splat\n // index. Uchar dequant uses BJS's `(v * 8/255 - 4) * 127.5 + 127.5`\n // (different from the standard f_rest float path).\n if (plySH && header.shProps.length > 0) {\n for (let k = 0; k < header.shCoefficientCount; k++) {\n const b = dv.getUint8(shBlockBase + i * header.shCoefficientCount + k);\n plySH[k] = clamp255((b * (8 / 255) - 4) * 127.5 + 127.5);\n }\n }\n\n // PLY stores SH as [R0..R(d-1), G0..G(d-1), B0..B(d-1)]; transpose to\n // the BJS-coefficient layout `[R0,G0,B0, R1,G1,B1, …]`.\n if (plySH && shFlat) {\n for (let j = 0; j < shDim; j++) {\n shFlat[i * header.shCoefficientCount + j * 3 + 0] = plySH[j]!;\n shFlat[i * header.shCoefficientCount + j * 3 + 1] = plySH[j + shDim]!;\n shFlat[i * header.shCoefficientCount + j * 3 + 2] = plySH[j + shDim * 2]!;\n }\n }\n\n const len = Math.hypot(r0, r1, r2, r3) || 1;\n const inv = 1 / len;\n rot[0] = r0 * inv * 127.5 + 127.5;\n rot[1] = r1 * inv * 127.5 + 127.5;\n rot[2] = r2 * inv * 127.5 + 127.5;\n rot[3] = r3 * inv * 127.5 + 127.5;\n\n offsetRef.value += header.rowVertexLength;\n }\n\n if (shFlat && header.shDegree) {\n return { data: out, sh: shFlat, shDegree: header.shDegree };\n }\n return { data: out };\n}\n"],"names":[],"mappings":";AAqBA,MAAM,QAAQ;AACd,MAAM,QAAQ,KAAK;AACnB,MAAM,oBAAoB;AAE1B,MAAM,YAAoC,EAAE,QAAQ,GAAG,KAAK,GAAG,MAAM,GAAG,OAAO,GAAG,OAAO,GAAG,QAAQ,GAAG,OAAO,EAAA;AA4B9G,SAAS,iBAAiB,GAAmB;AACzC,MAAI,KAAK,IAAI;AACT,WAAO;AAAA,EACX;AACA,MAAI,KAAK,IAAI;AACT,WAAO;AAAA,EACX;AACA,MAAI,KAAK,IAAI;AACT,WAAO;AAAA,EACX;AACA,MAAI,KAAK,GAAG;AACR,WAAO;AAAA,EACX;AACA,SAAO;AACX;AAEA,SAAS,YAAY,MAAqC;AACtD,QAAM,aAAa,IAAI,YAAA,EAAc,OAAO,IAAI,GAAG,MAAM,GAAG,KAAK,IAAI,KAAK,YAAY,OAAO,EAAE,CAAC,CAAC;AACjG,QAAM,YAAY;AAClB,QAAM,MAAM,WAAW,QAAQ,SAAS;AACxC,MAAI,MAAM,GAAG;AACT,WAAO;AAAA,EACX;AACA,QAAM,SAAS,yBAAyB,KAAK,UAAU;AACvD,MAAI,CAAC,QAAQ;AACT,WAAO;AAAA,EACX;AACA,QAAM,cAAc,SAAS,OAAO,CAAC,GAAI,EAAE;AAC3C,QAAM,SAAS,wBAAwB,KAAK,UAAU;AACtD,QAAM,aAAa,SAAS,SAAS,OAAO,CAAC,GAAI,EAAE,IAAI;AACvD,MAAI,UAAmB;AACvB,MAAI,YAAY;AAChB,MAAI,WAAW;AACf,QAAM,cAAyB,CAAA;AAC/B,QAAM,aAAwB,CAAA;AAC9B,QAAM,UAAqB,CAAA;AAC3B,MAAI,WAAW;AACf,aAAW,QAAQ,WAAW,MAAM,GAAG,GAAG,EAAE,MAAM,IAAI,GAAG;AACrD,QAAI,KAAK,WAAW,UAAU,GAAG;AAC7B,YAAM,CAAA,EAAG,IAAI,IAAI,KAAK,MAAM,GAAG;AAC/B,gBAAU,SAAS,UAAU,IAAgB,SAAS,WAAW,IAAiB,SAAS,OAAO,IAAa;AAC/G;AAAA,IACJ;AACA,QAAI,CAAC,KAAK,WAAW,WAAW,GAAG;AAC/B;AAAA,IACJ;AACA,UAAM,CAAA,EAAG,MAAM,IAAI,IAAI,KAAK,MAAM,GAAG;AACrC,QAAI,CAAC,QAAQ,CAAC,QAAQ,UAAU,IAAI,MAAM,QAAW;AACjD,aAAO;AAAA,IACX;AACA,UAAM,KAAK,UAAU,IAAI;AACzB,QAAI,YAAY,GAAe;AAC3B,iBAAW,KAAK,EAAE,MAAM,MAAM,QAAQ,UAAU;AAChD,kBAAY;AAAA,IAChB,WAAW,YAAY,GAAgB;AACnC,kBAAY,KAAK,EAAE,MAAM,MAAM,QAAQ,WAAW;AAClD,mBAAa;AACb,UAAI,KAAK,WAAW,SAAS,GAAG;AAC5B,mBAAW,KAAK,IAAI,UAAU,iBAAiB,SAAS,KAAK,MAAM,CAAC,GAAG,EAAE,CAAC,CAAC;AAAA,MAC/E;AAAA,IACJ,WAAW,YAAY,GAAY;AAC/B,cAAQ,KAAK,EAAE,MAAM,MAAM,QAAQ,GAAG;AACtC,UAAI,KAAK,WAAW,SAAS,GAAG;AAC5B,mBAAW,KAAK,IAAI,UAAU,iBAAiB,SAAS,KAAK,MAAM,CAAC,GAAG,EAAE,CAAC,CAAC;AAAA,MAC/E;AAAA,IACJ;AAAA,EACJ;AACA,QAAM,qBAAqB,aAAa,WAAW,MAAM,WAAW,KAAK,KAAK,IAAI;AAClF,SAAO;AAAA,IACH;AAAA,IACA;AAAA,IACA,iBAAiB;AAAA,IACjB,gBAAgB;AAAA,IAChB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,WAAW,MAAM,UAAU;AAAA,EAAA;AAEnC;AAuBA,SAAS,WAAW,QAAmB,IAAc,WAAiD;AAClG,QAAM,MAAyB,CAAA;AAC/B,WAAS,IAAI,GAAG,IAAI,OAAO,YAAY,KAAK;AACxC,UAAM,IAAqB;AAAA,MACvB,MAAM;AAAA,MACN,MAAM;AAAA,MACN,MAAM;AAAA,MACN,MAAM;AAAA,MACN,MAAM;AAAA,MACN,MAAM;AAAA,MACN,OAAO;AAAA,MACP,OAAO;AAAA,MACP,OAAO;AAAA,MACP,OAAO;AAAA,MACP,OAAO;AAAA,MACP,OAAO;AAAA,MACP,MAAM;AAAA,MACN,MAAM;AAAA,MACN,MAAM;AAAA,MACN,MAAM;AAAA,MACN,MAAM;AAAA,MACN,MAAM;AAAA,IAAA;AAEV,eAAW,KAAK,OAAO,YAAY;AAC/B,UAAI,EAAE,SAAS,SAAS;AACpB;AAAA,MACJ;AACA,YAAM,IAAI,GAAG,WAAW,UAAU,QAAQ,EAAE,QAAQ,IAAI;AACxD,cAAQ,EAAE,MAAA;AAAA,QACN,KAAK;AACD,YAAE,OAAO;AACT;AAAA,QACJ,KAAK;AACD,YAAE,OAAO;AACT;AAAA,QACJ,KAAK;AACD,YAAE,OAAO;AACT;AAAA,QACJ,KAAK;AACD,YAAE,OAAO;AACT;AAAA,QACJ,KAAK;AACD,YAAE,OAAO;AACT;AAAA,QACJ,KAAK;AACD,YAAE,OAAO;AACT;AAAA,QACJ,KAAK;AACD,YAAE,QAAQ;AACV;AAAA,QACJ,KAAK;AACD,YAAE,QAAQ;AACV;AAAA,QACJ,KAAK;AACD,YAAE,QAAQ;AACV;AAAA,QACJ,KAAK;AACD,YAAE,QAAQ;AACV;AAAA,QACJ,KAAK;AACD,YAAE,QAAQ;AACV;AAAA,QACJ,KAAK;AACD,YAAE,QAAQ;AACV;AAAA,QACJ,KAAK;AACD,YAAE,OAAO;AACT;AAAA,QACJ,KAAK;AACD,YAAE,OAAO;AACT;AAAA,QACJ,KAAK;AACD,YAAE,OAAO;AACT;AAAA,QACJ,KAAK;AACD,YAAE,OAAO;AACT;AAAA,QACJ,KAAK;AACD,YAAE,OAAO;AACT;AAAA,QACJ,KAAK;AACD,YAAE,OAAO;AACT;AAAA,MAAA;AAAA,IAEZ;AACA,QAAI,KAAK,CAAC;AACV,cAAU,SAAS,OAAO;AAAA,EAC9B;AACA,SAAO;AACX;AAEA,MAAM,OAAO,CAAC,GAAW,GAAW,MAAsB,KAAK,IAAI,KAAK;AACxE,MAAM,WAAW,CAAC,MAAuB,IAAI,IAAI,IAAI,IAAI,MAAM,MAAM;AAGrE,SAAS,aAAa,OAAe,KAAqC;AACtE,MAAI,CAAC,KAAM,UAAU,KAAM,QAAS;AACpC,MAAI,CAAC,KAAM,UAAU,KAAM,QAAS;AACpC,MAAI,CAAC,KAAK,QAAQ,QAAS;AAC/B;AAGA,SAAS,WAAW,OAAe,KAA6C;AAC5E,MAAI,CAAC,KAAM,UAAU,KAAM,OAAQ;AACnC,MAAI,CAAC,KAAM,UAAU,KAAM,OAAQ;AACnC,MAAI,CAAC,KAAM,UAAU,IAAK,OAAQ;AAClC,MAAI,CAAC,KAAK,QAAQ,OAAQ;AAC9B;AAIA,SAAS,UAAU,OAAe,KAA6C;AAC3E,QAAM,OAAO,KAAO,QAAQ;AAC5B,QAAM,MAAO,UAAU,KAAM,QAAS,OAAQ,OAAO;AACrD,QAAM,MAAO,UAAU,KAAM,QAAS,OAAQ,OAAO;AACrD,QAAM,MAAM,QAAQ,QAAS,OAAQ,OAAO;AAC5C,QAAM,IAAI,KAAK,KAAK,KAAK,IAAI,GAAG,KAAO,IAAI,IAAI,IAAI,IAAI,IAAI,EAAE,CAAC;AAC9D,UAAQ,UAAU,IAAA;AAAA,IACd,KAAK;AACD,UAAI,CAAC,IAAI;AACT,UAAI,CAAC,IAAI;AACT,UAAI,CAAC,IAAI;AACT,UAAI,CAAC,IAAI;AACT;AAAA,IACJ,KAAK;AACD,UAAI,CAAC,IAAI;AACT,UAAI,CAAC,IAAI;AACT,UAAI,CAAC,IAAI;AACT,UAAI,CAAC,IAAI;AACT;AAAA,IACJ,KAAK;AACD,UAAI,CAAC,IAAI;AACT,UAAI,CAAC,IAAI;AACT,UAAI,CAAC,IAAI;AACT,UAAI,CAAC,IAAI;AACT;AAAA,IACJ;AACI,UAAI,CAAC,IAAI;AACT,UAAI,CAAC,IAAI;AACT,UAAI,CAAC,IAAI;AACT,UAAI,CAAC,IAAI;AACT;AAAA,EAAA;AAEZ;AAMO,SAAS,kCAAkC,MAAgC;AAC9E,QAAM,SAAS,YAAY,IAAI;AAC/B,MAAI,CAAC,QAAQ;AACT,WAAO,EAAE,KAAA;AAAA,EACb;AAEA,QAAM,eAAe,OAAO,aAAa;AACzC,QAAM,KAAK,IAAI,GAAG,MAAM,OAAO,SAAS;AACxC,QAAM,MAAM,IAAI,YAAY,oBAAoB,OAAO,WAAW;AAElE,QAAM,SAAmC,CAAC,GAAG,GAAG,CAAC;AACjD,QAAM,SAAmC,CAAC,GAAG,GAAG,CAAC;AACjD,QAAM,UAA4C,CAAC,GAAG,GAAG,GAAG,CAAC;AAC7D,QAAM,UAA4C,CAAC,GAAG,GAAG,GAAG,CAAC;AAE7D,QAAM,YAAY,EAAE,OAAO,EAAA;AAC3B,QAAM,SAAS,eAAe,WAAW,QAAQ,IAAI,SAAS,IAAI;AAElE,QAAM,SAAS,OAAO,YAAY,OAAO,qBAAqB,IAAI,GAAG,OAAO,qBAAqB,OAAO,WAAW,IAAI;AACvH,QAAM,cAAc,OAAO,iBAAiB,OAAO,aAAa,OAAO,cAAc,OAAO;AAC5F,QAAM,QAAQ,OAAO,qBAAqB;AAE1C,WAAS,IAAI,GAAG,IAAI,OAAO,aAAa,KAAK;AACzC,UAAM,WAAW,IAAI,IAAI,KAAK,IAAI,mBAAmB,CAAC;AACtD,UAAM,QAAQ,IAAI,IAAI,KAAK,IAAI,oBAAoB,IAAI,CAAC;AACxD,UAAM,OAAO,IAAI,IAAI,KAAK,IAAI,oBAAoB,IAAI,CAAC;AACvD,UAAM,MAAM,IAAI,IAAI,KAAK,IAAI,oBAAoB,IAAI,CAAC;AACtD,UAAM,QAAQ,SAAS,OAAO,KAAK,CAAC,IAAI;AAExC,QAAI,KAAK,KACL,KAAK,GACL,KAAK,GACL,KAAK;AACT,UAAM,QAAQ,SAAS,IAAI,MAAc,OAAO,kBAAkB,IAAI;AAEtE,eAAW,QAAQ,OAAO,aAAa;AACnC,UAAI;AACJ,cAAQ,KAAK,MAAA;AAAA,QACT,KAAK;AACD,kBAAQ,GAAG,WAAW,UAAU,QAAQ,KAAK,QAAQ,IAAI;AACzD;AAAA,QACJ,KAAK;AACD,kBAAQ,GAAG,SAAS,UAAU,QAAQ,KAAK,QAAQ,IAAI;AACvD;AAAA,QACJ,KAAK;AACD,kBAAQ,GAAG,UAAU,UAAU,QAAQ,KAAK,QAAQ,IAAI;AACxD;AAAA,QACJ,KAAK;AACD,kBAAQ,GAAG,SAAS,UAAU,QAAQ,KAAK,MAAM;AACjD;AAAA,QACJ,KAAK;AACD,kBAAQ,GAAG,SAAS,UAAU,QAAQ,KAAK,QAAQ,IAAI;AACvD;AAAA,QACJ,KAAK;AACD,kBAAQ,GAAG,UAAU,UAAU,QAAQ,KAAK,QAAQ,IAAI;AACxD;AAAA,QACJ,KAAK;AACD,kBAAQ,GAAG,WAAW,UAAU,QAAQ,KAAK,QAAQ,IAAI;AACzD;AAAA,QACJ;AACI;AAAA,MAAA;AAER,cAAQ,KAAK,MAAA;AAAA,QACT,KAAK;AACD,uBAAa,OAAO,MAAM;AAC1B,mBAAS,CAAC,IAAI,KAAK,MAAO,MAAM,MAAO,MAAM,OAAO,CAAC,CAAC;AACtD,mBAAS,CAAC,IAAI,KAAK,MAAO,MAAM,MAAO,MAAM,OAAO,CAAC,CAAC;AACtD,mBAAS,CAAC,IAAI,KAAK,MAAO,MAAM,MAAO,MAAM,OAAO,CAAC,CAAC;AACtD;AAAA,QACJ,KAAK;AACD,oBAAU,OAAO,OAAO;AACxB,eAAK,QAAQ,CAAC;AACd,eAAK,QAAQ,CAAC;AACd,eAAK,QAAQ,CAAC;AACd,eAAK,QAAQ,CAAC;AACd;AAAA,QACJ,KAAK;AACD,uBAAa,OAAO,MAAM;AAC1B,gBAAM,CAAC,IAAI,KAAK,IAAI,KAAK,MAAO,OAAO,MAAO,OAAO,OAAO,CAAC,CAAC,CAAC;AAC/D,gBAAM,CAAC,IAAI,KAAK,IAAI,KAAK,MAAO,OAAO,MAAO,OAAO,OAAO,CAAC,CAAC,CAAC;AAC/D,gBAAM,CAAC,IAAI,KAAK,IAAI,KAAK,MAAO,OAAO,MAAO,OAAO,OAAO,CAAC,CAAC,CAAC;AAC/D;AAAA,QACJ,KAAK;AACD,qBAAW,OAAO,OAAO;AACzB,eAAK,CAAC,IAAI,KAAK,MAAO,MAAM,MAAO,MAAM,QAAQ,CAAC,CAAC,IAAI;AACvD,eAAK,CAAC,IAAI,KAAK,MAAO,MAAM,MAAO,MAAM,QAAQ,CAAC,CAAC,IAAI;AACvD,eAAK,CAAC,IAAI,KAAK,MAAO,MAAM,MAAO,MAAM,QAAQ,CAAC,CAAC,IAAI;AACvD,eAAK,CAAC,IAAI,QAAQ,CAAC,IAAI;AACvB;AAAA,QACJ,KAAK;AACD,mBAAS,CAAC,IAAI;AACd;AAAA,QACJ,KAAK;AACD,mBAAS,CAAC,IAAI;AACd;AAAA,QACJ,KAAK;AACD,mBAAS,CAAC,IAAI;AACd;AAAA,QACJ,KAAK;AACD,gBAAM,CAAC,IAAI,KAAK,IAAI,KAAK;AACzB;AAAA,QACJ,KAAK;AACD,gBAAM,CAAC,IAAI,KAAK,IAAI,KAAK;AACzB;AAAA,QACJ,KAAK;AACD,gBAAM,CAAC,IAAI,KAAK,IAAI,KAAK;AACzB;AAAA,QACJ,KAAK;AAAA,QACL,KAAK;AACD,eAAK,CAAC,IAAI;AACV;AAAA,QACJ,KAAK;AAAA,QACL,KAAK;AACD,eAAK,CAAC,IAAI;AACV;AAAA,QACJ,KAAK;AAAA,QACL,KAAK;AACD,eAAK,CAAC,IAAI;AACV;AAAA,QACJ,KAAK;AACD,eAAK,CAAC,KAAK,MAAM,QAAQ,SAAS;AAClC;AAAA,QACJ,KAAK;AACD,eAAK,CAAC,KAAK,MAAM,QAAQ,SAAS;AAClC;AAAA,QACJ,KAAK;AACD,eAAK,CAAC,KAAK,MAAM,QAAQ,SAAS;AAClC;AAAA,QACJ,KAAK;AACD,eAAK,CAAC,KAAK,MAAM,QAAQ,SAAS;AAClC;AAAA,QACJ,KAAK;AACD,eAAK,CAAC,IAAK,KAAK,IAAI,KAAK,IAAI,CAAC,KAAK,KAAM;AACzC;AAAA,QACJ,KAAK;AACD,eAAK;AACL;AAAA,QACJ,KAAK;AACD,eAAK;AACL;AAAA,QACJ,KAAK;AACD,eAAK;AACL;AAAA,QACJ,KAAK;AACD,eAAK;AACL;AAAA,QACJ;AACI,cAAI,SAAS,KAAK,KAAK,WAAW,SAAS,GAAG;AAC1C,kBAAM,QAAQ,SAAS,KAAK,KAAK,MAAM,CAAC,GAAG,EAAE;AAC7C,kBAAM,KAAK,IAAI,SAAS,QAAQ,QAAQ,KAAK;AAAA,UACjD;AACA;AAAA,MAAA;AAAA,IAEZ;AAKA,QAAI,SAAS,OAAO,QAAQ,SAAS,GAAG;AACpC,eAAS,IAAI,GAAG,IAAI,OAAO,oBAAoB,KAAK;AAChD,cAAM,IAAI,GAAG,SAAS,cAAc,IAAI,OAAO,qBAAqB,CAAC;AACrE,cAAM,CAAC,IAAI,UAAU,KAAK,IAAI,OAAO,KAAK,QAAQ,KAAK;AAAA,MAC3D;AAAA,IACJ;AAIA,QAAI,SAAS,QAAQ;AACjB,eAAS,IAAI,GAAG,IAAI,OAAO,KAAK;AAC5B,eAAO,IAAI,OAAO,qBAAqB,IAAI,IAAI,CAAC,IAAI,MAAM,CAAC;AAC3D,eAAO,IAAI,OAAO,qBAAqB,IAAI,IAAI,CAAC,IAAI,MAAM,IAAI,KAAK;AACnE,eAAO,IAAI,OAAO,qBAAqB,IAAI,IAAI,CAAC,IAAI,MAAM,IAAI,QAAQ,CAAC;AAAA,MAC3E;AAAA,IACJ;AAEA,UAAM,MAAM,KAAK,MAAM,IAAI,IAAI,IAAI,EAAE,KAAK;AAC1C,UAAM,MAAM,IAAI;AAChB,QAAI,CAAC,IAAI,KAAK,MAAM,QAAQ;AAC5B,QAAI,CAAC,IAAI,KAAK,MAAM,QAAQ;AAC5B,QAAI,CAAC,IAAI,KAAK,MAAM,QAAQ;AAC5B,QAAI,CAAC,IAAI,KAAK,MAAM,QAAQ;AAE5B,cAAU,SAAS,OAAO;AAAA,EAC9B;AAEA,MAAI,UAAU,OAAO,UAAU;AAC3B,WAAO,EAAE,MAAM,KAAK,IAAI,QAAQ,UAAU,OAAO,SAAA;AAAA,EACrD;AACA,SAAO,EAAE,MAAM,IAAA;AACnB;"}
@@ -1,17 +1,6 @@
1
- import { bE as _getStdExts, bn as appendMeshLightUboFields, M as MAX_LIGHTS, bo as meshLightIndexWGSL, bF as clearSceneBGLCache, a_ as createUniformBuffer, bG as _getStdExtsSorted, bH as _standardFeatureKey, bI as HAS_DIFFUSE_TEXTURE, bJ as NEEDS_UV, E as ESM_SHADOW_OUTPUT, t as targetSignatureKey, j as getSceneBindGroupLayout, bj as REVERSE_DEPTH_COMPARE, bK as DOUBLE_SIDED, bL as NO_COLOR_OUTPUT, a7 as HAS_OPACITY_TEXTURE, B as MATERIAL_ALPHA_BLEND, bM as DISABLE_LIGHTING, bN as DIFFUSE_USES_UV2, bO as NEEDS_UV2, bB as clearSamplerCache, bP as _computeStandardMaterialFeatures, p as packMat4IntoF32, a as writeMeshLightSelection, b4 as acquireTexture, b5 as releaseTexture, bQ as _standardShaderVariantKey } from "./index-B7Qhw0xL.js";
1
+ import { bF as appendMeshLightUboFields, M as MAX_LIGHTS, bG as meshLightIndexWGSL, bH as clearSceneBGLCache, a as F32, aw as createUniformBuffer, bI as _getStdExtsSorted, bJ as _standardFeatureKey, aF as MSH_RECEIVE_SHADOWS, bK as HAS_DIFFUSE_TEXTURE, aB as NEEDS_UV, Q as ESM_SHADOW_OUTPUT, y as targetSignatureKey, A as getSceneBindGroupLayout, bL as REVERSE_DEPTH_COMPARE, bM as DOUBLE_SIDED, aA as NO_COLOR_OUTPUT, an as HAS_OPACITY_TEXTURE, R as MATERIAL_ALPHA_BLEND, bN as DISABLE_LIGHTING, bO as DIFFUSE_USES_UV2, aD as NEEDS_UV2 } from "./index-C-tEgwbZ.js";
2
2
  import { a as WGSL_FOG } from "./wgsl-helpers-D8sl1VVA.js";
3
- import { e as composeShader, f as MSH_RECEIVE_SHADOWS, _ as _computeMeshFeatures, i as MSH_HAS_INSTANCE_COLOR, g as MSH_HAS_THIN_INSTANCES } from "./mesh-features-BAJpbMog.js";
4
- function collectStdBoundTextures(mat) {
5
- var _a;
6
- const t = [];
7
- if (mat.diffuseTexture) {
8
- t.push(mat.diffuseTexture);
9
- }
10
- for (const ext of _getStdExts().values()) {
11
- (_a = ext._textures) == null ? void 0 : _a.call(ext, mat, t);
12
- }
13
- return t;
14
- }
3
+ import { c as composeShader } from "./shader-composer-CZagsJDS.js";
15
4
  const STAGE_VERTEX = 1;
16
5
  const STAGE_FRAGMENT = 2;
17
6
  const LIGHTING_FN = `
@@ -316,7 +305,7 @@ function getOrCreateStandardPipeline(engine, sig, bindings) {
316
305
  }
317
306
  } : {},
318
307
  multisample: { count: sig._sampleCount },
319
- primitive: { topology: "triangle-list", cullMode: features & DOUBLE_SIDED ? "none" : "back", frontFace: sig._flipY ? "cw" : "ccw" }
308
+ primitive: { topology: "triangle-list", cullMode: features & DOUBLE_SIDED ? "none" : "back", frontFace: "ccw" }
320
309
  });
321
310
  bindings._pipelines.set(key, pipeline);
322
311
  return pipeline;
@@ -338,7 +327,7 @@ function createStandardMeshBindGroup(engine, bindings, meshUBO, materialUBO, mat
338
327
  entries.push({ binding: nextBinding++, resource: tex.texture.createView() }, { binding: nextBinding++, resource: tex.sampler });
339
328
  }
340
329
  if (needsUV) {
341
- const uvData = new Float32Array(4);
330
+ const uvData = new F32(4);
342
331
  const scaleX = material.uvScale[0];
343
332
  let scaleY = material.uvScale[1];
344
333
  let offsetY = 0;
@@ -391,192 +380,12 @@ function writeStdMaterialData(data, mat, textureLevel) {
391
380
  data[20] = mat.reflectionLevel;
392
381
  data[21] = mat.reflectionCoordMode;
393
382
  }
394
- const _stdMatScratch = new Float32Array(24);
395
- function buildStandardMeshRenderables(scene, meshes, factories) {
396
- const engine = scene.engine;
397
- const device = engine._device;
398
- const { tiSync, tiFragment, shadowFragment, cull } = factories;
399
- const shadowLights = [];
400
- for (let i = 0; i < scene.lights.length; i++) {
401
- const sg = scene.lights[i].shadowGenerator;
402
- if (sg) {
403
- shadowLights.push({ lightIndex: i, shadowType: sg._shadowType, gen: sg });
404
- }
405
- }
406
- const hasSomeShadows = shadowLights.length > 0;
407
- const shadowBGCache = /* @__PURE__ */ new Map();
408
- const rebuildSingle = (s, mesh, materialOverride) => {
409
- var _a, _b;
410
- const mat = materialOverride ?? mesh.material;
411
- const renderFeatures = mat._renderFeatures ?? (mat._renderFeatures = { features: _computeStandardMaterialFeatures(mat) });
412
- const isOverride = materialOverride != null;
413
- const features = renderFeatures.features;
414
- const shadowOutput = (features & (NO_COLOR_OUTPUT | ESM_SHADOW_OUTPUT)) !== 0;
415
- const receiveShadows = !shadowOutput && mesh.receiveShadows && hasSomeShadows;
416
- const meshFeatures = _computeMeshFeatures(mesh, receiveShadows);
417
- const frags = [];
418
- for (const ext of _getStdExts().values()) {
419
- if (features & ext._feature) {
420
- const f = ext._frag(features);
421
- if (f) {
422
- frags.push(f);
423
- }
424
- }
425
- }
426
- let shaderKey = "";
427
- if (meshFeatures & MSH_RECEIVE_SHADOWS && shadowFragment) {
428
- const slots = shadowLights.map((sl) => ({ lightIndex: sl.lightIndex, shadowType: sl.shadowType }));
429
- shaderKey = _standardShaderVariantKey(slots);
430
- frags.push(shadowFragment(slots));
431
- }
432
- if (meshFeatures & MSH_HAS_THIN_INSTANCES && tiFragment) {
433
- const hasColor = !!(meshFeatures & MSH_HAS_INSTANCE_COLOR);
434
- const tiFrag = tiFragment(hasColor);
435
- if (hasColor) {
436
- const { _fragmentSlots, ...rest } = tiFrag;
437
- frags.push({
438
- ...rest,
439
- _fragmentSlots: {
440
- BC: `color = vec4<f32>(color.rgb * input.vInstanceColor.rgb, color.a * input.vInstanceColor.a);`
441
- }
442
- });
443
- } else {
444
- frags.push(tiFrag);
445
- }
446
- }
447
- const esmShadowDepthCode = (features & ESM_SHADOW_OUTPUT) !== 0 ? mat._esmShadowDepthCode : "";
448
- const bindings = getOrCreateStandardBindings(engine, features, meshFeatures, frags, shaderKey, esmShadowDepthCode);
449
- const meshShadowGens = receiveShadows ? shadowLights.map((sl) => sl.gen) : [];
450
- const meshUboData = new Float32Array(bindings._composed._meshUboSpec._totalBytes / 4);
451
- const _packMeshWorld = ((_a = engine._makePackMeshWorld) == null ? void 0 : _a.call(engine, s)) ?? packMat4IntoF32;
452
- _packMeshWorld(meshUboData, mesh.worldMatrix, 0, 0);
453
- writeMeshLightSelection(mesh, s.lights, meshUboData);
454
- const meshUBO = createUniformBuffer(engine, meshUboData);
455
- const textureLevel = (features & NEEDS_UV) !== 0 ? 1 : 0;
456
- const matData = new Float32Array(24);
457
- writeStdMaterialData(matData, mat, textureLevel);
458
- const materialUBO = createUniformBuffer(engine, matData);
459
- const meshBindGroup = createStandardMeshBindGroup(engine, bindings, meshUBO, materialUBO, mat);
460
- let shadowBindGroup = null;
461
- if (meshShadowGens.length > 0 && bindings._shadowBGL) {
462
- let cached = shadowBGCache.get(bindings._shadowBGL);
463
- if (!cached) {
464
- const entries = [];
465
- let b = 0;
466
- for (const sg of meshShadowGens) {
467
- entries.push({ binding: b++, resource: sg._depthTexture.createView() });
468
- entries.push({ binding: b++, resource: sg._depthSampler });
469
- entries.push({ binding: b++, resource: { buffer: sg._shadowUBO } });
470
- }
471
- cached = device.createBindGroup({ layout: bindings._shadowBGL, entries });
472
- shadowBGCache.set(bindings._shadowBGL, cached);
473
- }
474
- shadowBindGroup = cached;
475
- }
476
- const needsUV = (features & NEEDS_UV) !== 0;
477
- const needsUV2 = (features & NEEDS_UV2) !== 0;
478
- const hasThinInstances = (meshFeatures & MSH_HAS_THIN_INSTANCES) !== 0;
479
- const hasInstanceColor = (meshFeatures & MSH_HAS_INSTANCE_COLOR) !== 0;
480
- const isTransparent = !shadowOutput && ((features & HAS_OPACITY_TEXTURE) !== 0 || mat.alpha < 1);
481
- const boundTextures = collectStdBoundTextures(mat);
482
- for (const t of boundTextures) {
483
- acquireTexture(t);
484
- }
485
- s._meshDisposables.set(mesh, [
486
- () => {
487
- for (const t of boundTextures) {
488
- releaseTexture(t);
489
- }
490
- }
491
- ]);
492
- let _lastWorldVersion = mesh.worldMatrixVersion;
493
- let _lastLightsCount = s.lights.length;
494
- const sortCenter = [mesh.worldMatrix[12], mesh.worldMatrix[13], mesh.worldMatrix[14]];
495
- const _baseUpdate = () => {
496
- const worldVersion = mesh.worldMatrixVersion;
497
- if (worldVersion !== _lastWorldVersion || s.lights.length !== _lastLightsCount) {
498
- sortCenter[0] = mesh.worldMatrix[12];
499
- sortCenter[1] = mesh.worldMatrix[13];
500
- sortCenter[2] = mesh.worldMatrix[14];
501
- _packMeshWorld(meshUboData, mesh.worldMatrix, 0, 0);
502
- writeMeshLightSelection(mesh, s.lights, meshUboData);
503
- device.queue.writeBuffer(meshUBO, 0, meshUboData);
504
- _lastWorldVersion = worldVersion;
505
- _lastLightsCount = s.lights.length;
506
- }
507
- const uboVersion = mat._uboVersion;
508
- if (uboVersion !== _lastUboVersion) {
509
- _lastUboVersion = uboVersion;
510
- _stdMatScratch.fill(0);
511
- writeStdMaterialData(_stdMatScratch, mat, textureLevel);
512
- device.queue.writeBuffer(materialUBO, 0, _stdMatScratch.buffer, 0, 96);
513
- }
514
- };
515
- const _invalidate = () => {
516
- _lastWorldVersion = -1;
517
- };
518
- const update = ((_b = engine._wrapRenderableForFO) == null ? void 0 : _b.call(engine, _baseUpdate, s, _invalidate)) ?? _baseUpdate;
519
- const draw = (pass, cullBinding) => {
520
- var _a2, _b2, _c, _d;
521
- if (!isOverride && mesh.material !== mat) {
522
- return 0;
523
- }
524
- const g = mesh._gpu;
525
- let slot = 0;
526
- const vb = g._vbLayout;
527
- pass.setVertexBuffer(slot++, g.positionBuffer, (_a2 = vb == null ? void 0 : vb._p) == null ? void 0 : _a2._offset);
528
- pass.setVertexBuffer(slot++, g.normalBuffer, (_b2 = vb == null ? void 0 : vb._n) == null ? void 0 : _b2._offset);
529
- if (needsUV) {
530
- pass.setVertexBuffer(slot++, g.uvBuffer, (_c = vb == null ? void 0 : vb._u) == null ? void 0 : _c._offset);
531
- }
532
- if (needsUV2 && g.uv2Buffer) {
533
- pass.setVertexBuffer(slot++, g.uv2Buffer, (_d = vb == null ? void 0 : vb._u2) == null ? void 0 : _d._offset);
534
- }
535
- const ti = hasThinInstances ? mesh.thinInstances : null;
536
- if (ti && tiSync) {
537
- slot = tiSync(engine, ti, pass, slot, hasInstanceColor, cullBinding == null ? void 0 : cullBinding.cullDrawBufs);
538
- }
539
- pass.setIndexBuffer(g.indexBuffer, g.indexFormat);
540
- pass.setBindGroup(1, meshBindGroup);
541
- if (receiveShadows && shadowBindGroup) {
542
- pass.setBindGroup(2, shadowBindGroup);
543
- }
544
- if (cullBinding) {
545
- cullBinding.draw(pass, g.indexCount, ti.count);
546
- } else if (ti && ti.count > 0) {
547
- pass.drawIndexed(g.indexCount, ti.count);
548
- } else {
549
- pass.drawIndexed(g.indexCount);
550
- }
551
- return 1;
552
- };
553
- const r = {
554
- order: mesh.renderOrder ?? (isTransparent ? 200 : 100),
555
- isTransparent,
556
- mesh,
557
- bind(eng, sig) {
558
- const pipeline = getOrCreateStandardPipeline(eng, sig, bindings);
559
- const cb = cull == null ? void 0 : cull.tryBind(r, s, mesh, engine, hasInstanceColor, isTransparent, update);
560
- return {
561
- renderable: r,
562
- pipeline,
563
- update: cb ? cb.update : update,
564
- draw: (pass) => draw(pass, cb)
565
- };
566
- }
567
- };
568
- r._worldCenter = sortCenter;
569
- let _lastUboVersion = mat._uboVersion;
570
- return r;
571
- };
572
- const renderables = meshes.map((m) => rebuildSingle(scene, m));
573
- scene._disposables.push(
574
- () => clearStandardPipelineCache(),
575
- () => clearSamplerCache(engine)
576
- );
577
- return { renderables, rebuildSingle };
578
- }
579
383
  export {
580
- buildStandardMeshRenderables
384
+ createStandardMeshBindGroup as a,
385
+ getOrCreateStandardPipeline as b,
386
+ clearStandardPipelineCache as c,
387
+ composeStandardShader as d,
388
+ getOrCreateStandardBindings as g,
389
+ writeStdMaterialData as w
581
390
  };
582
- //# sourceMappingURL=standard-renderable-D1bhoF0K.js.map
391
+ //# sourceMappingURL=standard-pipeline-BvFynkwL.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"standard-pipeline-BvFynkwL.js","sources":["../src/material/standard/standard-template.ts","../src/material/standard/standard-pipeline.ts"],"sourcesContent":["/**\n * Standard Base Template\n *\n * Provides the base Standard (Blinn-Phong) shader structure with slot markers.\n * Parameterized by feature configuration (textures, UV, shadow, reflection, fog).\n *\n * The Standard material uses 3 separate UBOs in group 1:\n * binding 0: mesh UBO (world matrix)\n * binding 1: material UBO (colors, levels)\n * Plus optional texture/sampler bindings at fixed slots.\n */\n\nimport type { ShaderTemplate, UboField, VertexAttribute, Varying, BindingDecl } from \"../../shader/fragment-types.js\";\nimport { WGSL_FOG } from \"../../shader/wgsl-helpers.js\";\nimport { MAX_LIGHTS } from \"../../light/types.js\";\nimport { appendMeshLightUboFields, meshLightIndexWGSL } from \"../../render/lights-ubo.js\";\n\nconst STAGE_VERTEX = 0x1;\nconst STAGE_FRAGMENT = 0x2;\n\n// ── Lighting function (always present unless disableLighting) ───\n\nconst LIGHTING_FN = `\nfn computeLighting(viewDir: vec3<f32>, N: vec3<f32>, L: LightEntry, g: f32, P: vec3<f32>) -> array<vec3<f32>, 2> {\nvar lv: vec3<f32>;\nvar a: f32 = 1.0;\nlet t = u32(L.vLightData.w);\nif (t == 3u) {\nlet nl = 0.5 + 0.5 * dot(N, normalize(L.vLightData.xyz));\nlet diff = mix(L.vLightDirection.xyz, L.vLightDiffuse.rgb, nl);\nlet h = normalize(viewDir + normalize(L.vLightData.xyz));\nvar s = pow(max(0.0, dot(N, h)), max(1.0, g));\nreturn array<vec3<f32>, 2>(diff, s * L.vLightSpecular.rgb);\n}\nif (t == 1u) {\nlv = normalize(-L.vLightData.xyz);\n} else {\nlet d = L.vLightData.xyz - P;\na = max(0.0, 1.0 - length(d) / L.vLightDiffuse.a);\nlv = normalize(d);\nif (t == 2u) {\nlet c = max(0.0, dot(L.vLightDirection.xyz, -lv));\nif (c >= L.vLightDirection.w) { a *= max(0.0, pow(c, L.vLightSpecular.a)); } else { a = 0.0; }\n}\n}\nlet nl = max(0.0, dot(N, lv));\nlet diff = nl * L.vLightDiffuse.rgb * a;\nlet h = normalize(viewDir + lv);\nvar s = max(0.0, dot(N, h));\ns = pow(s, max(1.0, g));\nreturn array<vec3<f32>, 2>(diff, s * L.vLightSpecular.rgb * a);\n}\n`;\n\nexport interface StandardTemplateConfig {\n /** @internal */\n readonly _diffuse?: boolean;\n /** @internal UV coordinate channels used */\n readonly _needsUV: boolean;\n /** @internal */\n readonly _needsUV2: boolean;\n /** @internal */\n readonly _diffuseUsesUV2?: boolean;\n /** @internal Disable lighting (unlit material) */\n readonly _disableLighting?: boolean;\n /** @internal Generate a fragment stage that runs discard/alpha-test logic and writes no color. */\n readonly _noColorOutput?: boolean;\n /** @internal Generate a fragment stage that runs discard/alpha-test logic and writes ESM shadow color. */\n readonly _esmShadowOutput?: boolean;\n}\n\n/**\n * Create a Standard material ShaderTemplate from configuration.\n * The template contains slot markers that the composer fills.\n */\nexport function createStandardTemplate(config: StandardTemplateConfig, esmShadowDepthCode = \"\"): ShaderTemplate {\n const { _diffuse, _needsUV, _needsUV2, _diffuseUsesUV2, _disableLighting, _noColorOutput, _esmShadowOutput } = config;\n\n // ── Base vertex attributes ──────────────────────────────────\n const _baseVertexAttributes: VertexAttribute[] = [\n { _name: \"position\", _type: \"vec3<f32>\", _gpuFormat: \"float32x3\", _arrayStride: 12 },\n { _name: \"normal\", _type: \"vec3<f32>\", _gpuFormat: \"float32x3\", _arrayStride: 12 },\n ];\n if (_needsUV) {\n _baseVertexAttributes.push({ _name: \"uv\", _type: \"vec2<f32>\", _gpuFormat: \"float32x2\", _arrayStride: 8 });\n }\n if (_needsUV2) {\n _baseVertexAttributes.push({ _name: \"uv2\", _type: \"vec2<f32>\", _gpuFormat: \"float32x2\", _arrayStride: 8 });\n }\n\n // ── Base varyings ───────────────────────────────────────────\n const _baseVaryings: Varying[] = [\n { _name: \"vp\", _type: \"vec3<f32>\" },\n { _name: \"vn\", _type: \"vec3<f32>\" },\n { _name: \"vf\", _type: \"vec3<f32>\" },\n ];\n if (_needsUV) {\n _baseVaryings.push({ _name: \"vu\", _type: \"vec2<f32>\" });\n }\n if (_needsUV2) {\n _baseVaryings.push({ _name: \"vv\", _type: \"vec2<f32>\" });\n }\n // shadow varyings (vPositionFromLight, vDepthMetric) are provided by std-shadow-fragment\n\n // ── Base UBO fields (mesh = world matrix + affected light indices) ──────────────\n const _baseMeshUboFields: UboField[] = [{ _name: \"world\", _type: \"mat4x4<f32>\" }];\n appendMeshLightUboFields(_baseMeshUboFields);\n\n // ── Base bindings (group 1, starting after mesh UBO at 0) ───\n // Order: material, diffuse*, shadow/UV*, emissive*, bump*, specular*, ambient*, lightmap*, opacity*, reflection*\n // The shadow/UV UBO is placed AFTER diffuse so its auto-assigned binding index\n // matches the conventional slot 5 when diffuse is present (bindings 3,4).\n const _baseBindings: BindingDecl[] = [{ _name: \"mat\", _type: { _kind: \"uniform-buffer\" }, _visibility: STAGE_FRAGMENT }];\n\n if (_diffuse) {\n _baseBindings.push(\n { _name: \"dT\", _type: { _kind: \"texture\", _textureType: \"texture_2d<f32>\" }, _visibility: STAGE_FRAGMENT },\n { _name: \"dS\", _type: { _kind: \"sampler\", _samplerType: \"sampler\" }, _visibility: STAGE_FRAGMENT }\n );\n }\n // UV params UBO — only when UVs are actually emitted.\n if (_needsUV) {\n _baseBindings.push({ _name: \"up\", _type: { _kind: \"uniform-buffer\" }, _visibility: STAGE_VERTEX });\n }\n if (_esmShadowOutput) {\n _baseBindings.push({ _name: \"shadowParams\", _type: { _kind: \"uniform-buffer\" }, _visibility: STAGE_FRAGMENT });\n }\n // bump bindings are provided by the normal-map fragment (not baseBindings)\n // emissive, specular, ambient, lightmap, opacity, reflection bindings\n // are provided by their respective fragments (not baseBindings)\n\n // Shadow map bindings (group 2) are provided by std-shadow-fragment\n\n // ── Vertex template ─────────────────────────────────────────\n\n const uvPassthrough = _needsUV ? `out.vu = uv * up.u.xy + up.u.zw;` : \"\";\n\n const uv2Passthrough = _needsUV2 ? `out.vv = uv2;` : \"\";\n\n // Vertex UBO struct definitions (must be before binding declarations)\n const vertexUboStructs = _needsUV ? `struct upUniforms { u: vec4<f32>, }` : \"\";\n\n const _vertexTemplate = `/*SU*/\n/*MU*/\n@group(1) @binding(0) var<uniform> mesh: MeshUniforms;\n${vertexUboStructs}\n/*VH*/\n/*VD*/\n/*VO*/\n@vertex fn main(\n/*VP*/\n) -> VertexOutput {\nvar out: VertexOutput;\n/*VR*/\nvar finalWorld = mesh.world;\n/*VW*/\nlet worldPos4 = finalWorld * vec4<f32>(position, 1.0);\nout.vp = worldPos4.xyz;\nlet normalWorld = mat3x3<f32>(finalWorld[0].xyz, finalWorld[1].xyz, finalWorld[2].xyz);\nout.vn = normalize(normalWorld * normal);\nout.clipPos = scene.viewProjection * worldPos4;\nout.vf = (scene.view * worldPos4).xyz;\n${uvPassthrough}\n${uv2Passthrough}\n/*VB*/\nreturn out;\n}`;\n\n // ── Fragment template ────────────────────────────────────────\n\n const lightsStructs = `\nstruct LightEntry { vLightData: vec4<f32>, vLightDiffuse: vec4<f32>, vLightSpecular: vec4<f32>, vLightDirection: vec4<f32> };\nstruct lightsUniforms { count: u32, _p0: u32, _p1: u32, _p2: u32, lights: array<LightEntry, ${MAX_LIGHTS}> };\n@group(0) @binding(1) var<uniform> lights: lightsUniforms;\n`;\n\n const materialStruct = `\nstruct matUniforms {\ndc: vec4<f32>,\nsc: vec4<f32>,\nec: vec3<f32>,\nbs: f32,\nac: vec3<f32>,\ntl: f32,\nambTexLvl: f32,\nlmLvl: f32,\nopLvl: f32,\naCut: f32,\nrLvl: f32,\nrCm: f32,\n_0: f32,\n_1: f32,\n};\n`;\n\n const helpers = _disableLighting ? WGSL_FOG : WGSL_FOG + LIGHTING_FN;\n // reflection, shadow, bump helpers are provided by their respective fragments\n\n // Main fragment body — mirrors old composeFragmentShader exactly\n const doubleSidedEntry = `@fragment fn main(input: FragmentInput)${_noColorOutput ? \"\" : \" -> @location(0) vec4<f32>\"} {`;\n\n // View direction\n const viewDirCode = !_disableLighting ? `let viewDirectionW = normalize(scene.vEyePosition.xyz - input.vp);` : \"\";\n\n // Normal computation — fragment can override via AC slot\n const normalCode = _disableLighting ? \"\" : `var normalW = normalize(input.vn);`;\n\n // Opacity — default from material alpha, fragment can modify via AT\n const opacityCode = `var alpha = mat.dc.a;`;\n\n // Base color + alpha test. Texture alpha used for discard only (not blended into output alpha),\n // matching BJS ALPHATEST without ALPHAFROMDIFFUSE.\n const baseColorCode = _diffuse\n ? `let _ds = textureSample(dT, dS, ${_diffuseUsesUV2 ? \"input.vv\" : \"input.vu\"});\nif (_ds.a < mat.aCut) { discard; }\nvar baseColor = _ds.rgb * mat.tl;`\n : `var baseColor = vec3<f32>(1.0, 1.0, 1.0);`;\n\n // Diffuse color + emissive + specular — defaults, fragments can override via AT\n const diffuseColorCode = `let diffuseColor = mat.dc.rgb;`;\n const emissiveCode = `var emissiveContrib = mat.ec;`;\n const specularColorCode = !_disableLighting ? `var specularColor = mat.sc.rgb;` : \"\";\n // Lighting block (only when lighting enabled)\n let lightingBlock: string;\n if (!_disableLighting) {\n // Shadow — default to 1.0, fragment overrides via AD slot\n // shadowFactors array is populated by std-shadow-fragment (one per light index)\n lightingBlock = `var glossiness = mat.sc.a;\nvar diffuseBase = vec3<f32>(0.0);\nvar specularBase = vec3<f32>(0.0);\nvar shadowFactors = array<f32, ${MAX_LIGHTS}>(${new Array(MAX_LIGHTS).fill(\"1.0\").join(\", \")});\nvar baseAmbientColor = vec3<f32>(1.0, 1.0, 1.0);\nvar reflectionColor = vec3<f32>(0.0);\nlet lc = min(mesh.lc, ${MAX_LIGHTS}u);\n/*AD*/\nfor (var li = 0u; li < lc; li++) {\nlet lightIndex = mli(li);\nlet r = computeLighting(viewDirectionW, normalW, lights.lights[lightIndex], glossiness, input.vp);\nlet sf = shadowFactors[lightIndex];\ndiffuseBase += r[0] * sf;\nspecularBase += r[1] * sf;\n}\nlet finalDiffuse = clamp(diffuseBase * diffuseColor + emissiveContrib + mat.ac, vec3<f32>(0.0), vec3<f32>(1.0)) * baseColor;\nlet finalSpecular = specularBase * specularColor;\nvar color = vec4<f32>(finalDiffuse * baseAmbientColor + finalSpecular + reflectionColor, alpha);`;\n } else {\n lightingBlock = `var color = vec4<f32>(clamp(emissiveContrib * diffuseColor, vec3<f32>(0.0), vec3<f32>(1.0)) * baseColor, alpha);`;\n }\n\n const _fragmentTemplate = `/*SU*/\n${lightsStructs}\n${materialStruct}\n${_esmShadowOutput ? \"struct shadowParamsUniforms { biasAndScale: vec4<f32>, depthValues: vec4<f32>, }\" : \"\"}\n/*MU*/\n@group(1) @binding(0) var<uniform> mesh: MeshUniforms;\n${!_disableLighting ? meshLightIndexWGSL(\"mesh\") : \"\"}\n${helpers}\n/*HF*/\n/*FB*/\n/*FI*/\n${doubleSidedEntry}\n/*SV*/\n${viewDirCode}\n${normalCode}\n/*AC*/\n${opacityCode}\n${baseColorCode}\n${diffuseColorCode}\n${emissiveCode}\n${specularColorCode}\n/*AT*/\n${_noColorOutput ? \"return;\" : _esmShadowOutput ? esmShadowDepthCode : \"\"}\n${lightingBlock}\n/*BC*/\ncolor = vec4<f32>(max(color.rgb, vec3<f32>(0.0)), color.a);\nif (scene.vFogInfos.x > 0.0) {\nlet fog = calcFogFactor(input.vf);\ncolor = vec4<f32>(mix(scene.vFogColor.rgb, color.rgb, fog), color.a);\n}\n/*BA*/\n${_noColorOutput ? \"\" : \"return color;\"}\n}`;\n\n return {\n _vertexTemplate,\n _fragmentTemplate,\n _baseMeshUboFields,\n _baseVertexAttributes,\n _baseVaryings,\n _baseBindings,\n };\n}\n","/** Dynamic StandardMaterial pipeline builder — creates and caches GPU render\n * pipelines based on per-material feature flags.\n *\n * Feature flags (bitmask):\n * HAS_DIFFUSE_TEXTURE — diffuse texture sampling + UV attribute\n * HAS_EMISSIVE_TEXTURE — emissive texture sampling + UV attribute\n * Derived flag (computed automatically):\n * NEEDS_UV = HAS_DIFFUSE_TEXTURE | HAS_EMISSIVE_TEXTURE\n *\n * Pipelines are cached per (features, format, msaaSamples) tuple.\n * Shared scene UBO layout is identical across all variants (176 bytes). */\n\nimport { F32 } from \"../../engine/typed-arrays.js\";\nimport type { EngineContext } from \"../../engine/engine.js\";\nimport type { RenderTargetSignature } from \"../../engine/render-target.js\";\nimport type { StandardMaterialProps } from \"./standard-material.js\";\nimport { _standardFeatureKey } from \"./standard-material.js\";\nimport { getSceneBindGroupLayout, clearSceneBGLCache } from \"../../render/scene-helpers.js\";\nimport { createStandardTemplate } from \"./standard-template.js\";\nimport { composeShader } from \"../../shader/shader-composer.js\";\nimport type { ComposedShader, ShaderFragment } from \"../../shader/fragment-types.js\";\nimport { createUniformBuffer } from \"../../resource/gpu-buffers.js\";\nimport { REVERSE_DEPTH_COMPARE, targetSignatureKey } from \"../../engine/render-target.js\";\nimport {\n DIFFUSE_USES_UV2,\n DISABLE_LIGHTING,\n DOUBLE_SIDED,\n HAS_DIFFUSE_TEXTURE,\n HAS_OPACITY_TEXTURE,\n MATERIAL_ALPHA_BLEND,\n NEEDS_UV,\n NEEDS_UV2,\n NO_COLOR_OUTPUT,\n ESM_SHADOW_OUTPUT,\n _getStdExtsSorted,\n} from \"./standard-flags.js\";\nimport { MSH_RECEIVE_SHADOWS } from \"../mesh-features.js\";\n\n// ─── Composer Path (Phase 1) ────────────────────────────────────────\n// Converts feature bitmask → StandardTemplateConfig → ComposedShader.\n// This produces identical WGSL to the old string-builder path but via\n// the generic composer, enabling fragment-based extensions in Phase 2.\n\n/** Compose Standard shader via the generic ShaderComposer.\n * @param fragments - Optional extra fragments (e.g. thin-instance). */\nexport function composeStandardShader(features: number, _meshFeatures = 0, fragments: ShaderFragment[] = [], esmShadowDepthCode = \"\"): ComposedShader {\n const has = (bit: number) => (features & bit) !== 0;\n const template = createStandardTemplate(\n {\n _diffuse: has(HAS_DIFFUSE_TEXTURE),\n _needsUV: has(NEEDS_UV),\n _needsUV2: has(NEEDS_UV2),\n _diffuseUsesUV2: has(DIFFUSE_USES_UV2),\n _disableLighting: has(DISABLE_LIGHTING),\n _noColorOutput: has(NO_COLOR_OUTPUT),\n _esmShadowOutput: has(ESM_SHADOW_OUTPUT),\n },\n esmShadowDepthCode\n );\n return composeShader(template, fragments);\n}\n\n// ─── Shader Bindings (sig-independent) ──────────────────────────────\n\n/** Cached per-(features, fragments) shader bindings: BGLs + composed shader +\n * per-sig pipeline cache. Created once at renderable build time, shared across\n * all sig-specific pipelines. */\nexport interface StandardShaderBindings {\n /** @internal */\n _features: number;\n /** @internal */\n _meshFeatures: number;\n /** @internal */\n _meshBGL: GPUBindGroupLayout;\n /** @internal */\n _shadowBGL: GPUBindGroupLayout | null;\n /** @internal */\n _composed: ComposedShader;\n /** @internal Per-sig pipeline cache. Key = `targetSignatureKey(sig)`. */\n _pipelines: Map<string, GPURenderPipeline>;\n}\n\n// ─── Caches ─────────────────────────────────────────────────────────\n\n/** Per-(features:fk) shader bindings cache (sig-independent). */\nconst _bindingsCache = new Map<string, StandardShaderBindings>();\nlet _composedCache: Map<string, ComposedShader> | null = null;\nlet _cachedDevice: GPUDevice | null = null;\n\nfunction getComposedCache(): Map<string, ComposedShader> {\n if (!_composedCache) {\n _composedCache = new Map();\n }\n return _composedCache;\n}\n\nfunction ensureDevice(engine: EngineContext): void {\n if (_cachedDevice !== engine._device) {\n _bindingsCache.clear();\n _composedCache?.clear();\n clearSceneBGLCache();\n _cachedDevice = engine._device;\n }\n}\n\n/** Clear the pipeline cache. Must be called when a GPU device is destroyed. */\nexport function clearStandardPipelineCache(): void {\n _bindingsCache.clear();\n _composedCache?.clear();\n clearSceneBGLCache();\n _cachedDevice = null;\n}\n\n/** Get-or-build the sig-independent shader bindings for a given feature/fragment set.\n * Used at renderable build time so per-mesh bind groups can be created BEFORE the\n * first bind() call (when sig is known). */\nexport function getOrCreateStandardBindings(\n engine: EngineContext,\n features: number,\n meshFeatures: number,\n fragments: ShaderFragment[] = [],\n shaderKey = \"\",\n esmShadowDepthCode = \"\"\n): StandardShaderBindings {\n ensureDevice(engine);\n const key = _standardFeatureKey(features, meshFeatures, shaderKey);\n const cached = _bindingsCache.get(key);\n if (cached) {\n return cached;\n }\n\n const cc = getComposedCache();\n let composed = cc.get(key);\n if (!composed) {\n composed = composeStandardShader(features, meshFeatures, fragments, esmShadowDepthCode);\n cc.set(key, composed);\n }\n\n const device = engine._device;\n const meshBGL = device.createBindGroupLayout(composed._meshBGLDescriptor);\n let shadowBGL: GPUBindGroupLayout | null = null;\n const hasShadow = (meshFeatures & MSH_RECEIVE_SHADOWS) !== 0;\n if (hasShadow && composed._shadowBGLDescriptor) {\n shadowBGL = device.createBindGroupLayout(composed._shadowBGLDescriptor);\n }\n\n const bindings: StandardShaderBindings = {\n _features: features,\n _meshFeatures: meshFeatures,\n _meshBGL: meshBGL,\n _shadowBGL: shadowBGL,\n _composed: composed,\n _pipelines: new Map(),\n };\n _bindingsCache.set(key, bindings);\n return bindings;\n}\n\n/** Get-or-build a sig-specific pipeline on top of a shader bindings. Called at bind() time. */\nexport function getOrCreateStandardPipeline(engine: EngineContext, sig: RenderTargetSignature, bindings: StandardShaderBindings): GPURenderPipeline {\n ensureDevice(engine);\n const key = targetSignatureKey(sig);\n const cached = bindings._pipelines.get(key);\n if (cached) {\n return cached;\n }\n\n const device = engine._device;\n const composed = bindings._composed;\n const features = bindings._features;\n const sceneBGL = getSceneBindGroupLayout(engine);\n const bgls: GPUBindGroupLayout[] = bindings._shadowBGL ? [sceneBGL, bindings._meshBGL, bindings._shadowBGL] : [sceneBGL, bindings._meshBGL];\n\n const vertModule = device.createShaderModule({ code: composed._vertexWGSL });\n const noColorOutput = (features & NO_COLOR_OUTPUT) !== 0;\n const esmShadowOutput = (features & ESM_SHADOW_OUTPUT) !== 0;\n const fragModule = !sig._colorFormat && !noColorOutput ? null : device.createShaderModule({ code: composed._fragmentWGSL });\n\n const needsBlend = !esmShadowOutput && ((features & HAS_OPACITY_TEXTURE) !== 0 || (features & MATERIAL_ALPHA_BLEND) !== 0);\n const colorTarget: GPUColorTargetState | null = noColorOutput\n ? null\n : needsBlend\n ? {\n format: sig._colorFormat!,\n blend: {\n color: { srcFactor: \"src-alpha\", dstFactor: \"one-minus-src-alpha\" },\n alpha: { srcFactor: \"one\", dstFactor: \"one-minus-src-alpha\" },\n },\n }\n : { format: sig._colorFormat! };\n\n const pipeline = device.createRenderPipeline({\n layout: device.createPipelineLayout({ bindGroupLayouts: bgls }),\n vertex: { module: vertModule, entryPoint: \"main\", buffers: composed._vertexBufferLayouts },\n ...(fragModule ? { fragment: { module: fragModule, entryPoint: \"main\", targets: colorTarget ? [colorTarget] : [] } } : {}),\n ...(sig._depthStencilFormat\n ? {\n depthStencil: {\n format: sig._depthStencilFormat,\n depthCompare: sig._depthCompare ?? REVERSE_DEPTH_COMPARE,\n depthWriteEnabled: noColorOutput || esmShadowOutput || !needsBlend,\n },\n }\n : {}),\n multisample: { count: sig._sampleCount },\n primitive: { topology: \"triangle-list\", cullMode: features & DOUBLE_SIDED ? \"none\" : \"back\", frontFace: \"ccw\" },\n });\n\n bindings._pipelines.set(key, pipeline);\n return pipeline;\n}\n\n// ─── Per-Mesh GPU Setup ─────────────────────────────────────────────\n\n/** Build the per-mesh material bind group (group 1). The mesh UBO\n * and material UBO are created/owned by the caller — this\n * function only assembles the bind group entries that match the composer's\n * binding layout.\n *\n * Mirrors `createPbrMeshBindGroup` in pbr-pipeline.ts. */\nexport function createStandardMeshBindGroup(\n engine: EngineContext,\n bindings: StandardShaderBindings,\n meshUBO: GPUBuffer,\n materialUBO: GPUBuffer,\n material: StandardMaterialProps\n): GPUBindGroup {\n const device = engine._device;\n const features = bindings._features;\n const needsUV = (features & NEEDS_UV) !== 0;\n const hasDiffuseTex = (features & HAS_DIFFUSE_TEXTURE) !== 0;\n const esmShadowOutput = (features & ESM_SHADOW_OUTPUT) !== 0;\n\n // Sequential numbering matches composer output.\n let nextBinding = 0;\n const entries: GPUBindGroupEntry[] = [\n { binding: nextBinding++, resource: { buffer: meshUBO } },\n { binding: nextBinding++, resource: { buffer: materialUBO } },\n ];\n\n if (hasDiffuseTex) {\n const tex = material.diffuseTexture!;\n entries.push({ binding: nextBinding++, resource: tex.texture.createView() }, { binding: nextBinding++, resource: tex.sampler });\n }\n\n // UV params UBO (only when UVs are actually emitted).\n if (needsUV) {\n const uvData = new F32(4);\n const scaleX = material.uvScale[0];\n let scaleY = material.uvScale[1];\n let offsetY = 0;\n // Flip V for y-down source data (e.g. basis/compressed textures).\n // uv * (sx, sy) + (ox, oy) with vFlip becomes uv.xy * (sx, -sy) + (ox, sy+oy).\n if (material.diffuseTexture?.invertY) {\n offsetY = scaleY;\n scaleY = -scaleY;\n }\n uvData[0] = scaleX;\n uvData[1] = scaleY;\n uvData[2] = 0;\n uvData[3] = offsetY;\n entries.push({ binding: nextBinding++, resource: { buffer: createUniformBuffer(engine, uvData) } });\n }\n\n if (esmShadowOutput) {\n entries.push({\n binding: nextBinding++,\n resource: { buffer: (material as StandardMaterialProps & { readonly _esmShadowParamsUBO: GPUBuffer })._esmShadowParamsUBO },\n });\n }\n\n // Fragment-contributed bindings — iterate ext registry in alphabetical id order\n // to match composer's fragment sort order.\n const sortedExts = _getStdExtsSorted();\n for (const ext of sortedExts) {\n if (features & ext._feature && ext._bind) {\n nextBinding = ext._bind(material, entries, nextBinding);\n }\n }\n\n return device.createBindGroup({ layout: bindings._meshBGL, entries });\n}\n\n// ─── Internal Helpers ───────────────────────────────────────────────\n\n/** Write standard material properties into a pre-allocated Float32Array (24 floats). */\nexport function writeStdMaterialData(data: Float32Array, mat: StandardMaterialProps, textureLevel: number): void {\n const { diffuseColor: dc, specularColor: sc, emissiveColor: ec, ambientColor: ac } = mat;\n data[0] = dc[0];\n data[1] = dc[1];\n data[2] = dc[2];\n data[3] = mat.alpha;\n data[4] = sc[0];\n data[5] = sc[1];\n data[6] = sc[2];\n data[7] = mat.specularPower;\n data[8] = ec[0];\n data[9] = ec[1];\n data[10] = ec[2];\n data[11] = 1.0 / mat.bumpLevel;\n data[12] = ac[0];\n data[13] = ac[1];\n data[14] = ac[2];\n data[15] = textureLevel;\n data[16] = mat.ambientTexLevel;\n data[17] = mat.lightmapLevel;\n data[18] = mat.opacityLevel;\n data[19] = mat.alphaCutOff;\n data[20] = mat.reflectionLevel;\n data[21] = mat.reflectionCoordMode;\n}\n"],"names":[],"mappings":";;;AAiBA,MAAM,eAAe;AACrB,MAAM,iBAAiB;AAIvB,MAAM,cAAc;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAqDb,SAAS,uBAAuB,QAAgC,qBAAqB,IAAoB;AAC5G,QAAM,EAAE,UAAU,UAAU,WAAW,iBAAiB,kBAAkB,gBAAgB,qBAAqB;AAG/G,QAAM,wBAA2C;AAAA,IAC7C,EAAE,OAAO,YAAY,OAAO,aAAa,YAAY,aAAa,cAAc,GAAA;AAAA,IAChF,EAAE,OAAO,UAAU,OAAO,aAAa,YAAY,aAAa,cAAc,GAAA;AAAA,EAAG;AAErF,MAAI,UAAU;AACV,0BAAsB,KAAK,EAAE,OAAO,MAAM,OAAO,aAAa,YAAY,aAAa,cAAc,EAAA,CAAG;AAAA,EAC5G;AACA,MAAI,WAAW;AACX,0BAAsB,KAAK,EAAE,OAAO,OAAO,OAAO,aAAa,YAAY,aAAa,cAAc,EAAA,CAAG;AAAA,EAC7G;AAGA,QAAM,gBAA2B;AAAA,IAC7B,EAAE,OAAO,MAAM,OAAO,YAAA;AAAA,IACtB,EAAE,OAAO,MAAM,OAAO,YAAA;AAAA,IACtB,EAAE,OAAO,MAAM,OAAO,YAAA;AAAA,EAAY;AAEtC,MAAI,UAAU;AACV,kBAAc,KAAK,EAAE,OAAO,MAAM,OAAO,aAAa;AAAA,EAC1D;AACA,MAAI,WAAW;AACX,kBAAc,KAAK,EAAE,OAAO,MAAM,OAAO,aAAa;AAAA,EAC1D;AAIA,QAAM,qBAAiC,CAAC,EAAE,OAAO,SAAS,OAAO,eAAe;AAChF,2BAAyB,kBAAkB;AAM3C,QAAM,gBAA+B,CAAC,EAAE,OAAO,OAAO,OAAO,EAAE,OAAO,iBAAA,GAAoB,aAAa,eAAA,CAAgB;AAEvH,MAAI,UAAU;AACV,kBAAc;AAAA,MACV,EAAE,OAAO,MAAM,OAAO,EAAE,OAAO,WAAW,cAAc,kBAAA,GAAqB,aAAa,eAAA;AAAA,MAC1F,EAAE,OAAO,MAAM,OAAO,EAAE,OAAO,WAAW,cAAc,aAAa,aAAa,eAAA;AAAA,IAAe;AAAA,EAEzG;AAEA,MAAI,UAAU;AACV,kBAAc,KAAK,EAAE,OAAO,MAAM,OAAO,EAAE,OAAO,iBAAA,GAAoB,aAAa,aAAA,CAAc;AAAA,EACrG;AACA,MAAI,kBAAkB;AAClB,kBAAc,KAAK,EAAE,OAAO,gBAAgB,OAAO,EAAE,OAAO,iBAAA,GAAoB,aAAa,eAAA,CAAgB;AAAA,EACjH;AASA,QAAM,gBAAgB,WAAW,qCAAqC;AAEtE,QAAM,iBAAiB,YAAY,kBAAkB;AAGrD,QAAM,mBAAmB,WAAW,wCAAwC;AAE5E,QAAM,kBAAkB;AAAA;AAAA;AAAA,EAG1B,gBAAgB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAiBhB,aAAa;AAAA,EACb,cAAc;AAAA;AAAA;AAAA;AAOZ,QAAM,gBAAgB;AAAA;AAAA,8FAEoE,UAAU;AAAA;AAAA;AAIpG,QAAM,iBAAiB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAmBvB,QAAM,UAAU,mBAAmB,WAAW,WAAW;AAIzD,QAAM,mBAAmB,0CAA0C,iBAAiB,KAAK,4BAA4B;AAGrH,QAAM,cAAc,CAAC,mBAAmB,uEAAuE;AAG/G,QAAM,aAAa,mBAAmB,KAAK;AAG3C,QAAM,cAAc;AAIpB,QAAM,gBAAgB,WAChB,mCAAmC,kBAAkB,aAAa,UAAU;AAAA;AAAA,qCAG5E;AAGN,QAAM,mBAAmB;AACzB,QAAM,eAAe;AACrB,QAAM,oBAAoB,CAAC,mBAAmB,oCAAoC;AAElF,MAAI;AACJ,MAAI,CAAC,kBAAkB;AAGnB,oBAAgB;AAAA;AAAA;AAAA,iCAGS,UAAU,KAAK,IAAI,MAAM,UAAU,EAAE,KAAK,KAAK,EAAE,KAAK,IAAI,CAAC;AAAA;AAAA;AAAA,wBAGpE,UAAU;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAY9B,OAAO;AACH,oBAAgB;AAAA,EACpB;AAEA,QAAM,oBAAoB;AAAA,EAC5B,aAAa;AAAA,EACb,cAAc;AAAA,EACd,mBAAmB,qFAAqF,EAAE;AAAA;AAAA;AAAA,EAG1G,CAAC,mBAAmB,mBAAmB,MAAM,IAAI,EAAE;AAAA,EACnD,OAAO;AAAA;AAAA;AAAA;AAAA,EAIP,gBAAgB;AAAA;AAAA,EAEhB,WAAW;AAAA,EACX,UAAU;AAAA;AAAA,EAEV,WAAW;AAAA,EACX,aAAa;AAAA,EACb,gBAAgB;AAAA,EAChB,YAAY;AAAA,EACZ,iBAAiB;AAAA;AAAA,EAEjB,iBAAiB,YAAY,mBAAmB,qBAAqB,EAAE;AAAA,EACvE,aAAa;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQb,iBAAiB,KAAK,eAAe;AAAA;AAGnC,SAAO;AAAA,IACH;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EAAA;AAER;ACtPO,SAAS,sBAAsB,UAAkB,gBAAgB,GAAG,YAA8B,CAAA,GAAI,qBAAqB,IAAoB;AAClJ,QAAM,MAAM,CAAC,SAAiB,WAAW,SAAS;AAClD,QAAM,WAAW;AAAA,IACb;AAAA,MACI,UAAU,IAAI,mBAAmB;AAAA,MACjC,UAAU,IAAI,QAAQ;AAAA,MACtB,WAAW,IAAI,SAAS;AAAA,MACxB,iBAAiB,IAAI,gBAAgB;AAAA,MACrC,kBAAkB,IAAI,gBAAgB;AAAA,MACtC,gBAAgB,IAAI,eAAe;AAAA,MACnC,kBAAkB,IAAI,iBAAiB;AAAA,IAAA;AAAA,IAE3C;AAAA,EAAA;AAEJ,SAAO,cAAc,UAAU,SAAS;AAC5C;AAyBA,MAAM,qCAAqB,IAAA;AAC3B,IAAI,iBAAqD;AACzD,IAAI,gBAAkC;AAEtC,SAAS,mBAAgD;AACrD,MAAI,CAAC,gBAAgB;AACjB,yCAAqB,IAAA;AAAA,EACzB;AACA,SAAO;AACX;AAEA,SAAS,aAAa,QAA6B;AAC/C,MAAI,kBAAkB,OAAO,SAAS;AAClC,mBAAe,MAAA;AACf,qDAAgB;AAChB,uBAAA;AACA,oBAAgB,OAAO;AAAA,EAC3B;AACJ;AAGO,SAAS,6BAAmC;AAC/C,iBAAe,MAAA;AACf,mDAAgB;AAChB,qBAAA;AACA,kBAAgB;AACpB;AAKO,SAAS,4BACZ,QACA,UACA,cACA,YAA8B,CAAA,GAC9B,YAAY,IACZ,qBAAqB,IACC;AACtB,eAAa,MAAM;AACnB,QAAM,MAAM,oBAAoB,UAAU,cAAc,SAAS;AACjE,QAAM,SAAS,eAAe,IAAI,GAAG;AACrC,MAAI,QAAQ;AACR,WAAO;AAAA,EACX;AAEA,QAAM,KAAK,iBAAA;AACX,MAAI,WAAW,GAAG,IAAI,GAAG;AACzB,MAAI,CAAC,UAAU;AACX,eAAW,sBAAsB,UAAU,cAAc,WAAW,kBAAkB;AACtF,OAAG,IAAI,KAAK,QAAQ;AAAA,EACxB;AAEA,QAAM,SAAS,OAAO;AACtB,QAAM,UAAU,OAAO,sBAAsB,SAAS,kBAAkB;AACxE,MAAI,YAAuC;AAC3C,QAAM,aAAa,eAAe,yBAAyB;AAC3D,MAAI,aAAa,SAAS,sBAAsB;AAC5C,gBAAY,OAAO,sBAAsB,SAAS,oBAAoB;AAAA,EAC1E;AAEA,QAAM,WAAmC;AAAA,IACrC,WAAW;AAAA,IACX,eAAe;AAAA,IACf,UAAU;AAAA,IACV,YAAY;AAAA,IACZ,WAAW;AAAA,IACX,gCAAgB,IAAA;AAAA,EAAI;AAExB,iBAAe,IAAI,KAAK,QAAQ;AAChC,SAAO;AACX;AAGO,SAAS,4BAA4B,QAAuB,KAA4B,UAAqD;AAChJ,eAAa,MAAM;AACnB,QAAM,MAAM,mBAAmB,GAAG;AAClC,QAAM,SAAS,SAAS,WAAW,IAAI,GAAG;AAC1C,MAAI,QAAQ;AACR,WAAO;AAAA,EACX;AAEA,QAAM,SAAS,OAAO;AACtB,QAAM,WAAW,SAAS;AAC1B,QAAM,WAAW,SAAS;AAC1B,QAAM,WAAW,wBAAwB,MAAM;AAC/C,QAAM,OAA6B,SAAS,aAAa,CAAC,UAAU,SAAS,UAAU,SAAS,UAAU,IAAI,CAAC,UAAU,SAAS,QAAQ;AAE1I,QAAM,aAAa,OAAO,mBAAmB,EAAE,MAAM,SAAS,aAAa;AAC3E,QAAM,iBAAiB,WAAW,qBAAqB;AACvD,QAAM,mBAAmB,WAAW,uBAAuB;AAC3D,QAAM,aAAa,CAAC,IAAI,gBAAgB,CAAC,gBAAgB,OAAO,OAAO,mBAAmB,EAAE,MAAM,SAAS,eAAe;AAE1H,QAAM,aAAa,CAAC,qBAAqB,WAAW,yBAAyB,MAAM,WAAW,0BAA0B;AACxH,QAAM,cAA0C,gBAC1C,OACA,aACE;AAAA,IACI,QAAQ,IAAI;AAAA,IACZ,OAAO;AAAA,MACH,OAAO,EAAE,WAAW,aAAa,WAAW,sBAAA;AAAA,MAC5C,OAAO,EAAE,WAAW,OAAO,WAAW,sBAAA;AAAA,IAAsB;AAAA,EAChE,IAEJ,EAAE,QAAQ,IAAI,aAAA;AAEtB,QAAM,WAAW,OAAO,qBAAqB;AAAA,IACzC,QAAQ,OAAO,qBAAqB,EAAE,kBAAkB,MAAM;AAAA,IAC9D,QAAQ,EAAE,QAAQ,YAAY,YAAY,QAAQ,SAAS,SAAS,qBAAA;AAAA,IACpE,GAAI,aAAa,EAAE,UAAU,EAAE,QAAQ,YAAY,YAAY,QAAQ,SAAS,cAAc,CAAC,WAAW,IAAI,CAAA,EAAC,EAAE,IAAM,CAAA;AAAA,IACvH,GAAI,IAAI,sBACF;AAAA,MACI,cAAc;AAAA,QACV,QAAQ,IAAI;AAAA,QACZ,cAAc,IAAI,iBAAiB;AAAA,QACnC,mBAAmB,iBAAiB,mBAAmB,CAAC;AAAA,MAAA;AAAA,IAC5D,IAEJ,CAAA;AAAA,IACN,aAAa,EAAE,OAAO,IAAI,aAAA;AAAA,IAC1B,WAAW,EAAE,UAAU,iBAAiB,UAAU,WAAW,eAAe,SAAS,QAAQ,WAAW,MAAA;AAAA,EAAM,CACjH;AAED,WAAS,WAAW,IAAI,KAAK,QAAQ;AACrC,SAAO;AACX;AAUO,SAAS,4BACZ,QACA,UACA,SACA,aACA,UACY;;AACZ,QAAM,SAAS,OAAO;AACtB,QAAM,WAAW,SAAS;AAC1B,QAAM,WAAW,WAAW,cAAc;AAC1C,QAAM,iBAAiB,WAAW,yBAAyB;AAC3D,QAAM,mBAAmB,WAAW,uBAAuB;AAG3D,MAAI,cAAc;AAClB,QAAM,UAA+B;AAAA,IACjC,EAAE,SAAS,eAAe,UAAU,EAAE,QAAQ,UAAQ;AAAA,IACtD,EAAE,SAAS,eAAe,UAAU,EAAE,QAAQ,cAAY;AAAA,EAAE;AAGhE,MAAI,eAAe;AACf,UAAM,MAAM,SAAS;AACrB,YAAQ,KAAK,EAAE,SAAS,eAAe,UAAU,IAAI,QAAQ,WAAA,EAAW,GAAK,EAAE,SAAS,eAAe,UAAU,IAAI,SAAS;AAAA,EAClI;AAGA,MAAI,SAAS;AACT,UAAM,SAAS,IAAI,IAAI,CAAC;AACxB,UAAM,SAAS,SAAS,QAAQ,CAAC;AACjC,QAAI,SAAS,SAAS,QAAQ,CAAC;AAC/B,QAAI,UAAU;AAGd,SAAI,cAAS,mBAAT,mBAAyB,SAAS;AAClC,gBAAU;AACV,eAAS,CAAC;AAAA,IACd;AACA,WAAO,CAAC,IAAI;AACZ,WAAO,CAAC,IAAI;AACZ,WAAO,CAAC,IAAI;AACZ,WAAO,CAAC,IAAI;AACZ,YAAQ,KAAK,EAAE,SAAS,eAAe,UAAU,EAAE,QAAQ,oBAAoB,QAAQ,MAAM,EAAA,EAAE,CAAG;AAAA,EACtG;AAEA,MAAI,iBAAiB;AACjB,YAAQ,KAAK;AAAA,MACT,SAAS;AAAA,MACT,UAAU,EAAE,QAAS,SAAiF,oBAAA;AAAA,IAAoB,CAC7H;AAAA,EACL;AAIA,QAAM,aAAa,kBAAA;AACnB,aAAW,OAAO,YAAY;AAC1B,QAAI,WAAW,IAAI,YAAY,IAAI,OAAO;AACtC,oBAAc,IAAI,MAAM,UAAU,SAAS,WAAW;AAAA,IAC1D;AAAA,EACJ;AAEA,SAAO,OAAO,gBAAgB,EAAE,QAAQ,SAAS,UAAU,SAAS;AACxE;AAKO,SAAS,qBAAqB,MAAoB,KAA4B,cAA4B;AAC7G,QAAM,EAAE,cAAc,IAAI,eAAe,IAAI,eAAe,IAAI,cAAc,GAAA,IAAO;AACrF,OAAK,CAAC,IAAI,GAAG,CAAC;AACd,OAAK,CAAC,IAAI,GAAG,CAAC;AACd,OAAK,CAAC,IAAI,GAAG,CAAC;AACd,OAAK,CAAC,IAAI,IAAI;AACd,OAAK,CAAC,IAAI,GAAG,CAAC;AACd,OAAK,CAAC,IAAI,GAAG,CAAC;AACd,OAAK,CAAC,IAAI,GAAG,CAAC;AACd,OAAK,CAAC,IAAI,IAAI;AACd,OAAK,CAAC,IAAI,GAAG,CAAC;AACd,OAAK,CAAC,IAAI,GAAG,CAAC;AACd,OAAK,EAAE,IAAI,GAAG,CAAC;AACf,OAAK,EAAE,IAAI,IAAM,IAAI;AACrB,OAAK,EAAE,IAAI,GAAG,CAAC;AACf,OAAK,EAAE,IAAI,GAAG,CAAC;AACf,OAAK,EAAE,IAAI,GAAG,CAAC;AACf,OAAK,EAAE,IAAI;AACX,OAAK,EAAE,IAAI,IAAI;AACf,OAAK,EAAE,IAAI,IAAI;AACf,OAAK,EAAE,IAAI,IAAI;AACf,OAAK,EAAE,IAAI,IAAI;AACf,OAAK,EAAE,IAAI,IAAI;AACf,OAAK,EAAE,IAAI,IAAI;AACnB;"}