@babylonjs/lite 0.1.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 (417) hide show
  1. package/_math-factory-C-QqW-Wi.js +55 -0
  2. package/_math-factory-C-QqW-Wi.js.map +1 -0
  3. package/add-block-CikX5gWy.js +6 -0
  4. package/add-block-CikX5gWy.js.map +1 -0
  5. package/alpha-test-fragment-CUiHCw7W.js +22 -0
  6. package/alpha-test-fragment-CUiHCw7W.js.map +1 -0
  7. package/ambient-occlusion-block-DForhWL3.js +77 -0
  8. package/ambient-occlusion-block-DForhWL3.js.map +1 -0
  9. package/anisotropy-block-D5fXH_OY.js +12 -0
  10. package/anisotropy-block-D5fXH_OY.js.map +1 -0
  11. package/anisotropy-fragment-HgasXS7l.js +89 -0
  12. package/anisotropy-fragment-HgasXS7l.js.map +1 -0
  13. package/arc-tan2-block-d8sWt_x0.js +12 -0
  14. package/arc-tan2-block-d8sWt_x0.js.map +1 -0
  15. package/assets/splat-sort-worker-Crg3CaCc.js.map +1 -0
  16. package/background-dds-skybox-yHTqabU3.js +221 -0
  17. package/background-dds-skybox-yHTqabU3.js.map +1 -0
  18. package/background-ground-DIw6D3qf.js +235 -0
  19. package/background-ground-DIw6D3qf.js.map +1 -0
  20. package/background-hdr-skybox-c4uuTmkP.js +179 -0
  21. package/background-hdr-skybox-c4uuTmkP.js.map +1 -0
  22. package/background-solid-skybox-DPGBpPbm.js +235 -0
  23. package/background-solid-skybox-DPGBpPbm.js.map +1 -0
  24. package/bake-local-matrix-Dfpd3b06.js +28 -0
  25. package/bake-local-matrix-Dfpd3b06.js.map +1 -0
  26. package/billboard-renderable-D8mlVGCd.js +242 -0
  27. package/billboard-renderable-D8mlVGCd.js.map +1 -0
  28. package/biplanar-block-DZnKuV81.js +115 -0
  29. package/biplanar-block-DZnKuV81.js.map +1 -0
  30. package/bones-block-D6IhqUVV.js +31 -0
  31. package/bones-block-D6IhqUVV.js.map +1 -0
  32. package/clamp-block-BdII67hT.js +21 -0
  33. package/clamp-block-BdII67hT.js.map +1 -0
  34. package/clearcoat-block-BGML4npi.js +12 -0
  35. package/clearcoat-block-BGML4npi.js.map +1 -0
  36. package/clearcoat-fragment-LCiG98Rf.js +256 -0
  37. package/clearcoat-fragment-LCiG98Rf.js.map +1 -0
  38. package/clip-planes-block-BPfFJrbf.js +26 -0
  39. package/clip-planes-block-BPfFJrbf.js.map +1 -0
  40. package/cloud-block-BeVrangc.js +90 -0
  41. package/cloud-block-BeVrangc.js.map +1 -0
  42. package/color-converter-block-CvwKiW4k.js +123 -0
  43. package/color-converter-block-CvwKiW4k.js.map +1 -0
  44. package/color-merger-CCu21ZII.js +57 -0
  45. package/color-merger-CCu21ZII.js.map +1 -0
  46. package/color-splitter-CGn1G4ow.js +33 -0
  47. package/color-splitter-CGn1G4ow.js.map +1 -0
  48. package/conditional-block-Cd2pbejI.js +51 -0
  49. package/conditional-block-Cd2pbejI.js.map +1 -0
  50. package/create-skeleton-C9JdIJnb.js +44 -0
  51. package/create-skeleton-C9JdIJnb.js.map +1 -0
  52. package/cross-block-DCrLwCpt.js +12 -0
  53. package/cross-block-DCrLwCpt.js.map +1 -0
  54. package/cubemap-skybox-material-DvXMVc4k.js +79 -0
  55. package/cubemap-skybox-material-DvXMVc4k.js.map +1 -0
  56. package/curve-block-BlJpXVYv.js +89 -0
  57. package/curve-block-BlJpXVYv.js.map +1 -0
  58. package/debug-block-D2pg4Yf6.js +14 -0
  59. package/debug-block-D2pg4Yf6.js.map +1 -0
  60. package/derivative-block-B8KjtaWs.js +20 -0
  61. package/derivative-block-B8KjtaWs.js.map +1 -0
  62. package/desaturate-block-C1RghNSB.js +15 -0
  63. package/desaturate-block-C1RghNSB.js.map +1 -0
  64. package/discard-block-B2jKjaEL.js +21 -0
  65. package/discard-block-B2jKjaEL.js.map +1 -0
  66. package/distance-block-3NkgFZ3f.js +16 -0
  67. package/distance-block-3NkgFZ3f.js.map +1 -0
  68. package/divide-block-ZyepIg_-.js +6 -0
  69. package/divide-block-ZyepIg_-.js.map +1 -0
  70. package/dot-block-VlfAC6cD.js +16 -0
  71. package/dot-block-VlfAC6cD.js.map +1 -0
  72. package/elbow-block-NEOiIxzO.js +10 -0
  73. package/elbow-block-NEOiIxzO.js.map +1 -0
  74. package/emissive-fragment-BnNvbBCw.js +39 -0
  75. package/emissive-fragment-BnNvbBCw.js.map +1 -0
  76. package/esm-shadow-view-DGKdF1NI.js +18 -0
  77. package/esm-shadow-view-DGKdF1NI.js.map +1 -0
  78. package/esm-shadow-view-DN9HIaM4.js +15 -0
  79. package/esm-shadow-view-DN9HIaM4.js.map +1 -0
  80. package/esm-shadow-view-Dk9NFtLq.js +15 -0
  81. package/esm-shadow-view-Dk9NFtLq.js.map +1 -0
  82. package/fog-block-DJ9hEolm.js +41 -0
  83. package/fog-block-DJ9hEolm.js.map +1 -0
  84. package/frag-coord-block-DzXfFgfV.js +25 -0
  85. package/frag-coord-block-DzXfFgfV.js.map +1 -0
  86. package/frag-depth-block-UQbeKP2D.js +34 -0
  87. package/frag-depth-block-UQbeKP2D.js.map +1 -0
  88. package/fragment-output-BOphkIeh.js +26 -0
  89. package/fragment-output-BOphkIeh.js.map +1 -0
  90. package/fresnel-block-DefHWeO-.js +20 -0
  91. package/fresnel-block-DefHWeO-.js.map +1 -0
  92. package/front-facing-0d6aiyrv.js +11 -0
  93. package/front-facing-0d6aiyrv.js.map +1 -0
  94. package/gaussian-splatting-pipeline-sh-DgJl7l56.js +500 -0
  95. package/gaussian-splatting-pipeline-sh-DgJl7l56.js.map +1 -0
  96. package/gltf-animation-D7uyTyO3.js +245 -0
  97. package/gltf-animation-D7uyTyO3.js.map +1 -0
  98. package/gltf-ext-anisotropy-CknJiJK8.js +22 -0
  99. package/gltf-ext-anisotropy-CknJiJK8.js.map +1 -0
  100. package/gltf-ext-basisu-CPg5kPrx.js +452 -0
  101. package/gltf-ext-basisu-CPg5kPrx.js.map +1 -0
  102. package/gltf-ext-clearcoat-CLH2SVph.js +31 -0
  103. package/gltf-ext-clearcoat-CLH2SVph.js.map +1 -0
  104. package/gltf-ext-dielectric-qHzlnvdl.js +105 -0
  105. package/gltf-ext-dielectric-qHzlnvdl.js.map +1 -0
  106. package/gltf-ext-emissive-strength-nzGZXZVK.js +19 -0
  107. package/gltf-ext-emissive-strength-nzGZXZVK.js.map +1 -0
  108. package/gltf-ext-iridescence-C6bq7jiM.js +26 -0
  109. package/gltf-ext-iridescence-C6bq7jiM.js.map +1 -0
  110. package/gltf-ext-node-visibility-MafA9ot2.js +25 -0
  111. package/gltf-ext-node-visibility-MafA9ot2.js.map +1 -0
  112. package/gltf-ext-orm-CT18G_vQ.js +33 -0
  113. package/gltf-ext-orm-CT18G_vQ.js.map +1 -0
  114. package/gltf-ext-quantization-CpZyLDIz.js +94 -0
  115. package/gltf-ext-quantization-CpZyLDIz.js.map +1 -0
  116. package/gltf-ext-sheen-BgIxUzyZ.js +25 -0
  117. package/gltf-ext-sheen-BgIxUzyZ.js.map +1 -0
  118. package/gltf-ext-spec-gloss-D0LJLBUM.js +24 -0
  119. package/gltf-ext-spec-gloss-D0LJLBUM.js.map +1 -0
  120. package/gltf-ext-unlit-D2ANui0V.js +16 -0
  121. package/gltf-ext-unlit-D2ANui0V.js.map +1 -0
  122. package/gltf-ext-uv-transform-CE_-T1Tr.js +38 -0
  123. package/gltf-ext-uv-transform-CE_-T1Tr.js.map +1 -0
  124. package/gltf-feature-animation-pointer-BjpwOOqo.js +88 -0
  125. package/gltf-feature-animation-pointer-BjpwOOqo.js.map +1 -0
  126. package/gltf-feature-animations-CCizegp8.js +15 -0
  127. package/gltf-feature-animations-CCizegp8.js.map +1 -0
  128. package/gltf-feature-draco-yGSMGTE3.js +124 -0
  129. package/gltf-feature-draco-yGSMGTE3.js.map +1 -0
  130. package/gltf-feature-gpu-instancing-2e_CFQnl.js +151 -0
  131. package/gltf-feature-gpu-instancing-2e_CFQnl.js.map +1 -0
  132. package/gltf-feature-lights-punctual-DDDg4j0U.js +71 -0
  133. package/gltf-feature-lights-punctual-DDDg4j0U.js.map +1 -0
  134. package/gltf-feature-meshopt-Des96YFI.js +84 -0
  135. package/gltf-feature-meshopt-Des96YFI.js.map +1 -0
  136. package/gltf-feature-morph-CKCw6tkX.js +29 -0
  137. package/gltf-feature-morph-CKCw6tkX.js.map +1 -0
  138. package/gltf-feature-skeleton-D8hWLqi2.js +36 -0
  139. package/gltf-feature-skeleton-D8hWLqi2.js.map +1 -0
  140. package/gltf-feature-variants-Ds6v9byg.js +17 -0
  141. package/gltf-feature-variants-Ds6v9byg.js.map +1 -0
  142. package/gltf-feature-xmp-BUfq_IVG.js +15 -0
  143. package/gltf-feature-xmp-BUfq_IVG.js.map +1 -0
  144. package/gltf-glb-parser-D6UZWFuC.js +27 -0
  145. package/gltf-glb-parser-D6UZWFuC.js.map +1 -0
  146. package/gltf-interleave-DGnUlz28.js +241 -0
  147. package/gltf-interleave-DGnUlz28.js.map +1 -0
  148. package/gltf-pbr-builder-ext-BFOxOCnQ.js +85 -0
  149. package/gltf-pbr-builder-ext-BFOxOCnQ.js.map +1 -0
  150. package/gltf-variants-DFbr8EES.js +88 -0
  151. package/gltf-variants-DFbr8EES.js.map +1 -0
  152. package/gradient-block-DL_60sDc.js +50 -0
  153. package/gradient-block-DL_60sDc.js.map +1 -0
  154. package/gs-picking-pipeline-DzfMASL9.js +280 -0
  155. package/gs-picking-pipeline-DzfMASL9.js.map +1 -0
  156. package/height-to-normal-block-DhPHkDFg.js +65 -0
  157. package/height-to-normal-block-DhPHkDFg.js.map +1 -0
  158. package/ibl-fragment-DqQVi8k0.js +91 -0
  159. package/ibl-fragment-DqQVi8k0.js.map +1 -0
  160. package/ibl-skybox-wgsl-DCah0kWV.js +13 -0
  161. package/ibl-skybox-wgsl-DCah0kWV.js.map +1 -0
  162. package/image-processing-block-DwrhhmuF.js +40 -0
  163. package/image-processing-block-DwrhhmuF.js.map +1 -0
  164. package/image-source-BuMJgd9-.js +17 -0
  165. package/image-source-BuMJgd9-.js.map +1 -0
  166. package/index-C8HOR2sB.js +19222 -0
  167. package/index-C8HOR2sB.js.map +1 -0
  168. package/index.d.ts +4611 -0
  169. package/index.js +309 -0
  170. package/index.js.map +1 -0
  171. package/input-block-DgAJBzN_.js +109 -0
  172. package/input-block-DgAJBzN_.js.map +1 -0
  173. package/instances-block-BaSSiz8m.js +12 -0
  174. package/instances-block-BaSSiz8m.js.map +1 -0
  175. package/iridescence-block-B0pRFoOU.js +67 -0
  176. package/iridescence-block-B0pRFoOU.js.map +1 -0
  177. package/iridescence-fragment-Gymp7or5.js +243 -0
  178. package/iridescence-fragment-Gymp7or5.js.map +1 -0
  179. package/length-block-ChOkeiHR.js +11 -0
  180. package/length-block-ChOkeiHR.js.map +1 -0
  181. package/lerp-block-DjI2SfmI.js +18 -0
  182. package/lerp-block-DjI2SfmI.js.map +1 -0
  183. package/light-block-B11ew7FA.js +123 -0
  184. package/light-block-B11ew7FA.js.map +1 -0
  185. package/light-information-VJbW0jbs.js +19 -0
  186. package/light-information-VJbW0jbs.js.map +1 -0
  187. package/loop-block-Bb23EOMb.js +71 -0
  188. package/loop-block-Bb23EOMb.js.map +1 -0
  189. package/manifold-AS8POaOr.js +3022 -0
  190. package/manifold-AS8POaOr.js.map +1 -0
  191. package/manifold-RCa7RkKz.js +5 -0
  192. package/manifold-RCa7RkKz.js.map +1 -0
  193. package/matrix-blocks-acWn_V6g.js +51 -0
  194. package/matrix-blocks-acWn_V6g.js.map +1 -0
  195. package/max-block-CjFgljZ7.js +6 -0
  196. package/max-block-CjFgljZ7.js.map +1 -0
  197. package/mesh-attribute-exists-block-BfK8UiSL.js +44 -0
  198. package/mesh-attribute-exists-block-BfK8UiSL.js.map +1 -0
  199. package/mesh-features-BLENkYVt.js +341 -0
  200. package/mesh-features-BLENkYVt.js.map +1 -0
  201. package/min-block-CHtBngNl.js +6 -0
  202. package/min-block-CHtBngNl.js.map +1 -0
  203. package/mod-block-Ceizv8Y7.js +6 -0
  204. package/mod-block-Ceizv8Y7.js.map +1 -0
  205. package/morph-fragment-DOVo70gP.js +59 -0
  206. package/morph-fragment-DOVo70gP.js.map +1 -0
  207. package/morph-targets-55z342ZB.js +35 -0
  208. package/morph-targets-55z342ZB.js.map +1 -0
  209. package/multilight-wgsl-BGyiIOp3.js +112 -0
  210. package/multilight-wgsl-BGyiIOp3.js.map +1 -0
  211. package/multiply-block-DaXLJ7Ud.js +6 -0
  212. package/multiply-block-DaXLJ7Ud.js.map +1 -0
  213. package/negate-block-9CSLc5pM.js +6 -0
  214. package/negate-block-9CSLc5pM.js.map +1 -0
  215. package/nlerp-block-BNK1adIb.js +21 -0
  216. package/nlerp-block-BNK1adIb.js.map +1 -0
  217. package/node-env-BPZXZzBf.js +39 -0
  218. package/node-env-BPZXZzBf.js.map +1 -0
  219. package/node-registry-DwgC4yth.js +190 -0
  220. package/node-registry-DwgC4yth.js.map +1 -0
  221. package/node-registry-extra-advanced-2DJVt67-.js +45 -0
  222. package/node-registry-extra-advanced-2DJVt67-.js.map +1 -0
  223. package/node-registry-extra-compat-Dhrw8fDQ.js +41 -0
  224. package/node-registry-extra-compat-Dhrw8fDQ.js.map +1 -0
  225. package/node-registry-extra-math-CsAHvIZo.js +49 -0
  226. package/node-registry-extra-math-CsAHvIZo.js.map +1 -0
  227. package/node-registry-extra-procedural-5pLQ3Bhz.js +45 -0
  228. package/node-registry-extra-procedural-5pLQ3Bhz.js.map +1 -0
  229. package/node-renderable-DlLIdBmd.js +269 -0
  230. package/node-renderable-DlLIdBmd.js.map +1 -0
  231. package/node-shadow-DKrcqmNg.js +122 -0
  232. package/node-shadow-DKrcqmNg.js.map +1 -0
  233. package/node-snippet-DUMm9qEO.js +22 -0
  234. package/node-snippet-DUMm9qEO.js.map +1 -0
  235. package/normal-blend-block-BfH_nBoj.js +29 -0
  236. package/normal-blend-block-BfH_nBoj.js.map +1 -0
  237. package/normal-map-fragment-DpsIXrJf.js +38 -0
  238. package/normal-map-fragment-DpsIXrJf.js.map +1 -0
  239. package/normalize-block-F2bLNj9K.js +6 -0
  240. package/normalize-block-F2bLNj9K.js.map +1 -0
  241. package/oneminus-block-BP9x4Dc3.js +6 -0
  242. package/oneminus-block-BP9x4Dc3.js.map +1 -0
  243. package/opposite-block-Cnqmm-lH.js +6 -0
  244. package/opposite-block-Cnqmm-lH.js.map +1 -0
  245. package/package.json +26 -0
  246. package/panner-block-BwMQq-6Y.js +13 -0
  247. package/panner-block-BwMQq-6Y.js.map +1 -0
  248. package/parse-camera-DM3oJJeT.js +23 -0
  249. package/parse-camera-DM3oJJeT.js.map +1 -0
  250. package/pbr-aces-wgsl-HpiQHGN_.js +13 -0
  251. package/pbr-aces-wgsl-HpiQHGN_.js.map +1 -0
  252. package/pbr-metallic-roughness-block-full-6vMm1Jk6.js +763 -0
  253. package/pbr-metallic-roughness-block-full-6vMm1Jk6.js.map +1 -0
  254. package/pbr-metallic-roughness-block-h_KAOZrW.js +104 -0
  255. package/pbr-metallic-roughness-block-h_KAOZrW.js.map +1 -0
  256. package/pbr-mr-helper-core-CIwm-T1G.js +237 -0
  257. package/pbr-mr-helper-core-CIwm-T1G.js.map +1 -0
  258. package/pbr-refraction-DGmMSa2v.js +17 -0
  259. package/pbr-refraction-DGmMSa2v.js.map +1 -0
  260. package/pbr-renderable-BJxUtPBb.js +961 -0
  261. package/pbr-renderable-BJxUtPBb.js.map +1 -0
  262. package/pbr-shadow-fragment-LO9SlbJj.js +14 -0
  263. package/pbr-shadow-fragment-LO9SlbJj.js.map +1 -0
  264. package/pbr-template-ext-8q7BcTDf.js +88 -0
  265. package/pbr-template-ext-8q7BcTDf.js.map +1 -0
  266. package/pbr-tracking-B3alzn91.js +31 -0
  267. package/pbr-tracking-B3alzn91.js.map +1 -0
  268. package/pbr-transmission-ext-BxW4CEGu.js +581 -0
  269. package/pbr-transmission-ext-BxW4CEGu.js.map +1 -0
  270. package/perturb-normal-0Q8EM9ig.js +39 -0
  271. package/perturb-normal-0Q8EM9ig.js.map +1 -0
  272. package/posterize-block-DfdKsbEf.js +28 -0
  273. package/posterize-block-DfdKsbEf.js.map +1 -0
  274. package/pow-block-DI5ICzhc.js +13 -0
  275. package/pow-block-DI5ICzhc.js.map +1 -0
  276. package/random-number-block-2OyRYljF.js +15 -0
  277. package/random-number-block-2OyRYljF.js.map +1 -0
  278. package/reciprocal-block-Ck3CW-j-.js +14 -0
  279. package/reciprocal-block-Ck3CW-j-.js.map +1 -0
  280. package/reflect-block-CizpzrX4.js +12 -0
  281. package/reflect-block-CizpzrX4.js.map +1 -0
  282. package/reflectance-fragment-BCrgPmrt.js +143 -0
  283. package/reflectance-fragment-BCrgPmrt.js.map +1 -0
  284. package/reflection-block-DqcwyYqr.js +12 -0
  285. package/reflection-block-DqcwyYqr.js.map +1 -0
  286. package/reflection-texture-base-block-1xmJ0HDj.js +10 -0
  287. package/reflection-texture-base-block-1xmJ0HDj.js.map +1 -0
  288. package/reflection-texture-block-C3QtzoV8.js +60 -0
  289. package/reflection-texture-block-C3QtzoV8.js.map +1 -0
  290. package/refract-block-HHiAk-7U.js +13 -0
  291. package/refract-block-HHiAk-7U.js.map +1 -0
  292. package/refraction-block-U8y6XiXs.js +11 -0
  293. package/refraction-block-U8y6XiXs.js.map +1 -0
  294. package/refraction-dispersion-wgsl-DdQCyyO1.js +16 -0
  295. package/refraction-dispersion-wgsl-DdQCyyO1.js.map +1 -0
  296. package/remap-block-DxK1W1vp.js +27 -0
  297. package/remap-block-DxK1W1vp.js.map +1 -0
  298. package/replace-color-block-1m--hiru.js +17 -0
  299. package/replace-color-block-1m--hiru.js.map +1 -0
  300. package/rgbd-decode-DCvzUYeI.js +110 -0
  301. package/rgbd-decode-DCvzUYeI.js.map +1 -0
  302. package/rotate2d-block-nEe1N2MJ.js +15 -0
  303. package/rotate2d-block-nEe1N2MJ.js.map +1 -0
  304. package/scale-block-C5Z8159G.js +13 -0
  305. package/scale-block-C5Z8159G.js.map +1 -0
  306. package/scene-material-swap-C2ykv55W.js +34 -0
  307. package/scene-material-swap-C2ykv55W.js.map +1 -0
  308. package/screen-size-block-BVNnOvE8.js +21 -0
  309. package/screen-size-block-BVNnOvE8.js.map +1 -0
  310. package/screen-space-block-CwaxdfSe.js +28 -0
  311. package/screen-space-block-CwaxdfSe.js.map +1 -0
  312. package/shader-renderable-D-6796KR.js +531 -0
  313. package/shader-renderable-D-6796KR.js.map +1 -0
  314. package/shadow-fragment-core-DHN2G6FI.js +110 -0
  315. package/shadow-fragment-core-DHN2G6FI.js.map +1 -0
  316. package/shadow-map-CQNQC-Fw.js +13 -0
  317. package/shadow-map-CQNQC-Fw.js.map +1 -0
  318. package/sheen-block-BugfJqK3.js +12 -0
  319. package/sheen-block-BugfJqK3.js.map +1 -0
  320. package/sheen-fragment-Dze2f7XJ.js +215 -0
  321. package/sheen-fragment-Dze2f7XJ.js.map +1 -0
  322. package/simplex-perlin-3d-block-CcMtofzV.js +58 -0
  323. package/simplex-perlin-3d-block-CcMtofzV.js.map +1 -0
  324. package/singlelight-directional-wgsl-CmUDZxwz.js +39 -0
  325. package/singlelight-directional-wgsl-CmUDZxwz.js.map +1 -0
  326. package/singlelight-hemispheric-wgsl-t-83IP_s.js +40 -0
  327. package/singlelight-hemispheric-wgsl-t-83IP_s.js.map +1 -0
  328. package/singlelight-point-wgsl-CLzULIYV.js +45 -0
  329. package/singlelight-point-wgsl-CLzULIYV.js.map +1 -0
  330. package/singlelight-spot-wgsl-DEEUrfVM.js +47 -0
  331. package/singlelight-spot-wgsl-DEEUrfVM.js.map +1 -0
  332. package/skeleton-fragment-B_XlFbtx.js +71 -0
  333. package/skeleton-fragment-B_XlFbtx.js.map +1 -0
  334. package/skybox-renderable-DDwzu-PT.js +92 -0
  335. package/skybox-renderable-DDwzu-PT.js.map +1 -0
  336. package/skybox.vertex-DJgi072W.js +5 -0
  337. package/skybox.vertex-DJgi072W.js.map +1 -0
  338. package/smoothstep-block-Di4t37x-.js +15 -0
  339. package/smoothstep-block-Di4t37x-.js.map +1 -0
  340. package/splat-ply-compressed-BahdBG1r.js +394 -0
  341. package/splat-ply-compressed-BahdBG1r.js.map +1 -0
  342. package/standard-renderable-GjxL9xSf.js +636 -0
  343. package/standard-renderable-GjxL9xSf.js.map +1 -0
  344. package/std-ambient-fragment-BoUsD06w.js +37 -0
  345. package/std-ambient-fragment-BoUsD06w.js.map +1 -0
  346. package/std-cube-reflection-fragment-ulqc3bsP.js +31 -0
  347. package/std-cube-reflection-fragment-ulqc3bsP.js.map +1 -0
  348. package/std-emissive-fragment-DNGj1HdQ.js +40 -0
  349. package/std-emissive-fragment-DNGj1HdQ.js.map +1 -0
  350. package/std-lightmap-fragment-Bqj89aIe.js +37 -0
  351. package/std-lightmap-fragment-Bqj89aIe.js.map +1 -0
  352. package/std-opacity-fragment-KuPh5N2Z.js +37 -0
  353. package/std-opacity-fragment-KuPh5N2Z.js.map +1 -0
  354. package/std-reflection-fragment-BA5Ghn_M.js +57 -0
  355. package/std-reflection-fragment-BA5Ghn_M.js.map +1 -0
  356. package/std-shadow-fragment-FNQfrJuC.js +8 -0
  357. package/std-shadow-fragment-FNQfrJuC.js.map +1 -0
  358. package/std-specular-fragment-CE-6scqd.js +37 -0
  359. package/std-specular-fragment-CE-6scqd.js.map +1 -0
  360. package/std-tracking-CNKZ-hJN.js +15 -0
  361. package/std-tracking-CNKZ-hJN.js.map +1 -0
  362. package/step-block-BkywzTYm.js +13 -0
  363. package/step-block-BkywzTYm.js.map +1 -0
  364. package/storage-read-block-BdzhJfln.js +25 -0
  365. package/storage-read-block-BdzhJfln.js.map +1 -0
  366. package/storage-write-block-DjLKZ0Ro.js +11 -0
  367. package/storage-write-block-DjLKZ0Ro.js.map +1 -0
  368. package/subsurface-block-CBhxT9ui.js +12 -0
  369. package/subsurface-block-CBhxT9ui.js.map +1 -0
  370. package/subsurface-fragment-liM3y2-P.js +158 -0
  371. package/subsurface-fragment-liM3y2-P.js.map +1 -0
  372. package/subtract-block-NPfKvzQP.js +6 -0
  373. package/subtract-block-NPfKvzQP.js.map +1 -0
  374. package/swapchain-overlay-DcCSFDp7.js +35 -0
  375. package/swapchain-overlay-DcCSFDp7.js.map +1 -0
  376. package/tbn-block-ByOI6Y43.js +43 -0
  377. package/tbn-block-ByOI6Y43.js.map +1 -0
  378. package/teleport-in-block-BMa17cqq.js +10 -0
  379. package/teleport-in-block-BMa17cqq.js.map +1 -0
  380. package/teleport-out-block-5AkB25H6.js +19 -0
  381. package/teleport-out-block-5AkB25H6.js.map +1 -0
  382. package/texture-block-rr21KIL_.js +70 -0
  383. package/texture-block-rr21KIL_.js.map +1 -0
  384. package/thin-instance-fragment-hsv-RyDs.js +69 -0
  385. package/thin-instance-fragment-hsv-RyDs.js.map +1 -0
  386. package/thin-instance-gpu-C9Gv_Z1w.js +62 -0
  387. package/thin-instance-gpu-C9Gv_Z1w.js.map +1 -0
  388. package/tracking-primitives-wgdBY85t.js +82 -0
  389. package/tracking-primitives-wgdBY85t.js.map +1 -0
  390. package/transform-block-DbRph9JI.js +32 -0
  391. package/transform-block-DbRph9JI.js.map +1 -0
  392. package/trigonometry-block-BYQcTHiD.js +36 -0
  393. package/trigonometry-block-BYQcTHiD.js.map +1 -0
  394. package/triplanar-block-BZHkD9hX.js +148 -0
  395. package/triplanar-block-BZHkD9hX.js.map +1 -0
  396. package/twirl-block-78WtdiBd.js +39 -0
  397. package/twirl-block-78WtdiBd.js.map +1 -0
  398. package/unlit-fragment-BIlhJpz6.js +43 -0
  399. package/unlit-fragment-BIlhJpz6.js.map +1 -0
  400. package/uv-transform-fragment-hYujGpZg.js +47 -0
  401. package/uv-transform-fragment-hYujGpZg.js.map +1 -0
  402. package/vector-merger-CrW-ONB0.js +43 -0
  403. package/vector-merger-CrW-ONB0.js.map +1 -0
  404. package/vector-splitter-BoJuHrAU.js +34 -0
  405. package/vector-splitter-BoJuHrAU.js.map +1 -0
  406. package/vertex-output-Cvft64y0.js +14 -0
  407. package/vertex-output-Cvft64y0.js.map +1 -0
  408. package/view-direction-CWVucfnT.js +12 -0
  409. package/view-direction-CWVucfnT.js.map +1 -0
  410. package/voronoi-noise-block-iNQxa_Ls.js +43 -0
  411. package/voronoi-noise-block-iNQxa_Ls.js.map +1 -0
  412. package/wave-block-CY_mk1ec.js +41 -0
  413. package/wave-block-CY_mk1ec.js.map +1 -0
  414. package/wgsl-helpers-DyzNzCeE.js +48 -0
  415. package/wgsl-helpers-DyzNzCeE.js.map +1 -0
  416. package/worley-noise-3d-block-CyR2-k4s.js +58 -0
  417. package/worley-noise-3d-block-CyR2-k4s.js.map +1 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"standard-renderable-GjxL9xSf.js","sources":["../src/material/standard/collect-std-bound-textures.ts","../src/material/standard/standard-material.ts","../src/material/standard/standard-template.ts","../src/material/standard/standard-pipeline.ts","../src/material/standard/standard-renderable.ts"],"sourcesContent":["import type { Texture2D } from \"../../texture/texture-2d.js\";\nimport { _getStdExts } from \"./standard-flags.js\";\nimport type { StandardMaterialProps } from \"./standard-material.js\";\n\n/** Collect all non-null textures referenced by a Standard material (for acquire/release). */\nexport function collectStdBoundTextures(mat: StandardMaterialProps): Texture2D[] {\n const t: Texture2D[] = [];\n if (mat.diffuseTexture) {\n t.push(mat.diffuseTexture);\n }\n for (const ext of _getStdExts().values()) {\n ext._textures?.(mat, t);\n }\n return t;\n}\n","/** StandardMaterial — Blinn-Phong material types and scene uniform helpers.\n *\n * Pipeline creation is handled by standard-pipeline.ts (dynamic permutation system).\n * This module owns the shared types and the scene UBO update function.\n *\n * Scene UBO uses the canonical SCENE_UBO layout (shared with PBR).\n */\n\nimport type { Texture2D } from \"../../texture/texture-2d.js\";\nimport type { Material } from \"../material.js\";\nimport {\n AMBIENT_USES_UV2,\n DIFFUSE_USES_UV2,\n DISABLE_LIGHTING,\n DOUBLE_SIDED,\n HAS_AMBIENT_TEXTURE,\n HAS_BUMP_TEXTURE,\n HAS_CUBE_REFLECTION,\n HAS_DEPTH_EMISSIVE_TEXTURE,\n HAS_DIFFUSE_TEXTURE,\n HAS_EMISSIVE_TEXTURE,\n HAS_LIGHTMAP_TEXTURE,\n HAS_OPACITY_TEXTURE,\n HAS_REFLECTION_TEXTURE,\n HAS_SPECULAR_TEXTURE,\n LIGHTMAP_USES_UV2,\n MATERIAL_ALPHA_BLEND,\n OPACITY_FROM_RGB,\n SPECULAR_USES_UV2,\n} from \"./standard-flags.js\";\n\n// ─── Shared Types ────────────────────────────────────────────────────\n\n/** StandardMaterial properties — plain data. */\nexport interface StandardMaterialProps extends Material {\n diffuseColor: [number, number, number];\n alpha: number;\n specularColor: [number, number, number];\n specularPower: number;\n emissiveColor: [number, number, number];\n ambientColor: [number, number, number];\n /** Optional diffuse texture. Null = solid color only. */\n diffuseTexture: Texture2D | null;\n /** Diffuse texture UV channel. 0=UV1, 1=UV2. Default 0. */\n diffuseCoordIndex: 0 | 1;\n /** Optional emissive texture. Null = solid emissive color only. */\n emissiveTexture: Texture2D | null;\n /** Optional bump/normal-map texture. Uses cotangent-frame (no tangent attribute needed). */\n bumpTexture: Texture2D | null;\n /** Bump perturbation strength. Default 1.0 (maps to 1/level in BJS). */\n bumpLevel: number;\n /** Optional specular texture. Replaces specularColor; alpha modulates glossiness. */\n specularTexture: Texture2D | null;\n /** Specular texture UV channel. 0=UV1, 1=UV2. Default 0. */\n specularCoordIndex: 0 | 1;\n /** Optional ambient/occlusion texture. Multiplies final diffuse contribution. */\n ambientTexture: Texture2D | null;\n /** Ambient texture intensity. Default 1.0. */\n ambientTexLevel: number;\n /** Ambient texture UV channel. 0=UV1, 1=UV2. Default 0. */\n ambientCoordIndex: 0 | 1;\n /** Optional lightmap texture. Added to final color (additive mode). */\n lightmapTexture: Texture2D | null;\n /** Lightmap intensity. Default 1.0. */\n lightmapLevel: number;\n /** Lightmap UV channel. 0=UV1, 1=UV2. Default 1 (BJS convention). */\n lightmapCoordIndex: 0 | 1;\n /** Optional opacity texture. Multiplies alpha (.a channel). */\n opacityTexture: Texture2D | null;\n /** Opacity texture intensity. Default 1.0. */\n opacityLevel: number;\n /** When true, derive opacity from RGB luminance instead of .a channel. Default false. */\n opacityFromRGB: boolean;\n /** Alpha test cutoff. Fragments with `alpha < alphaCutOff` are discarded. Default 0 (no alpha test). */\n alphaCutOff: number;\n /** Optional reflection texture (2D spherical map). Null = no reflection. */\n reflectionTexture: Texture2D | null;\n /** Optional cube reflection texture. Null = no cube reflection. */\n reflectionCubeTexture: { texture: GPUTexture; view: GPUTextureView; sampler: GPUSampler } | null;\n /** Reflection intensity. Default 1.0. */\n reflectionLevel: number;\n /** Reflection coordinate mode. 1=spherical, 2=planar. Default 1. */\n reflectionCoordMode: 1 | 2;\n /** UV tiling scale. Default [1, 1]. */\n uvScale: [number, number];\n /** Back-face culling. Default true (BJS convention). False = double-sided. */\n backFaceCulling: boolean;\n /** When true, skip all lighting and output emissive * diffuse * baseColor. Default false. */\n disableLighting: boolean;\n}\n\n/** @internal Compute Standard material-only feature bits. Mesh/pass bits are added by the renderable. */\nexport function _computeStandardMaterialFeatures(m: StandardMaterialProps): number {\n let f = 0;\n if (m.diffuseTexture) {\n f |= HAS_DIFFUSE_TEXTURE;\n if (m.diffuseCoordIndex === 1) {\n f |= DIFFUSE_USES_UV2;\n }\n }\n if (m.emissiveTexture) {\n f |= HAS_EMISSIVE_TEXTURE;\n if (m.emissiveTexture._sampleType === \"depth\") {\n f |= HAS_DEPTH_EMISSIVE_TEXTURE;\n }\n }\n if (m.bumpTexture) {\n f |= HAS_BUMP_TEXTURE;\n }\n if (m.specularTexture) {\n f |= HAS_SPECULAR_TEXTURE;\n if (m.specularCoordIndex === 1) {\n f |= SPECULAR_USES_UV2;\n }\n }\n if (m.ambientTexture) {\n f |= HAS_AMBIENT_TEXTURE;\n if (m.ambientCoordIndex === 1) {\n f |= AMBIENT_USES_UV2;\n }\n }\n if (m.lightmapTexture) {\n f |= HAS_LIGHTMAP_TEXTURE;\n if (m.lightmapCoordIndex === 1) {\n f |= LIGHTMAP_USES_UV2;\n }\n }\n if (m.opacityTexture) {\n f |= HAS_OPACITY_TEXTURE;\n if (m.opacityFromRGB) {\n f |= OPACITY_FROM_RGB;\n }\n }\n if (!m.backFaceCulling) {\n f |= DOUBLE_SIDED;\n }\n if (m.reflectionTexture) {\n f |= HAS_REFLECTION_TEXTURE;\n }\n if (m.reflectionCubeTexture) {\n f |= HAS_CUBE_REFLECTION;\n }\n if (m.disableLighting) {\n f |= DISABLE_LIGHTING;\n }\n if (m.alpha < 1) {\n f |= MATERIAL_ALPHA_BLEND;\n }\n return f;\n}\n\n/** @internal Key for Standard shader features, including mesh/pass features. */\nexport function _standardFeatureKey(features: number, meshFeatures: number, variant = \"\"): string {\n return variant ? `${features}:${meshFeatures}:${variant}` : `${features}:${meshFeatures}`;\n}\n\n/** @internal Key for Standard scene-driven shader variants not encoded in feature bits. */\nexport function _standardShaderVariantKey(shadowLights: readonly { readonly lightIndex: number; readonly shadowType: \"esm\" | \"pcf\" }[]): string {\n return shadowLights.length === 0 ? \"\" : shadowLights.map((sl) => `${sl.lightIndex}${sl.shadowType === \"pcf\" ? \"p\" : \"e\"}`).join(\",\");\n}\n\n/** Fog configuration — plain data. */\nexport interface FogConfig {\n mode: 0 | 1 | 2 | 3; // 0=off, 1=exp, 2=exp2, 3=linear\n density: number;\n start: number;\n end: number;\n color: [number, number, number];\n}\n\nexport { collectStdBoundTextures } from \"./collect-std-bound-textures.js\";\nexport { createStandardMaterial } from \"./create-standard-material.js\";\nexport { standardGroupBuilder } from \"./standard-group-builder.js\";\n","/**\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 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). */\nfunction 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: sig._flipY ? \"cw\" : \"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 Float32Array(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","/** Standard mesh renderable — builds Renderables from Mesh + StandardMaterial.\n *\n * `buildStandardMeshRenderables` does shared per-scene setup, then delegates\n * per-mesh work to `buildSingleStandardRenderable`. The same single-mesh\n * function is reused by the material-swap path. */\n\nimport type { EngineContext } from \"../../engine/engine.js\";\nimport type { SceneContext } from \"../../scene/scene.js\";\nimport type { Mesh } from \"../../mesh/mesh.js\";\nimport type { Renderable, MeshGroupBuildResult } from \"../../render/renderable.js\";\nimport { collectStdBoundTextures } from \"./collect-std-bound-textures.js\";\nimport type { StandardMaterialProps } from \"./standard-material.js\";\nimport { _computeStandardMaterialFeatures, _standardShaderVariantKey } from \"./standard-material.js\";\nimport { acquireTexture, releaseTexture, clearSamplerCache } from \"../../resource/gpu-pool.js\";\nimport { createUniformBuffer } from \"../../resource/gpu-buffers.js\";\nimport { getOrCreateStandardBindings, getOrCreateStandardPipeline, createStandardMeshBindGroup, clearStandardPipelineCache, writeStdMaterialData } from \"./standard-pipeline.js\";\nimport { ESM_SHADOW_OUTPUT, NO_COLOR_OUTPUT, NEEDS_UV, NEEDS_UV2, HAS_OPACITY_TEXTURE, _getStdExts } from \"./standard-flags.js\";\nimport type { ShaderFragment } from \"../../shader/fragment-types.js\";\nimport type { ShadowGenerator } from \"../../shadow/shadow-generator.js\";\nimport { writeMeshLightSelection } from \"../../render/lights-ubo.js\";\nimport type { Material, MaterialRenderFeatures } from \"../material.js\";\nimport { _computeMeshFeatures, MSH_HAS_INSTANCE_COLOR, MSH_HAS_THIN_INSTANCES, MSH_RECEIVE_SHADOWS } from \"../mesh-features.js\";\n\n/** Scratch buffer for material UBO writes (24 floats = 96 bytes). Reused across\n * every Standard renderable since binding updates are single-threaded per frame. */\nconst _stdMatScratch = new Float32Array(24);\n\n/** Thin instance GPU sync callback type — loaded dynamically only when needed. */\ntype ThinInstanceSync = (engine: EngineContext, ti: any, pass: GPURenderPassEncoder | GPURenderBundleEncoder, slot: number, hasColor: boolean) => number;\n\n/** Fragment factories passed from the async group builder. */\nexport interface StdFragmentFactories {\n tiSync?: ThinInstanceSync;\n tiFragment?: (hasColor: boolean) => ShaderFragment;\n shadowFragment?: (shadowLights: import(\"./fragments/std-shadow-fragment.js\").ShadowLightSlot[]) => ShaderFragment;\n}\n\n/** Build Renderable(s) + a SceneUniformUpdater for a set of standard meshes.\n * The `rebuildSingle` closure is reused later (via `_rebuildSingle` on the group\n * builder) for material swaps + per-pass material overrides. */\nexport function buildStandardMeshRenderables(scene: SceneContext, meshes: Mesh[], factories: StdFragmentFactories): MeshGroupBuildResult {\n const engine = scene.engine;\n const device = engine._device;\n const { tiSync, tiFragment, shadowFragment } = factories;\n\n // Collect per-light shadow info.\n const shadowLights: { lightIndex: number; shadowType: \"esm\" | \"pcf\"; gen: ShadowGenerator }[] = [];\n for (let i = 0; i < scene.lights.length; i++) {\n const sg = scene.lights[i]!.shadowGenerator;\n if (sg) {\n shadowLights.push({ lightIndex: i, shadowType: sg._shadowType, gen: sg });\n }\n }\n const hasSomeShadows = shadowLights.length > 0;\n\n // All receiving meshes in this build share the same shadow generators,\n // so keying the shadow BG by `bindings._shadowBGL` alone is correct.\n const shadowBGCache = new Map<GPUBindGroupLayout, GPUBindGroup>();\n // Closure used both for the initial per-mesh build below AND for later\n // material-swap / per-pass-override rebuilds (set on standardGroupBuilder._rebuildSingle).\n const rebuildSingle = (s: SceneContext, mesh: Mesh, materialOverride?: Material): Renderable => {\n const mat = (materialOverride ?? mesh.material) as StandardMaterialProps;\n const renderFeatures = (mat._renderFeatures ??= { features: _computeStandardMaterialFeatures(mat) }) as MaterialRenderFeatures;\n const isOverride = materialOverride != null;\n const features = renderFeatures.features;\n const shadowOutput = (features & (NO_COLOR_OUTPUT | ESM_SHADOW_OUTPUT)) !== 0;\n const receiveShadows = !shadowOutput && mesh.receiveShadows && hasSomeShadows;\n const meshFeatures = _computeMeshFeatures(mesh, receiveShadows);\n // Build per-feature fragment list (deduped via pipeline cache).\n const frags: ShaderFragment[] = [];\n for (const ext of _getStdExts().values()) {\n if (features & ext._feature) {\n const f = ext._frag(features);\n if (f) {\n frags.push(f);\n }\n }\n }\n let shaderKey = \"\";\n if (meshFeatures & MSH_RECEIVE_SHADOWS && shadowFragment) {\n const slots = shadowLights.map((sl) => ({ lightIndex: sl.lightIndex, shadowType: sl.shadowType }));\n shaderKey = _standardShaderVariantKey(slots);\n frags.push(shadowFragment(slots));\n }\n if (meshFeatures & MSH_HAS_THIN_INSTANCES && tiFragment) {\n const hasColor = !!(meshFeatures & MSH_HAS_INSTANCE_COLOR);\n const tiFrag = tiFragment(hasColor);\n if (hasColor) {\n // Standard applies instance color to final color (BC), not to baseColor (AT) like PBR.\n const { _fragmentSlots: _fragmentSlots, ...rest } = tiFrag;\n frags.push({\n ...rest,\n _fragmentSlots: {\n BC: `color = vec4<f32>(color.rgb * input.vInstanceColor.rgb, color.a * input.vInstanceColor.a);`,\n },\n });\n } else {\n frags.push(tiFrag);\n }\n }\n const esmShadowDepthCode = (features & ESM_SHADOW_OUTPUT) !== 0 ? (mat as StandardMaterialProps & { readonly _esmShadowDepthCode: string })._esmShadowDepthCode : \"\";\n const bindings = getOrCreateStandardBindings(engine, features, meshFeatures, frags, shaderKey, esmShadowDepthCode);\n\n const meshShadowGens = receiveShadows ? shadowLights.map((sl) => sl.gen) : [];\n\n const meshUboData = new Float32Array(bindings._composed._meshUboSpec._totalBytes / 4);\n meshUboData.set(mesh.worldMatrix, 0);\n writeMeshLightSelection(mesh, s.lights, meshUboData);\n const meshUBO = createUniformBuffer(engine, meshUboData);\n const textureLevel = (features & NEEDS_UV) !== 0 ? 1.0 : 0;\n const matData = new Float32Array(24);\n writeStdMaterialData(matData, mat, textureLevel);\n const materialUBO = createUniformBuffer(engine, matData);\n const meshBindGroup = createStandardMeshBindGroup(engine, bindings, meshUBO, materialUBO, mat);\n\n // Shadow bind group (group 2) — shared across receiving meshes via shadowBGCache.\n let shadowBindGroup: GPUBindGroup | null = null;\n if (meshShadowGens.length > 0 && bindings._shadowBGL) {\n let cached = shadowBGCache.get(bindings._shadowBGL);\n if (!cached) {\n const entries: GPUBindGroupEntry[] = [];\n let b = 0;\n for (const sg of meshShadowGens) {\n entries.push({ binding: b++, resource: sg._depthTexture.createView() });\n entries.push({ binding: b++, resource: sg._depthSampler });\n entries.push({ binding: b++, resource: { buffer: sg._shadowUBO } });\n }\n cached = device.createBindGroup({ layout: bindings._shadowBGL, entries });\n shadowBGCache.set(bindings._shadowBGL, cached);\n }\n shadowBindGroup = cached;\n }\n\n const needsUV = (features & NEEDS_UV) !== 0;\n const needsUV2 = (features & NEEDS_UV2) !== 0;\n const hasThinInstances = (meshFeatures & MSH_HAS_THIN_INSTANCES) !== 0;\n const hasInstanceColor = (meshFeatures & MSH_HAS_INSTANCE_COLOR) !== 0;\n const isTransparent = !shadowOutput && ((features & HAS_OPACITY_TEXTURE) !== 0 || mat.alpha < 1);\n\n const boundTextures = collectStdBoundTextures(mat);\n for (const t of boundTextures) {\n acquireTexture(t);\n }\n s._meshDisposables.set(mesh, [\n () => {\n for (const t of boundTextures) {\n releaseTexture(t);\n }\n },\n ]);\n\n let _lastWorldVersion = mesh.worldMatrixVersion;\n let _lastLightsCount = s.lights.length;\n const sortCenter = [mesh.worldMatrix[12]!, mesh.worldMatrix[13]!, mesh.worldMatrix[14]!] as [number, number, number];\n const update = (): void => {\n const worldVersion = mesh.worldMatrixVersion;\n if (worldVersion !== _lastWorldVersion || s.lights.length !== _lastLightsCount) {\n sortCenter[0] = mesh.worldMatrix[12]!;\n sortCenter[1] = mesh.worldMatrix[13]!;\n sortCenter[2] = mesh.worldMatrix[14]!;\n meshUboData.set(mesh.worldMatrix, 0);\n writeMeshLightSelection(mesh, s.lights, meshUboData);\n device.queue.writeBuffer(meshUBO, 0, meshUboData as Float32Array<ArrayBuffer>);\n _lastWorldVersion = worldVersion;\n _lastLightsCount = s.lights.length;\n }\n const uboVersion = mat._uboVersion;\n if (uboVersion !== _lastUboVersion) {\n _lastUboVersion = uboVersion;\n _stdMatScratch.fill(0);\n writeStdMaterialData(_stdMatScratch, mat, textureLevel);\n device.queue.writeBuffer(materialUBO, 0, _stdMatScratch.buffer, 0, 96);\n }\n };\n\n const draw = (pass: GPURenderPassEncoder | GPURenderBundleEncoder): number => {\n // For per-pass material overrides, skip the mesh.material === mat guard\n // because the override material is intentionally not the mesh's current one.\n if (!isOverride && mesh.material !== mat) {\n return 0;\n }\n const g = mesh._gpu;\n let slot = 0;\n const vb = g._vbLayout;\n pass.setVertexBuffer(slot++, g.positionBuffer, vb?._p?._offset);\n pass.setVertexBuffer(slot++, g.normalBuffer, vb?._n?._offset);\n if (needsUV) {\n pass.setVertexBuffer(slot++, g.uvBuffer, vb?._u?._offset);\n }\n if (needsUV2 && g.uv2Buffer) {\n pass.setVertexBuffer(slot++, g.uv2Buffer, vb?._u2?._offset);\n }\n\n const ti = hasThinInstances ? mesh.thinInstances : null;\n if (ti && tiSync) {\n slot = tiSync(engine, ti, pass, slot, hasInstanceColor);\n }\n\n pass.setIndexBuffer(g.indexBuffer, g.indexFormat);\n pass.setBindGroup(1, meshBindGroup);\n if (receiveShadows && shadowBindGroup) {\n pass.setBindGroup(2, shadowBindGroup);\n }\n if (ti && ti.count > 0) {\n pass.drawIndexed(g.indexCount, ti.count);\n } else {\n pass.drawIndexed(g.indexCount);\n }\n return 1;\n };\n\n const r: Renderable = {\n order: mesh.renderOrder ?? (isTransparent ? 200 : 100),\n isTransparent,\n mesh,\n bind(eng, sig) {\n return {\n renderable: r,\n pipeline: getOrCreateStandardPipeline(eng as EngineContext, sig, bindings),\n update,\n draw,\n };\n },\n };\n r._worldCenter = sortCenter;\n let _lastUboVersion = mat._uboVersion;\n return r;\n };\n\n const renderables = meshes.map((m) => rebuildSingle(scene, m));\n\n scene._disposables.push(\n () => clearStandardPipelineCache(),\n () => clearSamplerCache(engine)\n );\n\n return { renderables, rebuildSingle };\n}\n"],"names":[],"mappings":"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"}
@@ -0,0 +1,37 @@
1
+ import { ah as HAS_AMBIENT_TEXTURE, ai as AMBIENT_USES_UV2 } from "./index-C8HOR2sB.js";
2
+ const STAGE_FRAGMENT = 2;
3
+ function createStdAmbientFragment(usesUV2) {
4
+ const uv = usesUV2 ? "input.vv" : "input.vu";
5
+ return {
6
+ _id: "std-ambient",
7
+ _bindings: [
8
+ { _name: "aT", _type: { _kind: "texture", _textureType: "texture_2d<f32>" }, _visibility: STAGE_FRAGMENT },
9
+ { _name: "aS", _type: { _kind: "sampler", _samplerType: "sampler" }, _visibility: STAGE_FRAGMENT }
10
+ ],
11
+ _fragmentSlots: {
12
+ AD: `baseAmbientColor = textureSample(aT, aS, ${uv}).rgb * mat.ambTexLvl;`
13
+ }
14
+ };
15
+ }
16
+ const stdAmbientExt = {
17
+ _id: "std-ambient",
18
+ _phase: "mesh",
19
+ _feature: HAS_AMBIENT_TEXTURE,
20
+ _frag: (features) => createStdAmbientFragment((features & AMBIENT_USES_UV2) !== 0),
21
+ _bind(mat, entries, b) {
22
+ const tex = mat.ambientTexture;
23
+ entries.push({ binding: b++, resource: tex.texture.createView() });
24
+ entries.push({ binding: b++, resource: tex.sampler });
25
+ return b;
26
+ },
27
+ _textures(mat, out) {
28
+ if (mat.ambientTexture) {
29
+ out.push(mat.ambientTexture);
30
+ }
31
+ }
32
+ };
33
+ export {
34
+ createStdAmbientFragment,
35
+ stdAmbientExt
36
+ };
37
+ //# sourceMappingURL=std-ambient-fragment-BoUsD06w.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"std-ambient-fragment-BoUsD06w.js","sources":["../src/material/standard/fragments/std-ambient-fragment.ts"],"sourcesContent":["/** Standard Ambient Texture Fragment — multiplies final diffuse by ambient occlusion texture. */\nimport type { ShaderFragment } from \"../../../shader/fragment-types.js\";\nimport type { StandardMaterialProps } from \"../standard-material.js\";\nimport type { Texture2D } from \"../../../texture/texture-2d.js\";\nimport type { StdExt } from \"../standard-flags.js\";\nimport { HAS_AMBIENT_TEXTURE, AMBIENT_USES_UV2 } from \"../standard-flags.js\";\n\nconst STAGE_FRAGMENT = 0x2;\n\nexport function createStdAmbientFragment(usesUV2: boolean): ShaderFragment {\n const uv = usesUV2 ? \"input.vv\" : \"input.vu\";\n return {\n _id: \"std-ambient\",\n _bindings: [\n { _name: \"aT\", _type: { _kind: \"texture\", _textureType: \"texture_2d<f32>\" }, _visibility: STAGE_FRAGMENT },\n { _name: \"aS\", _type: { _kind: \"sampler\", _samplerType: \"sampler\" }, _visibility: STAGE_FRAGMENT },\n ],\n _fragmentSlots: {\n AD: `baseAmbientColor = textureSample(aT, aS, ${uv}).rgb * mat.ambTexLvl;`,\n },\n };\n}\n\nexport const stdAmbientExt: StdExt = {\n _id: \"std-ambient\",\n _phase: \"mesh\",\n _feature: HAS_AMBIENT_TEXTURE,\n _frag: (features) => createStdAmbientFragment((features & AMBIENT_USES_UV2) !== 0),\n _bind(mat, entries, b) {\n const tex = mat.ambientTexture!;\n entries.push({ binding: b++, resource: tex.texture.createView() });\n entries.push({ binding: b++, resource: tex.sampler });\n return b;\n },\n _textures(mat: StandardMaterialProps, out: Texture2D[]): void {\n if (mat.ambientTexture) {\n out.push(mat.ambientTexture);\n }\n },\n};\n"],"names":[],"mappings":";AAOA,MAAM,iBAAiB;AAEhB,SAAS,yBAAyB,SAAkC;AACvE,QAAM,KAAK,UAAU,aAAa;AAClC,SAAO;AAAA,IACH,KAAK;AAAA,IACL,WAAW;AAAA,MACP,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,IAErG,gBAAgB;AAAA,MACZ,IAAI,4CAA4C,EAAE;AAAA,IAAA;AAAA,EACtD;AAER;AAEO,MAAM,gBAAwB;AAAA,EACjC,KAAK;AAAA,EACL,QAAQ;AAAA,EACR,UAAU;AAAA,EACV,OAAO,CAAC,aAAa,0BAA0B,WAAW,sBAAsB,CAAC;AAAA,EACjF,MAAM,KAAK,SAAS,GAAG;AACnB,UAAM,MAAM,IAAI;AAChB,YAAQ,KAAK,EAAE,SAAS,KAAK,UAAU,IAAI,QAAQ,WAAA,GAAc;AACjE,YAAQ,KAAK,EAAE,SAAS,KAAK,UAAU,IAAI,SAAS;AACpD,WAAO;AAAA,EACX;AAAA,EACA,UAAU,KAA4B,KAAwB;AAC1D,QAAI,IAAI,gBAAgB;AACpB,UAAI,KAAK,IAAI,cAAc;AAAA,IAC/B;AAAA,EACJ;AACJ;"}
@@ -0,0 +1,31 @@
1
+ import { ao as HAS_CUBE_REFLECTION } from "./index-C8HOR2sB.js";
2
+ function createStdCubeReflectionFragment() {
3
+ return {
4
+ _id: "std-cube-reflection",
5
+ _bindings: [
6
+ { _name: "cRT", _type: { _kind: "texture", _textureType: "texture_cube<f32>" }, _visibility: 2 },
7
+ { _name: "cRS", _type: { _kind: "sampler", _samplerType: "sampler" }, _visibility: 2 }
8
+ ],
9
+ _fragmentSlots: {
10
+ AD: `{let v=normalize(input.vp-scene.vEyePosition.xyz);reflectionColor=textureSample(cRT,cRS,reflect(v,normalW)).rgb*mat.rLvl;}`
11
+ }
12
+ };
13
+ }
14
+ const stdCubeReflectionExt = {
15
+ _id: "std-cube-reflection",
16
+ _phase: "mesh",
17
+ _feature: HAS_CUBE_REFLECTION,
18
+ _frag: createStdCubeReflectionFragment,
19
+ _bind(mat, entries, b) {
20
+ const cube = mat.reflectionCubeTexture;
21
+ entries.push({ binding: b++, resource: cube.view });
22
+ entries.push({ binding: b++, resource: cube.sampler });
23
+ return b;
24
+ }
25
+ // Cube textures are tracked separately; no Texture2D[] contribution.
26
+ };
27
+ export {
28
+ createStdCubeReflectionFragment,
29
+ stdCubeReflectionExt
30
+ };
31
+ //# sourceMappingURL=std-cube-reflection-fragment-ulqc3bsP.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"std-cube-reflection-fragment-ulqc3bsP.js","sources":["../src/material/standard/fragments/std-cube-reflection-fragment.ts"],"sourcesContent":["/** Cube reflection fragment — dynamically imported for scenes with cube reflection textures. */\nimport type { ShaderFragment } from \"../../../shader/fragment-types.js\";\nimport type { StdExt } from \"../standard-flags.js\";\nimport { HAS_CUBE_REFLECTION } from \"../standard-flags.js\";\n\nexport function createStdCubeReflectionFragment(): ShaderFragment {\n return {\n _id: \"std-cube-reflection\",\n _bindings: [\n { _name: \"cRT\", _type: { _kind: \"texture\", _textureType: \"texture_cube<f32>\" }, _visibility: 0x2 },\n { _name: \"cRS\", _type: { _kind: \"sampler\", _samplerType: \"sampler\" }, _visibility: 0x2 },\n ],\n _fragmentSlots: {\n AD: `{let v=normalize(input.vp-scene.vEyePosition.xyz);reflectionColor=textureSample(cRT,cRS,reflect(v,normalW)).rgb*mat.rLvl;}`,\n },\n };\n}\n\nexport const stdCubeReflectionExt: StdExt = {\n _id: \"std-cube-reflection\",\n _phase: \"mesh\",\n _feature: HAS_CUBE_REFLECTION,\n _frag: createStdCubeReflectionFragment,\n _bind(mat, entries, b) {\n const cube = mat.reflectionCubeTexture!;\n entries.push({ binding: b++, resource: cube.view });\n entries.push({ binding: b++, resource: cube.sampler });\n return b;\n },\n // Cube textures are tracked separately; no Texture2D[] contribution.\n};\n"],"names":[],"mappings":";AAKO,SAAS,kCAAkD;AAC9D,SAAO;AAAA,IACH,KAAK;AAAA,IACL,WAAW;AAAA,MACP,EAAE,OAAO,OAAO,OAAO,EAAE,OAAO,WAAW,cAAc,oBAAA,GAAuB,aAAa,EAAA;AAAA,MAC7F,EAAE,OAAO,OAAO,OAAO,EAAE,OAAO,WAAW,cAAc,aAAa,aAAa,EAAA;AAAA,IAAI;AAAA,IAE3F,gBAAgB;AAAA,MACZ,IAAI;AAAA,IAAA;AAAA,EACR;AAER;AAEO,MAAM,uBAA+B;AAAA,EACxC,KAAK;AAAA,EACL,QAAQ;AAAA,EACR,UAAU;AAAA,EACV,OAAO;AAAA,EACP,MAAM,KAAK,SAAS,GAAG;AACnB,UAAM,OAAO,IAAI;AACjB,YAAQ,KAAK,EAAE,SAAS,KAAK,UAAU,KAAK,MAAM;AAClD,YAAQ,KAAK,EAAE,SAAS,KAAK,UAAU,KAAK,SAAS;AACrD,WAAO;AAAA,EACX;AAAA;AAEJ;"}
@@ -0,0 +1,40 @@
1
+ import { ad as HAS_EMISSIVE_TEXTURE, ae as HAS_DEPTH_EMISSIVE_TEXTURE } from "./index-C8HOR2sB.js";
2
+ const STAGE_FRAGMENT = 2;
3
+ function createStdEmissiveFragment(depthTexture) {
4
+ return {
5
+ _id: "std-emissive",
6
+ _bindings: [
7
+ {
8
+ _name: "eT",
9
+ _type: { _kind: "texture", _textureType: "texture_2d<f32>", _sampleType: depthTexture ? "unfilterable-float" : void 0 },
10
+ _visibility: STAGE_FRAGMENT
11
+ },
12
+ { _name: "eS", _type: { _kind: "sampler", _samplerType: depthTexture ? "sampler_non_filtering" : "sampler" }, _visibility: STAGE_FRAGMENT }
13
+ ],
14
+ _fragmentSlots: {
15
+ AT: `emissiveContrib = mat.ec + textureSample(eT, eS, input.vu).rgb * mat.tl;`
16
+ }
17
+ };
18
+ }
19
+ const stdEmissiveExt = {
20
+ _id: "std-emissive",
21
+ _phase: "mesh",
22
+ _feature: HAS_EMISSIVE_TEXTURE,
23
+ _frag: (features) => createStdEmissiveFragment((features & HAS_DEPTH_EMISSIVE_TEXTURE) !== 0),
24
+ _bind(mat, entries, b) {
25
+ const tex = mat.emissiveTexture;
26
+ entries.push({ binding: b++, resource: tex.view });
27
+ entries.push({ binding: b++, resource: tex.sampler });
28
+ return b;
29
+ },
30
+ _textures(mat, out) {
31
+ if (mat.emissiveTexture) {
32
+ out.push(mat.emissiveTexture);
33
+ }
34
+ }
35
+ };
36
+ export {
37
+ createStdEmissiveFragment,
38
+ stdEmissiveExt
39
+ };
40
+ //# sourceMappingURL=std-emissive-fragment-DNGj1HdQ.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"std-emissive-fragment-DNGj1HdQ.js","sources":["../src/material/standard/fragments/std-emissive-fragment.ts"],"sourcesContent":["/** Standard Emissive Texture Fragment — multiplies emissive contribution by texture sample. */\nimport type { ShaderFragment } from \"../../../shader/fragment-types.js\";\nimport type { StandardMaterialProps } from \"../standard-material.js\";\nimport type { Texture2D } from \"../../../texture/texture-2d.js\";\nimport type { StdExt } from \"../standard-flags.js\";\nimport { HAS_DEPTH_EMISSIVE_TEXTURE, HAS_EMISSIVE_TEXTURE } from \"../standard-flags.js\";\n\nconst STAGE_FRAGMENT = 0x2;\n\nexport function createStdEmissiveFragment(depthTexture: boolean): ShaderFragment {\n return {\n _id: \"std-emissive\",\n _bindings: [\n {\n _name: \"eT\",\n _type: { _kind: \"texture\", _textureType: \"texture_2d<f32>\", _sampleType: depthTexture ? \"unfilterable-float\" : undefined },\n _visibility: STAGE_FRAGMENT,\n },\n { _name: \"eS\", _type: { _kind: \"sampler\", _samplerType: depthTexture ? \"sampler_non_filtering\" : \"sampler\" }, _visibility: STAGE_FRAGMENT },\n ],\n _fragmentSlots: {\n AT: `emissiveContrib = mat.ec + textureSample(eT, eS, input.vu).rgb * mat.tl;`,\n },\n };\n}\n\nexport const stdEmissiveExt: StdExt = {\n _id: \"std-emissive\",\n _phase: \"mesh\",\n _feature: HAS_EMISSIVE_TEXTURE,\n _frag: (features) => createStdEmissiveFragment((features & HAS_DEPTH_EMISSIVE_TEXTURE) !== 0),\n _bind(mat: StandardMaterialProps, entries: GPUBindGroupEntry[], b: number): number {\n const tex = mat.emissiveTexture!;\n entries.push({ binding: b++, resource: tex.view });\n entries.push({ binding: b++, resource: tex.sampler });\n return b;\n },\n _textures(mat: StandardMaterialProps, out: Texture2D[]): void {\n if (mat.emissiveTexture) {\n out.push(mat.emissiveTexture);\n }\n },\n};\n"],"names":[],"mappings":";AAOA,MAAM,iBAAiB;AAEhB,SAAS,0BAA0B,cAAuC;AAC7E,SAAO;AAAA,IACH,KAAK;AAAA,IACL,WAAW;AAAA,MACP;AAAA,QACI,OAAO;AAAA,QACP,OAAO,EAAE,OAAO,WAAW,cAAc,mBAAmB,aAAa,eAAe,uBAAuB,OAAA;AAAA,QAC/G,aAAa;AAAA,MAAA;AAAA,MAEjB,EAAE,OAAO,MAAM,OAAO,EAAE,OAAO,WAAW,cAAc,eAAe,0BAA0B,UAAA,GAAa,aAAa,eAAA;AAAA,IAAe;AAAA,IAE9I,gBAAgB;AAAA,MACZ,IAAI;AAAA,IAAA;AAAA,EACR;AAER;AAEO,MAAM,iBAAyB;AAAA,EAClC,KAAK;AAAA,EACL,QAAQ;AAAA,EACR,UAAU;AAAA,EACV,OAAO,CAAC,aAAa,2BAA2B,WAAW,gCAAgC,CAAC;AAAA,EAC5F,MAAM,KAA4B,SAA8B,GAAmB;AAC/E,UAAM,MAAM,IAAI;AAChB,YAAQ,KAAK,EAAE,SAAS,KAAK,UAAU,IAAI,MAAM;AACjD,YAAQ,KAAK,EAAE,SAAS,KAAK,UAAU,IAAI,SAAS;AACpD,WAAO;AAAA,EACX;AAAA,EACA,UAAU,KAA4B,KAAwB;AAC1D,QAAI,IAAI,iBAAiB;AACrB,UAAI,KAAK,IAAI,eAAe;AAAA,IAChC;AAAA,EACJ;AACJ;"}
@@ -0,0 +1,37 @@
1
+ import { aj as HAS_LIGHTMAP_TEXTURE, ak as LIGHTMAP_USES_UV2 } from "./index-C8HOR2sB.js";
2
+ const STAGE_FRAGMENT = 2;
3
+ function createStdLightmapFragment(usesUV2) {
4
+ const uv = usesUV2 ? "input.vv" : "input.vu";
5
+ return {
6
+ _id: "std-lightmap",
7
+ _bindings: [
8
+ { _name: "lT", _type: { _kind: "texture", _textureType: "texture_2d<f32>" }, _visibility: STAGE_FRAGMENT },
9
+ { _name: "lS", _type: { _kind: "sampler", _samplerType: "sampler" }, _visibility: STAGE_FRAGMENT }
10
+ ],
11
+ _fragmentSlots: {
12
+ BC: `color = vec4<f32>(color.rgb + textureSample(lT, lS, ${uv}).rgb * mat.lmLvl, color.a);`
13
+ }
14
+ };
15
+ }
16
+ const stdLightmapExt = {
17
+ _id: "std-lightmap",
18
+ _phase: "mesh",
19
+ _feature: HAS_LIGHTMAP_TEXTURE,
20
+ _frag: (features) => createStdLightmapFragment((features & LIGHTMAP_USES_UV2) !== 0),
21
+ _bind(mat, entries, b) {
22
+ const tex = mat.lightmapTexture;
23
+ entries.push({ binding: b++, resource: tex.texture.createView() });
24
+ entries.push({ binding: b++, resource: tex.sampler });
25
+ return b;
26
+ },
27
+ _textures(mat, out) {
28
+ if (mat.lightmapTexture) {
29
+ out.push(mat.lightmapTexture);
30
+ }
31
+ }
32
+ };
33
+ export {
34
+ createStdLightmapFragment,
35
+ stdLightmapExt
36
+ };
37
+ //# sourceMappingURL=std-lightmap-fragment-Bqj89aIe.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"std-lightmap-fragment-Bqj89aIe.js","sources":["../src/material/standard/fragments/std-lightmap-fragment.ts"],"sourcesContent":["/** Standard Lightmap Fragment — additively blends lightmap into final color. */\nimport type { ShaderFragment } from \"../../../shader/fragment-types.js\";\nimport type { StandardMaterialProps } from \"../standard-material.js\";\nimport type { Texture2D } from \"../../../texture/texture-2d.js\";\nimport type { StdExt } from \"../standard-flags.js\";\nimport { HAS_LIGHTMAP_TEXTURE, LIGHTMAP_USES_UV2 } from \"../standard-flags.js\";\n\nconst STAGE_FRAGMENT = 0x2;\n\nexport function createStdLightmapFragment(usesUV2: boolean): ShaderFragment {\n const uv = usesUV2 ? \"input.vv\" : \"input.vu\";\n return {\n _id: \"std-lightmap\",\n _bindings: [\n { _name: \"lT\", _type: { _kind: \"texture\", _textureType: \"texture_2d<f32>\" }, _visibility: STAGE_FRAGMENT },\n { _name: \"lS\", _type: { _kind: \"sampler\", _samplerType: \"sampler\" }, _visibility: STAGE_FRAGMENT },\n ],\n _fragmentSlots: {\n BC: `color = vec4<f32>(color.rgb + textureSample(lT, lS, ${uv}).rgb * mat.lmLvl, color.a);`,\n },\n };\n}\n\nexport const stdLightmapExt: StdExt = {\n _id: \"std-lightmap\",\n _phase: \"mesh\",\n _feature: HAS_LIGHTMAP_TEXTURE,\n _frag: (features) => createStdLightmapFragment((features & LIGHTMAP_USES_UV2) !== 0),\n _bind(mat, entries, b) {\n const tex = mat.lightmapTexture!;\n entries.push({ binding: b++, resource: tex.texture.createView() });\n entries.push({ binding: b++, resource: tex.sampler });\n return b;\n },\n _textures(mat: StandardMaterialProps, out: Texture2D[]): void {\n if (mat.lightmapTexture) {\n out.push(mat.lightmapTexture);\n }\n },\n};\n"],"names":[],"mappings":";AAOA,MAAM,iBAAiB;AAEhB,SAAS,0BAA0B,SAAkC;AACxE,QAAM,KAAK,UAAU,aAAa;AAClC,SAAO;AAAA,IACH,KAAK;AAAA,IACL,WAAW;AAAA,MACP,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,IAErG,gBAAgB;AAAA,MACZ,IAAI,uDAAuD,EAAE;AAAA,IAAA;AAAA,EACjE;AAER;AAEO,MAAM,iBAAyB;AAAA,EAClC,KAAK;AAAA,EACL,QAAQ;AAAA,EACR,UAAU;AAAA,EACV,OAAO,CAAC,aAAa,2BAA2B,WAAW,uBAAuB,CAAC;AAAA,EACnF,MAAM,KAAK,SAAS,GAAG;AACnB,UAAM,MAAM,IAAI;AAChB,YAAQ,KAAK,EAAE,SAAS,KAAK,UAAU,IAAI,QAAQ,WAAA,GAAc;AACjE,YAAQ,KAAK,EAAE,SAAS,KAAK,UAAU,IAAI,SAAS;AACpD,WAAO;AAAA,EACX;AAAA,EACA,UAAU,KAA4B,KAAwB;AAC1D,QAAI,IAAI,iBAAiB;AACrB,UAAI,KAAK,IAAI,eAAe;AAAA,IAChC;AAAA,EACJ;AACJ;"}
@@ -0,0 +1,37 @@
1
+ import { al as HAS_OPACITY_TEXTURE, am as OPACITY_FROM_RGB } from "./index-C8HOR2sB.js";
2
+ const STAGE_FRAGMENT = 2;
3
+ function createStdOpacityFragment(fromRGB) {
4
+ const opacityCalc = fromRGB ? `{ let opSample = textureSample(oT, oS, input.vu); alpha *= dot(opSample.rgb, vec3<f32>(0.3, 0.59, 0.11)) * mat.opLvl; }` : `alpha *= textureSample(oT, oS, input.vu).a * mat.opLvl;`;
5
+ return {
6
+ _id: "std-opacity",
7
+ _bindings: [
8
+ { _name: "oT", _type: { _kind: "texture", _textureType: "texture_2d<f32>" }, _visibility: STAGE_FRAGMENT },
9
+ { _name: "oS", _type: { _kind: "sampler", _samplerType: "sampler" }, _visibility: STAGE_FRAGMENT }
10
+ ],
11
+ _fragmentSlots: {
12
+ AT: opacityCalc
13
+ }
14
+ };
15
+ }
16
+ const stdOpacityExt = {
17
+ _id: "std-opacity",
18
+ _phase: "mesh",
19
+ _feature: HAS_OPACITY_TEXTURE,
20
+ _frag: (features) => createStdOpacityFragment((features & OPACITY_FROM_RGB) !== 0),
21
+ _bind(mat, entries, b) {
22
+ const tex = mat.opacityTexture;
23
+ entries.push({ binding: b++, resource: tex.texture.createView() });
24
+ entries.push({ binding: b++, resource: tex.sampler });
25
+ return b;
26
+ },
27
+ _textures(mat, out) {
28
+ if (mat.opacityTexture) {
29
+ out.push(mat.opacityTexture);
30
+ }
31
+ }
32
+ };
33
+ export {
34
+ createStdOpacityFragment,
35
+ stdOpacityExt
36
+ };
37
+ //# sourceMappingURL=std-opacity-fragment-KuPh5N2Z.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"std-opacity-fragment-KuPh5N2Z.js","sources":["../src/material/standard/fragments/std-opacity-fragment.ts"],"sourcesContent":["/** Standard Opacity Texture Fragment — modulates alpha by opacity texture. */\nimport type { ShaderFragment } from \"../../../shader/fragment-types.js\";\nimport type { StandardMaterialProps } from \"../standard-material.js\";\nimport type { Texture2D } from \"../../../texture/texture-2d.js\";\nimport type { StdExt } from \"../standard-flags.js\";\nimport { HAS_OPACITY_TEXTURE, OPACITY_FROM_RGB } from \"../standard-flags.js\";\n\nconst STAGE_FRAGMENT = 0x2;\n\nexport function createStdOpacityFragment(fromRGB: boolean): ShaderFragment {\n const opacityCalc = fromRGB\n ? `{ let opSample = textureSample(oT, oS, input.vu); alpha *= dot(opSample.rgb, vec3<f32>(0.3, 0.59, 0.11)) * mat.opLvl; }`\n : `alpha *= textureSample(oT, oS, input.vu).a * mat.opLvl;`;\n return {\n _id: \"std-opacity\",\n _bindings: [\n { _name: \"oT\", _type: { _kind: \"texture\", _textureType: \"texture_2d<f32>\" }, _visibility: STAGE_FRAGMENT },\n { _name: \"oS\", _type: { _kind: \"sampler\", _samplerType: \"sampler\" }, _visibility: STAGE_FRAGMENT },\n ],\n _fragmentSlots: {\n AT: opacityCalc,\n },\n };\n}\n\nexport const stdOpacityExt: StdExt = {\n _id: \"std-opacity\",\n _phase: \"mesh\",\n _feature: HAS_OPACITY_TEXTURE,\n _frag: (features) => createStdOpacityFragment((features & OPACITY_FROM_RGB) !== 0),\n _bind(mat, entries, b) {\n const tex = mat.opacityTexture!;\n entries.push({ binding: b++, resource: tex.texture.createView() });\n entries.push({ binding: b++, resource: tex.sampler });\n return b;\n },\n _textures(mat: StandardMaterialProps, out: Texture2D[]): void {\n if (mat.opacityTexture) {\n out.push(mat.opacityTexture);\n }\n },\n};\n"],"names":[],"mappings":";AAOA,MAAM,iBAAiB;AAEhB,SAAS,yBAAyB,SAAkC;AACvE,QAAM,cAAc,UACd,4HACA;AACN,SAAO;AAAA,IACH,KAAK;AAAA,IACL,WAAW;AAAA,MACP,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,IAErG,gBAAgB;AAAA,MACZ,IAAI;AAAA,IAAA;AAAA,EACR;AAER;AAEO,MAAM,gBAAwB;AAAA,EACjC,KAAK;AAAA,EACL,QAAQ;AAAA,EACR,UAAU;AAAA,EACV,OAAO,CAAC,aAAa,0BAA0B,WAAW,sBAAsB,CAAC;AAAA,EACjF,MAAM,KAAK,SAAS,GAAG;AACnB,UAAM,MAAM,IAAI;AAChB,YAAQ,KAAK,EAAE,SAAS,KAAK,UAAU,IAAI,QAAQ,WAAA,GAAc;AACjE,YAAQ,KAAK,EAAE,SAAS,KAAK,UAAU,IAAI,SAAS;AACpD,WAAO;AAAA,EACX;AAAA,EACA,UAAU,KAA4B,KAAwB;AAC1D,QAAI,IAAI,gBAAgB;AACpB,UAAI,KAAK,IAAI,cAAc;AAAA,IAC/B;AAAA,EACJ;AACJ;"}
@@ -0,0 +1,57 @@
1
+ import { an as HAS_REFLECTION_TEXTURE } from "./index-C8HOR2sB.js";
2
+ const STAGE_FRAGMENT = 2;
3
+ const REFLECTION_HELPERS = `
4
+ fn computeSphericalCoords(worldPos: vec3<f32>, worldNormal: vec3<f32>) -> vec2<f32> {
5
+ let viewDir = normalize((scene.view * vec4<f32>(worldPos, 1.0)).xyz);
6
+ let viewNormal = normalize((scene.view * vec4<f32>(worldNormal, 0.0)).xyz);
7
+ var r = reflect(viewDir, viewNormal);
8
+ r.z = r.z - 1.0;
9
+ let m = 2.0 * length(r);
10
+ return vec2<f32>(r.x / m + 0.5, r.y / m + 0.5);
11
+ }
12
+ fn computePlanarCoords(worldPos: vec3<f32>, worldNormal: vec3<f32>) -> vec2<f32> {
13
+ let viewDir = worldPos - scene.vEyePosition.xyz;
14
+ let coords = normalize(reflect(viewDir, worldNormal));
15
+ return vec2<f32>(coords.x, 1.0 - coords.y);
16
+ }
17
+ `;
18
+ function createStdReflectionFragment() {
19
+ return {
20
+ _id: "std-reflection",
21
+ _bindings: [
22
+ { _name: "rT", _type: { _kind: "texture", _textureType: "texture_2d<f32>" }, _visibility: STAGE_FRAGMENT },
23
+ { _name: "rS", _type: { _kind: "sampler", _samplerType: "sampler" }, _visibility: STAGE_FRAGMENT }
24
+ ],
25
+ _helperFunctions: REFLECTION_HELPERS,
26
+ _fragmentSlots: {
27
+ AD: `{
28
+ var reflCoords: vec2<f32>;
29
+ if (mat.rCm < 1.5) { reflCoords = computeSphericalCoords(input.vp, normalW); }
30
+ else { reflCoords = computePlanarCoords(input.vp, normalW); }
31
+ reflectionColor = textureSample(rT, rS, reflCoords).rgb * mat.rLvl;
32
+ }`
33
+ }
34
+ };
35
+ }
36
+ const stdReflectionExt = {
37
+ _id: "std-reflection",
38
+ _phase: "mesh",
39
+ _feature: HAS_REFLECTION_TEXTURE,
40
+ _frag: createStdReflectionFragment,
41
+ _bind(mat, entries, b) {
42
+ const tex = mat.reflectionTexture;
43
+ entries.push({ binding: b++, resource: tex.texture.createView() });
44
+ entries.push({ binding: b++, resource: tex.sampler });
45
+ return b;
46
+ },
47
+ _textures(mat, out) {
48
+ if (mat.reflectionTexture) {
49
+ out.push(mat.reflectionTexture);
50
+ }
51
+ }
52
+ };
53
+ export {
54
+ createStdReflectionFragment,
55
+ stdReflectionExt
56
+ };
57
+ //# sourceMappingURL=std-reflection-fragment-BA5Ghn_M.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"std-reflection-fragment-BA5Ghn_M.js","sources":["../src/material/standard/fragments/std-reflection-fragment.ts"],"sourcesContent":["/** Standard Reflection Texture Fragment — spherical/planar environment reflection. */\nimport type { ShaderFragment } from \"../../../shader/fragment-types.js\";\n\nconst STAGE_FRAGMENT = 0x2;\n\nconst REFLECTION_HELPERS = `\nfn computeSphericalCoords(worldPos: vec3<f32>, worldNormal: vec3<f32>) -> vec2<f32> {\nlet viewDir = normalize((scene.view * vec4<f32>(worldPos, 1.0)).xyz);\nlet viewNormal = normalize((scene.view * vec4<f32>(worldNormal, 0.0)).xyz);\nvar r = reflect(viewDir, viewNormal);\nr.z = r.z - 1.0;\nlet m = 2.0 * length(r);\nreturn vec2<f32>(r.x / m + 0.5, r.y / m + 0.5);\n}\nfn computePlanarCoords(worldPos: vec3<f32>, worldNormal: vec3<f32>) -> vec2<f32> {\nlet viewDir = worldPos - scene.vEyePosition.xyz;\nlet coords = normalize(reflect(viewDir, worldNormal));\nreturn vec2<f32>(coords.x, 1.0 - coords.y);\n}\n`;\n\nexport function createStdReflectionFragment(): ShaderFragment {\n return {\n _id: \"std-reflection\",\n _bindings: [\n { _name: \"rT\", _type: { _kind: \"texture\", _textureType: \"texture_2d<f32>\" }, _visibility: STAGE_FRAGMENT },\n { _name: \"rS\", _type: { _kind: \"sampler\", _samplerType: \"sampler\" }, _visibility: STAGE_FRAGMENT },\n ],\n _helperFunctions: REFLECTION_HELPERS,\n _fragmentSlots: {\n AD: `{\nvar reflCoords: vec2<f32>;\nif (mat.rCm < 1.5) { reflCoords = computeSphericalCoords(input.vp, normalW); }\nelse { reflCoords = computePlanarCoords(input.vp, normalW); }\nreflectionColor = textureSample(rT, rS, reflCoords).rgb * mat.rLvl;\n}`,\n },\n };\n}\n\nimport type { StandardMaterialProps } from \"../standard-material.js\";\nimport type { Texture2D } from \"../../../texture/texture-2d.js\";\nimport type { StdExt } from \"../standard-flags.js\";\nimport { HAS_REFLECTION_TEXTURE } from \"../standard-flags.js\";\n\nexport const stdReflectionExt: StdExt = {\n _id: \"std-reflection\",\n _phase: \"mesh\",\n _feature: HAS_REFLECTION_TEXTURE,\n _frag: createStdReflectionFragment,\n _bind(mat, entries, b) {\n const tex = mat.reflectionTexture!;\n entries.push({ binding: b++, resource: tex.texture.createView() });\n entries.push({ binding: b++, resource: tex.sampler });\n return b;\n },\n _textures(mat: StandardMaterialProps, out: Texture2D[]): void {\n if (mat.reflectionTexture) {\n out.push(mat.reflectionTexture);\n }\n },\n};\n"],"names":[],"mappings":";AAGA,MAAM,iBAAiB;AAEvB,MAAM,qBAAqB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAgBpB,SAAS,8BAA8C;AAC1D,SAAO;AAAA,IACH,KAAK;AAAA,IACL,WAAW;AAAA,MACP,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,IAErG,kBAAkB;AAAA,IAClB,gBAAgB;AAAA,MACZ,IAAI;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAAA;AAAA,EAMR;AAER;AAOO,MAAM,mBAA2B;AAAA,EACpC,KAAK;AAAA,EACL,QAAQ;AAAA,EACR,UAAU;AAAA,EACV,OAAO;AAAA,EACP,MAAM,KAAK,SAAS,GAAG;AACnB,UAAM,MAAM,IAAI;AAChB,YAAQ,KAAK,EAAE,SAAS,KAAK,UAAU,IAAI,QAAQ,WAAA,GAAc;AACjE,YAAQ,KAAK,EAAE,SAAS,KAAK,UAAU,IAAI,SAAS;AACpD,WAAO;AAAA,EACX;AAAA,EACA,UAAU,KAA4B,KAAwB;AAC1D,QAAI,IAAI,mBAAmB;AACvB,UAAI,KAAK,IAAI,iBAAiB;AAAA,IAClC;AAAA,EACJ;AACJ;"}
@@ -0,0 +1,8 @@
1
+ import { c as createShadowFragment } from "./shadow-fragment-core-DHN2G6FI.js";
2
+ function createStdShadowFragment(shadowLights) {
3
+ return createShadowFragment("std-shadow", shadowLights);
4
+ }
5
+ export {
6
+ createStdShadowFragment
7
+ };
8
+ //# sourceMappingURL=std-shadow-fragment-FNQfrJuC.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"std-shadow-fragment-FNQfrJuC.js","sources":["../src/material/standard/fragments/std-shadow-fragment.ts"],"sourcesContent":["/**\n * Standard Shadow Fragment — Per-Light Shadow Support\n *\n * Thin wrapper around the shared shadow-fragment-core for Standard materials.\n * Only bundled when a scene uses shadow-receiving Standard meshes.\n */\n\nimport type { ShaderFragment } from \"../../../shader/fragment-types.js\";\nimport { createShadowFragment } from \"../../../shader/fragments/shadow-fragment-core.js\";\n\nexport type { ShadowLightSlot } from \"../../../shader/fragments/shadow-fragment-core.js\";\nimport type { ShadowLightSlot } from \"../../../shader/fragments/shadow-fragment-core.js\";\n\n/**\n * Create a per-light shadow fragment for Standard materials.\n * Each shadow-casting light gets its own varying, bindings, and sampling code.\n * The shadow factor for each light is stored in shadowFactors[lightIndex].\n */\nexport function createStdShadowFragment(shadowLights: ShadowLightSlot[]): ShaderFragment {\n return createShadowFragment(\"std-shadow\", shadowLights);\n}\n"],"names":[],"mappings":";AAkBO,SAAS,wBAAwB,cAAiD;AACrF,SAAO,qBAAqB,cAAc,YAAY;AAC1D;"}
@@ -0,0 +1,37 @@
1
+ import { af as HAS_SPECULAR_TEXTURE, ag as SPECULAR_USES_UV2 } from "./index-C8HOR2sB.js";
2
+ const STAGE_FRAGMENT = 2;
3
+ function createStdSpecularFragment(usesUV2) {
4
+ const uv = usesUV2 ? "input.vv" : "input.vu";
5
+ return {
6
+ _id: "std-specular",
7
+ _bindings: [
8
+ { _name: "sT", _type: { _kind: "texture", _textureType: "texture_2d<f32>" }, _visibility: STAGE_FRAGMENT },
9
+ { _name: "sS", _type: { _kind: "sampler", _samplerType: "sampler" }, _visibility: STAGE_FRAGMENT }
10
+ ],
11
+ _fragmentSlots: {
12
+ AT: `specularColor = textureSample(sT, sS, ${uv}).rgb;`
13
+ }
14
+ };
15
+ }
16
+ const stdSpecularExt = {
17
+ _id: "std-specular",
18
+ _phase: "mesh",
19
+ _feature: HAS_SPECULAR_TEXTURE,
20
+ _frag: (features) => createStdSpecularFragment((features & SPECULAR_USES_UV2) !== 0),
21
+ _bind(mat, entries, b) {
22
+ const tex = mat.specularTexture;
23
+ entries.push({ binding: b++, resource: tex.texture.createView() });
24
+ entries.push({ binding: b++, resource: tex.sampler });
25
+ return b;
26
+ },
27
+ _textures(mat, out) {
28
+ if (mat.specularTexture) {
29
+ out.push(mat.specularTexture);
30
+ }
31
+ }
32
+ };
33
+ export {
34
+ createStdSpecularFragment,
35
+ stdSpecularExt
36
+ };
37
+ //# sourceMappingURL=std-specular-fragment-CE-6scqd.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"std-specular-fragment-CE-6scqd.js","sources":["../src/material/standard/fragments/std-specular-fragment.ts"],"sourcesContent":["/** Standard Specular Texture Fragment — replaces specular color with texture sample. */\nimport type { ShaderFragment } from \"../../../shader/fragment-types.js\";\nimport type { StandardMaterialProps } from \"../standard-material.js\";\nimport type { Texture2D } from \"../../../texture/texture-2d.js\";\nimport type { StdExt } from \"../standard-flags.js\";\nimport { HAS_SPECULAR_TEXTURE, SPECULAR_USES_UV2 } from \"../standard-flags.js\";\n\nconst STAGE_FRAGMENT = 0x2;\n\nexport function createStdSpecularFragment(usesUV2: boolean): ShaderFragment {\n const uv = usesUV2 ? \"input.vv\" : \"input.vu\";\n return {\n _id: \"std-specular\",\n _bindings: [\n { _name: \"sT\", _type: { _kind: \"texture\", _textureType: \"texture_2d<f32>\" }, _visibility: STAGE_FRAGMENT },\n { _name: \"sS\", _type: { _kind: \"sampler\", _samplerType: \"sampler\" }, _visibility: STAGE_FRAGMENT },\n ],\n _fragmentSlots: {\n AT: `specularColor = textureSample(sT, sS, ${uv}).rgb;`,\n },\n };\n}\n\nexport const stdSpecularExt: StdExt = {\n _id: \"std-specular\",\n _phase: \"mesh\",\n _feature: HAS_SPECULAR_TEXTURE,\n _frag: (features) => createStdSpecularFragment((features & SPECULAR_USES_UV2) !== 0),\n _bind(mat, entries, b) {\n const tex = mat.specularTexture!;\n entries.push({ binding: b++, resource: tex.texture.createView() });\n entries.push({ binding: b++, resource: tex.sampler });\n return b;\n },\n _textures(mat: StandardMaterialProps, out: Texture2D[]): void {\n if (mat.specularTexture) {\n out.push(mat.specularTexture);\n }\n },\n};\n"],"names":[],"mappings":";AAOA,MAAM,iBAAiB;AAEhB,SAAS,0BAA0B,SAAkC;AACxE,QAAM,KAAK,UAAU,aAAa;AAClC,SAAO;AAAA,IACH,KAAK;AAAA,IACL,WAAW;AAAA,MACP,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,IAErG,gBAAgB;AAAA,MACZ,IAAI,yCAAyC,EAAE;AAAA,IAAA;AAAA,EACnD;AAER;AAEO,MAAM,iBAAyB;AAAA,EAClC,KAAK;AAAA,EACL,QAAQ;AAAA,EACR,UAAU;AAAA,EACV,OAAO,CAAC,aAAa,2BAA2B,WAAW,uBAAuB,CAAC;AAAA,EACnF,MAAM,KAAK,SAAS,GAAG;AACnB,UAAM,MAAM,IAAI;AAChB,YAAQ,KAAK,EAAE,SAAS,KAAK,UAAU,IAAI,QAAQ,WAAA,GAAc;AACjE,YAAQ,KAAK,EAAE,SAAS,KAAK,UAAU,IAAI,SAAS;AACpD,WAAO;AAAA,EACX;AAAA,EACA,UAAU,KAA4B,KAAwB;AAC1D,QAAI,IAAI,iBAAiB;AACrB,UAAI,KAAK,IAAI,eAAe;AAAA,IAChC;AAAA,EACJ;AACJ;"}
@@ -0,0 +1,15 @@
1
+ import { t as trackScalar, o as observableColor3, a as observableVec2 } from "./tracking-primitives-wgdBY85t.js";
2
+ function installStdTracking(mat) {
3
+ for (const key of ["alpha", "specularPower", "bumpLevel", "ambientTexLevel", "lightmapLevel", "opacityLevel", "alphaCutOff", "reflectionLevel"]) {
4
+ trackScalar(mat, key);
5
+ }
6
+ mat.diffuseColor = observableColor3(mat.diffuseColor[0], mat.diffuseColor[1], mat.diffuseColor[2], mat);
7
+ mat.specularColor = observableColor3(mat.specularColor[0], mat.specularColor[1], mat.specularColor[2], mat);
8
+ mat.emissiveColor = observableColor3(mat.emissiveColor[0], mat.emissiveColor[1], mat.emissiveColor[2], mat);
9
+ mat.ambientColor = observableColor3(mat.ambientColor[0], mat.ambientColor[1], mat.ambientColor[2], mat);
10
+ mat.uvScale = observableVec2(mat.uvScale[0], mat.uvScale[1], mat);
11
+ }
12
+ export {
13
+ installStdTracking
14
+ };
15
+ //# sourceMappingURL=std-tracking-CNKZ-hJN.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"std-tracking-CNKZ-hJN.js","sources":["../src/material/tracking/std-tracking.ts"],"sourcesContent":["/** Standard material auto-dirty tracking. Dynamically imported by enableMaterialTracking(). */\n\nimport type { StandardMaterialProps } from \"../standard/standard-material.js\";\nimport { trackScalar, observableColor3, observableVec2 } from \"./tracking-primitives.js\";\n\nexport function installStdTracking(mat: StandardMaterialProps): void {\n for (const key of [\"alpha\", \"specularPower\", \"bumpLevel\", \"ambientTexLevel\", \"lightmapLevel\", \"opacityLevel\", \"alphaCutOff\", \"reflectionLevel\"]) {\n trackScalar(mat, key);\n }\n mat.diffuseColor = observableColor3(mat.diffuseColor[0], mat.diffuseColor[1], mat.diffuseColor[2], mat as any);\n mat.specularColor = observableColor3(mat.specularColor[0], mat.specularColor[1], mat.specularColor[2], mat as any);\n mat.emissiveColor = observableColor3(mat.emissiveColor[0], mat.emissiveColor[1], mat.emissiveColor[2], mat as any);\n mat.ambientColor = observableColor3(mat.ambientColor[0], mat.ambientColor[1], mat.ambientColor[2], mat as any);\n mat.uvScale = observableVec2(mat.uvScale[0], mat.uvScale[1], mat as any);\n}\n"],"names":[],"mappings":";AAKO,SAAS,mBAAmB,KAAkC;AACjE,aAAW,OAAO,CAAC,SAAS,iBAAiB,aAAa,mBAAmB,iBAAiB,gBAAgB,eAAe,iBAAiB,GAAG;AAC7I,gBAAY,KAAK,GAAG;AAAA,EACxB;AACA,MAAI,eAAe,iBAAiB,IAAI,aAAa,CAAC,GAAG,IAAI,aAAa,CAAC,GAAG,IAAI,aAAa,CAAC,GAAG,GAAU;AAC7G,MAAI,gBAAgB,iBAAiB,IAAI,cAAc,CAAC,GAAG,IAAI,cAAc,CAAC,GAAG,IAAI,cAAc,CAAC,GAAG,GAAU;AACjH,MAAI,gBAAgB,iBAAiB,IAAI,cAAc,CAAC,GAAG,IAAI,cAAc,CAAC,GAAG,IAAI,cAAc,CAAC,GAAG,GAAU;AACjH,MAAI,eAAe,iBAAiB,IAAI,aAAa,CAAC,GAAG,IAAI,aAAa,CAAC,GAAG,IAAI,aAAa,CAAC,GAAG,GAAU;AAC7G,MAAI,UAAU,eAAe,IAAI,QAAQ,CAAC,GAAG,IAAI,QAAQ,CAAC,GAAG,GAAU;AAC3E;"}
@@ -0,0 +1,13 @@
1
+ const emitter = {
2
+ className: "StepBlock",
3
+ emit(block, _outputName, stage, state, ctx) {
4
+ const value = ctx.resolve(block, "value", stage, state);
5
+ const edge = ctx.resolve(block, "edge", stage, state);
6
+ const ec = ctx.cast(edge, value.type).expr;
7
+ return { expr: `step(${ec}, ${value.expr})`, type: value.type };
8
+ }
9
+ };
10
+ export {
11
+ emitter
12
+ };
13
+ //# sourceMappingURL=step-block-BkywzTYm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"step-block-BkywzTYm.js","sources":["../src/material/node/blocks/step-block.ts"],"sourcesContent":["import type { BlockEmitter } from \"../node-types.js\";\n\nexport const emitter: BlockEmitter = {\n className: \"StepBlock\",\n emit(block, _outputName, stage, state, ctx) {\n const value = ctx.resolve(block, \"value\", stage, state);\n const edge = ctx.resolve(block, \"edge\", stage, state);\n const ec = ctx.cast(edge, value.type).expr;\n return { expr: `step(${ec}, ${value.expr})`, type: value.type };\n },\n};\n"],"names":[],"mappings":"AAEO,MAAM,UAAwB;AAAA,EACjC,WAAW;AAAA,EACX,KAAK,OAAO,aAAa,OAAO,OAAO,KAAK;AACxC,UAAM,QAAQ,IAAI,QAAQ,OAAO,SAAS,OAAO,KAAK;AACtD,UAAM,OAAO,IAAI,QAAQ,OAAO,QAAQ,OAAO,KAAK;AACpD,UAAM,KAAK,IAAI,KAAK,MAAM,MAAM,IAAI,EAAE;AACtC,WAAO,EAAE,MAAM,QAAQ,EAAE,KAAK,MAAM,IAAI,KAAK,MAAM,MAAM,KAAA;AAAA,EAC7D;AACJ;"}
@@ -0,0 +1,25 @@
1
+ function loopKey(stage, blockId) {
2
+ return `${stage}|${blockId}`;
3
+ }
4
+ const emitter = {
5
+ className: "StorageReadBlock",
6
+ emit(block, outputName, stage, state, _ctx) {
7
+ var _a;
8
+ if (outputName !== "value") {
9
+ throw new Error(`StorageReadBlock "${block.name}": unsupported output "${outputName}"`);
10
+ }
11
+ const loopSource = (_a = block.inputs.get("loopID")) == null ? void 0 : _a.source;
12
+ if (!loopSource) {
13
+ throw new Error(`StorageReadBlock "${block.name}": loopID input is not connected`);
14
+ }
15
+ const active = state.loopVariables.get(loopKey(stage, loopSource.blockId));
16
+ if (!active) {
17
+ throw new Error(`StorageReadBlock "${block.name}": loop ${loopSource.blockId} is not active`);
18
+ }
19
+ return { expr: active.valueVar, type: active.valueType };
20
+ }
21
+ };
22
+ export {
23
+ emitter
24
+ };
25
+ //# sourceMappingURL=storage-read-block-BdzhJfln.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"storage-read-block-BdzhJfln.js","sources":["../src/material/node/blocks/storage-read-block.ts"],"sourcesContent":["import type { BlockEmitter, Stage } from \"../node-types.js\";\n\nfunction loopKey(stage: Stage, blockId: number): string {\n return `${stage}|${blockId}`;\n}\n\nexport const emitter: BlockEmitter = {\n className: \"StorageReadBlock\",\n emit(block, outputName, stage, state, _ctx) {\n if (outputName !== \"value\") {\n throw new Error(`StorageReadBlock \"${block.name}\": unsupported output \"${outputName}\"`);\n }\n const loopSource = block.inputs.get(\"loopID\")?.source;\n if (!loopSource) {\n throw new Error(`StorageReadBlock \"${block.name}\": loopID input is not connected`);\n }\n const active = state.loopVariables.get(loopKey(stage, loopSource.blockId));\n if (!active) {\n throw new Error(`StorageReadBlock \"${block.name}\": loop ${loopSource.blockId} is not active`);\n }\n return { expr: active.valueVar, type: active.valueType };\n },\n};\n"],"names":[],"mappings":"AAEA,SAAS,QAAQ,OAAc,SAAyB;AACpD,SAAO,GAAG,KAAK,IAAI,OAAO;AAC9B;AAEO,MAAM,UAAwB;AAAA,EACjC,WAAW;AAAA,EACX,KAAK,OAAO,YAAY,OAAO,OAAO,MAAM;AANhD;AAOQ,QAAI,eAAe,SAAS;AACxB,YAAM,IAAI,MAAM,qBAAqB,MAAM,IAAI,0BAA0B,UAAU,GAAG;AAAA,IAC1F;AACA,UAAM,cAAa,WAAM,OAAO,IAAI,QAAQ,MAAzB,mBAA4B;AAC/C,QAAI,CAAC,YAAY;AACb,YAAM,IAAI,MAAM,qBAAqB,MAAM,IAAI,kCAAkC;AAAA,IACrF;AACA,UAAM,SAAS,MAAM,cAAc,IAAI,QAAQ,OAAO,WAAW,OAAO,CAAC;AACzE,QAAI,CAAC,QAAQ;AACT,YAAM,IAAI,MAAM,qBAAqB,MAAM,IAAI,WAAW,WAAW,OAAO,gBAAgB;AAAA,IAChG;AACA,WAAO,EAAE,MAAM,OAAO,UAAU,MAAM,OAAO,UAAA;AAAA,EACjD;AACJ;"}
@@ -0,0 +1,11 @@
1
+ const emitter = {
2
+ className: "StorageWriteBlock",
3
+ emit(block, _outputName, stage, state, ctx) {
4
+ const value = ctx.resolve(block, "value", stage, state);
5
+ return value;
6
+ }
7
+ };
8
+ export {
9
+ emitter
10
+ };
11
+ //# sourceMappingURL=storage-write-block-DjLKZ0Ro.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"storage-write-block-DjLKZ0Ro.js","sources":["../src/material/node/blocks/storage-write-block.ts"],"sourcesContent":["import type { BlockEmitter } from \"../node-types.js\";\n\nexport const emitter: BlockEmitter = {\n className: \"StorageWriteBlock\",\n emit(block, _outputName, stage, state, ctx) {\n const value = ctx.resolve(block, \"value\", stage, state);\n return value;\n },\n};\n"],"names":[],"mappings":"AAEO,MAAM,UAAwB;AAAA,EACjC,WAAW;AAAA,EACX,KAAK,OAAO,aAAa,OAAO,OAAO,KAAK;AACxC,UAAM,QAAQ,IAAI,QAAQ,OAAO,SAAS,OAAO,KAAK;AACtD,WAAO;AAAA,EACX;AACJ;"}
@@ -0,0 +1,12 @@
1
+ const emitter = {
2
+ className: "SubSurfaceBlock",
3
+ stage: "fragment",
4
+ emit(_block, _outputName, _stage, state, _ctx) {
5
+ state.usesSubsurface = true;
6
+ return { expr: `vec3<f32>(0.0)`, type: "vec3f" };
7
+ }
8
+ };
9
+ export {
10
+ emitter
11
+ };
12
+ //# sourceMappingURL=subsurface-block-CBhxT9ui.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"subsurface-block-CBhxT9ui.js","sources":["../src/material/node/blocks/subsurface-block.ts"],"sourcesContent":["/** SubSurfaceBlock — passthrough marker.\n *\n * All actual subsurface math (translucency back-scatter, refraction sampling,\n * Beer-Lambert tint absorption) is implemented inside PBRMetallicRoughnessBlock,\n * which walks into the connected SubSurfaceBlock to read its inputs:\n * - thickness, tintColor, translucencyIntensity, translucencyDiffusionDist\n * - refraction (`->` RefractionBlock for intensity / tintAtDistance)\n * This emitter only exists to register the class and report `usesSubsurface`\n * so the build pipeline can include any related infrastructure.\n */\n\nimport type { BlockEmitter } from \"../node-types.js\";\n\nexport const emitter: BlockEmitter = {\n className: \"SubSurfaceBlock\",\n stage: \"fragment\",\n emit(_block, _outputName, _stage, state, _ctx) {\n state.usesSubsurface = true;\n return { expr: `vec3<f32>(0.0)`, type: \"vec3f\" };\n },\n};\n"],"names":[],"mappings":"AAaO,MAAM,UAAwB;AAAA,EACjC,WAAW;AAAA,EACX,OAAO;AAAA,EACP,KAAK,QAAQ,aAAa,QAAQ,OAAO,MAAM;AAC3C,UAAM,iBAAiB;AACvB,WAAO,EAAE,MAAM,kBAAkB,MAAM,QAAA;AAAA,EAC3C;AACJ;"}