@babylonjs/lite 0.2.0 → 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (249) hide show
  1. package/{_mat4-storage-f64-Bvh5TymE.js → _mat4-storage-f64-CjDoht2w.js} +3 -2
  2. package/_mat4-storage-f64-CjDoht2w.js.map +1 -0
  3. package/{alpha-test-fragment-BCChpzaV.js → alpha-test-fragment-B7DjSnF7.js} +2 -2
  4. package/{alpha-test-fragment-BCChpzaV.js.map → alpha-test-fragment-B7DjSnF7.js.map} +1 -1
  5. package/assets/splat-sort-worker-DT3eybMZ.js.map +1 -0
  6. package/{background-dds-skybox-ZjrSIxrT.js → background-dds-skybox-BEX309u3.js} +13 -13
  7. package/background-dds-skybox-BEX309u3.js.map +1 -0
  8. package/{background-ground-B2Mie-MI.js → background-ground-BU0HOcM4.js} +19 -19
  9. package/background-ground-BU0HOcM4.js.map +1 -0
  10. package/{background-hdr-skybox-DDRJYuT2.js → background-hdr-skybox--RRRic_K.js} +10 -10
  11. package/background-hdr-skybox--RRRic_K.js.map +1 -0
  12. package/{background-solid-skybox-fjXlnWaD.js → background-solid-skybox-BrH2fXSu.js} +11 -12
  13. package/background-solid-skybox-BrH2fXSu.js.map +1 -0
  14. package/{billboard-renderable-DKmlOgbM.js → billboard-renderable-BHWryAeC.js} +46 -10
  15. package/billboard-renderable-BHWryAeC.js.map +1 -0
  16. package/{clamp-block-CxRBPlUq.js → clamp-block-DqbwnQGW.js} +2 -2
  17. package/{clamp-block-CxRBPlUq.js.map → clamp-block-DqbwnQGW.js.map} +1 -1
  18. package/{clearcoat-fragment-KbZAa0TA.js → clearcoat-fragment-D6FSCie1.js} +2 -2
  19. package/{clearcoat-fragment-KbZAa0TA.js.map → clearcoat-fragment-D6FSCie1.js.map} +1 -1
  20. package/{create-skeleton-BBI5urcj.js → create-skeleton-D_uplboC.js} +9 -9
  21. package/create-skeleton-D_uplboC.js.map +1 -0
  22. package/{cubemap-skybox-material-DvW81drX.js → cubemap-skybox-material-DQcMMdf-.js} +6 -7
  23. package/cubemap-skybox-material-DQcMMdf-.js.map +1 -0
  24. package/{curve-block-Dh_xdUj-.js → curve-block-21rT0JjG.js} +2 -2
  25. package/{curve-block-Dh_xdUj-.js.map → curve-block-21rT0JjG.js.map} +1 -1
  26. package/{emissive-fragment-DD8cvHyx.js → emissive-fragment-C5FtBs3y.js} +3 -3
  27. package/emissive-fragment-C5FtBs3y.js.map +1 -0
  28. package/{esm-shadow-view-DYAc62Kl.js → esm-shadow-view-Cl3rPGof.js} +2 -2
  29. package/{esm-shadow-view-DYAc62Kl.js.map → esm-shadow-view-Cl3rPGof.js.map} +1 -1
  30. package/{esm-shadow-view-DHVS9r7H.js → esm-shadow-view-Gtd1LWRP.js} +2 -2
  31. package/{esm-shadow-view-DHVS9r7H.js.map → esm-shadow-view-Gtd1LWRP.js.map} +1 -1
  32. package/{esm-shadow-view-15S4JK6p.js → esm-shadow-view-c5YV4Eg9.js} +2 -2
  33. package/{esm-shadow-view-15S4JK6p.js.map → esm-shadow-view-c5YV4Eg9.js.map} +1 -1
  34. package/{gaussian-splatting-pipeline-sh-BvkUhA9V.js → gaussian-splatting-pipeline-sh-7J31V23x.js} +19 -19
  35. package/gaussian-splatting-pipeline-sh-7J31V23x.js.map +1 -0
  36. package/geometry-texture-output-dXk4E9uu.js +41 -0
  37. package/geometry-texture-output-dXk4E9uu.js.map +1 -0
  38. package/geometry-view-BsFJpBJa.js +404 -0
  39. package/geometry-view-BsFJpBJa.js.map +1 -0
  40. package/{gltf-animation-KnPzeOIY.js → gltf-animation-K_zZxj_d.js} +6 -6
  41. package/gltf-animation-K_zZxj_d.js.map +1 -0
  42. package/{gltf-ext-basisu-kmth3UWX.js → gltf-ext-basisu-CDbPclzZ.js} +48 -16
  43. package/gltf-ext-basisu-CDbPclzZ.js.map +1 -0
  44. package/{gltf-ext-node-visibility-BjRRd6si.js → gltf-ext-node-visibility-DXCJEYr6.js} +2 -2
  45. package/{gltf-ext-node-visibility-BjRRd6si.js.map → gltf-ext-node-visibility-DXCJEYr6.js.map} +1 -1
  46. package/{gltf-ext-quantization-CpZyLDIz.js → gltf-ext-quantization-CvHI_0Vg.js} +4 -3
  47. package/gltf-ext-quantization-CvHI_0Vg.js.map +1 -0
  48. package/{gltf-ext-uv-transform-MHmR-YyM.js → gltf-ext-uv-transform-DgYazJBs.js} +2 -2
  49. package/{gltf-ext-uv-transform-MHmR-YyM.js.map → gltf-ext-uv-transform-DgYazJBs.js.map} +1 -1
  50. package/{gltf-feature-animation-pointer-rFqLfbO_.js → gltf-feature-animation-pointer-D1RJRFBw.js} +9 -9
  51. package/gltf-feature-animation-pointer-D1RJRFBw.js.map +1 -0
  52. package/{gltf-feature-animations-DikONdzi.js → gltf-feature-animations-Cmc1uoIu.js} +2 -2
  53. package/{gltf-feature-animations-DikONdzi.js.map → gltf-feature-animations-Cmc1uoIu.js.map} +1 -1
  54. package/{gltf-feature-draco-yGSMGTE3.js → gltf-feature-draco-CKKzT5E3.js} +6 -5
  55. package/gltf-feature-draco-CKKzT5E3.js.map +1 -0
  56. package/{gltf-feature-gpu-instancing-Cj1XjmM6.js → gltf-feature-gpu-instancing-n87SO6Vh.js} +4 -4
  57. package/gltf-feature-gpu-instancing-n87SO6Vh.js.map +1 -0
  58. package/{gltf-feature-lights-punctual-C-0SlGmD.js → gltf-feature-lights-punctual-Ckm3ciL8.js} +5 -5
  59. package/{gltf-feature-lights-punctual-C-0SlGmD.js.map → gltf-feature-lights-punctual-Ckm3ciL8.js.map} +1 -1
  60. package/{gltf-feature-meshopt-Des96YFI.js → gltf-feature-meshopt-DLC4SF1E.js} +7 -6
  61. package/gltf-feature-meshopt-DLC4SF1E.js.map +1 -0
  62. package/{gltf-feature-morph-BAcY14XU.js → gltf-feature-morph-Cjtu7hYa.js} +4 -4
  63. package/gltf-feature-morph-Cjtu7hYa.js.map +1 -0
  64. package/{gltf-feature-registry-97sY_x5O.js → gltf-feature-registry-C63Hjp9w.js} +15 -15
  65. package/{gltf-feature-registry-97sY_x5O.js.map → gltf-feature-registry-C63Hjp9w.js.map} +1 -1
  66. package/{gltf-feature-skeleton-lVjkDfIU.js → gltf-feature-skeleton-DKbOGidp.js} +3 -3
  67. package/{gltf-feature-skeleton-lVjkDfIU.js.map → gltf-feature-skeleton-DKbOGidp.js.map} +1 -1
  68. package/{gltf-feature-variants-BphF4JmV.js → gltf-feature-variants-Cmzu0O0e.js} +2 -2
  69. package/{gltf-feature-variants-BphF4JmV.js.map → gltf-feature-variants-Cmzu0O0e.js.map} +1 -1
  70. package/{gltf-glb-parser-D6UZWFuC.js → gltf-glb-parser-Cj5MHS-v.js} +5 -4
  71. package/gltf-glb-parser-Cj5MHS-v.js.map +1 -0
  72. package/{gltf-interleave-C9eBqH_F.js → gltf-interleave-gHf9_t0i.js} +14 -14
  73. package/gltf-interleave-gHf9_t0i.js.map +1 -0
  74. package/{gltf-pbr-builder-ext-DPC0zg_u.js → gltf-pbr-builder-ext-edNcjwPf.js} +5 -5
  75. package/gltf-pbr-builder-ext-edNcjwPf.js.map +1 -0
  76. package/{gltf-variants-CnBEZr0o.js → gltf-variants-CPxNdtP4.js} +4 -4
  77. package/{gltf-variants-CnBEZr0o.js.map → gltf-variants-CPxNdtP4.js.map} +1 -1
  78. package/{gs-picking-pipeline-Bx8LTav6.js → gs-picking-pipeline-DYaW_Lg3.js} +14 -14
  79. package/gs-picking-pipeline-DYaW_Lg3.js.map +1 -0
  80. package/havok-floating-origin-Dr-18Nds.js +198 -0
  81. package/havok-floating-origin-Dr-18Nds.js.map +1 -0
  82. package/index-CLElg2Bo.js +39209 -0
  83. package/index-CLElg2Bo.js.map +1 -0
  84. package/index-CYZDclhF.js +918 -0
  85. package/index-CYZDclhF.js.map +1 -0
  86. package/index-SMJ67XwT.js +3330 -0
  87. package/index-SMJ67XwT.js.map +1 -0
  88. package/index.d.ts +2007 -105
  89. package/index.js +446 -322
  90. package/{input-block-Coi_aZwl.js → input-block-DqEedWF2.js} +2 -2
  91. package/{input-block-Coi_aZwl.js.map → input-block-DqEedWF2.js.map} +1 -1
  92. package/{iridescence-fragment-DwZcCTdD.js → iridescence-fragment-BHU59-gQ.js} +2 -2
  93. package/{iridescence-fragment-DwZcCTdD.js.map → iridescence-fragment-BHU59-gQ.js.map} +1 -1
  94. package/{light-block-Np_h5gPI.js → light-block-Bv37V8vl.js} +2 -2
  95. package/{light-block-Np_h5gPI.js.map → light-block-Bv37V8vl.js.map} +1 -1
  96. package/{loop-block-BFkLFYGm.js → loop-block-qTg8vb99.js} +2 -2
  97. package/{loop-block-BFkLFYGm.js.map → loop-block-qTg8vb99.js.map} +1 -1
  98. package/{morph-fragment-DqH-w61u.js → morph-fragment-BRCUr2wQ.js} +2 -2
  99. package/{morph-fragment-DqH-w61u.js.map → morph-fragment-BRCUr2wQ.js.map} +1 -1
  100. package/{multilight-wgsl-B9Mf9d-q.js → multilight-wgsl-DMeppAdZ.js} +2 -2
  101. package/{multilight-wgsl-B9Mf9d-q.js.map → multilight-wgsl-DMeppAdZ.js.map} +1 -1
  102. package/{node-env-BPZXZzBf.js → node-env-Bc559GmY.js} +6 -5
  103. package/node-env-Bc559GmY.js.map +1 -0
  104. package/node-geometry-view-COmWsRXK.js +291 -0
  105. package/node-geometry-view-COmWsRXK.js.map +1 -0
  106. package/{node-registry-extra-compat-Ch7ApZHF.js → node-registry-extra-compat-dWrv7gpS.js} +2 -2
  107. package/{node-registry-extra-compat-Ch7ApZHF.js.map → node-registry-extra-compat-dWrv7gpS.js.map} +1 -1
  108. package/{node-registry-extra-math-6ezzTkPj.js → node-registry-extra-math-Bn854sX9.js} +2 -2
  109. package/{node-registry-extra-math-6ezzTkPj.js.map → node-registry-extra-math-Bn854sX9.js.map} +1 -1
  110. package/{node-renderable-CS0CmsSp.js → node-renderable-B5G8WcdH.js} +15 -13
  111. package/node-renderable-B5G8WcdH.js.map +1 -0
  112. package/{node-shadow-CpnrdvtJ.js → node-shadow-CVIUlNf0.js} +7 -7
  113. package/node-shadow-CVIUlNf0.js.map +1 -0
  114. package/{normal-map-fragment-DradEMl-.js → normal-map-fragment-CQSxhjCy.js} +2 -2
  115. package/{normal-map-fragment-DradEMl-.js.map → normal-map-fragment-CQSxhjCy.js.map} +1 -1
  116. package/package.json +3 -10
  117. package/{parse-camera-CgV4bWc0.js → parse-camera-pBRT_6i5.js} +2 -2
  118. package/{parse-camera-CgV4bWc0.js.map → parse-camera-pBRT_6i5.js.map} +1 -1
  119. package/pbr-geometry-view-NiZY_juX.js +491 -0
  120. package/pbr-geometry-view-NiZY_juX.js.map +1 -0
  121. package/{pbr-metallic-roughness-block-BFwZj2Nw.js → pbr-metallic-roughness-block-JBSi-tQN.js} +2 -2
  122. package/{pbr-metallic-roughness-block-BFwZj2Nw.js.map → pbr-metallic-roughness-block-JBSi-tQN.js.map} +1 -1
  123. package/{pbr-metallic-roughness-block-full-5t0HT3xl.js → pbr-metallic-roughness-block-full-Ta9lR2cz.js} +2 -2
  124. package/{pbr-metallic-roughness-block-full-5t0HT3xl.js.map → pbr-metallic-roughness-block-full-Ta9lR2cz.js.map} +1 -1
  125. package/{pbr-mr-helper-core-R5tOZ8Ap.js → pbr-mr-helper-core-BVWNR08D.js} +2 -2
  126. package/{pbr-mr-helper-core-R5tOZ8Ap.js.map → pbr-mr-helper-core-BVWNR08D.js.map} +1 -1
  127. package/{pbr-refraction-Dd11HnaI.js → pbr-refraction-C9FvFmAp.js} +2 -2
  128. package/{pbr-refraction-Dd11HnaI.js.map → pbr-refraction-C9FvFmAp.js.map} +1 -1
  129. package/{pbr-renderable-BHAdF5Vw.js → pbr-renderable-DzUF2QIk.js} +60 -42
  130. package/pbr-renderable-DzUF2QIk.js.map +1 -0
  131. package/{pbr-shadow-fragment-BxUrFJYZ.js → pbr-shadow-fragment-CnqnbGYS.js} +2 -2
  132. package/{pbr-shadow-fragment-BxUrFJYZ.js.map → pbr-shadow-fragment-CnqnbGYS.js.map} +1 -1
  133. package/{pbr-tracking-D6i3yPb7.js → pbr-tracking-3tU1kqea.js} +2 -2
  134. package/{pbr-tracking-D6i3yPb7.js.map → pbr-tracking-3tU1kqea.js.map} +1 -1
  135. package/{pbr-transmission-ext-Dll8EYwE.js → pbr-transmission-ext-BcLjRxfB.js} +2 -2
  136. package/{pbr-transmission-ext-Dll8EYwE.js.map → pbr-transmission-ext-BcLjRxfB.js.map} +1 -1
  137. package/recast-navigation.wasm-DG_0AFuk.js +8706 -0
  138. package/recast-navigation.wasm-DG_0AFuk.js.map +1 -0
  139. package/recast-navigation.wasm-compat-C-Bf2ylB.js +8692 -0
  140. package/recast-navigation.wasm-compat-C-Bf2ylB.js.map +1 -0
  141. package/{reflectance-fragment-ejMJ4O1o.js → reflectance-fragment-Dbpgw3Jt.js} +2 -2
  142. package/{reflectance-fragment-ejMJ4O1o.js.map → reflectance-fragment-Dbpgw3Jt.js.map} +1 -1
  143. package/{rgbd-decode-DCvzUYeI.js → rgbd-decode-DoyUquy3.js} +7 -6
  144. package/rgbd-decode-DoyUquy3.js.map +1 -0
  145. package/{scene-material-swap-C2ykv55W.js → scene-material-swap-nNUH4nGn.js} +11 -4
  146. package/scene-material-swap-nNUH4nGn.js.map +1 -0
  147. package/screenshot-readback-D0Sj9qq3.js +92 -0
  148. package/screenshot-readback-D0Sj9qq3.js.map +1 -0
  149. package/{mesh-features-BAJpbMog.js → shader-composer-BUD_pSX4.js} +3 -54
  150. package/shader-composer-BUD_pSX4.js.map +1 -0
  151. package/{shader-renderable-BMf_vvO0.js → shader-renderable-D7-RyVxa.js} +25 -19
  152. package/shader-renderable-D7-RyVxa.js.map +1 -0
  153. package/{shader-thin-instance-5_WUfi3m.js → shader-thin-instance-DuBotxDO.js} +4 -4
  154. package/shader-thin-instance-DuBotxDO.js.map +1 -0
  155. package/{sheen-fragment-CS6z29Fs.js → sheen-fragment-1MkEMcbc.js} +2 -2
  156. package/{sheen-fragment-CS6z29Fs.js.map → sheen-fragment-1MkEMcbc.js.map} +1 -1
  157. package/{singlelight-directional-wgsl-4MIgZMeC.js → singlelight-directional-wgsl-BsV8G456.js} +2 -2
  158. package/{singlelight-directional-wgsl-4MIgZMeC.js.map → singlelight-directional-wgsl-BsV8G456.js.map} +1 -1
  159. package/{singlelight-hemispheric-wgsl-CK-GUYWe.js → singlelight-hemispheric-wgsl-Bo0jKlW5.js} +2 -2
  160. package/{singlelight-hemispheric-wgsl-CK-GUYWe.js.map → singlelight-hemispheric-wgsl-Bo0jKlW5.js.map} +1 -1
  161. package/{singlelight-point-wgsl-CYtzqCbP.js → singlelight-point-wgsl-DV39UP5Y.js} +2 -2
  162. package/{singlelight-point-wgsl-CYtzqCbP.js.map → singlelight-point-wgsl-DV39UP5Y.js.map} +1 -1
  163. package/{singlelight-spot-wgsl-DVbaVufF.js → singlelight-spot-wgsl-yg3od6vL.js} +2 -2
  164. package/{singlelight-spot-wgsl-DVbaVufF.js.map → singlelight-spot-wgsl-yg3od6vL.js.map} +1 -1
  165. package/{skeleton-fragment-BOVmc8YS.js → skeleton-fragment-DdxYG6kv.js} +2 -2
  166. package/{skeleton-fragment-BOVmc8YS.js.map → skeleton-fragment-DdxYG6kv.js.map} +1 -1
  167. package/{skybox-renderable-DDcCPSly.js → skybox-renderable-CJD4XmX5.js} +7 -8
  168. package/skybox-renderable-CJD4XmX5.js.map +1 -0
  169. package/{splat-ply-compressed-BahdBG1r.js → splat-ply-compressed-DHjyiVmI.js} +9 -8
  170. package/splat-ply-compressed-DHjyiVmI.js.map +1 -0
  171. package/{standard-renderable-D1bhoF0K.js → standard-pipeline-XTbHL7MY.js} +11 -202
  172. package/standard-pipeline-XTbHL7MY.js.map +1 -0
  173. package/standard-renderable-CREWLNHI.js +191 -0
  174. package/standard-renderable-CREWLNHI.js.map +1 -0
  175. package/{std-ambient-fragment-C6WNm8dQ.js → std-ambient-fragment-Bjx3VFrr.js} +2 -2
  176. package/{std-ambient-fragment-C6WNm8dQ.js.map → std-ambient-fragment-Bjx3VFrr.js.map} +1 -1
  177. package/{std-cube-reflection-fragment-Bqutpy2q.js → std-cube-reflection-fragment-y9WWdXUt.js} +2 -2
  178. package/{std-cube-reflection-fragment-Bqutpy2q.js.map → std-cube-reflection-fragment-y9WWdXUt.js.map} +1 -1
  179. package/{std-emissive-fragment-B-A83rqX.js → std-emissive-fragment-C8Lnmojh.js} +2 -2
  180. package/{std-emissive-fragment-B-A83rqX.js.map → std-emissive-fragment-C8Lnmojh.js.map} +1 -1
  181. package/{std-lightmap-fragment-Df7KJezh.js → std-lightmap-fragment-DFxGcoA5.js} +2 -2
  182. package/{std-lightmap-fragment-Df7KJezh.js.map → std-lightmap-fragment-DFxGcoA5.js.map} +1 -1
  183. package/{std-opacity-fragment-D9et2jip.js → std-opacity-fragment-EXzFWiSp.js} +2 -2
  184. package/{std-opacity-fragment-D9et2jip.js.map → std-opacity-fragment-EXzFWiSp.js.map} +1 -1
  185. package/{std-reflection-fragment-DBJeT-yg.js → std-reflection-fragment-BoJORqpG.js} +2 -2
  186. package/{std-reflection-fragment-DBJeT-yg.js.map → std-reflection-fragment-BoJORqpG.js.map} +1 -1
  187. package/{std-shadow-fragment-C6fD8rW-.js → std-shadow-fragment-Bq-Wc8UJ.js} +2 -2
  188. package/{std-shadow-fragment-C6fD8rW-.js.map → std-shadow-fragment-Bq-Wc8UJ.js.map} +1 -1
  189. package/{std-specular-fragment-C2ZOss-t.js → std-specular-fragment-CM5R5j2g.js} +2 -2
  190. package/{std-specular-fragment-C2ZOss-t.js.map → std-specular-fragment-CM5R5j2g.js.map} +1 -1
  191. package/{std-tracking-C4L4nQGc.js → std-tracking-Cif_wXeT.js} +2 -2
  192. package/{std-tracking-C4L4nQGc.js.map → std-tracking-Cif_wXeT.js.map} +1 -1
  193. package/{subsurface-fragment-C1H4ytqK.js → subsurface-fragment-BEaAXYXz.js} +2 -2
  194. package/{subsurface-fragment-C1H4ytqK.js.map → subsurface-fragment-BEaAXYXz.js.map} +1 -1
  195. package/swapchain-overlay-UCLilhbq.js +37 -0
  196. package/swapchain-overlay-UCLilhbq.js.map +1 -0
  197. package/{thin-instance-cull-binding-CCxrPNO6.js → thin-instance-cull-binding-DWKUt5ZN.js} +12 -12
  198. package/thin-instance-cull-binding-DWKUt5ZN.js.map +1 -0
  199. package/{thin-instance-gpu-E8DBd8XL.js → thin-instance-gpu-BDdRcNAh.js} +15 -7
  200. package/thin-instance-gpu-BDdRcNAh.js.map +1 -0
  201. package/{tracking-primitives-w4BVV9p9.js → tracking-primitives-CglRNTlX.js} +2 -2
  202. package/{tracking-primitives-w4BVV9p9.js.map → tracking-primitives-CglRNTlX.js.map} +1 -1
  203. package/{unlit-fragment-DU9_mhzZ.js → unlit-fragment-kxfZWlnp.js} +2 -2
  204. package/{unlit-fragment-DU9_mhzZ.js.map → unlit-fragment-kxfZWlnp.js.map} +1 -1
  205. package/_mat4-storage-f64-Bvh5TymE.js.map +0 -1
  206. package/assets/splat-sort-worker-Crg3CaCc.js.map +0 -1
  207. package/background-dds-skybox-ZjrSIxrT.js.map +0 -1
  208. package/background-ground-B2Mie-MI.js.map +0 -1
  209. package/background-hdr-skybox-DDRJYuT2.js.map +0 -1
  210. package/background-solid-skybox-fjXlnWaD.js.map +0 -1
  211. package/billboard-renderable-DKmlOgbM.js.map +0 -1
  212. package/create-skeleton-BBI5urcj.js.map +0 -1
  213. package/cubemap-skybox-material-DvW81drX.js.map +0 -1
  214. package/emissive-fragment-DD8cvHyx.js.map +0 -1
  215. package/gaussian-splatting-pipeline-sh-BvkUhA9V.js.map +0 -1
  216. package/gltf-animation-KnPzeOIY.js.map +0 -1
  217. package/gltf-ext-basisu-kmth3UWX.js.map +0 -1
  218. package/gltf-ext-quantization-CpZyLDIz.js.map +0 -1
  219. package/gltf-feature-animation-pointer-rFqLfbO_.js.map +0 -1
  220. package/gltf-feature-draco-yGSMGTE3.js.map +0 -1
  221. package/gltf-feature-gpu-instancing-Cj1XjmM6.js.map +0 -1
  222. package/gltf-feature-meshopt-Des96YFI.js.map +0 -1
  223. package/gltf-feature-morph-BAcY14XU.js.map +0 -1
  224. package/gltf-glb-parser-D6UZWFuC.js.map +0 -1
  225. package/gltf-interleave-C9eBqH_F.js.map +0 -1
  226. package/gltf-pbr-builder-ext-DPC0zg_u.js.map +0 -1
  227. package/gs-picking-pipeline-Bx8LTav6.js.map +0 -1
  228. package/index-B7Qhw0xL.js +0 -21232
  229. package/index-B7Qhw0xL.js.map +0 -1
  230. package/mesh-features-BAJpbMog.js.map +0 -1
  231. package/no-color-view-DsyLSL-W.js +0 -8
  232. package/no-color-view-DsyLSL-W.js.map +0 -1
  233. package/node-env-BPZXZzBf.js.map +0 -1
  234. package/node-registry-Bd-AlrgC.js +0 -190
  235. package/node-registry-Bd-AlrgC.js.map +0 -1
  236. package/node-renderable-CS0CmsSp.js.map +0 -1
  237. package/node-shadow-CpnrdvtJ.js.map +0 -1
  238. package/pbr-renderable-BHAdF5Vw.js.map +0 -1
  239. package/rgbd-decode-DCvzUYeI.js.map +0 -1
  240. package/scene-material-swap-C2ykv55W.js.map +0 -1
  241. package/shader-renderable-BMf_vvO0.js.map +0 -1
  242. package/shader-thin-instance-5_WUfi3m.js.map +0 -1
  243. package/skybox-renderable-DDcCPSly.js.map +0 -1
  244. package/splat-ply-compressed-BahdBG1r.js.map +0 -1
  245. package/standard-renderable-D1bhoF0K.js.map +0 -1
  246. package/swapchain-overlay-DcCSFDp7.js +0 -35
  247. package/swapchain-overlay-DcCSFDp7.js.map +0 -1
  248. package/thin-instance-cull-binding-CCxrPNO6.js.map +0 -1
  249. package/thin-instance-gpu-E8DBd8XL.js.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pbr-geometry-view-NiZY_juX.js","sources":["../src/material/pbr/pbr-geometry-output-shader.ts","../src/material/pbr/pbr-geometry-renderable.ts","../src/material/pbr/pbr-geometry-view.ts"],"sourcesContent":["/** PBR geometry-output shader composer.\n *\n * Builds the WGSL for a {@link createPbrGeometryMaterialView}-wrapped PBR\n * material that targets the geometry-renderer MRT pass.\n *\n * Design — *zero bundle impact* on PBR scenes that never load the\n * geometry-renderer task:\n *\n * 1. Reuse the per-scene {@link composePbr} captured on the scene context.\n * The composer already wires every PBR feature (IBL, shadows, lights,\n * clearcoat, sheen, iridescence, anisotropy, subsurface, alpha-test,\n * emissive, tonemap, …); none of it needs re-implementing for the\n * real-colour attachment.\n * 2. Register a PBR extension that, only when `PBR2_GEOMETRY_OUTPUT` is on,\n * contributes a small `geometry-params` ShaderFragment carrying the\n * `gp` UBO + per-attachment varyings (vCurrentClip / vPreviousClip /\n * vLocalPos). Off otherwise — no impact on regular PBR composes.\n * 3. Post-process the composed fragment WGSL: change the entry signature\n * to return a `FragmentOutput` MRT struct, inject the struct\n * declaration, and replace the alpha-block `return …` with code that\n * writes each requested geometry attachment from the in-scope PBR\n * intermediates (`N`, `surfaceAlbedo`, `colorF0`, `roughness`,\n * `microSurface`, `finalIrradiance`, `input.worldPos`, …).\n *\n * The lighting / tonemap / gamma pipeline still runs in full, producing\n * the lit `color` written to the optional real-colour attachment. */\n\nimport type { ComposedShader, ShaderFragment, Varying } from \"../../shader/fragment-types.js\";\nimport { GeometryTextureType } from \"../../frame-graph/geometry-types.js\";\nimport { PBR_HAS_ALPHA_BLEND, PBR_HAS_ENV, PBR2_GEOMETRY_OUTPUT, _registerPbrExt, type _PbrBindCtx, type _PbrFragCtx, type PbrExt } from \"./pbr-flags.js\";\nimport type { createPbrComposer, PbrLightMode } from \"./pbr-compose.js\";\nimport type { MeshVbLayout } from \"../../mesh/mesh.js\";\n\nconst STAGE_FRAGMENT = 0x2;\nconst STAGE_VERTEX = 0x1;\n\n// ─── PBR extension contributing the geometry-params fragment ──────────\n\nfunction needsGpUbo(attachments: readonly GeometryTextureType[]): boolean {\n for (const t of attachments) {\n if (t === GeometryTextureType.NORMALIZED_VIEW_DEPTH || t === GeometryTextureType.LINEAR_VELOCITY) {\n return true;\n }\n }\n return false;\n}\n\nfunction needsVelocity(attachments: readonly GeometryTextureType[]): boolean {\n return attachments.includes(GeometryTextureType.LINEAR_VELOCITY);\n}\n\nfunction needsLocalPos(attachments: readonly GeometryTextureType[]): boolean {\n return attachments.includes(GeometryTextureType.LOCAL_POSITION);\n}\n\n/** ShaderFragment contributing the `gp` UBO + (optionally) velocity / local-pos varyings.\n * PBR-specific: world-position varying is `out.worldPos`. */\nfunction createPbrGeometryParamsFragment(needsParamsUbo: boolean, needsVelocityVaryings: boolean, needsLocalPosVarying: boolean): ShaderFragment {\n const bindings = needsParamsUbo ? [{ _name: \"gp\", _type: { _kind: \"uniform-buffer\" as const }, _visibility: STAGE_FRAGMENT | STAGE_VERTEX }] : [];\n const helpers = needsParamsUbo ? `struct gpUniforms { previousViewProjection: mat4x4<f32>, cameraNearFar: vec4<f32>, };` : \"\";\n const varyings: Varying[] = [];\n if (needsVelocityVaryings) {\n varyings.push({ _name: \"vCurrentClip\", _type: \"vec4<f32>\" }, { _name: \"vPreviousClip\", _type: \"vec4<f32>\" });\n }\n if (needsLocalPosVarying) {\n varyings.push({ _name: \"vLocalPos\", _type: \"vec3<f32>\" });\n }\n const vbParts: string[] = [];\n if (needsVelocityVaryings) {\n vbParts.push(`out.vCurrentClip = scene.viewProjection * vec4<f32>(out.worldPos, 1.0);`);\n vbParts.push(`out.vPreviousClip = gp.previousViewProjection * vec4<f32>(out.worldPos, 1.0);`);\n }\n if (needsLocalPosVarying) {\n vbParts.push(`out.vLocalPos = position;`);\n }\n const slots: ShaderFragment[\"_vertexSlots\"] = vbParts.length > 0 ? { VB: vbParts.join(\"\\n\") } : {};\n return {\n _id: \"pbr-geometry-params\",\n _bindings: bindings,\n _helperFunctions: helpers,\n _vertexHelperFunctions: helpers,\n _varyings: varyings,\n _vertexSlots: slots,\n };\n}\n\n/** PBR extension that wires the geometry-params fragment + gp UBO bind entry.\n * Off-path for any scene that doesn't request `PBR2_GEOMETRY_OUTPUT`. */\nlet _pbrGeomExtRegistered = false;\n\n/** @internal Registers (idempotent) the PBR extension that wires up the\n * geometry-output `gp` UBO and varyings. Called by the geometry view at\n * first use so non-geometry PBR scenes pay zero bytes. */\nexport function _ensurePbrGeometryExt(getAttachments: () => readonly GeometryTextureType[] | undefined): void {\n if (_pbrGeomExtRegistered) {\n return;\n }\n _pbrGeomExtRegistered = true;\n const ext: PbrExt = {\n id: \"pbr-geometry-params\",\n // Fragment-phase so bind entry is appended after all other PBR exts.\n phase: \"fragment\",\n frag(ctx: _PbrFragCtx): ShaderFragment | null {\n if ((ctx._features2 & PBR2_GEOMETRY_OUTPUT) === 0) {\n return null;\n }\n const att = getAttachments() ?? [];\n const wantsGp = needsGpUbo(att);\n const wantsVelocity = needsVelocity(att);\n const wantsLocalPos = needsLocalPos(att);\n if (!wantsGp && !wantsVelocity && !wantsLocalPos) {\n return null;\n }\n return createPbrGeometryParamsFragment(wantsGp, wantsVelocity, wantsLocalPos);\n },\n bind(ctx: _PbrBindCtx, entries: GPUBindGroupEntry[], b: number): number {\n if ((ctx._features2 & PBR2_GEOMETRY_OUTPUT) === 0) {\n return b;\n }\n const view = ctx._material as { _gpUBO?: GPUBuffer | null };\n if (view._gpUBO) {\n entries.push({ binding: b++, resource: { buffer: view._gpUBO } });\n }\n return b;\n },\n };\n _registerPbrExt(ext);\n}\n\n// ─── Per-attachment WGSL expressions ──────────────────────────────────\n\n/** Per-attachment WGSL output expression. Symbols are resolved against the\n * in-scope PBR fragment vars at the BC slot location (after tonemap +\n * gamma + contrast; same scope as the alpha-block).\n * @internal */\nfunction attachmentExpr(type: GeometryTextureType, wg: string, hasIbl: boolean): string {\n switch (type) {\n case GeometryTextureType.IRRADIANCE:\n // BJS PREPASS_IRRADIANCE (pbrBlockPrePass.fx): `finalDiffuse + finalIrradiance`\n // — direct-light diffuse plus the IBL diffuse contribution (already multiplied\n // by surfaceAlbedo / occlusion), NOT the raw SH irradiance. Lite's equivalents\n // are `directDiffuse` (direct) and `finalIrradiance` (= environmentIrradiance *\n // surfaceAlbedo * occlusion, ibl-fragment.ts). Both are pre-tonemap, matching BJS.\n return hasIbl ? `vec4<f32>(directDiffuse + finalIrradiance, ${wg})` : `vec4<f32>(directDiffuse, ${wg})`;\n case GeometryTextureType.WORLD_POSITION:\n return `vec4<f32>(input.worldPos, ${wg})`;\n case GeometryTextureType.LOCAL_POSITION:\n return `vec4<f32>(input.vLocalPos, ${wg})`;\n case GeometryTextureType.REFLECTIVITY:\n // BJS PREPASS_REFLECTIVITY (pbrBlockPrePass.fx): `vec4(specularEnvironmentR0, microSurface)`\n // — LINEAR F0 reflectance (no gamma) in RGB, microSurface (= 1 - roughness) in A,\n // the whole vec4 masked by writeGeometryInfo. Lite's `colorF0` is the F0 reflectance.\n return `vec4<f32>(colorF0, 1.0 - roughness) * ${wg}`;\n case GeometryTextureType.VIEW_DEPTH:\n return `vec4<f32>((scene.view * vec4<f32>(input.worldPos, 1.0)).z, 0.0, 0.0, ${wg})`;\n case GeometryTextureType.NORMALIZED_VIEW_DEPTH:\n return `vec4<f32>(((scene.view * vec4<f32>(input.worldPos, 1.0)).z - gp.cameraNearFar.x) / (gp.cameraNearFar.y - gp.cameraNearFar.x), 0.0, 0.0, ${wg})`;\n case GeometryTextureType.SCREENSPACE_DEPTH:\n return `vec4<f32>(input.clipPos.z, 0.0, 0.0, ${wg})`;\n case GeometryTextureType.VIEW_NORMAL:\n return `vec4<f32>(normalize((scene.view * vec4<f32>(N, 0.0)).xyz), ${wg})`;\n case GeometryTextureType.WORLD_NORMAL:\n return `vec4<f32>(N * 0.5 + vec3<f32>(0.5), ${wg})`;\n case GeometryTextureType.ALBEDO:\n // BJS uses `surfaceAlbedo` for PBR (post diffuse / metallic split).\n return `vec4<f32>(surfaceAlbedo, ${wg})`;\n case GeometryTextureType.LINEAR_VELOCITY: {\n const cur = `(input.vCurrentClip.xy / input.vCurrentClip.w)`;\n const prev = `(input.vPreviousClip.xy / input.vPreviousClip.w)`;\n return `vec4<f32>(0.5 * (${prev} - ${cur}), 0.0, ${wg})`;\n }\n }\n}\n\n// ─── Composer entry ────────────────────────────────────────────────────\n\n/** Compose a PBR geometry-output shader by reusing the per-scene composer\n * and post-patching the resulting WGSL into MRT form. */\nexport function composePbrGeometryShader(\n composePbr: ReturnType<typeof createPbrComposer>,\n features: number,\n features2: number,\n meshFeatures: number,\n sceneFeatures: number,\n lightMode: PbrLightMode,\n singleLightType: string,\n esmShadowDepthCode: string,\n vbStrides: MeshVbLayout | undefined,\n vbKey: string,\n attachments: readonly GeometryTextureType[],\n emitColor: boolean\n): ComposedShader {\n // Strip PBR_HAS_ALPHA_BLEND: the template's alpha-blend branch returns\n // `finalAlpha = saturate(alpha + luminanceOverAlpha²)` which we don't need\n // — we drive blending per attachment via the geometry pipeline state and\n // gate writes via the `writeGeometryInfo` mask. Stripping yields the\n // simple `return vec4<f32>(color,alpha*material.materialAlpha);` alpha\n // block which is easier to pattern-match for the replacement.\n const geomFeatures = features & ~PBR_HAS_ALPHA_BLEND;\n // Tag the cache key with PBR2_GEOMETRY_OUTPUT so the geometry composed\n // shader doesn't collide with the regular non-geometry one in composePbr's\n // internal cache.\n const geomFeatures2 = features2 | PBR2_GEOMETRY_OUTPUT;\n\n const base = composePbr(\n geomFeatures,\n geomFeatures2,\n meshFeatures,\n sceneFeatures,\n lightMode,\n singleLightType,\n esmShadowDepthCode,\n vbStrides,\n `${vbKey}:geom:${attachments.join(\",\")}:${emitColor ? \"c\" : \"\"}`\n );\n\n const hasIbl = (sceneFeatures & PBR_HAS_ENV) !== 0;\n\n // ── Post-process the fragment WGSL ────────────────────────────────────\n\n // 1) Swap the entry signature.\n const fragmentSignatureFrom = \"-> @location(0) vec4<f32>\";\n const fragmentSignatureTo = \"-> FragmentOutput\";\n if (!base._fragmentWGSL.includes(fragmentSignatureFrom)) {\n throw new Error(\"composePbrGeometryShader: PBR fragment signature mismatch — _noColorOutput/_esmShadowOutput should be off\");\n }\n let frag = base._fragmentWGSL.replace(fragmentSignatureFrom, fragmentSignatureTo);\n\n // 2) Inject FragmentOutput struct before `@fragment fn main`. When\n // `emitColor` is true, append an extra slot at @location(N) for the\n // real lit colour (matches BJS `targetTexture`).\n const colorSlot = attachments.length;\n const extraColorLine = emitColor ? `\\n@location(${colorSlot}) color: vec4<f32>,` : \"\";\n const outputStruct = `struct FragmentOutput {\n${attachments.map((_, i) => `@location(${i}) f${i}: vec4<f32>,`).join(\"\\n\")}${extraColorLine}\n};\n`;\n frag = frag.replace(\"@fragment fn main\", `${outputStruct}@fragment fn main`);\n\n // 3) Replace the alpha-block return with MRT writes. With ALPHA_BLEND\n // stripped, the template emits the simpler return form.\n const wg = `select(0.0, 1.0, alpha > 0.4)`;\n const writes = attachments.map((type, i) => `out.f${i} = ${attachmentExpr(type, wg, hasIbl)};`).join(\"\\n\");\n const extraColorWrite = emitColor ? `\\nout.color = vec4<f32>(color, alpha * material.materialAlpha);` : \"\";\n const replacement = `var out: FragmentOutput;\n${writes}${extraColorWrite}\nreturn out;`;\n const returnPattern = \"return vec4<f32>(color,alpha*material.materialAlpha);\";\n if (!frag.includes(returnPattern)) {\n throw new Error(\"composePbrGeometryShader: alpha-block return statement not found — template changed?\");\n }\n frag = frag.replace(returnPattern, replacement);\n\n return { ...base, _fragmentWGSL: frag };\n}\n","/** PBR geometry-MRT renderable factory.\n *\n * Builds a {@link Renderable} that draws a single mesh through a\n * {@link createPbrGeometryMaterialView} into the geometry renderer task's\n * multi-attachment render target. Mirrors the regular PBR per-mesh\n * rebuildSingle closure (mesh UBO, material UBO, mesh bind group with env +\n * shadows, draw closure) but swaps the single-target pipeline for a\n * multi-color-attachment one built from the geometry-output shader.\n *\n * Per-(view, mesh-feature-variant) shared state — composed shader, mesh\n * BGL, pipeline cache — is cached on `view._geometry` keyed by the\n * shader-relevant mesh-feature bits + (features, features2, sceneFeatures,\n * lightMode, singleLightType). Per-mesh state (UBOs, bind group, sort\n * centre) lives in the closure returned by {@link buildPbrGeometryRenderable}.\n *\n * This module is imported only by {@link createPbrGeometryMaterialView} —\n * PBR scenes that don't use the geometry renderer task pay zero bytes for\n * it. */\n\nimport { F32 } from \"../../engine/typed-arrays.js\";\nimport type { EngineContext } from \"../../engine/engine.js\";\nimport type { RenderTargetSignature } from \"../../engine/render-target.js\";\nimport type { Mesh } from \"../../mesh/mesh.js\";\nimport type { MeshGroupBuilder, Renderable } from \"../../render/renderable.js\";\nimport { writeMeshLightSelection } from \"../../render/lights-ubo.js\";\nimport type { SceneContext } from \"../../scene/scene-core.js\";\nimport { createUniformBuffer } from \"../../resource/gpu-buffers.js\";\nimport { acquireTexture, releaseTexture } from \"../../resource/gpu-pool.js\";\nimport type { ComposedShader } from \"../../shader/fragment-types.js\";\nimport { targetSignatureKey, REVERSE_DEPTH_COMPARE } from \"../../engine/render-target.js\";\nimport { packMat4IntoF32 } from \"../../math/pack-mat4-into-f32.js\";\nimport { _computeMeshFeatures, MSH_HAS_INSTANCE_COLOR, MSH_HAS_THIN_INSTANCES, MSH_HAS_TANGENTS, MSH_HAS_UV2, MSH_HAS_VERTEX_COLOR } from \"../mesh-features.js\";\nimport type { Material } from \"../material.js\";\nimport { getSceneBindGroupLayout } from \"../../render/scene-helpers.js\";\n\nimport type { PbrMaterialProps } from \"./pbr-material.js\";\nimport { collectPbrBoundTextures } from \"./pbr-material.js\";\nimport { _computePbrMaterialFeatures } from \"./pbr-material.js\";\nimport { PBR_HAS_ALPHA_BLEND, PBR_HAS_DOUBLE_SIDED, PBR_HAS_NORMAL_MAP, PBR2_HAS_UV2 } from \"./pbr-flags.js\";\nimport { createPbrMeshBindGroup } from \"./pbr-pipeline.js\";\nimport type { _PbrGeometryContext } from \"./pbr-renderable.js\";\nimport { _writeMaterialData } from \"./pbr-renderable.js\";\nimport type { PbrGeometryMaterialView } from \"./pbr-geometry-view.js\";\nimport { composePbrGeometryShader, _ensurePbrGeometryExt } from \"./pbr-geometry-output-shader.js\";\nimport { _setActivePbrGeometryAttachments } from \"./pbr-geometry-view.js\";\n\n/** Singleton {@link MeshGroupBuilder} that geometry views point at via their\n * overridden `_buildGroup`. The async builder body is unreachable —\n * geometry views are dispatched per-mesh via `_rebuildSingle` directly. */\nexport const pbrGeometryGroupBuilder: MeshGroupBuilder = (async () => {\n throw new Error(\"pbr-geometry view does not support scene group building\");\n}) as MeshGroupBuilder;\npbrGeometryGroupBuilder._rebuildSingle = (scene: SceneContext, mesh: Mesh, materialOverride?: Material): Renderable => {\n const view = (materialOverride ?? mesh.material) as PbrGeometryMaterialView;\n return buildPbrGeometryRenderable(scene, mesh, view);\n};\npbrGeometryGroupBuilder._materialFamily = \"pbr\";\n\ninterface PbrGeometryViewResources {\n _composed: ComposedShader;\n _features: number;\n _features2: number;\n _meshFeatures: number;\n _sceneFeatures: number;\n _meshBGL: GPUBindGroupLayout;\n _shadowBGL: GPUBindGroupLayout | null;\n _pipelineLayout: GPUPipelineLayout;\n _vertModule: GPUShaderModule;\n _fragModule: GPUShaderModule;\n _pipelines: Map<string, GPURenderPipeline>;\n _alphaBlend: boolean;\n}\n\nfunction _variantKey(meshFeatures: number, lightMode: number, singleLightType: string): string {\n return `${meshFeatures}:${lightMode}:${singleLightType}`;\n}\n\n/** Build a {@link Renderable} for one mesh drawn through a PBR geometry view. */\nexport function buildPbrGeometryRenderable(scene: SceneContext, mesh: Mesh, view: PbrGeometryMaterialView): Renderable {\n const engine = scene.surface.engine;\n const device = engine._device;\n\n const ctx = (scene as SceneContext & { _pbrGeomContext?: _PbrGeometryContext })._pbrGeomContext;\n if (!ctx) {\n throw new Error(\"buildPbrGeometryRenderable: scene has no PBR context. Ensure regular PBR meshes have been built before recording the geometry task.\");\n }\n\n const source = view.source as PbrMaterialProps;\n if (!source._renderFeatures) {\n source._renderFeatures = _computePbrMaterialFeatures(source);\n }\n\n // Light selection mirrors regular PBR rebuildSingle, gated by the same\n // shadow rules so the geometry-pass real-color attachment receives the\n // same lighting as the regular PBR pass would have produced.\n const lr = writeMeshLightSelection(mesh, scene.lights);\n const lightCount = lr > 0 ? 1 : -lr;\n const hasSomeShadows = ctx._shadowLights.length > 0;\n const receiveShadows = mesh.receiveShadows && hasSomeShadows;\n const lightMode: 0 | 1 | 2 = lightCount === 0 ? 0 : lightCount === 1 && !receiveShadows ? 1 : 2;\n const singleLightType = lightMode === 1 ? _getPackedSingleLightType(scene.lights, lr - 1) : \"\";\n const meshFeatures = _computeMeshFeatures(mesh, receiveShadows);\n\n const variantKey = _variantKey(meshFeatures, lightMode, singleLightType);\n const res = _ensureViewResources(view, engine, ctx, meshFeatures, lightMode, singleLightType, variantKey);\n\n const features = res._features;\n const features2 = res._features2;\n const composed = res._composed;\n\n // ── Mesh UBO ───────────────────────────────────────────────────────\n const meshUboData = new F32(composed._meshUboSpec._totalBytes / 4);\n const _packMeshWorld = engine._makePackMeshWorld?.(scene) ?? packMat4IntoF32;\n _packMeshWorld(meshUboData, mesh.worldMatrix, 0, 0);\n writeMeshLightSelection(mesh, scene.lights, meshUboData);\n const meshUBO = createUniformBuffer(engine, meshUboData);\n\n // ── Material UBO ───────────────────────────────────────────────────\n const materialSpec = composed._materialUboSpec!;\n const matInitData = new F32(materialSpec._totalBytes / 4);\n // Use the per-scene writer captured on the geometry context.\n _writePbrMaterialData(matInitData, source, materialSpec);\n const materialUBO = createUniformBuffer(engine, matInitData);\n\n // ── Mesh bind group (group 1). Pass the VIEW as the \"material\" so the\n // PBR geometry ext can read `view._gpUBO`. The view inherits all\n // source fields via its prototype chain, so other ext bind callbacks\n // that look at source.* still resolve correctly.\n //\n // Bind during a scope where `_activeAttachments` is set so that any\n // composePbr cache miss inside `createPbrMeshBindGroup` (none expected\n // here, but defensive) sees the right attachments.\n const prev = _setActivePbrGeometryAttachments(view._geometryAttachments);\n let materialBindGroupStatic: GPUBindGroup;\n try {\n materialBindGroupStatic = createPbrMeshBindGroup(engine, _wrapBindings(res), composed, meshUBO, materialUBO, view as unknown as PbrMaterialProps, ctx._envTextures, mesh);\n } finally {\n _setActivePbrGeometryAttachments(prev);\n }\n\n // ── Shadow bind group (group 2) ────────────────────────────────────\n let shadowBindGroup: GPUBindGroup | null = null;\n if (receiveShadows && res._shadowBGL) {\n const entries: GPUBindGroupEntry[] = [];\n let b = 0;\n for (const sl of ctx._shadowLights) {\n const sg = sl.gen;\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 shadowBindGroup = device.createBindGroup({ layout: res._shadowBGL, entries });\n }\n\n // ── Texture acquire/release lifecycle ──────────────────────────────\n const boundTextures = collectPbrBoundTextures(source);\n for (const t of boundTextures) {\n acquireTexture(t);\n }\n const prevDisposables = scene._meshDisposables.get(mesh) ?? [];\n scene._meshDisposables.set(mesh, [\n ...prevDisposables,\n () => {\n meshUBO.destroy();\n materialUBO.destroy();\n },\n () => {\n for (const t of boundTextures) {\n releaseTexture(t);\n }\n },\n ]);\n\n const hasNormalMap = (features & PBR_HAS_NORMAL_MAP) !== 0 && (meshFeatures & MSH_HAS_TANGENTS) !== 0;\n const hasUV2 = (features2 & PBR2_HAS_UV2) !== 0 && (meshFeatures & MSH_HAS_UV2) !== 0;\n const hasVertexColor = (meshFeatures & MSH_HAS_VERTEX_COLOR) !== 0;\n const hasTI = (meshFeatures & MSH_HAS_THIN_INSTANCES) !== 0;\n const hasTIColor = (meshFeatures & MSH_HAS_INSTANCE_COLOR) !== 0;\n const syncThinInstanceBuffers = ctx._syncThinInstanceBuffers;\n const isAlphaBlend = res._alphaBlend;\n const sortCenter = [mesh.worldMatrix[12]!, mesh.worldMatrix[13]!, mesh.worldMatrix[14]!] as [number, number, number];\n\n let _lastWorldVersion = mesh.worldMatrixVersion;\n let _lastLightsCount = scene.lights.length;\n let _lastUboVersion = source._uboVersion;\n const matScratch = new F32(materialSpec._totalBytes / 4);\n\n const _baseUpdate = (): void => {\n if (mesh.worldMatrixVersion !== _lastWorldVersion || scene.lights.length !== _lastLightsCount) {\n sortCenter[0] = mesh.worldMatrix[12]!;\n sortCenter[1] = mesh.worldMatrix[13]!;\n sortCenter[2] = mesh.worldMatrix[14]!;\n _packMeshWorld(meshUboData, mesh.worldMatrix, 0, 0);\n writeMeshLightSelection(mesh, scene.lights, meshUboData);\n device.queue.writeBuffer(meshUBO, 0, meshUboData as Float32Array<ArrayBuffer>);\n _lastWorldVersion = mesh.worldMatrixVersion;\n _lastLightsCount = scene.lights.length;\n }\n if (source._uboVersion !== _lastUboVersion) {\n _lastUboVersion = source._uboVersion;\n matScratch.fill(0);\n _writePbrMaterialData(matScratch, source, materialSpec);\n device.queue.writeBuffer(materialUBO, 0, matScratch.buffer, 0, matScratch.byteLength);\n }\n };\n const _invalidate = (): void => {\n _lastWorldVersion = -1;\n };\n const update = engine._wrapRenderableForFO?.(_baseUpdate, scene, _invalidate) ?? _baseUpdate;\n\n const draw = (pass: GPURenderPassEncoder | GPURenderBundleEncoder): number => {\n if (mesh.visible === false) {\n return 0;\n }\n const gpu = mesh._gpu;\n pass.setBindGroup(1, materialBindGroupStatic);\n if (shadowBindGroup) {\n pass.setBindGroup(2, shadowBindGroup);\n }\n let slot = 0;\n const vb = gpu._vbLayout;\n pass.setVertexBuffer(slot++, gpu.positionBuffer, vb?._p?._offset);\n pass.setVertexBuffer(slot++, gpu.normalBuffer, vb?._n?._offset);\n if (hasNormalMap && gpu.tangentBuffer) {\n pass.setVertexBuffer(slot++, gpu.tangentBuffer, vb?._t?._offset);\n }\n pass.setVertexBuffer(slot++, gpu.uvBuffer, vb?._u?._offset);\n if (hasUV2 && gpu.uv2Buffer) {\n pass.setVertexBuffer(slot++, gpu.uv2Buffer, vb?._u2?._offset);\n }\n if (hasVertexColor && gpu.colorBuffer) {\n pass.setVertexBuffer(slot++, gpu.colorBuffer, vb?._c?._offset);\n }\n // Skinning vertex buffers: live skeleton OR baked VAT (same field names, mutually exclusive).\n // Mirrors the main PBR renderable — without the VAT branch, VAT-animated thin instances leave the\n // pipeline's joint/weight vertex slots unbound (invalid command buffer, black frame).\n const skin = mesh.skeleton ?? mesh.vat;\n if (skin) {\n pass.setVertexBuffer(slot++, skin.jointsBuffer);\n pass.setVertexBuffer(slot++, skin.weightsBuffer);\n if (skin.joints1Buffer && skin.weights1Buffer) {\n pass.setVertexBuffer(slot++, skin.joints1Buffer);\n pass.setVertexBuffer(slot++, skin.weights1Buffer);\n }\n }\n const ti = hasTI ? mesh.thinInstances : null;\n if (ti && syncThinInstanceBuffers) {\n slot = syncThinInstanceBuffers(engine, ti, pass, slot, hasTIColor);\n }\n pass.setIndexBuffer(gpu.indexBuffer, gpu.indexFormat);\n if (ti && ti.count > 0) {\n pass.drawIndexed(gpu.indexCount, ti.count);\n } else {\n pass.drawIndexed(gpu.indexCount);\n }\n return 1;\n };\n\n const r: Renderable = {\n order: mesh.renderOrder ?? (isAlphaBlend ? 200 : 100),\n isTransparent: isAlphaBlend,\n mesh,\n bind(eng: EngineContext, sig: RenderTargetSignature) {\n return {\n renderable: r,\n pipeline: _getOrCreateGeometryPipeline(eng as EngineContext, sig, view, res),\n update,\n draw,\n };\n },\n };\n r._worldCenter = sortCenter;\n return r;\n}\n\n// ─── Shared per-view resources ─────────────────────────────────────────\n\nfunction _ensureViewResources(\n view: PbrGeometryMaterialView,\n engine: EngineContext,\n ctx: _PbrGeometryContext,\n meshFeatures: number,\n lightMode: 0 | 1 | 2,\n singleLightType: string,\n variantKey: string\n): PbrGeometryViewResources {\n let cache = view._geometry as Map<string, PbrGeometryViewResources> | undefined;\n if (!cache) {\n cache = new Map();\n Object.defineProperty(view, \"_geometry\", { value: cache, enumerable: false, configurable: true });\n }\n const cached = cache.get(variantKey);\n if (cached) {\n return cached;\n }\n // Ensure the PBR geometry ext is registered (idempotent) before composePbr is called.\n _ensurePbrGeometryExt(() => view._geometryAttachments);\n\n const features = view._renderFeatures.features;\n const features2 = view._renderFeatures.features2 ?? 0;\n const sceneFeatures = ctx._sceneFeatures;\n const source = view.source as PbrMaterialProps;\n const vbLayout = (source as unknown as { _vbLayout?: import(\"../../mesh/mesh.js\").MeshVbLayout })._vbLayout;\n const vbKey = \"\";\n\n // Compose with the active-attachment scope set so the registered ext\n // sees the right list when contributing the geometry-params fragment.\n const prev = _setActivePbrGeometryAttachments(view._geometryAttachments);\n let composed: ComposedShader;\n try {\n composed = composePbrGeometryShader(\n ctx._composePbr,\n features,\n features2,\n meshFeatures,\n sceneFeatures,\n lightMode,\n singleLightType,\n \"\",\n vbLayout,\n vbKey,\n view._geometryAttachments,\n view._emitColor\n );\n } finally {\n _setActivePbrGeometryAttachments(prev);\n }\n\n const device = engine._device;\n const meshBGL = device.createBindGroupLayout(composed._meshBGLDescriptor);\n const shadowBGL = composed._shadowBGLDescriptor ? device.createBindGroupLayout(composed._shadowBGLDescriptor) : null;\n const sceneBGL = (engine as unknown as { _getSceneBGL: () => GPUBindGroupLayout })._getSceneBGL?.() ?? _getSceneBindGroupLayoutLocal(engine, composed);\n const bgls: GPUBindGroupLayout[] = shadowBGL ? [sceneBGL, meshBGL, shadowBGL] : [sceneBGL, meshBGL];\n const pipelineLayout = device.createPipelineLayout({ bindGroupLayouts: bgls });\n const vertModule = device.createShaderModule({ code: composed._vertexWGSL });\n const fragModule = device.createShaderModule({ code: composed._fragmentWGSL });\n\n // The view's features have PBR_HAS_ALPHA_BLEND already stripped. Detect\n // alpha-blend from the SOURCE so transparent meshes get the right blend\n // pipeline state below.\n const sourceFeatures = source._renderFeatures?.features ?? 0;\n const alphaBlend = (sourceFeatures & PBR_HAS_ALPHA_BLEND) !== 0;\n\n const res: PbrGeometryViewResources = {\n _composed: composed,\n _features: features,\n _features2: features2,\n _meshFeatures: meshFeatures,\n _sceneFeatures: sceneFeatures,\n _meshBGL: meshBGL,\n _shadowBGL: shadowBGL,\n _pipelineLayout: pipelineLayout,\n _vertModule: vertModule,\n _fragModule: fragModule,\n _pipelines: new Map(),\n _alphaBlend: alphaBlend,\n };\n cache.set(variantKey, res);\n return res;\n}\n\n/** Adapter so `createPbrMeshBindGroup` (which takes `_PbrShaderBindings`) can\n * consume our view resources. Only the fields it touches matter. */\nfunction _wrapBindings(res: PbrGeometryViewResources): Parameters<typeof createPbrMeshBindGroup>[1] {\n return {\n _features: res._features,\n _features2: res._features2,\n _meshFeatures: res._meshFeatures,\n _meshBGL: res._meshBGL,\n _shadowBGL: res._shadowBGL,\n _composed: res._composed,\n _pipelines: res._pipelines,\n } as Parameters<typeof createPbrMeshBindGroup>[1];\n}\n\n/** Local fallback used when the engine does not expose a centralised scene BGL\n * cache helper. Matches the layout produced by `getSceneBindGroupLayout`. */\nfunction _getSceneBindGroupLayoutLocal(engine: EngineContext, _composed: ComposedShader): GPUBindGroupLayout {\n return getSceneBindGroupLayout(engine);\n}\n\nfunction _getOrCreateGeometryPipeline(engine: EngineContext, sig: RenderTargetSignature, view: PbrGeometryMaterialView, res: PbrGeometryViewResources): GPURenderPipeline {\n const key = targetSignatureKey(sig);\n const cached = res._pipelines.get(key);\n if (cached) {\n return cached;\n }\n const device = engine._device;\n const formats = (sig as RenderTargetSignature & { _colorFormats?: readonly GPUTextureFormat[] })._colorFormats ?? (sig._colorFormat ? [sig._colorFormat] : []);\n if (formats.length === 0) {\n throw new Error(\"pbr-geometry: render target has no color attachments\");\n }\n const alphaBlend = res._alphaBlend;\n const blendState: GPUBlendState | undefined = alphaBlend\n ? {\n color: { srcFactor: \"src-alpha\", dstFactor: \"one-minus-src-alpha\", operation: \"add\" },\n alpha: { srcFactor: \"src-alpha\", dstFactor: \"one-minus-src-alpha\", operation: \"add\" },\n }\n : undefined;\n const colorTargets: GPUColorTargetState[] = formats.map((fmt) => (blendState ? { format: fmt, blend: blendState } : { format: fmt }));\n const sourceFeatures = (view.source as PbrMaterialProps)._renderFeatures?.features ?? 0;\n const hasDoubleSided = (sourceFeatures & PBR_HAS_DOUBLE_SIDED) !== 0;\n const cullMode = hasDoubleSided ? \"none\" : view._reverseCulling ? \"front\" : \"back\";\n const pipeline = device.createRenderPipeline({\n layout: res._pipelineLayout,\n vertex: { module: res._vertModule, entryPoint: \"main\", buffers: res._composed._vertexBufferLayouts },\n fragment: { module: res._fragModule, entryPoint: \"main\", targets: colorTargets },\n depthStencil: sig._depthStencilFormat\n ? {\n format: sig._depthStencilFormat,\n depthCompare: sig._depthCompare ?? REVERSE_DEPTH_COMPARE,\n // Disable depth-write for alpha-blended meshes so background\n // depth survives partially-transparent pixels. Matches the\n // Standard geometry-renderable behaviour.\n depthWriteEnabled: !alphaBlend,\n }\n : undefined,\n multisample: { count: sig._sampleCount },\n primitive: { topology: \"triangle-list\", cullMode, frontFace: \"ccw\" },\n });\n res._pipelines.set(key, pipeline);\n return pipeline;\n}\n\n// ─── Helpers cribbed from pbr-renderable (no static cycle) ─────────────\n\nfunction _getPackedSingleLightType(lights: SceneContext[\"lights\"], packedIndex: number): \"hemispheric\" | \"directional\" | \"spot\" | \"point\" {\n let packed = 0;\n for (const light of lights) {\n if (!light._writeLightUbo) {\n continue;\n }\n if (packed === packedIndex) {\n const t = light.lightType;\n return t === \"hemispheric\" || t === \"directional\" || t === \"spot\" ? t : \"point\";\n }\n packed++;\n }\n return \"point\";\n}\n\n/** Writes material UBO via the helper exported from pbr-renderable. */\nfunction _writePbrMaterialData(data: Float32Array, mat: PbrMaterialProps, spec: import(\"../../shader/fragment-types.js\").UboSpec): void {\n _writeMaterialData(data, mat, spec);\n}\n","/** PBR material view helper that targets geometry-rendering MRT output.\n *\n * The geometry renderer task wraps each PBR caster material in a\n * `PbrGeometryMaterialView`. The view carries the per-task attachment\n * list, target-texture intent, optional `gp` UBO (shared across the task's\n * materials), and reverse-culling flag. The view also shadows\n * {@link Material._buildGroup} with {@link pbrGeometryGroupBuilder} so that\n * the geometry renderer task materialises a {@link Renderable} through the\n * PBR geometry renderable infrastructure — no view-aware branching needed\n * in core render-task.\n *\n * The geometry-output WGSL itself is produced by post-processing the regular\n * per-scene composed PBR shader (reused via the `_pbrGeomContext` stash) in\n * `./pbr-geometry-output-shader.ts`. */\n\nimport { createMaterialView } from \"../material-view.js\";\nimport type { MaterialView } from \"../material.js\";\nimport type { GeometryTextureType } from \"../../frame-graph/geometry-types.js\";\nimport { PBR_HAS_ALPHA_BLEND, PBR2_GEOMETRY_OUTPUT } from \"./pbr-flags.js\";\nimport type { PbrMaterialProps } from \"./pbr-material.js\";\nimport { pbrGeometryGroupBuilder } from \"./pbr-geometry-renderable.js\";\nimport { _ensurePbrGeometryExt } from \"./pbr-geometry-output-shader.js\";\n\n/** Per-task ordered attachment list driving the geometry template. The array\n * index is the MRT color-attachment slot used in `@location(i)`. */\nexport type PbrGeometryAttachments = readonly GeometryTextureType[];\n\n/** Per-(task, material) PBR geometry view configuration. All fields are owned\n * by the geometry renderer task; the view captures them so per-mesh renderables\n * pick up the same pipeline state and bindings. */\nexport interface PbrGeometryViewConfig {\n /** Ordered MRT attachment list — index = `@location(i)`. */\n readonly attachments: PbrGeometryAttachments;\n /** When true, the composed fragment emits the real (lit) material color\n * at `@location(N)` (N = attachments.length). The target texture is\n * added to the pipeline color-target list at the same slot. */\n readonly emitColor: boolean;\n /** Per-task previous-VP + camera-near-far UBO. Required when\n * {@link attachments} contains `NORMALIZED_VIEW_DEPTH` or\n * `LINEAR_VELOCITY`; ignored otherwise. */\n readonly gpUBO?: GPUBuffer | null;\n /** Flip culling direction. */\n readonly reverseCulling?: boolean;\n}\n\n/** PBR material view that emits geometry textures instead of shaded colour. */\nexport interface PbrGeometryMaterialView extends MaterialView {\n /** @internal Ordered MRT attachment list — index = `@location(i)`. */\n readonly _geometryAttachments: PbrGeometryAttachments;\n /** @internal Geometry pipeline carries an extra `@location(N)` color attachment. */\n readonly _emitColor: boolean;\n /** @internal Optional per-task geometry-params UBO shared with the composer's\n * `geometry-params` fragment. */\n readonly _gpUBO: GPUBuffer | null;\n /** @internal */\n readonly _reverseCulling: boolean;\n /** @internal Shared per-view resources cache populated lazily by the renderable\n * factory. Opaque to callers. */\n _geometry?: unknown;\n}\n\n// Snapshot of the currently-building view's attachments so the registered\n// PBR geometry extension can read them from `frag(ctx)`. The extension is\n// invoked synchronously during composePbr inside `buildPbrGeometryRenderable`;\n// the snapshot is set right before that call and cleared after.\nlet _activeAttachments: readonly GeometryTextureType[] | undefined;\n\n/** @internal Used by the geometry renderable to scope attachment access for\n * the PBR ext during a composePbr call. Returns the previous value so the\n * caller can restore it (avoids global leakage in nested scenarios). */\nexport function _setActivePbrGeometryAttachments(att: readonly GeometryTextureType[] | undefined): readonly GeometryTextureType[] | undefined {\n const prev = _activeAttachments;\n _activeAttachments = att;\n return prev;\n}\n\n/** Wrap a PBR material as a geometry-output view.\n * - Sets the `PBR2_GEOMETRY_OUTPUT` features2 bit.\n * - Clears `PBR_HAS_ALPHA_BLEND`: the geometry pipeline drives blending per\n * attachment via the pipeline color-target state, not via the PBR\n * fragment's source-over color output.\n * - Shadows `_buildGroup` with {@link pbrGeometryGroupBuilder} so the\n * natural `material._buildGroup._rebuildSingle` dispatch in\n * `resolvePendingMeshes` builds a geometry-MRT renderable for this view.\n * - Registers the PBR geometry extension (idempotent) so subsequent\n * composePbr calls pick up the `gp` UBO + geometry varyings when\n * `PBR2_GEOMETRY_OUTPUT` is set. */\nexport function createPbrGeometryMaterialView(source: PbrMaterialProps, config: PbrGeometryViewConfig): PbrGeometryMaterialView {\n _ensurePbrGeometryExt(() => _activeAttachments);\n const baseFeatures = source._renderFeatures?.features ?? 0;\n const baseFeatures2 = source._renderFeatures?.features2 ?? 0;\n const view = createMaterialView(source, {\n features: baseFeatures & ~PBR_HAS_ALPHA_BLEND,\n features2: baseFeatures2 | PBR2_GEOMETRY_OUTPUT,\n }) as PbrGeometryMaterialView;\n Object.defineProperty(view, \"_geometryAttachments\", { value: config.attachments, enumerable: false });\n Object.defineProperty(view, \"_emitColor\", { value: config.emitColor, enumerable: false });\n Object.defineProperty(view, \"_gpUBO\", { value: config.gpUBO ?? null, enumerable: false });\n Object.defineProperty(view, \"_reverseCulling\", { value: config.reverseCulling ?? false, enumerable: false });\n Object.defineProperty(view, \"_buildGroup\", { value: pbrGeometryGroupBuilder, enumerable: false });\n return view;\n}\n"],"names":["_a","_b"],"mappings":";;AAiCA,MAAM,iBAAiB;AACvB,MAAM,eAAe;AAIrB,SAAS,WAAW,aAAsD;AACtE,aAAW,KAAK,aAAa;AACzB,QAAI,MAAM,oBAAoB,yBAAyB,MAAM,oBAAoB,iBAAiB;AAC9F,aAAO;AAAA,IACX;AAAA,EACJ;AACA,SAAO;AACX;AAEA,SAAS,cAAc,aAAsD;AACzE,SAAO,YAAY,SAAS,oBAAoB,eAAe;AACnE;AAEA,SAAS,cAAc,aAAsD;AACzE,SAAO,YAAY,SAAS,oBAAoB,cAAc;AAClE;AAIA,SAAS,gCAAgC,gBAAyB,uBAAgC,sBAA+C;AAC7I,QAAM,WAAW,iBAAiB,CAAC,EAAE,OAAO,MAAM,OAAO,EAAE,OAAO,iBAAA,GAA6B,aAAa,iBAAiB,aAAA,CAAc,IAAI,CAAA;AAC/I,QAAM,UAAU,iBAAiB,0FAA0F;AAC3H,QAAM,WAAsB,CAAA;AAC5B,MAAI,uBAAuB;AACvB,aAAS,KAAK,EAAE,OAAO,gBAAgB,OAAO,YAAA,GAAe,EAAE,OAAO,iBAAiB,OAAO,YAAA,CAAa;AAAA,EAC/G;AACA,MAAI,sBAAsB;AACtB,aAAS,KAAK,EAAE,OAAO,aAAa,OAAO,aAAa;AAAA,EAC5D;AACA,QAAM,UAAoB,CAAA;AAC1B,MAAI,uBAAuB;AACvB,YAAQ,KAAK,yEAAyE;AACtF,YAAQ,KAAK,+EAA+E;AAAA,EAChG;AACA,MAAI,sBAAsB;AACtB,YAAQ,KAAK,2BAA2B;AAAA,EAC5C;AACA,QAAM,QAAwC,QAAQ,SAAS,IAAI,EAAE,IAAI,QAAQ,KAAK,IAAI,EAAA,IAAM,CAAA;AAChG,SAAO;AAAA,IACH,KAAK;AAAA,IACL,WAAW;AAAA,IACX,kBAAkB;AAAA,IAClB,wBAAwB;AAAA,IACxB,WAAW;AAAA,IACX,cAAc;AAAA,EAAA;AAEtB;AAIA,IAAI,wBAAwB;AAKrB,SAAS,sBAAsB,gBAAwE;AAC1G,MAAI,uBAAuB;AACvB;AAAA,EACJ;AACA,0BAAwB;AACxB,QAAM,MAAc;AAAA,IAChB,IAAI;AAAA;AAAA,IAEJ,OAAO;AAAA,IACP,KAAK,KAAyC;AAC1C,WAAK,IAAI,aAAa,0BAA0B,GAAG;AAC/C,eAAO;AAAA,MACX;AACA,YAAM,MAAM,eAAA,KAAoB,CAAA;AAChC,YAAM,UAAU,WAAW,GAAG;AAC9B,YAAM,gBAAgB,cAAc,GAAG;AACvC,YAAM,gBAAgB,cAAc,GAAG;AACvC,UAAI,CAAC,WAAW,CAAC,iBAAiB,CAAC,eAAe;AAC9C,eAAO;AAAA,MACX;AACA,aAAO,gCAAgC,SAAS,eAAe,aAAa;AAAA,IAChF;AAAA,IACA,KAAK,KAAkB,SAA8B,GAAmB;AACpE,WAAK,IAAI,aAAa,0BAA0B,GAAG;AAC/C,eAAO;AAAA,MACX;AACA,YAAM,OAAO,IAAI;AACjB,UAAI,KAAK,QAAQ;AACb,gBAAQ,KAAK,EAAE,SAAS,KAAK,UAAU,EAAE,QAAQ,KAAK,OAAA,GAAU;AAAA,MACpE;AACA,aAAO;AAAA,IACX;AAAA,EAAA;AAEJ,kBAAgB,GAAG;AACvB;AAQA,SAAS,eAAe,MAA2B,IAAY,QAAyB;AACpF,UAAQ,MAAA;AAAA,IACJ,KAAK,oBAAoB;AAMrB,aAAO,SAAS,8CAA8C,EAAE,MAAM,4BAA4B,EAAE;AAAA,IACxG,KAAK,oBAAoB;AACrB,aAAO,6BAA6B,EAAE;AAAA,IAC1C,KAAK,oBAAoB;AACrB,aAAO,8BAA8B,EAAE;AAAA,IAC3C,KAAK,oBAAoB;AAIrB,aAAO,yCAAyC,EAAE;AAAA,IACtD,KAAK,oBAAoB;AACrB,aAAO,wEAAwE,EAAE;AAAA,IACrF,KAAK,oBAAoB;AACrB,aAAO,2IAA2I,EAAE;AAAA,IACxJ,KAAK,oBAAoB;AACrB,aAAO,wCAAwC,EAAE;AAAA,IACrD,KAAK,oBAAoB;AACrB,aAAO,8DAA8D,EAAE;AAAA,IAC3E,KAAK,oBAAoB;AACrB,aAAO,uCAAuC,EAAE;AAAA,IACpD,KAAK,oBAAoB;AAErB,aAAO,4BAA4B,EAAE;AAAA,IACzC,KAAK,oBAAoB,iBAAiB;AACtC,YAAM,MAAM;AACZ,YAAM,OAAO;AACb,aAAO,oBAAoB,IAAI,MAAM,GAAG,WAAW,EAAE;AAAA,IACzD;AAAA,EAAA;AAER;AAMO,SAAS,yBACZ,YACA,UACA,WACA,cACA,eACA,WACA,iBACA,oBACA,WACA,OACA,aACA,WACc;AAOd,QAAM,eAAe,WAAW,CAAC;AAIjC,QAAM,gBAAgB,YAAY;AAElC,QAAM,OAAO;AAAA,IACT;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,GAAG,KAAK,SAAS,YAAY,KAAK,GAAG,CAAC,IAAI,YAAY,MAAM,EAAE;AAAA,EAAA;AAGlE,QAAM,UAAU,gBAAgB,iBAAiB;AAKjD,QAAM,wBAAwB;AAC9B,QAAM,sBAAsB;AAC5B,MAAI,CAAC,KAAK,cAAc,SAAS,qBAAqB,GAAG;AACrD,UAAM,IAAI,MAAM,2GAA2G;AAAA,EAC/H;AACA,MAAI,OAAO,KAAK,cAAc,QAAQ,uBAAuB,mBAAmB;AAKhF,QAAM,YAAY,YAAY;AAC9B,QAAM,iBAAiB,YAAY;AAAA,YAAe,SAAS,wBAAwB;AACnF,QAAM,eAAe;AAAA,EACvB,YAAY,IAAI,CAAC,GAAG,MAAM,aAAa,CAAC,MAAM,CAAC,cAAc,EAAE,KAAK,IAAI,CAAC,GAAG,cAAc;AAAA;AAAA;AAGxF,SAAO,KAAK,QAAQ,qBAAqB,GAAG,YAAY,mBAAmB;AAI3E,QAAM,KAAK;AACX,QAAM,SAAS,YAAY,IAAI,CAAC,MAAM,MAAM,QAAQ,CAAC,MAAM,eAAe,MAAM,IAAI,MAAM,CAAC,GAAG,EAAE,KAAK,IAAI;AACzG,QAAM,kBAAkB,YAAY;AAAA,iEAAoE;AACxG,QAAM,cAAc;AAAA,EACtB,MAAM,GAAG,eAAe;AAAA;AAEtB,QAAM,gBAAgB;AACtB,MAAI,CAAC,KAAK,SAAS,aAAa,GAAG;AAC/B,UAAM,IAAI,MAAM,sFAAsF;AAAA,EAC1G;AACA,SAAO,KAAK,QAAQ,eAAe,WAAW;AAE9C,SAAO,EAAE,GAAG,MAAM,eAAe,KAAA;AACrC;AC7MO,MAAM,2BAA6C,YAAY;AAClE,QAAM,IAAI,MAAM,yDAAyD;AAC7E;AACA,wBAAwB,iBAAiB,CAAC,OAAqB,MAAY,qBAA4C;AACnH,QAAM,OAAQ,oBAAoB,KAAK;AACvC,SAAO,2BAA2B,OAAO,MAAM,IAAI;AACvD;AACA,wBAAwB,kBAAkB;AAiB1C,SAAS,YAAY,cAAsB,WAAmB,iBAAiC;AAC3F,SAAO,GAAG,YAAY,IAAI,SAAS,IAAI,eAAe;AAC1D;AAGO,SAAS,2BAA2B,OAAqB,MAAY,MAA2C;;AACnH,QAAM,SAAS,MAAM,QAAQ;AAC7B,QAAM,SAAS,OAAO;AAEtB,QAAM,MAAO,MAAmE;AAChF,MAAI,CAAC,KAAK;AACN,UAAM,IAAI,MAAM,qIAAqI;AAAA,EACzJ;AAEA,QAAM,SAAS,KAAK;AACpB,MAAI,CAAC,OAAO,iBAAiB;AACzB,WAAO,kBAAkB,4BAA4B,MAAM;AAAA,EAC/D;AAKA,QAAM,KAAK,wBAAwB,MAAM,MAAM,MAAM;AACrD,QAAM,aAAa,KAAK,IAAI,IAAI,CAAC;AACjC,QAAM,iBAAiB,IAAI,cAAc,SAAS;AAClD,QAAM,iBAAiB,KAAK,kBAAkB;AAC9C,QAAM,YAAuB,eAAe,IAAI,IAAI,eAAe,KAAK,CAAC,iBAAiB,IAAI;AAC9F,QAAM,kBAAkB,cAAc,IAAI,0BAA0B,MAAM,QAAQ,KAAK,CAAC,IAAI;AAC5F,QAAM,eAAe,qBAAqB,MAAM,cAAc;AAE9D,QAAM,aAAa,YAAY,cAAc,WAAW,eAAe;AACvE,QAAM,MAAM,qBAAqB,MAAM,QAAQ,KAAK,cAAc,WAAW,iBAAiB,UAAU;AAExG,QAAM,WAAW,IAAI;AACrB,QAAM,YAAY,IAAI;AACtB,QAAM,WAAW,IAAI;AAGrB,QAAM,cAAc,IAAI,IAAI,SAAS,aAAa,cAAc,CAAC;AACjE,QAAM,mBAAiB,YAAO,uBAAP,gCAA4B,WAAU;AAC7D,iBAAe,aAAa,KAAK,aAAa,GAAG,CAAC;AAClD,0BAAwB,MAAM,MAAM,QAAQ,WAAW;AACvD,QAAM,UAAU,oBAAoB,QAAQ,WAAW;AAGvD,QAAM,eAAe,SAAS;AAC9B,QAAM,cAAc,IAAI,IAAI,aAAa,cAAc,CAAC;AAExD,wBAAsB,aAAa,QAAQ,YAAY;AACvD,QAAM,cAAc,oBAAoB,QAAQ,WAAW;AAU3D,QAAM,OAAO,iCAAiC,KAAK,oBAAoB;AACvE,MAAI;AACJ,MAAI;AACA,8BAA0B,uBAAuB,QAAQ,cAAc,GAAG,GAAG,UAAU,SAAS,aAAa,MAAqC,IAAI,cAAc,IAAI;AAAA,EAC5K,UAAA;AACI,qCAAiC,IAAI;AAAA,EACzC;AAGA,MAAI,kBAAuC;AAC3C,MAAI,kBAAkB,IAAI,YAAY;AAClC,UAAM,UAA+B,CAAA;AACrC,QAAI,IAAI;AACR,eAAW,MAAM,IAAI,eAAe;AAChC,YAAM,KAAK,GAAG;AACd,cAAQ,KAAK,EAAE,SAAS,KAAK,UAAU,GAAG,cAAc,WAAA,GAAc;AACtE,cAAQ,KAAK,EAAE,SAAS,KAAK,UAAU,GAAG,eAAe;AACzD,cAAQ,KAAK,EAAE,SAAS,KAAK,UAAU,EAAE,QAAQ,GAAG,WAAA,GAAc;AAAA,IACtE;AACA,sBAAkB,OAAO,gBAAgB,EAAE,QAAQ,IAAI,YAAY,SAAS;AAAA,EAChF;AAGA,QAAM,gBAAgB,wBAAwB,MAAM;AACpD,aAAW,KAAK,eAAe;AAC3B,mBAAe,CAAC;AAAA,EACpB;AACA,QAAM,kBAAkB,MAAM,iBAAiB,IAAI,IAAI,KAAK,CAAA;AAC5D,QAAM,iBAAiB,IAAI,MAAM;AAAA,IAC7B,GAAG;AAAA,IACH,MAAM;AACF,cAAQ,QAAA;AACR,kBAAY,QAAA;AAAA,IAChB;AAAA,IACA,MAAM;AACF,iBAAW,KAAK,eAAe;AAC3B,uBAAe,CAAC;AAAA,MACpB;AAAA,IACJ;AAAA,EAAA,CACH;AAED,QAAM,gBAAgB,WAAW,wBAAwB,MAAM,eAAe,sBAAsB;AACpG,QAAM,UAAU,YAAY,kBAAkB,MAAM,eAAe,iBAAiB;AACpF,QAAM,kBAAkB,eAAe,0BAA0B;AACjE,QAAM,SAAS,eAAe,4BAA4B;AAC1D,QAAM,cAAc,eAAe,4BAA4B;AAC/D,QAAM,0BAA0B,IAAI;AACpC,QAAM,eAAe,IAAI;AACzB,QAAM,aAAa,CAAC,KAAK,YAAY,EAAE,GAAI,KAAK,YAAY,EAAE,GAAI,KAAK,YAAY,EAAE,CAAE;AAEvF,MAAI,oBAAoB,KAAK;AAC7B,MAAI,mBAAmB,MAAM,OAAO;AACpC,MAAI,kBAAkB,OAAO;AAC7B,QAAM,aAAa,IAAI,IAAI,aAAa,cAAc,CAAC;AAEvD,QAAM,cAAc,MAAY;AAC5B,QAAI,KAAK,uBAAuB,qBAAqB,MAAM,OAAO,WAAW,kBAAkB;AAC3F,iBAAW,CAAC,IAAI,KAAK,YAAY,EAAE;AACnC,iBAAW,CAAC,IAAI,KAAK,YAAY,EAAE;AACnC,iBAAW,CAAC,IAAI,KAAK,YAAY,EAAE;AACnC,qBAAe,aAAa,KAAK,aAAa,GAAG,CAAC;AAClD,8BAAwB,MAAM,MAAM,QAAQ,WAAW;AACvD,aAAO,MAAM,YAAY,SAAS,GAAG,WAAwC;AAC7E,0BAAoB,KAAK;AACzB,yBAAmB,MAAM,OAAO;AAAA,IACpC;AACA,QAAI,OAAO,gBAAgB,iBAAiB;AACxC,wBAAkB,OAAO;AACzB,iBAAW,KAAK,CAAC;AACjB,4BAAsB,YAAY,QAAQ,YAAY;AACtD,aAAO,MAAM,YAAY,aAAa,GAAG,WAAW,QAAQ,GAAG,WAAW,UAAU;AAAA,IACxF;AAAA,EACJ;AACA,QAAM,cAAc,MAAY;AAC5B,wBAAoB;AAAA,EACxB;AACA,QAAM,WAAS,YAAO,yBAAP,gCAA8B,aAAa,OAAO,iBAAgB;AAEjF,QAAM,OAAO,CAAC,SAAgE;;AAC1E,QAAI,KAAK,YAAY,OAAO;AACxB,aAAO;AAAA,IACX;AACA,UAAM,MAAM,KAAK;AACjB,SAAK,aAAa,GAAG,uBAAuB;AAC5C,QAAI,iBAAiB;AACjB,WAAK,aAAa,GAAG,eAAe;AAAA,IACxC;AACA,QAAI,OAAO;AACX,UAAM,KAAK,IAAI;AACf,SAAK,gBAAgB,QAAQ,IAAI,iBAAgBA,MAAA,yBAAI,OAAJ,gBAAAA,IAAQ,OAAO;AAChE,SAAK,gBAAgB,QAAQ,IAAI,eAAcC,MAAA,yBAAI,OAAJ,gBAAAA,IAAQ,OAAO;AAC9D,QAAI,gBAAgB,IAAI,eAAe;AACnC,WAAK,gBAAgB,QAAQ,IAAI,gBAAe,8BAAI,OAAJ,mBAAQ,OAAO;AAAA,IACnE;AACA,SAAK,gBAAgB,QAAQ,IAAI,WAAU,8BAAI,OAAJ,mBAAQ,OAAO;AAC1D,QAAI,UAAU,IAAI,WAAW;AACzB,WAAK,gBAAgB,QAAQ,IAAI,YAAW,8BAAI,QAAJ,mBAAS,OAAO;AAAA,IAChE;AACA,QAAI,kBAAkB,IAAI,aAAa;AACnC,WAAK,gBAAgB,QAAQ,IAAI,cAAa,8BAAI,OAAJ,mBAAQ,OAAO;AAAA,IACjE;AAIA,UAAM,OAAO,KAAK,YAAY,KAAK;AACnC,QAAI,MAAM;AACN,WAAK,gBAAgB,QAAQ,KAAK,YAAY;AAC9C,WAAK,gBAAgB,QAAQ,KAAK,aAAa;AAC/C,UAAI,KAAK,iBAAiB,KAAK,gBAAgB;AAC3C,aAAK,gBAAgB,QAAQ,KAAK,aAAa;AAC/C,aAAK,gBAAgB,QAAQ,KAAK,cAAc;AAAA,MACpD;AAAA,IACJ;AACA,UAAM,KAAK,QAAQ,KAAK,gBAAgB;AACxC,QAAI,MAAM,yBAAyB;AAC/B,aAAO,wBAAwB,QAAQ,IAAI,MAAM,MAAM,UAAU;AAAA,IACrE;AACA,SAAK,eAAe,IAAI,aAAa,IAAI,WAAW;AACpD,QAAI,MAAM,GAAG,QAAQ,GAAG;AACpB,WAAK,YAAY,IAAI,YAAY,GAAG,KAAK;AAAA,IAC7C,OAAO;AACH,WAAK,YAAY,IAAI,UAAU;AAAA,IACnC;AACA,WAAO;AAAA,EACX;AAEA,QAAM,IAAgB;AAAA,IAClB,OAAO,KAAK,gBAAgB,eAAe,MAAM;AAAA,IACjD,eAAe;AAAA,IACf;AAAA,IACA,KAAK,KAAoB,KAA4B;AACjD,aAAO;AAAA,QACH,YAAY;AAAA,QACZ,UAAU,6BAA6B,KAAsB,KAAK,MAAM,GAAG;AAAA,QAC3E;AAAA,QACA;AAAA,MAAA;AAAA,IAER;AAAA,EAAA;AAEJ,IAAE,eAAe;AACjB,SAAO;AACX;AAIA,SAAS,qBACL,MACA,QACA,KACA,cACA,WACA,iBACA,YACwB;;AACxB,MAAI,QAAQ,KAAK;AACjB,MAAI,CAAC,OAAO;AACR,gCAAY,IAAA;AACZ,WAAO,eAAe,MAAM,aAAa,EAAE,OAAO,OAAO,YAAY,OAAO,cAAc,KAAA,CAAM;AAAA,EACpG;AACA,QAAM,SAAS,MAAM,IAAI,UAAU;AACnC,MAAI,QAAQ;AACR,WAAO;AAAA,EACX;AAEA,wBAAsB,MAAM,KAAK,oBAAoB;AAErD,QAAM,WAAW,KAAK,gBAAgB;AACtC,QAAM,YAAY,KAAK,gBAAgB,aAAa;AACpD,QAAM,gBAAgB,IAAI;AAC1B,QAAM,SAAS,KAAK;AACpB,QAAM,WAAY,OAAgF;AAClG,QAAM,QAAQ;AAId,QAAM,OAAO,iCAAiC,KAAK,oBAAoB;AACvE,MAAI;AACJ,MAAI;AACA,eAAW;AAAA,MACP,IAAI;AAAA,MACJ;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,KAAK;AAAA,MACL,KAAK;AAAA,IAAA;AAAA,EAEb,UAAA;AACI,qCAAiC,IAAI;AAAA,EACzC;AAEA,QAAM,SAAS,OAAO;AACtB,QAAM,UAAU,OAAO,sBAAsB,SAAS,kBAAkB;AACxE,QAAM,YAAY,SAAS,uBAAuB,OAAO,sBAAsB,SAAS,oBAAoB,IAAI;AAChH,QAAM,aAAY,YAAiE,iBAAjE,oCAAqF,8BAA8B,MAAgB;AACrJ,QAAM,OAA6B,YAAY,CAAC,UAAU,SAAS,SAAS,IAAI,CAAC,UAAU,OAAO;AAClG,QAAM,iBAAiB,OAAO,qBAAqB,EAAE,kBAAkB,MAAM;AAC7E,QAAM,aAAa,OAAO,mBAAmB,EAAE,MAAM,SAAS,aAAa;AAC3E,QAAM,aAAa,OAAO,mBAAmB,EAAE,MAAM,SAAS,eAAe;AAK7E,QAAM,mBAAiB,YAAO,oBAAP,mBAAwB,aAAY;AAC3D,QAAM,cAAc,iBAAiB,yBAAyB;AAE9D,QAAM,MAAgC;AAAA,IAClC,WAAW;AAAA,IACX,WAAW;AAAA,IACX,YAAY;AAAA,IACZ,eAAe;AAAA,IACf,gBAAgB;AAAA,IAChB,UAAU;AAAA,IACV,YAAY;AAAA,IACZ,iBAAiB;AAAA,IACjB,aAAa;AAAA,IACb,aAAa;AAAA,IACb,gCAAgB,IAAA;AAAA,IAChB,aAAa;AAAA,EAAA;AAEjB,QAAM,IAAI,YAAY,GAAG;AACzB,SAAO;AACX;AAIA,SAAS,cAAc,KAA6E;AAChG,SAAO;AAAA,IACH,WAAW,IAAI;AAAA,IACf,YAAY,IAAI;AAAA,IAChB,eAAe,IAAI;AAAA,IACnB,UAAU,IAAI;AAAA,IACd,YAAY,IAAI;AAAA,IAChB,WAAW,IAAI;AAAA,IACf,YAAY,IAAI;AAAA,EAAA;AAExB;AAIA,SAAS,8BAA8B,QAAuB,WAA+C;AACzG,SAAO,wBAAwB,MAAM;AACzC;AAEA,SAAS,6BAA6B,QAAuB,KAA4B,MAA+B,KAAkD;;AACtK,QAAM,MAAM,mBAAmB,GAAG;AAClC,QAAM,SAAS,IAAI,WAAW,IAAI,GAAG;AACrC,MAAI,QAAQ;AACR,WAAO;AAAA,EACX;AACA,QAAM,SAAS,OAAO;AACtB,QAAM,UAAW,IAAgF,kBAAkB,IAAI,eAAe,CAAC,IAAI,YAAY,IAAI;AAC3J,MAAI,QAAQ,WAAW,GAAG;AACtB,UAAM,IAAI,MAAM,sDAAsD;AAAA,EAC1E;AACA,QAAM,aAAa,IAAI;AACvB,QAAM,aAAwC,aACxC;AAAA,IACI,OAAO,EAAE,WAAW,aAAa,WAAW,uBAAuB,WAAW,MAAA;AAAA,IAC9E,OAAO,EAAE,WAAW,aAAa,WAAW,uBAAuB,WAAW,MAAA;AAAA,EAAM,IAExF;AACN,QAAM,eAAsC,QAAQ,IAAI,CAAC,QAAS,aAAa,EAAE,QAAQ,KAAK,OAAO,WAAA,IAAe,EAAE,QAAQ,KAAM;AACpI,QAAM,mBAAkB,UAAK,OAA4B,oBAAjC,mBAAkD,aAAY;AACtF,QAAM,kBAAkB,iBAAiB,0BAA0B;AACnE,QAAM,WAAW,iBAAiB,SAAS,KAAK,kBAAkB,UAAU;AAC5E,QAAM,WAAW,OAAO,qBAAqB;AAAA,IACzC,QAAQ,IAAI;AAAA,IACZ,QAAQ,EAAE,QAAQ,IAAI,aAAa,YAAY,QAAQ,SAAS,IAAI,UAAU,qBAAA;AAAA,IAC9E,UAAU,EAAE,QAAQ,IAAI,aAAa,YAAY,QAAQ,SAAS,aAAA;AAAA,IAClE,cAAc,IAAI,sBACZ;AAAA,MACI,QAAQ,IAAI;AAAA,MACZ,cAAc,IAAI,iBAAiB;AAAA;AAAA;AAAA;AAAA,MAInC,mBAAmB,CAAC;AAAA,IAAA,IAExB;AAAA,IACN,aAAa,EAAE,OAAO,IAAI,aAAA;AAAA,IAC1B,WAAW,EAAE,UAAU,iBAAiB,UAAU,WAAW,MAAA;AAAA,EAAM,CACtE;AACD,MAAI,WAAW,IAAI,KAAK,QAAQ;AAChC,SAAO;AACX;AAIA,SAAS,0BAA0B,QAAgC,aAAuE;AACtI,MAAI,SAAS;AACb,aAAW,SAAS,QAAQ;AACxB,QAAI,CAAC,MAAM,gBAAgB;AACvB;AAAA,IACJ;AACA,QAAI,WAAW,aAAa;AACxB,YAAM,IAAI,MAAM;AAChB,aAAO,MAAM,iBAAiB,MAAM,iBAAiB,MAAM,SAAS,IAAI;AAAA,IAC5E;AACA;AAAA,EACJ;AACA,SAAO;AACX;AAGA,SAAS,sBAAsB,MAAoB,KAAuB,MAA8D;AACpI,qBAAmB,MAAM,KAAK,IAAI;AACtC;AC3XA,IAAI;AAKG,SAAS,iCAAiC,KAA6F;AAC1I,QAAM,OAAO;AACb,uBAAqB;AACrB,SAAO;AACX;AAaO,SAAS,8BAA8B,QAA0B,QAAwD;;AAC5H,wBAAsB,MAAM,kBAAkB;AAC9C,QAAM,iBAAe,YAAO,oBAAP,mBAAwB,aAAY;AACzD,QAAM,kBAAgB,YAAO,oBAAP,mBAAwB,cAAa;AAC3D,QAAM,OAAO,mBAAmB,QAAQ;AAAA,IACpC,UAAU,eAAe,CAAC;AAAA,IAC1B,WAAW,gBAAgB;AAAA,EAAA,CAC9B;AACD,SAAO,eAAe,MAAM,wBAAwB,EAAE,OAAO,OAAO,aAAa,YAAY,OAAO;AACpG,SAAO,eAAe,MAAM,cAAc,EAAE,OAAO,OAAO,WAAW,YAAY,OAAO;AACxF,SAAO,eAAe,MAAM,UAAU,EAAE,OAAO,OAAO,SAAS,MAAM,YAAY,MAAA,CAAO;AACxF,SAAO,eAAe,MAAM,mBAAmB,EAAE,OAAO,OAAO,kBAAkB,OAAO,YAAY,MAAA,CAAO;AAC3G,SAAO,eAAe,MAAM,eAAe,EAAE,OAAO,yBAAyB,YAAY,OAAO;AAChG,SAAO;AACX;"}
@@ -1,4 +1,4 @@
1
- import { M as MAX_LIGHTS } from "./index-B7Qhw0xL.js";
1
+ import { M as MAX_LIGHTS } from "./index-CLElg2Bo.js";
2
2
  const HELPER_KEY_PREFIX = "nme_pbr_mr";
3
3
  const SHADOW_FACTORS_ONE = `array<f32, ${MAX_LIGHTS}>(${new Array(MAX_LIGHTS).fill("1.0").join(", ")})`;
4
4
  function resolveOptional(block, inputName, fallback, target, stage, state, ctx) {
@@ -101,4 +101,4 @@ const emitter = {
101
101
  export {
102
102
  emitter
103
103
  };
104
- //# sourceMappingURL=pbr-metallic-roughness-block-BFwZj2Nw.js.map
104
+ //# sourceMappingURL=pbr-metallic-roughness-block-JBSi-tQN.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"pbr-metallic-roughness-block-BFwZj2Nw.js","sources":["../src/material/node/blocks/pbr-metallic-roughness-block.ts"],"sourcesContent":["import type { BlockEmitter, NodeBlock, NodeBuildState, NodeEmitContext, Stage } from \"../node-types.js\";\nimport { MAX_LIGHTS } from \"../../../light/types.js\";\n\nconst HELPER_KEY_PREFIX = \"nme_pbr_mr\";\nconst SHADOW_FACTORS_ONE = `array<f32, ${MAX_LIGHTS}>(${new Array(MAX_LIGHTS).fill(\"1.0\").join(\", \")})`;\n\nfunction resolveOptional(block: NodeBlock, inputName: string, fallback: string, target: \"vec3f\" | \"f32\", stage: Stage, state: NodeBuildState, ctx: NodeEmitContext): string {\n const input = block.inputs.get(inputName);\n if (input?.source) {\n return ctx.cast(ctx.resolve(block, inputName, stage, state), target).expr;\n }\n return fallback;\n}\n\nexport const emitter: BlockEmitter = {\n className: \"PBRMetallicRoughnessBlock\",\n stage: \"fragment\",\n emit(block, outputName, stage, state, ctx) {\n if (\n (block.serialized as { enableSpecularAntiAliasing?: boolean }).enableSpecularAntiAliasing === true ||\n block.inputs.get(\"clearcoat\")?.source ||\n block.inputs.get(\"sheen\")?.source ||\n block.inputs.get(\"subsurface\")?.source ||\n block.inputs.get(\"anisotropy\")?.source ||\n block.inputs.get(\"iridescence\")?.source\n ) {\n throw new Error(\"NodeMaterial: PBR-MR core emitter cannot emit optional PBR feature code\");\n }\n const reflectionConnected = !!block.inputs.get(\"reflection\")?.source;\n if (reflectionConnected) {\n state.usesEnv = true;\n ctx.resolve(block, \"reflection\", stage, state);\n }\n const helperKey = `${HELPER_KEY_PREFIX}_${reflectionConnected ? \"env\" : \"noenv\"}_nocc_ccF0_nosh_norefr_noss_noani_noShAS___noaa`;\n if (!state.pbrMrHelperRequests.some((request) => request.key === helperKey)) {\n state.pbrMrHelperRequests.push({\n key: helperKey,\n useEnv: reflectionConnected,\n useClearcoat: false,\n useSheen: false,\n useRefraction: false,\n useSubsurface: false,\n useAnisotropy: false,\n useIridescence: false,\n useShAlbedoScaling: false,\n useCcBump: false,\n useCcTint: false,\n useSpecularAA: false,\n remapClearcoatF0: false,\n });\n }\n state.usesLightsUbo = true;\n\n const memoKey = `_pbrmr_${block.id}_call`;\n let callVar: string;\n const existing = state.fragment.memo.get(memoKey);\n if (existing) {\n callVar = existing.expr;\n } else {\n const wp = resolveOptional(block, \"worldPosition\", \"v3(0.0)\", \"vec3f\", stage, state, ctx);\n const gn = resolveOptional(block, \"worldNormal\", \"v3(0.0, 1.0, 0.0)\", \"vec3f\", stage, state, ctx);\n const perturbed = block.inputs.get(\"perturbedNormal\");\n const wn = perturbed?.source ? ctx.cast(ctx.resolve(block, \"perturbedNormal\", stage, state), \"vec3f\").expr : gn;\n const cp = resolveOptional(block, \"cameraPosition\", \"_NME_CAMERA_POS_\", \"vec3f\", stage, state, ctx);\n const bc = resolveOptional(block, \"baseColor\", \"v3(1.0)\", \"vec3f\", stage, state, ctx);\n const me = resolveOptional(block, \"metallic\", \"0.0\", \"f32\", stage, state, ctx);\n const ro = resolveOptional(block, \"roughness\", \"0.5\", \"f32\", stage, state, ctx);\n const ao = resolveOptional(block, \"ambientOcc\", \"1.0\", \"f32\", stage, state, ctx);\n const baseIorExpr = resolveOptional(block, \"indexOfRefraction\", \"1.5\", \"f32\", stage, state, ctx);\n const sf = state.shadowLights.length > 0 ? `nme_computeShadowFactors(in)` : SHADOW_FACTORS_ONE;\n callVar = `_pbrR${ctx.temp(state, \"pbr\")}`;\n state.fragment.body.push(\n `let ${callVar} = nme_pbr_mr_compute(${wp}, ${gn}, ${wn}, ${cp}, ${bc}, ${me}, ${ro}, ${ao}, 0.0, 0.0, 1.5, v3(0.5, 0.5, 1.0), v2(0.0), v3(1.0), 1.0, 0.0, 0.0, v3(1.0), 0.0, ${baseIorExpr}, 0.0, 1.5, 1.0, v3(1.0), 0.0, 0.0, v3(1.0), 0.0, v2(1.0, 0.0), v2(0.0), ${sf});`\n );\n state.fragment.memo.set(memoKey, { expr: callVar, type: \"vec4f\" });\n }\n\n switch (outputName) {\n case \"lighting\":\n return { expr: `${callVar}.lighting`, type: \"vec3f\" };\n case \"diffuseDir\":\n return { expr: `${callVar}.diffuseDir`, type: \"vec3f\" };\n case \"specularDir\":\n return { expr: `${callVar}.specularDir`, type: \"vec3f\" };\n case \"diffuseInd\":\n return { expr: `${callVar}.diffuseInd`, type: \"vec3f\" };\n case \"specularInd\":\n return { expr: `${callVar}.specularInd`, type: \"vec3f\" };\n case \"shadow\":\n return { expr: `${callVar}.shadow`, type: \"f32\" };\n case \"alpha\": {\n const cfg = block.serialized as { useSpecularOverAlpha?: boolean; useRadianceOverAlpha?: boolean };\n const useOverAlpha = cfg.useSpecularOverAlpha === true || cfg.useRadianceOverAlpha === true;\n const op = block.inputs.get(\"opacity\");\n const baseAlpha = op?.source ? ctx.cast(ctx.resolve(block, \"opacity\", stage, state), \"f32\").expr : \"1.0\";\n if (useOverAlpha) {\n return { expr: `clamp(${baseAlpha} + ${callVar}.lumOverAlpha * ${callVar}.lumOverAlpha, 0.0, 1.0)`, type: \"f32\" };\n }\n return { expr: baseAlpha, type: \"f32\" };\n }\n case \"ambientClr\":\n case \"clearcoatDir\":\n case \"clearcoatInd\":\n case \"sheenDir\":\n case \"sheenInd\":\n case \"refraction\":\n return { expr: `v3(0.0)`, type: \"vec3f\" };\n default:\n return { expr: `${callVar}.lighting`, type: \"vec3f\" };\n }\n },\n};\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"pbr-metallic-roughness-block-JBSi-tQN.js","sources":["../src/material/node/blocks/pbr-metallic-roughness-block.ts"],"sourcesContent":["import type { BlockEmitter, NodeBlock, NodeBuildState, NodeEmitContext, Stage } from \"../node-types.js\";\nimport { MAX_LIGHTS } from \"../../../light/types.js\";\n\nconst HELPER_KEY_PREFIX = \"nme_pbr_mr\";\nconst SHADOW_FACTORS_ONE = `array<f32, ${MAX_LIGHTS}>(${new Array(MAX_LIGHTS).fill(\"1.0\").join(\", \")})`;\n\nfunction resolveOptional(block: NodeBlock, inputName: string, fallback: string, target: \"vec3f\" | \"f32\", stage: Stage, state: NodeBuildState, ctx: NodeEmitContext): string {\n const input = block.inputs.get(inputName);\n if (input?.source) {\n return ctx.cast(ctx.resolve(block, inputName, stage, state), target).expr;\n }\n return fallback;\n}\n\nexport const emitter: BlockEmitter = {\n className: \"PBRMetallicRoughnessBlock\",\n stage: \"fragment\",\n emit(block, outputName, stage, state, ctx) {\n if (\n (block.serialized as { enableSpecularAntiAliasing?: boolean }).enableSpecularAntiAliasing === true ||\n block.inputs.get(\"clearcoat\")?.source ||\n block.inputs.get(\"sheen\")?.source ||\n block.inputs.get(\"subsurface\")?.source ||\n block.inputs.get(\"anisotropy\")?.source ||\n block.inputs.get(\"iridescence\")?.source\n ) {\n throw new Error(\"NodeMaterial: PBR-MR core emitter cannot emit optional PBR feature code\");\n }\n const reflectionConnected = !!block.inputs.get(\"reflection\")?.source;\n if (reflectionConnected) {\n state.usesEnv = true;\n ctx.resolve(block, \"reflection\", stage, state);\n }\n const helperKey = `${HELPER_KEY_PREFIX}_${reflectionConnected ? \"env\" : \"noenv\"}_nocc_ccF0_nosh_norefr_noss_noani_noShAS___noaa`;\n if (!state.pbrMrHelperRequests.some((request) => request.key === helperKey)) {\n state.pbrMrHelperRequests.push({\n key: helperKey,\n useEnv: reflectionConnected,\n useClearcoat: false,\n useSheen: false,\n useRefraction: false,\n useSubsurface: false,\n useAnisotropy: false,\n useIridescence: false,\n useShAlbedoScaling: false,\n useCcBump: false,\n useCcTint: false,\n useSpecularAA: false,\n remapClearcoatF0: false,\n });\n }\n state.usesLightsUbo = true;\n\n const memoKey = `_pbrmr_${block.id}_call`;\n let callVar: string;\n const existing = state.fragment.memo.get(memoKey);\n if (existing) {\n callVar = existing.expr;\n } else {\n const wp = resolveOptional(block, \"worldPosition\", \"v3(0.0)\", \"vec3f\", stage, state, ctx);\n const gn = resolveOptional(block, \"worldNormal\", \"v3(0.0, 1.0, 0.0)\", \"vec3f\", stage, state, ctx);\n const perturbed = block.inputs.get(\"perturbedNormal\");\n const wn = perturbed?.source ? ctx.cast(ctx.resolve(block, \"perturbedNormal\", stage, state), \"vec3f\").expr : gn;\n const cp = resolveOptional(block, \"cameraPosition\", \"_NME_CAMERA_POS_\", \"vec3f\", stage, state, ctx);\n const bc = resolveOptional(block, \"baseColor\", \"v3(1.0)\", \"vec3f\", stage, state, ctx);\n const me = resolveOptional(block, \"metallic\", \"0.0\", \"f32\", stage, state, ctx);\n const ro = resolveOptional(block, \"roughness\", \"0.5\", \"f32\", stage, state, ctx);\n const ao = resolveOptional(block, \"ambientOcc\", \"1.0\", \"f32\", stage, state, ctx);\n const baseIorExpr = resolveOptional(block, \"indexOfRefraction\", \"1.5\", \"f32\", stage, state, ctx);\n const sf = state.shadowLights.length > 0 ? `nme_computeShadowFactors(in)` : SHADOW_FACTORS_ONE;\n callVar = `_pbrR${ctx.temp(state, \"pbr\")}`;\n state.fragment.body.push(\n `let ${callVar} = nme_pbr_mr_compute(${wp}, ${gn}, ${wn}, ${cp}, ${bc}, ${me}, ${ro}, ${ao}, 0.0, 0.0, 1.5, v3(0.5, 0.5, 1.0), v2(0.0), v3(1.0), 1.0, 0.0, 0.0, v3(1.0), 0.0, ${baseIorExpr}, 0.0, 1.5, 1.0, v3(1.0), 0.0, 0.0, v3(1.0), 0.0, v2(1.0, 0.0), v2(0.0), ${sf});`\n );\n state.fragment.memo.set(memoKey, { expr: callVar, type: \"vec4f\" });\n }\n\n switch (outputName) {\n case \"lighting\":\n return { expr: `${callVar}.lighting`, type: \"vec3f\" };\n case \"diffuseDir\":\n return { expr: `${callVar}.diffuseDir`, type: \"vec3f\" };\n case \"specularDir\":\n return { expr: `${callVar}.specularDir`, type: \"vec3f\" };\n case \"diffuseInd\":\n return { expr: `${callVar}.diffuseInd`, type: \"vec3f\" };\n case \"specularInd\":\n return { expr: `${callVar}.specularInd`, type: \"vec3f\" };\n case \"shadow\":\n return { expr: `${callVar}.shadow`, type: \"f32\" };\n case \"alpha\": {\n const cfg = block.serialized as { useSpecularOverAlpha?: boolean; useRadianceOverAlpha?: boolean };\n const useOverAlpha = cfg.useSpecularOverAlpha === true || cfg.useRadianceOverAlpha === true;\n const op = block.inputs.get(\"opacity\");\n const baseAlpha = op?.source ? ctx.cast(ctx.resolve(block, \"opacity\", stage, state), \"f32\").expr : \"1.0\";\n if (useOverAlpha) {\n return { expr: `clamp(${baseAlpha} + ${callVar}.lumOverAlpha * ${callVar}.lumOverAlpha, 0.0, 1.0)`, type: \"f32\" };\n }\n return { expr: baseAlpha, type: \"f32\" };\n }\n case \"ambientClr\":\n case \"clearcoatDir\":\n case \"clearcoatInd\":\n case \"sheenDir\":\n case \"sheenInd\":\n case \"refraction\":\n return { expr: `v3(0.0)`, type: \"vec3f\" };\n default:\n return { expr: `${callVar}.lighting`, type: \"vec3f\" };\n }\n },\n};\n"],"names":[],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- import { M as MAX_LIGHTS } from "./index-B7Qhw0xL.js";
1
+ import { M as MAX_LIGHTS } from "./index-CLElg2Bo.js";
2
2
  function ccDirectBlock(useClearcoat, useCcTint) {
3
3
  if (!useClearcoat) {
4
4
  return "";
@@ -760,4 +760,4 @@ const emitter = {
760
760
  export {
761
761
  emitter
762
762
  };
763
- //# sourceMappingURL=pbr-metallic-roughness-block-full-5t0HT3xl.js.map
763
+ //# sourceMappingURL=pbr-metallic-roughness-block-full-Ta9lR2cz.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"pbr-metallic-roughness-block-full-5t0HT3xl.js","sources":["../src/material/node/blocks/pbr-mr-helper-full.ts","../src/material/node/blocks/pbr-metallic-roughness-block-full.ts"],"sourcesContent":["/** PBRMetallicRoughnessBlock — direct lighting + optional IBL + optional clearcoat + optional sheen.\n *\n * When the `reflection` input is connected (typically to a ReflectionBlock),\n * this emitter runs the GGX direct-lighting path PLUS a split-sum IBL\n * contribution (specular cube + BRDF LUT + SH irradiance).\n *\n * When the `clearcoat` input is connected (to a ClearCoatBlock), an extra\n * GGX clear-coat layer is added on top: per-light Schlick fresnel + Kelemen\n * visibility GGX specular, and the base layer (diffuse + specular + IBL)\n * is modulated by (1 - ccFresnel * ccIntensity).\n *\n * When the `sheen` input is connected (to a SheenBlock), an extra Charlie\n * NDF + Ashikhmin visibility cloth/velvet sheen layer is added: per-light\n * direct sheen contribution and a sheen IBL term that uses the BRDF LUT\n * blue channel for the sheen-roughness lookup.\n *\n * Outputs implemented (others stub to a zero vector):\n * - lighting / diffuseDir / specularDir / shadow / alpha\n * - diffuseInd / specularInd (only meaningful when IBL is on)\n */\n\nimport type { NodePbrMrHelperRequest } from \"../node-types.js\";\nimport { MAX_LIGHTS } from \"../../../light/types.js\";\n\nfunction ccDirectBlock(useClearcoat: boolean, useCcTint: boolean): string {\n if (!useClearcoat) {\n return \"\";\n }\n const Ncc = \"ccNormalW\";\n const NdotLcc = \"ccNdotL\";\n const declCcNdotL = `let ccNdotL = clamp(dot(ccNormalW, L), 0.0000001, 1.0);`;\n return `\n${declCcNdotL}\nif (${NdotLcc} > 0.0 && atten > 0.0) {\nlet ccH = normalize(V + L);\nlet ccNdotH = clamp(dot(${Ncc}, ccH), 0.0000001, 1.0);\nlet ccVdotH = saturate(dot(V, ccH));\nlet ccD = nme_pbr_distGGX(ccNdotH, ccAlphaG);\nlet ccVis = 0.25 / (ccVdotH * ccVdotH + 0.0000001);\nlet ccF_d = nme_pbr_ccSchlick(ccF0, ccVdotH);\nlet ccTerm = ccF_d * ccD * ccVis * ${NdotLcc};\nccDirectSpecAcc = ccDirectSpecAcc + v3(ccTerm) * color * atten * ccIntensity * sh;\nbaseLayerAtten = 1.0 - ccF_d * ccIntensity;\n${\n useCcTint\n ? `let ccLRefract = -refract(L, ${Ncc}, ccIorInv);\nlet ccNdotLRefract = clamp(dot(${Ncc}, ccLRefract), 0.0000001, 1.0);\nlet ccDirectAbsorption = nme_pbr_cocaLambert(ccAbsorptionColor, ccTintThickness * ((ccNdotLRefract + ccNdotVRefract) / (ccNdotLRefract * ccNdotVRefract)));\nbaseLayerAbsorption = mix(v3(1.0), ccDirectAbsorption, v3(ccIntensity));`\n : ``\n}\n}`;\n}\n\nfunction ccHemiBlock(useClearcoat: boolean, useCcTint: boolean): string {\n if (!useClearcoat) {\n return \"\";\n }\n const Ncc = \"ccNormalW\";\n return `\nlet ccNdotL_h = clamp(dot(${Ncc}, Ldir), 0.0000001, 1.0);\nif (nl > 0.0) {\nlet ccH_h = normalize(V + Ldir);\nlet ccNdotH_h = clamp(dot(${Ncc}, ccH_h), 0.0000001, 1.0);\nlet ccVdotH_h = saturate(dot(V, ccH_h));\nlet ccD_h = nme_pbr_distGGX(ccNdotH_h, ccAlphaG);\nlet ccVis_h = 0.25 / (ccVdotH_h * ccVdotH_h + 0.0000001);\nlet ccF_h = nme_pbr_ccSchlick(ccF0, ccVdotH_h);\nlet ccTerm_h = ccF_h * ccD_h * ccVis_h * ccNdotL_h;\nccDirectSpecAcc = ccDirectSpecAcc + v3(ccTerm_h) * entry.vLightDiffuse.rgb * ccIntensity * sh;\nbaseLayerAtten = 1.0 - ccF_h * ccIntensity;\n${\n useCcTint\n ? `let ccLRefract_h = -refract(Ldir, ${Ncc}, ccIorInv);\nlet ccNdotLRefract_h = clamp(dot(${Ncc}, ccLRefract_h), 0.0000001, 1.0);\nlet ccDirectAbsorption_h = nme_pbr_cocaLambert(ccAbsorptionColor, ccTintThickness * ((ccNdotLRefract_h + ccNdotVRefract) / (ccNdotLRefract_h * ccNdotVRefract)));\nbaseLayerAbsorption = mix(v3(1.0), ccDirectAbsorption_h, v3(ccIntensity));`\n : ``\n}\n}`;\n}\n\nfunction shDirectBlock(useSheen: boolean): string {\n if (!useSheen) {\n return \"\";\n }\n return `\nif (NdotL > 0.0 && atten > 0.0) {\nlet shH = normalize(V + L);\nlet shNdotH = clamp(dot(N, shH), 0.0000001, 1.0);\nlet shD = nme_pbr_charlieD(shNdotH, shAlphaG);\nlet shV = 1.0 / (4.0 * (NdotL + NdotV - NdotL * NdotV) + 0.0000001);\nshDirectAcc = shDirectAcc + shColorScaled * shD * shV * NdotL * color * atten * sh * baseLayerAtten;\n}`;\n}\n\nfunction shHemiBlock(useSheen: boolean): string {\n if (!useSheen) {\n return \"\";\n }\n return `\nif (nl > 0.0) {\nlet shH_h = normalize(V + Ldir);\nlet shNdotH_h = clamp(dot(N, shH_h), 0.0000001, 1.0);\nlet shD_h = nme_pbr_charlieD(shNdotH_h, shAlphaG);\nlet shV_h = 1.0 / (4.0 * (nl + NdotV - nl * NdotV) + 0.0000001);\nshDirectAcc = shDirectAcc + shColorScaled * shD_h * shV_h * nl * entry.vLightSpecular.rgb * sh * baseLayerAtten;\n}`;\n}\n\n/** Subsurface IBL block — runs inside the env IBL section. Computes refraction\n * (refract V through N, sample env at refractionLOD, apply Coca-Lambert tint\n * absorption + reflectance complement) and translucency (back-scattered SH\n * irradiance with Burley transmittance). Contributes:\n * - finalRefraction (vec3, added to lighting)\n * - refractionOpacity (f32, scales finalIrradiance: 1 - refrIntensity)\n * - mutates finalIrradiance to include refractionIrradiance + (1-translucency) scale.\n *\n * Always declares finalRefraction/refractionOpacity even when sub-features are\n * off so the downstream composition can reference them unconditionally. */\nfunction ssBlock(useSubsurface: boolean, useRefraction: boolean, useAnisotropy: boolean): string {\n if (!useSubsurface && !useRefraction) {\n return `let finalRefraction = v3(0.0);\nlet refractionOpacity = 1.0;\nlet ssRefractionIrradiance = v3(0.0);`;\n }\n const refrPart = useRefraction\n ? `// Refraction: refract V through N at IOR, sample env at refraction LOD.\n let refrIntensity = clamp(refrIntensityIn, 0.0, 1.0);\n let invIor = 1.0 / max(refrIor, 1.0001);\n let refrV_raw = refract(-V, ${useAnisotropy ? \"aniN\" : \"N\"}, invIor);\n let refrV = v3(refrV_raw.x * cosA + refrV_raw.z * sinA, refrV_raw.y, -refrV_raw.x * sinA + refrV_raw.z * cosA);\n let refrAlphaG = mix(alphaG, 0.0, clamp(invIor * 3.0 - 2.0, 0.0, 1.0));\n let refrLod = log2(cubemapDim * refrAlphaG) * sceneU.vImageInfos.z;\n let envRefr = textureSampleLevel(nmeIblTexture, nmeIblSampler, refrV, clamp(refrLod, 0.0, maxLod)).rgb;\n let volumeAlbedo = nme_pbr_colorAtDistance(ssTintColor, refrTintAtDistance);\n let refrTransmittance = v3(refrIntensity) * nme_pbr_cocaLambert(volumeAlbedo, ssThickness);\n let finalRefractionRaw = envRefr * refrTransmittance * (v3(1.0) - refractionSpecEnvReflectance);\n let refractionOpacity = 1.0 - refrIntensity;`\n : `let finalRefractionRaw = v3(0.0);\nlet refractionOpacity = 1.0;`;\n const ssPart = useSubsurface\n ? `// Translucency: back-scattered SH irradiance with Burley transmittance.\n let nN_raw = -N;\n let nN_env = v3(nN_raw.x * cosA + nN_raw.z * sinA, nN_raw.y, -nN_raw.x * sinA + nN_raw.z * cosA);\n let backIrradiance = (sceneU.vSphericalL00.xyz\n + sceneU.vSphericalL1_1.xyz * nN_env.y + sceneU.vSphericalL10.xyz * nN_env.z + sceneU.vSphericalL11.xyz * nN_env.x\n + sceneU.vSphericalL2_2.xyz * (nN_env.y * nN_env.x) + sceneU.vSphericalL2_1.xyz * (nN_env.y * nN_env.z)\n + sceneU.vSphericalL20.xyz * (3.0 * nN_env.z * nN_env.z - 1.0) + sceneU.vSphericalL21.xyz * (nN_env.z * nN_env.x)\n + sceneU.vSphericalL22.xyz * (nN_env.x * nN_env.x - nN_env.y * nN_env.y));\n let ssRefractionIrradiance = backIrradiance * ssTransmittance;\n finalIrradiance = finalIrradiance * refractionOpacity;\n finalIrradiance = finalIrradiance * (1.0 - translucencyIntensity);`\n : `let ssRefractionIrradiance = v3(0.0);\nfinalIrradiance = finalIrradiance * refractionOpacity;`;\n return `${refrPart}\n${ssPart}\nlet finalRefraction = finalRefractionRaw;`;\n}\n\nexport function buildPbrMrHelperFull(request: NodePbrMrHelperRequest): string {\n return HELPER_WGSL(\n request.useEnv,\n request.useClearcoat,\n request.useSheen,\n request.useRefraction,\n request.useSubsurface,\n request.useAnisotropy,\n request.useIridescence,\n request.useShAlbedoScaling,\n request.useCcBump,\n request.useCcTint,\n request.useSpecularAA,\n request.remapClearcoatF0\n );\n}\n\nfunction HELPER_WGSL(\n useEnv: boolean,\n useClearcoat: boolean,\n useSheen: boolean,\n useRefraction: boolean,\n useSubsurface: boolean,\n useAnisotropy: boolean,\n useIridescence: boolean,\n useShAlbedoScaling: boolean,\n useCcBump: boolean,\n useCcTint: boolean,\n useSpecularAA: boolean,\n remapClearcoatF0: boolean\n): string {\n const ccDecls = useClearcoat\n ? `let ccIntensity = clamp(ccIntensityIn, 0.0, 1.0);\nlet ccRough = clamp(ccRoughnessIn, 0.0, 1.0);\nlet ccF0_raw = (ccIor - 1.0) / (ccIor + 1.0);\nlet ccF0 = ccF0_raw * ccF0_raw;\nvar ccDirectSpecAcc = v3(0.0);`\n : `let ccDirectSpecAcc = v3(0.0);`;\n\n const ccAlphaSetup = useClearcoat\n ? `var ccAA_factor_y = 0.0;\n${\n useSpecularAA\n ? `{ let ccNdfdx_AA = dpdx(ccNormalW);\nlet ccNdfdy_AA = dpdy(ccNormalW);\nlet ccSlopeSquare_AA = max(dot(ccNdfdx_AA, ccNdfdx_AA), dot(ccNdfdy_AA, ccNdfdy_AA));\nccAA_factor_y = sqrt(ccSlopeSquare_AA) * 0.75; }`\n : ``\n}\nlet ccAlphaG = ccRough * ccRough + 0.0005 + ccAA_factor_y;`\n : ``;\n\n const ccNormalSetup = useClearcoat\n ? useCcBump\n ? `let ccNormalW = nme_perturbNormal(worldPos, Ng, ccBumpUv, ccBumpColor, 1.0);\nlet ccNdotV = abs(dot(ccNormalW, V)) + 0.0000001;${\n useCcTint\n ? `\nlet ccIorInv = 1.0 / max(ccIor, 1.0001);\nlet ccAbsorptionColor = nme_pbr_colorAtDistance(max(ccTintColor, v3(0.0000001)), max(ccTintAtDistance, 0.0000001));\nlet ccVRefract = refract(-V, ccNormalW, ccIorInv);\nlet ccNdotVRefract = abs(dot(ccNormalW, ccVRefract)) + 0.0000001;`\n : ``\n }`\n : `let ccNormalW = Ng;\nlet ccNdotV = abs(dot(ccNormalW, V)) + 0.0000001;${\n useCcTint\n ? `\nlet ccIorInv = 1.0 / max(ccIor, 1.0001);\nlet ccAbsorptionColor = nme_pbr_colorAtDistance(max(ccTintColor, v3(0.0000001)), max(ccTintAtDistance, 0.0000001));\nlet ccVRefract = refract(-V, ccNormalW, ccIorInv);\nlet ccNdotVRefract = abs(dot(ccNormalW, ccVRefract)) + 0.0000001;`\n : ``\n }`\n : `let ccNormalW = N;\nlet ccNdotV: f32 = 0.0;`;\n\n const shDecls = useSheen\n ? `let shIntensityRaw = clamp(shIntensityIn, 0.0, 1.0);\n${\n useShAlbedoScaling\n ? `let shIntensity = shIntensityRaw;`\n : `let reflectanceF0 = max(colorF0.r, max(colorF0.g, colorF0.b));\nlet shIntensity = shIntensityRaw * (1.0 - reflectanceF0);`\n}\nlet shRough = clamp(shRoughnessIn, 0.0, 1.0);\nlet shAlphaG = shRough * shRough + 0.0005;\nlet shColorScaled = shColorIn * shIntensity;\nvar shDirectAcc = v3(0.0);`\n : `let shDirectAcc = v3(0.0);`;\n\n const shIblTerm =\n useEnv && useSheen\n ? `let shSpecLod = log2(cubemapDim * shAlphaG) * sceneU.vImageInfos.z;\n let shEnvRadiance = textureSampleLevel(nmeIblTexture, nmeIblSampler, R, clamp(shSpecLod, 0.0, maxLod)).rgb;\n let shBrdfBlue = textureSample(nmeBrdfLUT, nmeBrdfSampler, v2(NdotV, shRough)).b;\n let shFinalIbl = shEnvRadiance * shColorScaled * shBrdfBlue * seo * eho;\n ${\n useShAlbedoScaling\n ? `// SHEEN_ALBEDOSCALING: surface albedo and base specular scale by (1 - shInt × max(shColor) × envSheenBrdf.b).\n let shAlbedoScaling = 1.0 - shIntensity * max(max(shColorIn.r, shColorIn.g), shColorIn.b) * shBrdfBlue;`\n : `let shAlbedoScaling: f32 = 1.0;`\n }`\n : `let shFinalIbl = v3(0.0);\nlet shAlbedoScaling: f32 = 1.0;`;\n\n const directSpecR0Decl =\n useClearcoat && remapClearcoatF0\n ? `let _directF0S = sqrt(max(colorF0, v3(0.0)));\nlet _directF0T = ((1.0 - ccIor) + (1.0 + ccIor) * _directF0S) / ((1.0 + ccIor) + (1.0 - ccIor) * _directF0S);\nlet directSpecR0 = mix(colorF0, clamp(_directF0T * _directF0T, v3(0.0), v3(1.0)), ccIntensity);`\n : `let directSpecR0 = colorF0;`;\n\n const shIblScale = useClearcoat ? ` * ccConsIBL${useCcTint ? \" * ccAbsorption\" : \"\"}` : \"\";\n const refrCcScale = useClearcoat ? \" * ccConsIBL\" : \"\";\n const ccIblPre = useClearcoat\n ? `let ccFresnelIBL = nme_pbr_ccSchlick(ccF0, ccNdotV);\n let ccConsIBL = 1.0 - ccFresnelIBL * ccIntensity;\n let ccBrdfSample = textureSample(nmeBrdfLUT, nmeBrdfSampler, v2(ccNdotV, ccRough)).rgb;\n let ccSpecEnvReflRaw = (v3(ccF0) * ccBrdfSample.y + (v3(1.0) - v3(ccF0)) * ccBrdfSample.x) * ccIntensity;\n let ccEnergyConservation = 1.0 + _coloredR0 * (1.0 / max(ccBrdfSample.y, 0.001) - 1.0);\n let ccEhoT = clamp(1.0 + 1.1 * dot(reflect(-V, ccNormalW), Ng), 0.0, 1.0);\n let ccSpecEnvRefl = ccSpecEnvReflRaw * (ccEhoT * ccEhoT);\n let ccSpecLod = log2(cubemapDim * ccAlphaG) * sceneU.vImageInfos.z;\n let ccR_raw = reflect(-V, ccNormalW);\n let ccR = v3(ccR_raw.x * cosA + ccR_raw.z * sinA, ccR_raw.y, -ccR_raw.x * sinA + ccR_raw.z * cosA);\n let ccEnvRadiance = textureSampleLevel(nmeIblTexture, nmeIblSampler, ccR, clamp(ccSpecLod, 0.0, maxLod)).rgb;\n ${\n useCcTint\n ? `// Clearcoat absorption: BJS Beer-Lambert path length through the coat.\n let ccAbsorption = mix(v3(1.0), nme_pbr_cocaLambert(ccAbsorptionColor, ccTintThickness * ((ccNdotVRefract + ccNdotVRefract) / (ccNdotVRefract * ccNdotVRefract))), v3(ccIntensity));`\n : `let ccAbsorption = v3(1.0);`\n }\n let ccFinalRadiance = ccEnvRadiance * ccSpecEnvRefl;`\n : ``;\n const ccTintScale = useCcTint ? \" * ccAbsorption\" : \"\";\n const ccIblFinal = useClearcoat\n ? `${ccIblPre}\n${shIblTerm}\nr.lighting = finalIrradiance * shAlbedoScaling * ccConsIBL${ccTintScale}\n+ finalRadianceScaled * shAlbedoScaling * ccConsIBL${ccTintScale}\n+ ssRefractionIrradiance * ao_c\n+ finalSpecularScaledDirect * shAlbedoScaling\n+ diffuseAcc * shAlbedoScaling\n+ diffuseTransmissionAcc\n+ ccDirectSpecAcc * ccEnergyConservation\n+ ccFinalRadiance\n+ shDirectAcc\n+ shFinalIbl${shIblScale}\n+ finalRefraction${refrCcScale}${ccTintScale};`\n : `${shIblTerm}\nr.lighting = finalIrradiance * shAlbedoScaling + ssRefractionIrradiance * ao_c + (finalRadianceScaled + finalSpecularScaledDirect + diffuseAcc) * shAlbedoScaling + diffuseTransmissionAcc + shDirectAcc + shFinalIbl + finalRefraction;`;\n\n const ccDirectFinal = useClearcoat\n ? `r.lighting = diffuseAcc + specAcc + diffuseTransmissionAcc + ccDirectSpecAcc + shDirectAcc;`\n : `r.lighting = diffuseAcc + diffuseTransmissionAcc + specAcc + shDirectAcc;`;\n\n const refractionSpecEnvReflectanceDecl = useRefraction ? `let refractionSpecEnvReflectance = baseSpecEnvReflectance;` : ``;\n\n const iblBlock = useEnv\n ? `\n let envRot = sceneU.envRotationY;\n let cosA = cos(envRot); let sinA = sin(envRot);\n let N_specSrc = ${useAnisotropy ? \"aniN\" : \"N\"};\n let R_raw = reflect(-V, N_specSrc);\n let R = v3(R_raw.x * cosA + R_raw.z * sinA, R_raw.y, -R_raw.x * sinA + R_raw.z * cosA);\n let N_env = v3(Ng.x * cosA + Ng.z * sinA, Ng.y, -Ng.x * sinA + Ng.z * cosA);\n let environmentIrradiance = (sceneU.vSphericalL00.xyz\n + sceneU.vSphericalL1_1.xyz * N_env.y + sceneU.vSphericalL10.xyz * N_env.z + sceneU.vSphericalL11.xyz * N_env.x\n + sceneU.vSphericalL2_2.xyz * (N_env.y * N_env.x) + sceneU.vSphericalL2_1.xyz * (N_env.y * N_env.z)\n + sceneU.vSphericalL20.xyz * (3.0 * N_env.z * N_env.z - 1.0) + sceneU.vSphericalL21.xyz * (N_env.z * N_env.x)\n + sceneU.vSphericalL22.xyz * (N_env.x * N_env.x - N_env.y * N_env.y));\n let brdfSample = textureSample(nmeBrdfLUT, nmeBrdfSampler, v2(NdotV, rough_c));\n let envBrdf = brdfSample.rgb;\n let reflectanceF0Scalar = max(colorF0.r, max(colorF0.g, colorF0.b));\n let baseSpecEnvReflectance = (colorF90 - v3(reflectanceF0Scalar)) * envBrdf.x + v3(reflectanceF0Scalar) * envBrdf.y;\n let seo = clamp((NdotVUnclamped + ao_c) * (NdotVUnclamped + ao_c) - 1.0 + ao_c, 0.0, 1.0);\n let _geoNF = select(-Ng, Ng, dot(Ng, V) > 0.0);\n let _ehoRefl = reflect(-V, N);\n let _ehoT = clamp(1.0 + 1.1 * dot(_ehoRefl, _geoNF), 0.0, 1.0);\n let eho = _ehoT * _ehoT;\n ${\n useClearcoat && remapClearcoatF0\n ? `let _f0S = sqrt(max(colorF0, v3(0.0)));\n let _f0T = ((1.0 - ccIor) + (1.0 + ccIor) * _f0S) / ((1.0 + ccIor) + (1.0 - ccIor) * _f0S);\n let _coloredR0 = mix(colorF0, clamp(_f0T * _f0T, v3(0.0), v3(1.0)), ccIntensity);`\n : `let _coloredR0 = colorF0;`\n }\n let colorSpecEnvReflectance = ((colorF90 - _coloredR0) * envBrdf.x + _coloredR0 * envBrdf.y) * seo * eho;\n let energyConservation = 1.0 + _coloredR0 * (1.0 / max(envBrdf.y, 0.001) - 1.0);\n let maxLod = f32(textureNumLevels(nmeIblTexture) - 1);\n let cubemapDim = f32(textureDimensions(nmeIblTexture).x);\n let specLod = log2(cubemapDim * alphaG) * sceneU.vImageInfos.z;\n var environmentRadiance = textureSampleLevel(nmeIblTexture, nmeIblSampler, R, clamp(specLod, 0.0, maxLod)).rgb;\n ${refractionSpecEnvReflectanceDecl}\n var finalIrradiance = environmentIrradiance * surfaceAlbedo;\n let finalRadianceScaled = environmentRadiance * colorSpecEnvReflectance * energyConservation;\n let finalSpecularScaledDirect = specAcc * energyConservation;\n ${ssBlock(useSubsurface, useRefraction, useAnisotropy)}\n finalIrradiance = finalIrradiance * ao_c;\n r.diffuseInd = finalIrradiance;\n r.specularInd = finalRadianceScaled;\n ${ccIblFinal}`\n : `\nr.diffuseInd = v3(0.0);\nr.specularInd = v3(0.0);\n${ccDirectFinal}`;\n\n const ccSchlickFn = useClearcoat\n ? `fn nme_pbr_ccSchlick(f0: f32, cosTheta: f32) -> f32 {\nlet t = 1.0 - cosTheta;\nlet t2 = t * t;\nreturn f0 + (1.0 - f0) * (t2 * t2 * t);\n}\n`\n : ``;\n\n const charlieFn = useSheen\n ? `fn nme_pbr_charlieD(NdotH: f32, alphaG: f32) -> f32 {\nlet invR = 1.0 / max(alphaG, 0.0005);\nlet cos2h = NdotH * NdotH;\nlet sin2h = 1.0 - cos2h;\nreturn (2.0 + invR) * pow(sin2h, invR * 0.5) / (2.0 * NME_PBR_PI);\n}\n`\n : ``;\n\n const anisoFns = useAnisotropy\n ? `fn nme_pbr_anisoRoughness(alphaG: f32, anisotropy: f32) -> v2 {\nlet alphaT = max(alphaG * (1.0 + anisotropy), 0.0005);\nlet alphaB = max(alphaG * (1.0 - anisotropy), 0.0005);\nreturn v2(alphaT, alphaB);\n}\nfn nme_pbr_anisoBentNormal(T: v3, B: v3, N: v3, V: v3, anisotropy: f32) -> v3 {\nvar anisotropicFrameDirection = B;\nif (anisotropy < 0.0) {\nanisotropicFrameDirection = T;\n}\nlet anisoTan = cross(normalize(anisotropicFrameDirection), V);\nlet anisoNormal = cross(anisoTan, anisotropicFrameDirection);\nreturn normalize(mix(N, anisoNormal, abs(anisotropy)));\n}\nfn nme_pbr_burleyAnisoD(NdotH: f32, TdotH: f32, BdotH: f32, alphaTB: v2) -> f32 {\nlet a2 = alphaTB.x * alphaTB.y;\nlet v = v3(alphaTB.y * TdotH, alphaTB.x * BdotH, a2 * NdotH);\nlet v2 = dot(v, v);\nlet w2 = a2 / max(v2, 0.0000001);\nreturn a2 * w2 * w2 * (1.0 / NME_PBR_PI);\n}\nfn nme_pbr_visAnisoSmith(NdotL: f32, NdotV: f32, TdotV: f32, BdotV: f32, TdotL: f32, BdotL: f32, alphaTB: v2) -> f32 {\nlet lambdaV = NdotL * length(v3(alphaTB.x * TdotV, alphaTB.y * BdotV, NdotV));\nlet lambdaL = NdotV * length(v3(alphaTB.x * TdotL, alphaTB.y * BdotL, NdotL));\nreturn 0.5 / max(lambdaV + lambdaL, 0.0000001);\n}\n`\n : ``;\n\n const ssFns =\n useSubsurface || useRefraction || useCcTint\n ? `fn nme_pbr_transmittanceBurley(tintColor: v3, diffusionDist: v3, thickness: f32) -> v3 {\nlet S = v3(1.0) / max(diffusionDist, v3(0.0000001));\nlet temp = exp(-0.333333333 * thickness * S);\nreturn tintColor * 0.25 * (temp * temp * temp + 3.0 * temp);\n}\nfn nme_pbr_cocaLambert(volumeAlbedo: v3, distance: f32) -> v3 {\nreturn exp(-volumeAlbedo * distance);\n}\nfn nme_pbr_colorAtDistance(color: v3, distance: f32) -> v3 {\nreturn -log(color) / distance;\n}\n`\n : ``;\n\n const anisoSetup = useAnisotropy\n ? `let _adp1 = dpdx(worldPos);\nlet _adp2 = -dpdy(worldPos);\nlet _aduv1 = dpdx(anisoUv);\nlet _aduv2 = -dpdy(anisoUv);\nlet _adp2perp = cross(_adp2, Ng);\nlet _adp1perp = cross(Ng, _adp1);\nlet _atan = _adp2perp * _aduv1.x + _adp1perp * _aduv2.x;\nlet _abit = _adp2perp * _aduv1.y + _adp1perp * _aduv2.y;\nlet _adet = max(dot(_atan, _atan), dot(_abit, _abit));\nlet _ainvmax = select(0.0, inverseSqrt(_adet), _adet > 0.0);\nlet _aTBN0 = normalize(_atan * _ainvmax);\nlet _aTBN1 = normalize(_abit * _ainvmax);\nlet anisoIntensity = clamp(anisoIntensityIn, -1.0, 1.0);\nlet anisoDir = v3(anisoDirection, 0.0);\nlet anisoT_raw = _aTBN0 * anisoDir.x + _aTBN1 * anisoDir.y;\nlet anisoT = normalize(anisoT_raw);\nlet anisoB = normalize(cross(Ng, anisoT));\nlet aniAlphaTB = nme_pbr_anisoRoughness(alphaG, anisoIntensity);\nlet aniN = nme_pbr_anisoBentNormal(anisoT, anisoB, N, V, anisoIntensity);`\n : `let anisoT = v3(1.0, 0.0, 0.0);\nlet anisoB = v3(0.0, 0.0, 1.0);\nlet aniAlphaTB = v2(alphaG, alphaG);\nlet aniN = N;`;\n\n const specularAABlock = useSpecularAA\n ? `var AA_factor_x = 0.0;\nvar AA_factor_y = 0.0;\n{ let nDfdx_AA = dpdx(N);\nlet nDfdy_AA = dpdy(N);\nlet slopeSquare_AA = max(dot(nDfdx_AA, nDfdx_AA), dot(nDfdy_AA, nDfdy_AA));\nAA_factor_x = pow(saturate(slopeSquare_AA), 0.333);\nAA_factor_y = sqrt(slopeSquare_AA) * 0.75;\nalphaG = alphaG + AA_factor_y; }`\n : `let AA_factor_x = 0.0;\nlet AA_factor_y = 0.0;`;\n\n return `alias v2 = vec2<f32>;\nalias v3 = vec3<f32>;\nalias v4 = vec4<f32>;\nstruct NmePbrMrResult {\nlighting: v3,\ndiffuseDir: v3,\nspecularDir: v3,\ndiffuseInd: v3,\nspecularInd: v3,\nshadow: f32,\nlumOverAlpha: f32,\n};\nconst NME_PBR_PI: f32 = 3.14159265358979323846;\nfn nme_pbr_distGGX(NdotH: f32, alphaG: f32) -> f32 {\nlet a2 = alphaG * alphaG;\nlet d = NdotH * NdotH * (a2 - 1.0) + 1.0;\nreturn a2 / (NME_PBR_PI * d * d);\n}\nfn nme_pbr_geomGGX(NdotL: f32, NdotV: f32, alphaG: f32) -> f32 {\nlet a2 = alphaG * alphaG;\nlet gl = NdotL * sqrt(NdotV * (NdotV - a2 * NdotV) + a2);\nlet gv = NdotV * sqrt(NdotL * (NdotL - a2 * NdotL) + a2);\nreturn 0.5 / max(gl + gv, 0.00001);\n}\nfn nme_pbr_fresSchlick(c: f32, F0: v3, F90: v3) -> v3 {\nlet t = 1.0 - c;\nlet t2 = t * t;\nreturn F0 + (F90 - F0) * (t2 * t2 * t);\n}\nfn nme_pbr_diffuseEON(albedo: v3, sigma: f32, NdotL: f32, NdotV: f32, LdotV: f32) -> v3 {\nreturn albedo * (1.0 / NME_PBR_PI);\n}\n${ccSchlickFn}${charlieFn}${anisoFns}${ssFns}fn nme_pbr_mr_compute(\n worldPos: v3, geometricNormal: v3, worldNormal: v3, cameraPos: v3,\n baseColor: v3, metallic: f32, roughness: f32, ao: f32,\n ccIntensityIn: f32, ccRoughnessIn: f32, ccIor: f32,\n ccBumpColor: v3, ccBumpUv: v2,\n ccTintColor: v3, ccTintAtDistance: f32, ccTintThickness: f32,\n shIntensityIn: f32, shColorIn: v3, shRoughnessIn: f32,\n baseIor: f32,\n refrIntensityIn: f32, refrIor: f32, refrTintAtDistance: f32,\n ssTintColor: v3, ssThickness: f32,\n ssTranslucencyIntensityIn: f32, ssDiffusionDist: v3,\n anisoIntensityIn: f32, anisoDirection: v2, anisoUv: v2,\n iridescenceIntensityIn: f32, iridescenceIorIn: f32, iridescenceThicknessIn: f32,\n shadowFactors: array<f32, ${MAX_LIGHTS}>\n) -> NmePbrMrResult {\n var r: NmePbrMrResult;\n let Ng = normalize(geometricNormal);\n let N = normalize(worldNormal);\n let V = normalize(cameraPos - worldPos);\n let NdotVUnclamped = dot(N, V);\n let NdotV = abs(NdotVUnclamped) + 0.0000001;\n let metallic_c = clamp(metallic, 0.0, 1.0);\n let rough_c = clamp(roughness, 0.0, 1.0);\n var alphaG = rough_c * rough_c + 0.0005;\n ${specularAABlock}\n let dielectricF0Raw = (baseIor - 1.0) / (baseIor + 1.0);\n let dielectricF0Scalar = dielectricF0Raw * dielectricF0Raw;\n let dielectricF0 = v3(dielectricF0Scalar);\n var surfaceAlbedo = baseColor * (1.0 - metallic_c) * (1.0 - dielectricF0Scalar);\n let colorF0Base = mix(dielectricF0, baseColor, metallic_c);\n let colorF0 = ${\n useIridescence\n ? `mix(colorF0Base, nme_pbr_evalIridescence(1.0, max(iridescenceIorIn, 1.0001), NdotV, max(iridescenceThicknessIn, 0.0), colorF0Base), clamp(iridescenceIntensityIn, 0.0, 1.0))`\n : `colorF0Base`\n };\n let colorF90 = v3(1.0);\n let ao_c = clamp(ao, 0.0, 1.0);\n let directRoughness = max(rough_c, AA_factor_x);\n let directAlphaG = directRoughness * directRoughness + 0.0005;\n ${anisoSetup}\n ${ccDecls}\n ${directSpecR0Decl}\n ${ccNormalSetup}\n ${ccAlphaSetup}\n ${shDecls}\n let translucencyIntensity = ${useSubsurface ? \"clamp(ssTranslucencyIntensityIn, 0.0, 1.0)\" : \"0.0\"};\n let ssTransmittance = ${useSubsurface ? \"nme_pbr_transmittanceBurley(ssTintColor, ssDiffusionDist, max(ssThickness, 0.0000001)) * translucencyIntensity\" : \"v3(0.0)\"};\n let directDiffuseTranslucencyScale = 1.0 - translucencyIntensity;\n ${\n useRefraction\n ? `// LEGACY_SPECULAR_ENERGY_CONSERVATION is on for BJS NME PBR-MR. When refraction\n let _refractionOpacityPre = 1.0 - clamp(refrIntensityIn, 0.0, 1.0);\n surfaceAlbedo = surfaceAlbedo * _refractionOpacityPre;`\n : ``\n }\n var diffuseAcc = v3(0.0);\n var diffuseTransmissionAcc = v3(0.0);\n var specAcc = v3(0.0);\n var aggShadow: f32 = 0.0;\n var nLights: f32 = 0.0;\n let lc = min(meshU.lc, ${MAX_LIGHTS}u);\n for (var i: u32 = 0u; i < lc; i = i + 1u) {\n let lightIndex = nli(i);\n let entry = nmeLights.lights[lightIndex];\n let t = u32(entry.vLightData.w);\n let sh = shadowFactors[lightIndex];\n if (t == 3u) {\n let Ldir = normalize(entry.vLightData.xyz);\n let nl = clamp(0.5 + 0.5 * dot(N, Ldir), 0.0000001, 1.0);\n let groundSky = mix(entry.vLightDirection.xyz, entry.vLightDiffuse.rgb, nl);\n var baseLayerAtten: f32 = 1.0;\n var baseLayerAbsorption = v3(1.0);${ccHemiBlock(useClearcoat, useCcTint)}\n let H_h = normalize(V + Ldir);\n let NdotH_h = clamp(dot(N, H_h), 0.0000001, 1.0);\n let VdotH_h = saturate(dot(V, H_h));\n let cF_h = nme_pbr_fresSchlick(VdotH_h, directSpecR0, colorF90);\n ${\n useAnisotropy\n ? `let TdotH_h = dot(anisoT, H_h);\n let BdotH_h = dot(anisoB, H_h);\n let TdotV_h = dot(anisoT, V);\n let BdotV_h = dot(anisoB, V);\n let TdotL_h = dot(anisoT, Ldir);\n let BdotL_h = dot(anisoB, Ldir);\n let D_h = nme_pbr_burleyAnisoD(NdotH_h, TdotH_h, BdotH_h, aniAlphaTB);\n let Vis_h = nme_pbr_visAnisoSmith(nl, NdotV, TdotV_h, BdotV_h, TdotL_h, BdotL_h, aniAlphaTB);\n specAcc = specAcc + cF_h * D_h * Vis_h * nl * entry.vLightDiffuse.rgb * sh * baseLayerAtten * baseLayerAbsorption;`\n : `let D_h = nme_pbr_distGGX(NdotH_h, directAlphaG);\n let G_h = nme_pbr_geomGGX(nl, NdotV, directAlphaG);\n specAcc = specAcc + cF_h * D_h * G_h * nl * entry.vLightDiffuse.rgb * sh * baseLayerAtten * baseLayerAbsorption;`\n }\n diffuseAcc = diffuseAcc + groundSky * surfaceAlbedo * sh * baseLayerAtten * baseLayerAbsorption;${shHemiBlock(useSheen)}\n aggShadow = aggShadow + sh;\n nLights = nLights + 1.0;\n continue;\n }\n var L: v3;\n var atten: f32 = 1.0;\n let color = entry.vLightDiffuse.rgb;\n if (t == 1u) {\n L = normalize(-entry.vLightData.xyz);\n } else {\n let toL = entry.vLightData.xyz - worldPos;\n let d2 = dot(toL, toL);\n let dist = sqrt(d2);\n L = toL / max(dist, 0.0001);\n let range = entry.vLightDiffuse.a;\n if (t == 2u) {\n let invD2 = 1.0 / max(d2, 0.0000001);\n let cosHalfAngle = entry.vLightDirection.w;\n let kappa = 6.64385618977 / max(1.0 - cosHalfAngle, 0.0001);\n let cd = dot(-entry.vLightDirection.xyz, L);\n let dirFall = exp2(kappa * (cd - 1.0));\n atten = invD2 * dirFall;\n } else {\n atten = 1.0 / max(d2, 0.0000001);\n }\n }\n let NdotLUnclamped = dot(N, L);\n let NdotL = clamp(NdotLUnclamped, 0.0000001, 1.0);\n var baseLayerAtten: f32 = 1.0;\n var baseLayerAbsorption = v3(1.0);${ccDirectBlock(useClearcoat, useCcTint)}\n let _LdotV = select(0.0, dot(L, V), t == 1u);\n let _eonDiffuse = nme_pbr_diffuseEON(surfaceAlbedo, 0.0, NdotL, NdotV, _LdotV);\n diffuseAcc = diffuseAcc + _eonDiffuse * directDiffuseTranslucencyScale * NdotL * color * atten * sh * baseLayerAtten * baseLayerAbsorption;\n if (NdotLUnclamped < 0.0 && translucencyIntensity > 0.0) {\n let _trNdotL = abs(NdotLUnclamped) + 0.0000001;\n let _wrapW = 0.02;\n let _wrapT = 1.0 + _wrapW;\n let _wrapNdotL = clamp((_trNdotL + _wrapW) / (_wrapT * _wrapT), 0.0, 1.0);\n let _clampedAlbT = clamp(surfaceAlbedo, v3(0.1), v3(1.0));\n let _eonTransmit = nme_pbr_diffuseEON(_clampedAlbT, 0.0, max(NdotL, 0.0000001), NdotV, _LdotV) / _clampedAlbT;\n diffuseTransmissionAcc = diffuseTransmissionAcc + _eonTransmit * (ssTransmittance * _wrapNdotL) * color * atten * sh * baseLayerAtten * baseLayerAbsorption;\n }\n if (NdotL > 0.0 && atten > 0.0) {\n let H = normalize(V + L);\n let NdotH = clamp(dot(N, H), 0.0000001, 1.0);\n let VdotH = saturate(dot(V, H));\n let cF = nme_pbr_fresSchlick(VdotH, directSpecR0, colorF90);\n ${\n useAnisotropy\n ? `let TdotH = dot(anisoT, H);\n let BdotH = dot(anisoB, H);\n let TdotV = dot(anisoT, V);\n let BdotV = dot(anisoB, V);\n let TdotL = dot(anisoT, L);\n let BdotL = dot(anisoB, L);\n let D = nme_pbr_burleyAnisoD(NdotH, TdotH, BdotH, aniAlphaTB);\n let Vis = nme_pbr_visAnisoSmith(NdotL, NdotV, TdotV, BdotV, TdotL, BdotL, aniAlphaTB);\n specAcc = specAcc + cF * D * Vis * NdotL * color * atten * sh * baseLayerAtten * baseLayerAbsorption;`\n : `let D = nme_pbr_distGGX(NdotH, directAlphaG);\n let G = nme_pbr_geomGGX(NdotL, NdotV, directAlphaG);\n specAcc = specAcc + cF * D * G * NdotL * color * atten * sh * baseLayerAtten * baseLayerAbsorption;`\n }\n }${shDirectBlock(useSheen)}\n aggShadow = aggShadow + sh;\n nLights = nLights + 1.0;\n }\n r.diffuseDir = diffuseAcc;\n r.specularDir = specAcc;\n${iblBlock}\n ${\n useEnv\n ? `let _radLum = clamp(dot(finalRadianceScaled * shAlbedoScaling${useClearcoat ? ` * ccConsIBL${ccTintScale}` : ``}, v3(0.2126, 0.7152, 0.0722)), 0.0, 1.0);\n let _specLum = clamp(dot(finalSpecularScaledDirect * shAlbedoScaling, v3(0.2126, 0.7152, 0.0722)), 0.0, 1.0);${\n useClearcoat\n ? `\n let _ccLum = clamp(dot(ccFinalRadiance, v3(0.2126, 0.7152, 0.0722)), 0.0, 1.0);\n r.lumOverAlpha = _radLum + _specLum + _ccLum;`\n : `\n r.lumOverAlpha = _radLum + _specLum;`\n }`\n : `let _specLum = clamp(dot(specAcc, v3(0.2126, 0.7152, 0.0722)), 0.0, 1.0);\n r.lumOverAlpha = _specLum;`\n }\n var colorOut = max(r.lighting, v3(0.0)) * sceneU.vImageInfos.x;\n if (sceneU.vImageInfos.w > 0.5) {\n colorOut = 1.0 - exp2(-1.590579 * colorOut);\n }\n colorOut = pow(max(colorOut, v3(0.0)), v3(0.45454545));\n colorOut = clamp(colorOut, v3(0.0), v3(1.0));\n let highContrast = colorOut * colorOut * (v3(3.0) - colorOut * 2.0);\n if (sceneU.vImageInfos.y < 1.0) {\n colorOut = mix(v3(0.5), colorOut, sceneU.vImageInfos.y);\n } else {\n colorOut = mix(colorOut, highContrast, sceneU.vImageInfos.y - 1.0);\n }\n r.lighting = max(colorOut, v3(0.0));\n if (nLights > 0.0) { r.shadow = aggShadow / nLights; } else { r.shadow = 1.0; }\n return r;\n}\n`;\n}\n","import type { BlockEmitter, NodeBlock, NodeBuildState, NodeEmitContext, Stage } from \"../node-types.js\";\nimport { MAX_LIGHTS } from \"../../../light/types.js\";\nimport { buildPbrMrHelperFull } from \"./pbr-mr-helper-full.js\";\n\nconst HELPER_KEY_PREFIX = \"nme_pbr_mr\";\nconst SHADOW_FACTORS_ONE = `array<f32, ${MAX_LIGHTS}>(${new Array(MAX_LIGHTS).fill(\"1.0\").join(\", \")})`;\n\nfunction resolveOptional(block: NodeBlock, inputName: string, fallback: string, target: \"vec3f\" | \"f32\", stage: Stage, state: NodeBuildState, ctx: NodeEmitContext): string {\n const input = block.inputs.get(inputName);\n if (input?.source) {\n return ctx.cast(ctx.resolve(block, inputName, stage, state), target).expr;\n }\n return fallback;\n}\n\nexport const emitter: BlockEmitter = {\n className: \"PBRMetallicRoughnessBlock\",\n stage: \"fragment\",\n emit(block, outputName, stage, state, ctx) {\n const reflectionConnected = !!block.inputs.get(\"reflection\")?.source;\n if (reflectionConnected) {\n state.usesEnv = true;\n ctx.resolve(block, \"reflection\", stage, state);\n }\n const ccInputRef = block.inputs.get(\"clearcoat\")?.source;\n let ccIntensityExpr = \"0.0\";\n let ccRoughnessExpr = \"0.0\";\n let ccIorExpr = \"1.5\";\n let ccBumpExpr = \"v3(0.5, 0.5, 1.0)\";\n let ccBumpUvExpr = \"v2(0.0)\";\n let useCcBump = false;\n let ccTintColorExpr = \"v3(1.0)\";\n let ccTintAtDistanceExpr = \"1.0\";\n let ccTintThicknessExpr = \"0.0\";\n let useCcTint = false;\n let useClearcoat = false;\n let remapClearcoatF0 = false;\n if (ccInputRef) {\n const ccBlock = ctx.graph.blocks.get(ccInputRef.blockId);\n if (ccBlock && ccBlock.className === \"ClearCoatBlock\") {\n useClearcoat = true;\n remapClearcoatF0 = (ccBlock.serialized as { remapF0OnInterfaceChange?: boolean }).remapF0OnInterfaceChange === true;\n state.usesClearcoat = true;\n ctx.resolveOutput(ccBlock, ccInputRef.outputName, stage, state);\n ccIntensityExpr = resolveOptional(ccBlock, \"intensity\", \"1.0\", \"f32\", stage, state, ctx);\n ccRoughnessExpr = resolveOptional(ccBlock, \"roughness\", \"0.0\", \"f32\", stage, state, ctx);\n ccIorExpr = resolveOptional(ccBlock, \"indexOfRefraction\", \"1.5\", \"f32\", stage, state, ctx);\n if (ccBlock.inputs.get(\"normalMapColor\")?.source) {\n useCcBump = true;\n ccBumpExpr = resolveOptional(ccBlock, \"normalMapColor\", \"v3(0.5, 0.5, 1.0)\", \"vec3f\", stage, state, ctx);\n const uvIn = ccBlock.inputs.get(\"uv\");\n if (uvIn?.source) {\n const e = ctx.resolve(ccBlock, \"uv\", stage, state);\n ccBumpUvExpr = e.type === \"vec2f\" ? e.expr : `(${e.expr}).xy`;\n }\n }\n if (ccBlock.inputs.get(\"tintColor\")?.source) {\n useCcTint = true;\n ccTintColorExpr = resolveOptional(ccBlock, \"tintColor\", \"v3(1.0)\", \"vec3f\", stage, state, ctx);\n ccTintAtDistanceExpr = resolveOptional(ccBlock, \"tintAtDistance\", \"1.0\", \"f32\", stage, state, ctx);\n ccTintThicknessExpr = resolveOptional(ccBlock, \"tintThickness\", \"0.0\", \"f32\", stage, state, ctx);\n }\n }\n }\n const shInputRef = block.inputs.get(\"sheen\")?.source;\n let shIntensityExpr = \"0.0\";\n let shColorExpr = \"v3(1.0)\";\n let shRoughnessExpr = \"0.0\";\n let useSheen = false;\n let useShAlbedoScaling = false;\n if (shInputRef) {\n const shBlock = ctx.graph.blocks.get(shInputRef.blockId);\n if (shBlock && shBlock.className === \"SheenBlock\") {\n useSheen = true;\n state.usesSheen = true;\n useShAlbedoScaling = (shBlock.serialized as { albedoScaling?: boolean }).albedoScaling === true;\n ctx.resolveOutput(shBlock, shInputRef.outputName, stage, state);\n shIntensityExpr = resolveOptional(shBlock, \"intensity\", \"1.0\", \"f32\", stage, state, ctx);\n shColorExpr = resolveOptional(shBlock, \"color\", \"v3(1.0)\", \"vec3f\", stage, state, ctx);\n const shrIn = shBlock.inputs.get(\"roughness\");\n shRoughnessExpr = shrIn?.source\n ? resolveOptional(shBlock, \"roughness\", \"0.0\", \"f32\", stage, state, ctx)\n : `clamp(${resolveOptional(block, \"roughness\", \"0.5\", \"f32\", stage, state, ctx)}, 0.0, 1.0)`;\n }\n }\n const ssInputRef = block.inputs.get(\"subsurface\")?.source;\n let useSubsurface = false;\n let useRefraction = false;\n let ssTintColorExpr = \"v3(1.0)\";\n let ssThicknessExpr = \"0.0\";\n let ssTranslucencyIntensityExpr = \"0.0\";\n let ssDiffusionDistExpr = \"v3(1.0)\";\n let refrIntensityExpr = \"0.0\";\n let refrIorExpr = resolveOptional(block, \"indexOfRefraction\", \"1.5\", \"f32\", stage, state, ctx);\n let refrTintAtDistanceExpr = \"1.0\";\n if (ssInputRef) {\n const ssBlk = ctx.graph.blocks.get(ssInputRef.blockId);\n if (ssBlk && ssBlk.className === \"SubSurfaceBlock\") {\n useSubsurface = true;\n state.usesSubsurface = true;\n ctx.resolveOutput(ssBlk, ssInputRef.outputName, stage, state);\n ssTintColorExpr = resolveOptional(ssBlk, \"tintColor\", \"v3(1.0)\", \"vec3f\", stage, state, ctx);\n ssThicknessExpr = resolveOptional(ssBlk, \"thickness\", \"0.0\", \"f32\", stage, state, ctx);\n ssTranslucencyIntensityExpr = resolveOptional(ssBlk, \"translucencyIntensity\", \"0.0\", \"f32\", stage, state, ctx);\n ssDiffusionDistExpr = resolveOptional(ssBlk, \"translucencyDiffusionDist\", \"v3(1.0)\", \"vec3f\", stage, state, ctx);\n const refrInputRef = ssBlk.inputs.get(\"refraction\")?.source;\n if (refrInputRef) {\n const refrBlk = ctx.graph.blocks.get(refrInputRef.blockId);\n if (refrBlk && refrBlk.className === \"RefractionBlock\") {\n useRefraction = true;\n ctx.resolveOutput(refrBlk, refrInputRef.outputName, stage, state);\n refrIntensityExpr = resolveOptional(refrBlk, \"intensity\", \"1.0\", \"f32\", stage, state, ctx);\n refrTintAtDistanceExpr = resolveOptional(refrBlk, \"tintAtDistance\", \"1.0\", \"f32\", stage, state, ctx);\n const volIor = refrBlk.inputs.get(\"volumeIndexOfRefraction\");\n if (volIor?.source) {\n refrIorExpr = resolveOptional(refrBlk, \"volumeIndexOfRefraction\", \"1.5\", \"f32\", stage, state, ctx);\n }\n }\n }\n }\n }\n const aniInputRef = block.inputs.get(\"anisotropy\")?.source;\n let useAnisotropy = false;\n let anisoIntensityExpr = \"0.0\";\n let anisoDirectionExpr = \"v2(1.0, 0.0)\";\n let anisoUvExpr = \"v2(0.0)\";\n if (aniInputRef) {\n const aniBlk = ctx.graph.blocks.get(aniInputRef.blockId);\n if (aniBlk && aniBlk.className === \"AnisotropyBlock\") {\n useAnisotropy = true;\n state.usesAnisotropy = true;\n ctx.resolveOutput(aniBlk, aniInputRef.outputName, stage, state);\n anisoIntensityExpr = resolveOptional(aniBlk, \"intensity\", \"0.0\", \"f32\", stage, state, ctx);\n anisoDirectionExpr = resolveOptional(aniBlk, \"direction\", \"v2(1.0, 0.0)\", \"vec3f\", stage, state, ctx);\n const dirIn = aniBlk.inputs.get(\"direction\");\n if (dirIn?.source) {\n const e = ctx.resolve(aniBlk, \"direction\", stage, state);\n anisoDirectionExpr = e.type === \"vec2f\" ? e.expr : `(${e.expr}).xy`;\n }\n const uvIn = aniBlk.inputs.get(\"uv\");\n if (uvIn?.source) {\n const e = ctx.resolve(aniBlk, \"uv\", stage, state);\n anisoUvExpr = e.type === \"vec2f\" ? e.expr : `(${e.expr}).xy`;\n }\n }\n }\n const iriInputRef = block.inputs.get(\"iridescence\")?.source;\n let useIridescence = false;\n let iriIntensityExpr = \"1.0\";\n let iriIorExpr = \"1.3\";\n let iriThicknessExpr = \"400.0\";\n if (iriInputRef) {\n const iriBlk = ctx.graph.blocks.get(iriInputRef.blockId);\n if (iriBlk && iriBlk.className === \"IridescenceBlock\") {\n useIridescence = true;\n state.usesIridescence = true;\n ctx.resolveOutput(iriBlk, iriInputRef.outputName, stage, state);\n iriIntensityExpr = resolveOptional(iriBlk, \"intensity\", \"1.0\", \"f32\", stage, state, ctx);\n iriIorExpr = resolveOptional(iriBlk, \"indexOfRefraction\", \"1.3\", \"f32\", stage, state, ctx);\n iriThicknessExpr = resolveOptional(iriBlk, \"thickness\", \"400.0\", \"f32\", stage, state, ctx);\n }\n }\n const useSpecularAA = (block.serialized as { enableSpecularAntiAliasing?: boolean }).enableSpecularAntiAliasing === true;\n const helperKey = `${HELPER_KEY_PREFIX}_${reflectionConnected ? \"env\" : \"noenv\"}_${useClearcoat ? \"cc\" : \"nocc\"}_${remapClearcoatF0 ? \"ccF0R\" : \"ccF0\"}_${useSheen ? \"sh\" : \"nosh\"}_${useRefraction ? \"refr\" : \"norefr\"}_${useSubsurface ? \"ss\" : \"noss\"}_${useAnisotropy ? \"ani\" : \"noani\"}_${useIridescence ? \"iri\" : \"noiri\"}_${useShAlbedoScaling ? \"shAS\" : \"noShAS\"}_${useCcBump ? \"ccB\" : \"\"}_${useCcTint ? \"ccT\" : \"\"}_${useSpecularAA ? \"aa\" : \"noaa\"}`;\n state.fragment.helpers.set(\n helperKey,\n buildPbrMrHelperFull({\n key: helperKey,\n useEnv: reflectionConnected,\n useClearcoat,\n useSheen,\n useRefraction,\n useSubsurface,\n useAnisotropy,\n useIridescence,\n useShAlbedoScaling,\n useCcBump,\n useCcTint,\n useSpecularAA,\n remapClearcoatF0,\n })\n );\n state.usesLightsUbo = true;\n\n const memoKey = `_pbrmr_${block.id}_call`;\n let callVar: string;\n const existing = state.fragment.memo.get(memoKey);\n if (existing) {\n callVar = existing.expr;\n } else {\n const wp = resolveOptional(block, \"worldPosition\", \"v3(0.0)\", \"vec3f\", stage, state, ctx);\n const gn = resolveOptional(block, \"worldNormal\", \"v3(0.0, 1.0, 0.0)\", \"vec3f\", stage, state, ctx);\n const perturbed = block.inputs.get(\"perturbedNormal\");\n const wn = perturbed?.source ? ctx.cast(ctx.resolve(block, \"perturbedNormal\", stage, state), \"vec3f\").expr : gn;\n const cp = resolveOptional(block, \"cameraPosition\", \"_NME_CAMERA_POS_\", \"vec3f\", stage, state, ctx);\n const bc = resolveOptional(block, \"baseColor\", \"v3(1.0)\", \"vec3f\", stage, state, ctx);\n const me = resolveOptional(block, \"metallic\", \"0.0\", \"f32\", stage, state, ctx);\n const ro = resolveOptional(block, \"roughness\", \"0.5\", \"f32\", stage, state, ctx);\n const ao = resolveOptional(block, \"ambientOcc\", \"1.0\", \"f32\", stage, state, ctx);\n const baseIorExpr = resolveOptional(block, \"indexOfRefraction\", \"1.5\", \"f32\", stage, state, ctx);\n const sf = state.shadowLights.length > 0 ? `nme_computeShadowFactors(in)` : SHADOW_FACTORS_ONE;\n callVar = `_pbrR${ctx.temp(state, \"pbr\")}`;\n state.fragment.body.push(\n `let ${callVar} = nme_pbr_mr_compute(${wp}, ${gn}, ${wn}, ${cp}, ${bc}, ${me}, ${ro}, ${ao}, ${ccIntensityExpr}, ${ccRoughnessExpr}, ${ccIorExpr}, ${ccBumpExpr}, ${ccBumpUvExpr}, ${ccTintColorExpr}, ${ccTintAtDistanceExpr}, ${ccTintThicknessExpr}, ${shIntensityExpr}, ${shColorExpr}, ${shRoughnessExpr}, ${baseIorExpr}, ${refrIntensityExpr}, ${refrIorExpr}, ${refrTintAtDistanceExpr}, ${ssTintColorExpr}, ${ssThicknessExpr}, ${ssTranslucencyIntensityExpr}, ${ssDiffusionDistExpr}, ${anisoIntensityExpr}, ${anisoDirectionExpr}, ${anisoUvExpr}, ${iriIntensityExpr}, ${iriIorExpr}, ${iriThicknessExpr}, ${sf});`\n );\n state.fragment.memo.set(memoKey, { expr: callVar, type: \"vec4f\" });\n }\n\n switch (outputName) {\n case \"lighting\":\n return { expr: `${callVar}.lighting`, type: \"vec3f\" };\n case \"diffuseDir\":\n return { expr: `${callVar}.diffuseDir`, type: \"vec3f\" };\n case \"specularDir\":\n return { expr: `${callVar}.specularDir`, type: \"vec3f\" };\n case \"diffuseInd\":\n return { expr: `${callVar}.diffuseInd`, type: \"vec3f\" };\n case \"specularInd\":\n return { expr: `${callVar}.specularInd`, type: \"vec3f\" };\n case \"shadow\":\n return { expr: `${callVar}.shadow`, type: \"f32\" };\n case \"alpha\": {\n const cfg = block.serialized as { useSpecularOverAlpha?: boolean; useRadianceOverAlpha?: boolean };\n const useOverAlpha = cfg.useSpecularOverAlpha === true || cfg.useRadianceOverAlpha === true;\n const op = block.inputs.get(\"opacity\");\n const baseAlpha = op?.source ? ctx.cast(ctx.resolve(block, \"opacity\", stage, state), \"f32\").expr : \"1.0\";\n if (useOverAlpha) {\n return { expr: `clamp(${baseAlpha} + ${callVar}.lumOverAlpha * ${callVar}.lumOverAlpha, 0.0, 1.0)`, type: \"f32\" };\n }\n return { expr: baseAlpha, type: \"f32\" };\n }\n case \"ambientClr\":\n case \"clearcoatDir\":\n case \"clearcoatInd\":\n case \"sheenDir\":\n case \"sheenInd\":\n case \"refraction\":\n return { expr: `v3(0.0)`, type: \"vec3f\" };\n default:\n return { expr: `${callVar}.lighting`, type: \"vec3f\" };\n }\n },\n};\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"pbr-metallic-roughness-block-full-Ta9lR2cz.js","sources":["../src/material/node/blocks/pbr-mr-helper-full.ts","../src/material/node/blocks/pbr-metallic-roughness-block-full.ts"],"sourcesContent":["/** PBRMetallicRoughnessBlock — direct lighting + optional IBL + optional clearcoat + optional sheen.\n *\n * When the `reflection` input is connected (typically to a ReflectionBlock),\n * this emitter runs the GGX direct-lighting path PLUS a split-sum IBL\n * contribution (specular cube + BRDF LUT + SH irradiance).\n *\n * When the `clearcoat` input is connected (to a ClearCoatBlock), an extra\n * GGX clear-coat layer is added on top: per-light Schlick fresnel + Kelemen\n * visibility GGX specular, and the base layer (diffuse + specular + IBL)\n * is modulated by (1 - ccFresnel * ccIntensity).\n *\n * When the `sheen` input is connected (to a SheenBlock), an extra Charlie\n * NDF + Ashikhmin visibility cloth/velvet sheen layer is added: per-light\n * direct sheen contribution and a sheen IBL term that uses the BRDF LUT\n * blue channel for the sheen-roughness lookup.\n *\n * Outputs implemented (others stub to a zero vector):\n * - lighting / diffuseDir / specularDir / shadow / alpha\n * - diffuseInd / specularInd (only meaningful when IBL is on)\n */\n\nimport type { NodePbrMrHelperRequest } from \"../node-types.js\";\nimport { MAX_LIGHTS } from \"../../../light/types.js\";\n\nfunction ccDirectBlock(useClearcoat: boolean, useCcTint: boolean): string {\n if (!useClearcoat) {\n return \"\";\n }\n const Ncc = \"ccNormalW\";\n const NdotLcc = \"ccNdotL\";\n const declCcNdotL = `let ccNdotL = clamp(dot(ccNormalW, L), 0.0000001, 1.0);`;\n return `\n${declCcNdotL}\nif (${NdotLcc} > 0.0 && atten > 0.0) {\nlet ccH = normalize(V + L);\nlet ccNdotH = clamp(dot(${Ncc}, ccH), 0.0000001, 1.0);\nlet ccVdotH = saturate(dot(V, ccH));\nlet ccD = nme_pbr_distGGX(ccNdotH, ccAlphaG);\nlet ccVis = 0.25 / (ccVdotH * ccVdotH + 0.0000001);\nlet ccF_d = nme_pbr_ccSchlick(ccF0, ccVdotH);\nlet ccTerm = ccF_d * ccD * ccVis * ${NdotLcc};\nccDirectSpecAcc = ccDirectSpecAcc + v3(ccTerm) * color * atten * ccIntensity * sh;\nbaseLayerAtten = 1.0 - ccF_d * ccIntensity;\n${\n useCcTint\n ? `let ccLRefract = -refract(L, ${Ncc}, ccIorInv);\nlet ccNdotLRefract = clamp(dot(${Ncc}, ccLRefract), 0.0000001, 1.0);\nlet ccDirectAbsorption = nme_pbr_cocaLambert(ccAbsorptionColor, ccTintThickness * ((ccNdotLRefract + ccNdotVRefract) / (ccNdotLRefract * ccNdotVRefract)));\nbaseLayerAbsorption = mix(v3(1.0), ccDirectAbsorption, v3(ccIntensity));`\n : ``\n}\n}`;\n}\n\nfunction ccHemiBlock(useClearcoat: boolean, useCcTint: boolean): string {\n if (!useClearcoat) {\n return \"\";\n }\n const Ncc = \"ccNormalW\";\n return `\nlet ccNdotL_h = clamp(dot(${Ncc}, Ldir), 0.0000001, 1.0);\nif (nl > 0.0) {\nlet ccH_h = normalize(V + Ldir);\nlet ccNdotH_h = clamp(dot(${Ncc}, ccH_h), 0.0000001, 1.0);\nlet ccVdotH_h = saturate(dot(V, ccH_h));\nlet ccD_h = nme_pbr_distGGX(ccNdotH_h, ccAlphaG);\nlet ccVis_h = 0.25 / (ccVdotH_h * ccVdotH_h + 0.0000001);\nlet ccF_h = nme_pbr_ccSchlick(ccF0, ccVdotH_h);\nlet ccTerm_h = ccF_h * ccD_h * ccVis_h * ccNdotL_h;\nccDirectSpecAcc = ccDirectSpecAcc + v3(ccTerm_h) * entry.vLightDiffuse.rgb * ccIntensity * sh;\nbaseLayerAtten = 1.0 - ccF_h * ccIntensity;\n${\n useCcTint\n ? `let ccLRefract_h = -refract(Ldir, ${Ncc}, ccIorInv);\nlet ccNdotLRefract_h = clamp(dot(${Ncc}, ccLRefract_h), 0.0000001, 1.0);\nlet ccDirectAbsorption_h = nme_pbr_cocaLambert(ccAbsorptionColor, ccTintThickness * ((ccNdotLRefract_h + ccNdotVRefract) / (ccNdotLRefract_h * ccNdotVRefract)));\nbaseLayerAbsorption = mix(v3(1.0), ccDirectAbsorption_h, v3(ccIntensity));`\n : ``\n}\n}`;\n}\n\nfunction shDirectBlock(useSheen: boolean): string {\n if (!useSheen) {\n return \"\";\n }\n return `\nif (NdotL > 0.0 && atten > 0.0) {\nlet shH = normalize(V + L);\nlet shNdotH = clamp(dot(N, shH), 0.0000001, 1.0);\nlet shD = nme_pbr_charlieD(shNdotH, shAlphaG);\nlet shV = 1.0 / (4.0 * (NdotL + NdotV - NdotL * NdotV) + 0.0000001);\nshDirectAcc = shDirectAcc + shColorScaled * shD * shV * NdotL * color * atten * sh * baseLayerAtten;\n}`;\n}\n\nfunction shHemiBlock(useSheen: boolean): string {\n if (!useSheen) {\n return \"\";\n }\n return `\nif (nl > 0.0) {\nlet shH_h = normalize(V + Ldir);\nlet shNdotH_h = clamp(dot(N, shH_h), 0.0000001, 1.0);\nlet shD_h = nme_pbr_charlieD(shNdotH_h, shAlphaG);\nlet shV_h = 1.0 / (4.0 * (nl + NdotV - nl * NdotV) + 0.0000001);\nshDirectAcc = shDirectAcc + shColorScaled * shD_h * shV_h * nl * entry.vLightSpecular.rgb * sh * baseLayerAtten;\n}`;\n}\n\n/** Subsurface IBL block — runs inside the env IBL section. Computes refraction\n * (refract V through N, sample env at refractionLOD, apply Coca-Lambert tint\n * absorption + reflectance complement) and translucency (back-scattered SH\n * irradiance with Burley transmittance). Contributes:\n * - finalRefraction (vec3, added to lighting)\n * - refractionOpacity (f32, scales finalIrradiance: 1 - refrIntensity)\n * - mutates finalIrradiance to include refractionIrradiance + (1-translucency) scale.\n *\n * Always declares finalRefraction/refractionOpacity even when sub-features are\n * off so the downstream composition can reference them unconditionally. */\nfunction ssBlock(useSubsurface: boolean, useRefraction: boolean, useAnisotropy: boolean): string {\n if (!useSubsurface && !useRefraction) {\n return `let finalRefraction = v3(0.0);\nlet refractionOpacity = 1.0;\nlet ssRefractionIrradiance = v3(0.0);`;\n }\n const refrPart = useRefraction\n ? `// Refraction: refract V through N at IOR, sample env at refraction LOD.\n let refrIntensity = clamp(refrIntensityIn, 0.0, 1.0);\n let invIor = 1.0 / max(refrIor, 1.0001);\n let refrV_raw = refract(-V, ${useAnisotropy ? \"aniN\" : \"N\"}, invIor);\n let refrV = v3(refrV_raw.x * cosA + refrV_raw.z * sinA, refrV_raw.y, -refrV_raw.x * sinA + refrV_raw.z * cosA);\n let refrAlphaG = mix(alphaG, 0.0, clamp(invIor * 3.0 - 2.0, 0.0, 1.0));\n let refrLod = log2(cubemapDim * refrAlphaG) * sceneU.vImageInfos.z;\n let envRefr = textureSampleLevel(nmeIblTexture, nmeIblSampler, refrV, clamp(refrLod, 0.0, maxLod)).rgb;\n let volumeAlbedo = nme_pbr_colorAtDistance(ssTintColor, refrTintAtDistance);\n let refrTransmittance = v3(refrIntensity) * nme_pbr_cocaLambert(volumeAlbedo, ssThickness);\n let finalRefractionRaw = envRefr * refrTransmittance * (v3(1.0) - refractionSpecEnvReflectance);\n let refractionOpacity = 1.0 - refrIntensity;`\n : `let finalRefractionRaw = v3(0.0);\nlet refractionOpacity = 1.0;`;\n const ssPart = useSubsurface\n ? `// Translucency: back-scattered SH irradiance with Burley transmittance.\n let nN_raw = -N;\n let nN_env = v3(nN_raw.x * cosA + nN_raw.z * sinA, nN_raw.y, -nN_raw.x * sinA + nN_raw.z * cosA);\n let backIrradiance = (sceneU.vSphericalL00.xyz\n + sceneU.vSphericalL1_1.xyz * nN_env.y + sceneU.vSphericalL10.xyz * nN_env.z + sceneU.vSphericalL11.xyz * nN_env.x\n + sceneU.vSphericalL2_2.xyz * (nN_env.y * nN_env.x) + sceneU.vSphericalL2_1.xyz * (nN_env.y * nN_env.z)\n + sceneU.vSphericalL20.xyz * (3.0 * nN_env.z * nN_env.z - 1.0) + sceneU.vSphericalL21.xyz * (nN_env.z * nN_env.x)\n + sceneU.vSphericalL22.xyz * (nN_env.x * nN_env.x - nN_env.y * nN_env.y));\n let ssRefractionIrradiance = backIrradiance * ssTransmittance;\n finalIrradiance = finalIrradiance * refractionOpacity;\n finalIrradiance = finalIrradiance * (1.0 - translucencyIntensity);`\n : `let ssRefractionIrradiance = v3(0.0);\nfinalIrradiance = finalIrradiance * refractionOpacity;`;\n return `${refrPart}\n${ssPart}\nlet finalRefraction = finalRefractionRaw;`;\n}\n\nexport function buildPbrMrHelperFull(request: NodePbrMrHelperRequest): string {\n return HELPER_WGSL(\n request.useEnv,\n request.useClearcoat,\n request.useSheen,\n request.useRefraction,\n request.useSubsurface,\n request.useAnisotropy,\n request.useIridescence,\n request.useShAlbedoScaling,\n request.useCcBump,\n request.useCcTint,\n request.useSpecularAA,\n request.remapClearcoatF0\n );\n}\n\nfunction HELPER_WGSL(\n useEnv: boolean,\n useClearcoat: boolean,\n useSheen: boolean,\n useRefraction: boolean,\n useSubsurface: boolean,\n useAnisotropy: boolean,\n useIridescence: boolean,\n useShAlbedoScaling: boolean,\n useCcBump: boolean,\n useCcTint: boolean,\n useSpecularAA: boolean,\n remapClearcoatF0: boolean\n): string {\n const ccDecls = useClearcoat\n ? `let ccIntensity = clamp(ccIntensityIn, 0.0, 1.0);\nlet ccRough = clamp(ccRoughnessIn, 0.0, 1.0);\nlet ccF0_raw = (ccIor - 1.0) / (ccIor + 1.0);\nlet ccF0 = ccF0_raw * ccF0_raw;\nvar ccDirectSpecAcc = v3(0.0);`\n : `let ccDirectSpecAcc = v3(0.0);`;\n\n const ccAlphaSetup = useClearcoat\n ? `var ccAA_factor_y = 0.0;\n${\n useSpecularAA\n ? `{ let ccNdfdx_AA = dpdx(ccNormalW);\nlet ccNdfdy_AA = dpdy(ccNormalW);\nlet ccSlopeSquare_AA = max(dot(ccNdfdx_AA, ccNdfdx_AA), dot(ccNdfdy_AA, ccNdfdy_AA));\nccAA_factor_y = sqrt(ccSlopeSquare_AA) * 0.75; }`\n : ``\n}\nlet ccAlphaG = ccRough * ccRough + 0.0005 + ccAA_factor_y;`\n : ``;\n\n const ccNormalSetup = useClearcoat\n ? useCcBump\n ? `let ccNormalW = nme_perturbNormal(worldPos, Ng, ccBumpUv, ccBumpColor, 1.0);\nlet ccNdotV = abs(dot(ccNormalW, V)) + 0.0000001;${\n useCcTint\n ? `\nlet ccIorInv = 1.0 / max(ccIor, 1.0001);\nlet ccAbsorptionColor = nme_pbr_colorAtDistance(max(ccTintColor, v3(0.0000001)), max(ccTintAtDistance, 0.0000001));\nlet ccVRefract = refract(-V, ccNormalW, ccIorInv);\nlet ccNdotVRefract = abs(dot(ccNormalW, ccVRefract)) + 0.0000001;`\n : ``\n }`\n : `let ccNormalW = Ng;\nlet ccNdotV = abs(dot(ccNormalW, V)) + 0.0000001;${\n useCcTint\n ? `\nlet ccIorInv = 1.0 / max(ccIor, 1.0001);\nlet ccAbsorptionColor = nme_pbr_colorAtDistance(max(ccTintColor, v3(0.0000001)), max(ccTintAtDistance, 0.0000001));\nlet ccVRefract = refract(-V, ccNormalW, ccIorInv);\nlet ccNdotVRefract = abs(dot(ccNormalW, ccVRefract)) + 0.0000001;`\n : ``\n }`\n : `let ccNormalW = N;\nlet ccNdotV: f32 = 0.0;`;\n\n const shDecls = useSheen\n ? `let shIntensityRaw = clamp(shIntensityIn, 0.0, 1.0);\n${\n useShAlbedoScaling\n ? `let shIntensity = shIntensityRaw;`\n : `let reflectanceF0 = max(colorF0.r, max(colorF0.g, colorF0.b));\nlet shIntensity = shIntensityRaw * (1.0 - reflectanceF0);`\n}\nlet shRough = clamp(shRoughnessIn, 0.0, 1.0);\nlet shAlphaG = shRough * shRough + 0.0005;\nlet shColorScaled = shColorIn * shIntensity;\nvar shDirectAcc = v3(0.0);`\n : `let shDirectAcc = v3(0.0);`;\n\n const shIblTerm =\n useEnv && useSheen\n ? `let shSpecLod = log2(cubemapDim * shAlphaG) * sceneU.vImageInfos.z;\n let shEnvRadiance = textureSampleLevel(nmeIblTexture, nmeIblSampler, R, clamp(shSpecLod, 0.0, maxLod)).rgb;\n let shBrdfBlue = textureSample(nmeBrdfLUT, nmeBrdfSampler, v2(NdotV, shRough)).b;\n let shFinalIbl = shEnvRadiance * shColorScaled * shBrdfBlue * seo * eho;\n ${\n useShAlbedoScaling\n ? `// SHEEN_ALBEDOSCALING: surface albedo and base specular scale by (1 - shInt × max(shColor) × envSheenBrdf.b).\n let shAlbedoScaling = 1.0 - shIntensity * max(max(shColorIn.r, shColorIn.g), shColorIn.b) * shBrdfBlue;`\n : `let shAlbedoScaling: f32 = 1.0;`\n }`\n : `let shFinalIbl = v3(0.0);\nlet shAlbedoScaling: f32 = 1.0;`;\n\n const directSpecR0Decl =\n useClearcoat && remapClearcoatF0\n ? `let _directF0S = sqrt(max(colorF0, v3(0.0)));\nlet _directF0T = ((1.0 - ccIor) + (1.0 + ccIor) * _directF0S) / ((1.0 + ccIor) + (1.0 - ccIor) * _directF0S);\nlet directSpecR0 = mix(colorF0, clamp(_directF0T * _directF0T, v3(0.0), v3(1.0)), ccIntensity);`\n : `let directSpecR0 = colorF0;`;\n\n const shIblScale = useClearcoat ? ` * ccConsIBL${useCcTint ? \" * ccAbsorption\" : \"\"}` : \"\";\n const refrCcScale = useClearcoat ? \" * ccConsIBL\" : \"\";\n const ccIblPre = useClearcoat\n ? `let ccFresnelIBL = nme_pbr_ccSchlick(ccF0, ccNdotV);\n let ccConsIBL = 1.0 - ccFresnelIBL * ccIntensity;\n let ccBrdfSample = textureSample(nmeBrdfLUT, nmeBrdfSampler, v2(ccNdotV, ccRough)).rgb;\n let ccSpecEnvReflRaw = (v3(ccF0) * ccBrdfSample.y + (v3(1.0) - v3(ccF0)) * ccBrdfSample.x) * ccIntensity;\n let ccEnergyConservation = 1.0 + _coloredR0 * (1.0 / max(ccBrdfSample.y, 0.001) - 1.0);\n let ccEhoT = clamp(1.0 + 1.1 * dot(reflect(-V, ccNormalW), Ng), 0.0, 1.0);\n let ccSpecEnvRefl = ccSpecEnvReflRaw * (ccEhoT * ccEhoT);\n let ccSpecLod = log2(cubemapDim * ccAlphaG) * sceneU.vImageInfos.z;\n let ccR_raw = reflect(-V, ccNormalW);\n let ccR = v3(ccR_raw.x * cosA + ccR_raw.z * sinA, ccR_raw.y, -ccR_raw.x * sinA + ccR_raw.z * cosA);\n let ccEnvRadiance = textureSampleLevel(nmeIblTexture, nmeIblSampler, ccR, clamp(ccSpecLod, 0.0, maxLod)).rgb;\n ${\n useCcTint\n ? `// Clearcoat absorption: BJS Beer-Lambert path length through the coat.\n let ccAbsorption = mix(v3(1.0), nme_pbr_cocaLambert(ccAbsorptionColor, ccTintThickness * ((ccNdotVRefract + ccNdotVRefract) / (ccNdotVRefract * ccNdotVRefract))), v3(ccIntensity));`\n : `let ccAbsorption = v3(1.0);`\n }\n let ccFinalRadiance = ccEnvRadiance * ccSpecEnvRefl;`\n : ``;\n const ccTintScale = useCcTint ? \" * ccAbsorption\" : \"\";\n const ccIblFinal = useClearcoat\n ? `${ccIblPre}\n${shIblTerm}\nr.lighting = finalIrradiance * shAlbedoScaling * ccConsIBL${ccTintScale}\n+ finalRadianceScaled * shAlbedoScaling * ccConsIBL${ccTintScale}\n+ ssRefractionIrradiance * ao_c\n+ finalSpecularScaledDirect * shAlbedoScaling\n+ diffuseAcc * shAlbedoScaling\n+ diffuseTransmissionAcc\n+ ccDirectSpecAcc * ccEnergyConservation\n+ ccFinalRadiance\n+ shDirectAcc\n+ shFinalIbl${shIblScale}\n+ finalRefraction${refrCcScale}${ccTintScale};`\n : `${shIblTerm}\nr.lighting = finalIrradiance * shAlbedoScaling + ssRefractionIrradiance * ao_c + (finalRadianceScaled + finalSpecularScaledDirect + diffuseAcc) * shAlbedoScaling + diffuseTransmissionAcc + shDirectAcc + shFinalIbl + finalRefraction;`;\n\n const ccDirectFinal = useClearcoat\n ? `r.lighting = diffuseAcc + specAcc + diffuseTransmissionAcc + ccDirectSpecAcc + shDirectAcc;`\n : `r.lighting = diffuseAcc + diffuseTransmissionAcc + specAcc + shDirectAcc;`;\n\n const refractionSpecEnvReflectanceDecl = useRefraction ? `let refractionSpecEnvReflectance = baseSpecEnvReflectance;` : ``;\n\n const iblBlock = useEnv\n ? `\n let envRot = sceneU.envRotationY;\n let cosA = cos(envRot); let sinA = sin(envRot);\n let N_specSrc = ${useAnisotropy ? \"aniN\" : \"N\"};\n let R_raw = reflect(-V, N_specSrc);\n let R = v3(R_raw.x * cosA + R_raw.z * sinA, R_raw.y, -R_raw.x * sinA + R_raw.z * cosA);\n let N_env = v3(Ng.x * cosA + Ng.z * sinA, Ng.y, -Ng.x * sinA + Ng.z * cosA);\n let environmentIrradiance = (sceneU.vSphericalL00.xyz\n + sceneU.vSphericalL1_1.xyz * N_env.y + sceneU.vSphericalL10.xyz * N_env.z + sceneU.vSphericalL11.xyz * N_env.x\n + sceneU.vSphericalL2_2.xyz * (N_env.y * N_env.x) + sceneU.vSphericalL2_1.xyz * (N_env.y * N_env.z)\n + sceneU.vSphericalL20.xyz * (3.0 * N_env.z * N_env.z - 1.0) + sceneU.vSphericalL21.xyz * (N_env.z * N_env.x)\n + sceneU.vSphericalL22.xyz * (N_env.x * N_env.x - N_env.y * N_env.y));\n let brdfSample = textureSample(nmeBrdfLUT, nmeBrdfSampler, v2(NdotV, rough_c));\n let envBrdf = brdfSample.rgb;\n let reflectanceF0Scalar = max(colorF0.r, max(colorF0.g, colorF0.b));\n let baseSpecEnvReflectance = (colorF90 - v3(reflectanceF0Scalar)) * envBrdf.x + v3(reflectanceF0Scalar) * envBrdf.y;\n let seo = clamp((NdotVUnclamped + ao_c) * (NdotVUnclamped + ao_c) - 1.0 + ao_c, 0.0, 1.0);\n let _geoNF = select(-Ng, Ng, dot(Ng, V) > 0.0);\n let _ehoRefl = reflect(-V, N);\n let _ehoT = clamp(1.0 + 1.1 * dot(_ehoRefl, _geoNF), 0.0, 1.0);\n let eho = _ehoT * _ehoT;\n ${\n useClearcoat && remapClearcoatF0\n ? `let _f0S = sqrt(max(colorF0, v3(0.0)));\n let _f0T = ((1.0 - ccIor) + (1.0 + ccIor) * _f0S) / ((1.0 + ccIor) + (1.0 - ccIor) * _f0S);\n let _coloredR0 = mix(colorF0, clamp(_f0T * _f0T, v3(0.0), v3(1.0)), ccIntensity);`\n : `let _coloredR0 = colorF0;`\n }\n let colorSpecEnvReflectance = ((colorF90 - _coloredR0) * envBrdf.x + _coloredR0 * envBrdf.y) * seo * eho;\n let energyConservation = 1.0 + _coloredR0 * (1.0 / max(envBrdf.y, 0.001) - 1.0);\n let maxLod = f32(textureNumLevels(nmeIblTexture) - 1);\n let cubemapDim = f32(textureDimensions(nmeIblTexture).x);\n let specLod = log2(cubemapDim * alphaG) * sceneU.vImageInfos.z;\n var environmentRadiance = textureSampleLevel(nmeIblTexture, nmeIblSampler, R, clamp(specLod, 0.0, maxLod)).rgb;\n ${refractionSpecEnvReflectanceDecl}\n var finalIrradiance = environmentIrradiance * surfaceAlbedo;\n let finalRadianceScaled = environmentRadiance * colorSpecEnvReflectance * energyConservation;\n let finalSpecularScaledDirect = specAcc * energyConservation;\n ${ssBlock(useSubsurface, useRefraction, useAnisotropy)}\n finalIrradiance = finalIrradiance * ao_c;\n r.diffuseInd = finalIrradiance;\n r.specularInd = finalRadianceScaled;\n ${ccIblFinal}`\n : `\nr.diffuseInd = v3(0.0);\nr.specularInd = v3(0.0);\n${ccDirectFinal}`;\n\n const ccSchlickFn = useClearcoat\n ? `fn nme_pbr_ccSchlick(f0: f32, cosTheta: f32) -> f32 {\nlet t = 1.0 - cosTheta;\nlet t2 = t * t;\nreturn f0 + (1.0 - f0) * (t2 * t2 * t);\n}\n`\n : ``;\n\n const charlieFn = useSheen\n ? `fn nme_pbr_charlieD(NdotH: f32, alphaG: f32) -> f32 {\nlet invR = 1.0 / max(alphaG, 0.0005);\nlet cos2h = NdotH * NdotH;\nlet sin2h = 1.0 - cos2h;\nreturn (2.0 + invR) * pow(sin2h, invR * 0.5) / (2.0 * NME_PBR_PI);\n}\n`\n : ``;\n\n const anisoFns = useAnisotropy\n ? `fn nme_pbr_anisoRoughness(alphaG: f32, anisotropy: f32) -> v2 {\nlet alphaT = max(alphaG * (1.0 + anisotropy), 0.0005);\nlet alphaB = max(alphaG * (1.0 - anisotropy), 0.0005);\nreturn v2(alphaT, alphaB);\n}\nfn nme_pbr_anisoBentNormal(T: v3, B: v3, N: v3, V: v3, anisotropy: f32) -> v3 {\nvar anisotropicFrameDirection = B;\nif (anisotropy < 0.0) {\nanisotropicFrameDirection = T;\n}\nlet anisoTan = cross(normalize(anisotropicFrameDirection), V);\nlet anisoNormal = cross(anisoTan, anisotropicFrameDirection);\nreturn normalize(mix(N, anisoNormal, abs(anisotropy)));\n}\nfn nme_pbr_burleyAnisoD(NdotH: f32, TdotH: f32, BdotH: f32, alphaTB: v2) -> f32 {\nlet a2 = alphaTB.x * alphaTB.y;\nlet v = v3(alphaTB.y * TdotH, alphaTB.x * BdotH, a2 * NdotH);\nlet v2 = dot(v, v);\nlet w2 = a2 / max(v2, 0.0000001);\nreturn a2 * w2 * w2 * (1.0 / NME_PBR_PI);\n}\nfn nme_pbr_visAnisoSmith(NdotL: f32, NdotV: f32, TdotV: f32, BdotV: f32, TdotL: f32, BdotL: f32, alphaTB: v2) -> f32 {\nlet lambdaV = NdotL * length(v3(alphaTB.x * TdotV, alphaTB.y * BdotV, NdotV));\nlet lambdaL = NdotV * length(v3(alphaTB.x * TdotL, alphaTB.y * BdotL, NdotL));\nreturn 0.5 / max(lambdaV + lambdaL, 0.0000001);\n}\n`\n : ``;\n\n const ssFns =\n useSubsurface || useRefraction || useCcTint\n ? `fn nme_pbr_transmittanceBurley(tintColor: v3, diffusionDist: v3, thickness: f32) -> v3 {\nlet S = v3(1.0) / max(diffusionDist, v3(0.0000001));\nlet temp = exp(-0.333333333 * thickness * S);\nreturn tintColor * 0.25 * (temp * temp * temp + 3.0 * temp);\n}\nfn nme_pbr_cocaLambert(volumeAlbedo: v3, distance: f32) -> v3 {\nreturn exp(-volumeAlbedo * distance);\n}\nfn nme_pbr_colorAtDistance(color: v3, distance: f32) -> v3 {\nreturn -log(color) / distance;\n}\n`\n : ``;\n\n const anisoSetup = useAnisotropy\n ? `let _adp1 = dpdx(worldPos);\nlet _adp2 = -dpdy(worldPos);\nlet _aduv1 = dpdx(anisoUv);\nlet _aduv2 = -dpdy(anisoUv);\nlet _adp2perp = cross(_adp2, Ng);\nlet _adp1perp = cross(Ng, _adp1);\nlet _atan = _adp2perp * _aduv1.x + _adp1perp * _aduv2.x;\nlet _abit = _adp2perp * _aduv1.y + _adp1perp * _aduv2.y;\nlet _adet = max(dot(_atan, _atan), dot(_abit, _abit));\nlet _ainvmax = select(0.0, inverseSqrt(_adet), _adet > 0.0);\nlet _aTBN0 = normalize(_atan * _ainvmax);\nlet _aTBN1 = normalize(_abit * _ainvmax);\nlet anisoIntensity = clamp(anisoIntensityIn, -1.0, 1.0);\nlet anisoDir = v3(anisoDirection, 0.0);\nlet anisoT_raw = _aTBN0 * anisoDir.x + _aTBN1 * anisoDir.y;\nlet anisoT = normalize(anisoT_raw);\nlet anisoB = normalize(cross(Ng, anisoT));\nlet aniAlphaTB = nme_pbr_anisoRoughness(alphaG, anisoIntensity);\nlet aniN = nme_pbr_anisoBentNormal(anisoT, anisoB, N, V, anisoIntensity);`\n : `let anisoT = v3(1.0, 0.0, 0.0);\nlet anisoB = v3(0.0, 0.0, 1.0);\nlet aniAlphaTB = v2(alphaG, alphaG);\nlet aniN = N;`;\n\n const specularAABlock = useSpecularAA\n ? `var AA_factor_x = 0.0;\nvar AA_factor_y = 0.0;\n{ let nDfdx_AA = dpdx(N);\nlet nDfdy_AA = dpdy(N);\nlet slopeSquare_AA = max(dot(nDfdx_AA, nDfdx_AA), dot(nDfdy_AA, nDfdy_AA));\nAA_factor_x = pow(saturate(slopeSquare_AA), 0.333);\nAA_factor_y = sqrt(slopeSquare_AA) * 0.75;\nalphaG = alphaG + AA_factor_y; }`\n : `let AA_factor_x = 0.0;\nlet AA_factor_y = 0.0;`;\n\n return `alias v2 = vec2<f32>;\nalias v3 = vec3<f32>;\nalias v4 = vec4<f32>;\nstruct NmePbrMrResult {\nlighting: v3,\ndiffuseDir: v3,\nspecularDir: v3,\ndiffuseInd: v3,\nspecularInd: v3,\nshadow: f32,\nlumOverAlpha: f32,\n};\nconst NME_PBR_PI: f32 = 3.14159265358979323846;\nfn nme_pbr_distGGX(NdotH: f32, alphaG: f32) -> f32 {\nlet a2 = alphaG * alphaG;\nlet d = NdotH * NdotH * (a2 - 1.0) + 1.0;\nreturn a2 / (NME_PBR_PI * d * d);\n}\nfn nme_pbr_geomGGX(NdotL: f32, NdotV: f32, alphaG: f32) -> f32 {\nlet a2 = alphaG * alphaG;\nlet gl = NdotL * sqrt(NdotV * (NdotV - a2 * NdotV) + a2);\nlet gv = NdotV * sqrt(NdotL * (NdotL - a2 * NdotL) + a2);\nreturn 0.5 / max(gl + gv, 0.00001);\n}\nfn nme_pbr_fresSchlick(c: f32, F0: v3, F90: v3) -> v3 {\nlet t = 1.0 - c;\nlet t2 = t * t;\nreturn F0 + (F90 - F0) * (t2 * t2 * t);\n}\nfn nme_pbr_diffuseEON(albedo: v3, sigma: f32, NdotL: f32, NdotV: f32, LdotV: f32) -> v3 {\nreturn albedo * (1.0 / NME_PBR_PI);\n}\n${ccSchlickFn}${charlieFn}${anisoFns}${ssFns}fn nme_pbr_mr_compute(\n worldPos: v3, geometricNormal: v3, worldNormal: v3, cameraPos: v3,\n baseColor: v3, metallic: f32, roughness: f32, ao: f32,\n ccIntensityIn: f32, ccRoughnessIn: f32, ccIor: f32,\n ccBumpColor: v3, ccBumpUv: v2,\n ccTintColor: v3, ccTintAtDistance: f32, ccTintThickness: f32,\n shIntensityIn: f32, shColorIn: v3, shRoughnessIn: f32,\n baseIor: f32,\n refrIntensityIn: f32, refrIor: f32, refrTintAtDistance: f32,\n ssTintColor: v3, ssThickness: f32,\n ssTranslucencyIntensityIn: f32, ssDiffusionDist: v3,\n anisoIntensityIn: f32, anisoDirection: v2, anisoUv: v2,\n iridescenceIntensityIn: f32, iridescenceIorIn: f32, iridescenceThicknessIn: f32,\n shadowFactors: array<f32, ${MAX_LIGHTS}>\n) -> NmePbrMrResult {\n var r: NmePbrMrResult;\n let Ng = normalize(geometricNormal);\n let N = normalize(worldNormal);\n let V = normalize(cameraPos - worldPos);\n let NdotVUnclamped = dot(N, V);\n let NdotV = abs(NdotVUnclamped) + 0.0000001;\n let metallic_c = clamp(metallic, 0.0, 1.0);\n let rough_c = clamp(roughness, 0.0, 1.0);\n var alphaG = rough_c * rough_c + 0.0005;\n ${specularAABlock}\n let dielectricF0Raw = (baseIor - 1.0) / (baseIor + 1.0);\n let dielectricF0Scalar = dielectricF0Raw * dielectricF0Raw;\n let dielectricF0 = v3(dielectricF0Scalar);\n var surfaceAlbedo = baseColor * (1.0 - metallic_c) * (1.0 - dielectricF0Scalar);\n let colorF0Base = mix(dielectricF0, baseColor, metallic_c);\n let colorF0 = ${\n useIridescence\n ? `mix(colorF0Base, nme_pbr_evalIridescence(1.0, max(iridescenceIorIn, 1.0001), NdotV, max(iridescenceThicknessIn, 0.0), colorF0Base), clamp(iridescenceIntensityIn, 0.0, 1.0))`\n : `colorF0Base`\n };\n let colorF90 = v3(1.0);\n let ao_c = clamp(ao, 0.0, 1.0);\n let directRoughness = max(rough_c, AA_factor_x);\n let directAlphaG = directRoughness * directRoughness + 0.0005;\n ${anisoSetup}\n ${ccDecls}\n ${directSpecR0Decl}\n ${ccNormalSetup}\n ${ccAlphaSetup}\n ${shDecls}\n let translucencyIntensity = ${useSubsurface ? \"clamp(ssTranslucencyIntensityIn, 0.0, 1.0)\" : \"0.0\"};\n let ssTransmittance = ${useSubsurface ? \"nme_pbr_transmittanceBurley(ssTintColor, ssDiffusionDist, max(ssThickness, 0.0000001)) * translucencyIntensity\" : \"v3(0.0)\"};\n let directDiffuseTranslucencyScale = 1.0 - translucencyIntensity;\n ${\n useRefraction\n ? `// LEGACY_SPECULAR_ENERGY_CONSERVATION is on for BJS NME PBR-MR. When refraction\n let _refractionOpacityPre = 1.0 - clamp(refrIntensityIn, 0.0, 1.0);\n surfaceAlbedo = surfaceAlbedo * _refractionOpacityPre;`\n : ``\n }\n var diffuseAcc = v3(0.0);\n var diffuseTransmissionAcc = v3(0.0);\n var specAcc = v3(0.0);\n var aggShadow: f32 = 0.0;\n var nLights: f32 = 0.0;\n let lc = min(meshU.lc, ${MAX_LIGHTS}u);\n for (var i: u32 = 0u; i < lc; i = i + 1u) {\n let lightIndex = nli(i);\n let entry = nmeLights.lights[lightIndex];\n let t = u32(entry.vLightData.w);\n let sh = shadowFactors[lightIndex];\n if (t == 3u) {\n let Ldir = normalize(entry.vLightData.xyz);\n let nl = clamp(0.5 + 0.5 * dot(N, Ldir), 0.0000001, 1.0);\n let groundSky = mix(entry.vLightDirection.xyz, entry.vLightDiffuse.rgb, nl);\n var baseLayerAtten: f32 = 1.0;\n var baseLayerAbsorption = v3(1.0);${ccHemiBlock(useClearcoat, useCcTint)}\n let H_h = normalize(V + Ldir);\n let NdotH_h = clamp(dot(N, H_h), 0.0000001, 1.0);\n let VdotH_h = saturate(dot(V, H_h));\n let cF_h = nme_pbr_fresSchlick(VdotH_h, directSpecR0, colorF90);\n ${\n useAnisotropy\n ? `let TdotH_h = dot(anisoT, H_h);\n let BdotH_h = dot(anisoB, H_h);\n let TdotV_h = dot(anisoT, V);\n let BdotV_h = dot(anisoB, V);\n let TdotL_h = dot(anisoT, Ldir);\n let BdotL_h = dot(anisoB, Ldir);\n let D_h = nme_pbr_burleyAnisoD(NdotH_h, TdotH_h, BdotH_h, aniAlphaTB);\n let Vis_h = nme_pbr_visAnisoSmith(nl, NdotV, TdotV_h, BdotV_h, TdotL_h, BdotL_h, aniAlphaTB);\n specAcc = specAcc + cF_h * D_h * Vis_h * nl * entry.vLightDiffuse.rgb * sh * baseLayerAtten * baseLayerAbsorption;`\n : `let D_h = nme_pbr_distGGX(NdotH_h, directAlphaG);\n let G_h = nme_pbr_geomGGX(nl, NdotV, directAlphaG);\n specAcc = specAcc + cF_h * D_h * G_h * nl * entry.vLightDiffuse.rgb * sh * baseLayerAtten * baseLayerAbsorption;`\n }\n diffuseAcc = diffuseAcc + groundSky * surfaceAlbedo * sh * baseLayerAtten * baseLayerAbsorption;${shHemiBlock(useSheen)}\n aggShadow = aggShadow + sh;\n nLights = nLights + 1.0;\n continue;\n }\n var L: v3;\n var atten: f32 = 1.0;\n let color = entry.vLightDiffuse.rgb;\n if (t == 1u) {\n L = normalize(-entry.vLightData.xyz);\n } else {\n let toL = entry.vLightData.xyz - worldPos;\n let d2 = dot(toL, toL);\n let dist = sqrt(d2);\n L = toL / max(dist, 0.0001);\n let range = entry.vLightDiffuse.a;\n if (t == 2u) {\n let invD2 = 1.0 / max(d2, 0.0000001);\n let cosHalfAngle = entry.vLightDirection.w;\n let kappa = 6.64385618977 / max(1.0 - cosHalfAngle, 0.0001);\n let cd = dot(-entry.vLightDirection.xyz, L);\n let dirFall = exp2(kappa * (cd - 1.0));\n atten = invD2 * dirFall;\n } else {\n atten = 1.0 / max(d2, 0.0000001);\n }\n }\n let NdotLUnclamped = dot(N, L);\n let NdotL = clamp(NdotLUnclamped, 0.0000001, 1.0);\n var baseLayerAtten: f32 = 1.0;\n var baseLayerAbsorption = v3(1.0);${ccDirectBlock(useClearcoat, useCcTint)}\n let _LdotV = select(0.0, dot(L, V), t == 1u);\n let _eonDiffuse = nme_pbr_diffuseEON(surfaceAlbedo, 0.0, NdotL, NdotV, _LdotV);\n diffuseAcc = diffuseAcc + _eonDiffuse * directDiffuseTranslucencyScale * NdotL * color * atten * sh * baseLayerAtten * baseLayerAbsorption;\n if (NdotLUnclamped < 0.0 && translucencyIntensity > 0.0) {\n let _trNdotL = abs(NdotLUnclamped) + 0.0000001;\n let _wrapW = 0.02;\n let _wrapT = 1.0 + _wrapW;\n let _wrapNdotL = clamp((_trNdotL + _wrapW) / (_wrapT * _wrapT), 0.0, 1.0);\n let _clampedAlbT = clamp(surfaceAlbedo, v3(0.1), v3(1.0));\n let _eonTransmit = nme_pbr_diffuseEON(_clampedAlbT, 0.0, max(NdotL, 0.0000001), NdotV, _LdotV) / _clampedAlbT;\n diffuseTransmissionAcc = diffuseTransmissionAcc + _eonTransmit * (ssTransmittance * _wrapNdotL) * color * atten * sh * baseLayerAtten * baseLayerAbsorption;\n }\n if (NdotL > 0.0 && atten > 0.0) {\n let H = normalize(V + L);\n let NdotH = clamp(dot(N, H), 0.0000001, 1.0);\n let VdotH = saturate(dot(V, H));\n let cF = nme_pbr_fresSchlick(VdotH, directSpecR0, colorF90);\n ${\n useAnisotropy\n ? `let TdotH = dot(anisoT, H);\n let BdotH = dot(anisoB, H);\n let TdotV = dot(anisoT, V);\n let BdotV = dot(anisoB, V);\n let TdotL = dot(anisoT, L);\n let BdotL = dot(anisoB, L);\n let D = nme_pbr_burleyAnisoD(NdotH, TdotH, BdotH, aniAlphaTB);\n let Vis = nme_pbr_visAnisoSmith(NdotL, NdotV, TdotV, BdotV, TdotL, BdotL, aniAlphaTB);\n specAcc = specAcc + cF * D * Vis * NdotL * color * atten * sh * baseLayerAtten * baseLayerAbsorption;`\n : `let D = nme_pbr_distGGX(NdotH, directAlphaG);\n let G = nme_pbr_geomGGX(NdotL, NdotV, directAlphaG);\n specAcc = specAcc + cF * D * G * NdotL * color * atten * sh * baseLayerAtten * baseLayerAbsorption;`\n }\n }${shDirectBlock(useSheen)}\n aggShadow = aggShadow + sh;\n nLights = nLights + 1.0;\n }\n r.diffuseDir = diffuseAcc;\n r.specularDir = specAcc;\n${iblBlock}\n ${\n useEnv\n ? `let _radLum = clamp(dot(finalRadianceScaled * shAlbedoScaling${useClearcoat ? ` * ccConsIBL${ccTintScale}` : ``}, v3(0.2126, 0.7152, 0.0722)), 0.0, 1.0);\n let _specLum = clamp(dot(finalSpecularScaledDirect * shAlbedoScaling, v3(0.2126, 0.7152, 0.0722)), 0.0, 1.0);${\n useClearcoat\n ? `\n let _ccLum = clamp(dot(ccFinalRadiance, v3(0.2126, 0.7152, 0.0722)), 0.0, 1.0);\n r.lumOverAlpha = _radLum + _specLum + _ccLum;`\n : `\n r.lumOverAlpha = _radLum + _specLum;`\n }`\n : `let _specLum = clamp(dot(specAcc, v3(0.2126, 0.7152, 0.0722)), 0.0, 1.0);\n r.lumOverAlpha = _specLum;`\n }\n var colorOut = max(r.lighting, v3(0.0)) * sceneU.vImageInfos.x;\n if (sceneU.vImageInfos.w > 0.5) {\n colorOut = 1.0 - exp2(-1.590579 * colorOut);\n }\n colorOut = pow(max(colorOut, v3(0.0)), v3(0.45454545));\n colorOut = clamp(colorOut, v3(0.0), v3(1.0));\n let highContrast = colorOut * colorOut * (v3(3.0) - colorOut * 2.0);\n if (sceneU.vImageInfos.y < 1.0) {\n colorOut = mix(v3(0.5), colorOut, sceneU.vImageInfos.y);\n } else {\n colorOut = mix(colorOut, highContrast, sceneU.vImageInfos.y - 1.0);\n }\n r.lighting = max(colorOut, v3(0.0));\n if (nLights > 0.0) { r.shadow = aggShadow / nLights; } else { r.shadow = 1.0; }\n return r;\n}\n`;\n}\n","import type { BlockEmitter, NodeBlock, NodeBuildState, NodeEmitContext, Stage } from \"../node-types.js\";\nimport { MAX_LIGHTS } from \"../../../light/types.js\";\nimport { buildPbrMrHelperFull } from \"./pbr-mr-helper-full.js\";\n\nconst HELPER_KEY_PREFIX = \"nme_pbr_mr\";\nconst SHADOW_FACTORS_ONE = `array<f32, ${MAX_LIGHTS}>(${new Array(MAX_LIGHTS).fill(\"1.0\").join(\", \")})`;\n\nfunction resolveOptional(block: NodeBlock, inputName: string, fallback: string, target: \"vec3f\" | \"f32\", stage: Stage, state: NodeBuildState, ctx: NodeEmitContext): string {\n const input = block.inputs.get(inputName);\n if (input?.source) {\n return ctx.cast(ctx.resolve(block, inputName, stage, state), target).expr;\n }\n return fallback;\n}\n\nexport const emitter: BlockEmitter = {\n className: \"PBRMetallicRoughnessBlock\",\n stage: \"fragment\",\n emit(block, outputName, stage, state, ctx) {\n const reflectionConnected = !!block.inputs.get(\"reflection\")?.source;\n if (reflectionConnected) {\n state.usesEnv = true;\n ctx.resolve(block, \"reflection\", stage, state);\n }\n const ccInputRef = block.inputs.get(\"clearcoat\")?.source;\n let ccIntensityExpr = \"0.0\";\n let ccRoughnessExpr = \"0.0\";\n let ccIorExpr = \"1.5\";\n let ccBumpExpr = \"v3(0.5, 0.5, 1.0)\";\n let ccBumpUvExpr = \"v2(0.0)\";\n let useCcBump = false;\n let ccTintColorExpr = \"v3(1.0)\";\n let ccTintAtDistanceExpr = \"1.0\";\n let ccTintThicknessExpr = \"0.0\";\n let useCcTint = false;\n let useClearcoat = false;\n let remapClearcoatF0 = false;\n if (ccInputRef) {\n const ccBlock = ctx.graph.blocks.get(ccInputRef.blockId);\n if (ccBlock && ccBlock.className === \"ClearCoatBlock\") {\n useClearcoat = true;\n remapClearcoatF0 = (ccBlock.serialized as { remapF0OnInterfaceChange?: boolean }).remapF0OnInterfaceChange === true;\n state.usesClearcoat = true;\n ctx.resolveOutput(ccBlock, ccInputRef.outputName, stage, state);\n ccIntensityExpr = resolveOptional(ccBlock, \"intensity\", \"1.0\", \"f32\", stage, state, ctx);\n ccRoughnessExpr = resolveOptional(ccBlock, \"roughness\", \"0.0\", \"f32\", stage, state, ctx);\n ccIorExpr = resolveOptional(ccBlock, \"indexOfRefraction\", \"1.5\", \"f32\", stage, state, ctx);\n if (ccBlock.inputs.get(\"normalMapColor\")?.source) {\n useCcBump = true;\n ccBumpExpr = resolveOptional(ccBlock, \"normalMapColor\", \"v3(0.5, 0.5, 1.0)\", \"vec3f\", stage, state, ctx);\n const uvIn = ccBlock.inputs.get(\"uv\");\n if (uvIn?.source) {\n const e = ctx.resolve(ccBlock, \"uv\", stage, state);\n ccBumpUvExpr = e.type === \"vec2f\" ? e.expr : `(${e.expr}).xy`;\n }\n }\n if (ccBlock.inputs.get(\"tintColor\")?.source) {\n useCcTint = true;\n ccTintColorExpr = resolveOptional(ccBlock, \"tintColor\", \"v3(1.0)\", \"vec3f\", stage, state, ctx);\n ccTintAtDistanceExpr = resolveOptional(ccBlock, \"tintAtDistance\", \"1.0\", \"f32\", stage, state, ctx);\n ccTintThicknessExpr = resolveOptional(ccBlock, \"tintThickness\", \"0.0\", \"f32\", stage, state, ctx);\n }\n }\n }\n const shInputRef = block.inputs.get(\"sheen\")?.source;\n let shIntensityExpr = \"0.0\";\n let shColorExpr = \"v3(1.0)\";\n let shRoughnessExpr = \"0.0\";\n let useSheen = false;\n let useShAlbedoScaling = false;\n if (shInputRef) {\n const shBlock = ctx.graph.blocks.get(shInputRef.blockId);\n if (shBlock && shBlock.className === \"SheenBlock\") {\n useSheen = true;\n state.usesSheen = true;\n useShAlbedoScaling = (shBlock.serialized as { albedoScaling?: boolean }).albedoScaling === true;\n ctx.resolveOutput(shBlock, shInputRef.outputName, stage, state);\n shIntensityExpr = resolveOptional(shBlock, \"intensity\", \"1.0\", \"f32\", stage, state, ctx);\n shColorExpr = resolveOptional(shBlock, \"color\", \"v3(1.0)\", \"vec3f\", stage, state, ctx);\n const shrIn = shBlock.inputs.get(\"roughness\");\n shRoughnessExpr = shrIn?.source\n ? resolveOptional(shBlock, \"roughness\", \"0.0\", \"f32\", stage, state, ctx)\n : `clamp(${resolveOptional(block, \"roughness\", \"0.5\", \"f32\", stage, state, ctx)}, 0.0, 1.0)`;\n }\n }\n const ssInputRef = block.inputs.get(\"subsurface\")?.source;\n let useSubsurface = false;\n let useRefraction = false;\n let ssTintColorExpr = \"v3(1.0)\";\n let ssThicknessExpr = \"0.0\";\n let ssTranslucencyIntensityExpr = \"0.0\";\n let ssDiffusionDistExpr = \"v3(1.0)\";\n let refrIntensityExpr = \"0.0\";\n let refrIorExpr = resolveOptional(block, \"indexOfRefraction\", \"1.5\", \"f32\", stage, state, ctx);\n let refrTintAtDistanceExpr = \"1.0\";\n if (ssInputRef) {\n const ssBlk = ctx.graph.blocks.get(ssInputRef.blockId);\n if (ssBlk && ssBlk.className === \"SubSurfaceBlock\") {\n useSubsurface = true;\n state.usesSubsurface = true;\n ctx.resolveOutput(ssBlk, ssInputRef.outputName, stage, state);\n ssTintColorExpr = resolveOptional(ssBlk, \"tintColor\", \"v3(1.0)\", \"vec3f\", stage, state, ctx);\n ssThicknessExpr = resolveOptional(ssBlk, \"thickness\", \"0.0\", \"f32\", stage, state, ctx);\n ssTranslucencyIntensityExpr = resolveOptional(ssBlk, \"translucencyIntensity\", \"0.0\", \"f32\", stage, state, ctx);\n ssDiffusionDistExpr = resolveOptional(ssBlk, \"translucencyDiffusionDist\", \"v3(1.0)\", \"vec3f\", stage, state, ctx);\n const refrInputRef = ssBlk.inputs.get(\"refraction\")?.source;\n if (refrInputRef) {\n const refrBlk = ctx.graph.blocks.get(refrInputRef.blockId);\n if (refrBlk && refrBlk.className === \"RefractionBlock\") {\n useRefraction = true;\n ctx.resolveOutput(refrBlk, refrInputRef.outputName, stage, state);\n refrIntensityExpr = resolveOptional(refrBlk, \"intensity\", \"1.0\", \"f32\", stage, state, ctx);\n refrTintAtDistanceExpr = resolveOptional(refrBlk, \"tintAtDistance\", \"1.0\", \"f32\", stage, state, ctx);\n const volIor = refrBlk.inputs.get(\"volumeIndexOfRefraction\");\n if (volIor?.source) {\n refrIorExpr = resolveOptional(refrBlk, \"volumeIndexOfRefraction\", \"1.5\", \"f32\", stage, state, ctx);\n }\n }\n }\n }\n }\n const aniInputRef = block.inputs.get(\"anisotropy\")?.source;\n let useAnisotropy = false;\n let anisoIntensityExpr = \"0.0\";\n let anisoDirectionExpr = \"v2(1.0, 0.0)\";\n let anisoUvExpr = \"v2(0.0)\";\n if (aniInputRef) {\n const aniBlk = ctx.graph.blocks.get(aniInputRef.blockId);\n if (aniBlk && aniBlk.className === \"AnisotropyBlock\") {\n useAnisotropy = true;\n state.usesAnisotropy = true;\n ctx.resolveOutput(aniBlk, aniInputRef.outputName, stage, state);\n anisoIntensityExpr = resolveOptional(aniBlk, \"intensity\", \"0.0\", \"f32\", stage, state, ctx);\n anisoDirectionExpr = resolveOptional(aniBlk, \"direction\", \"v2(1.0, 0.0)\", \"vec3f\", stage, state, ctx);\n const dirIn = aniBlk.inputs.get(\"direction\");\n if (dirIn?.source) {\n const e = ctx.resolve(aniBlk, \"direction\", stage, state);\n anisoDirectionExpr = e.type === \"vec2f\" ? e.expr : `(${e.expr}).xy`;\n }\n const uvIn = aniBlk.inputs.get(\"uv\");\n if (uvIn?.source) {\n const e = ctx.resolve(aniBlk, \"uv\", stage, state);\n anisoUvExpr = e.type === \"vec2f\" ? e.expr : `(${e.expr}).xy`;\n }\n }\n }\n const iriInputRef = block.inputs.get(\"iridescence\")?.source;\n let useIridescence = false;\n let iriIntensityExpr = \"1.0\";\n let iriIorExpr = \"1.3\";\n let iriThicknessExpr = \"400.0\";\n if (iriInputRef) {\n const iriBlk = ctx.graph.blocks.get(iriInputRef.blockId);\n if (iriBlk && iriBlk.className === \"IridescenceBlock\") {\n useIridescence = true;\n state.usesIridescence = true;\n ctx.resolveOutput(iriBlk, iriInputRef.outputName, stage, state);\n iriIntensityExpr = resolveOptional(iriBlk, \"intensity\", \"1.0\", \"f32\", stage, state, ctx);\n iriIorExpr = resolveOptional(iriBlk, \"indexOfRefraction\", \"1.3\", \"f32\", stage, state, ctx);\n iriThicknessExpr = resolveOptional(iriBlk, \"thickness\", \"400.0\", \"f32\", stage, state, ctx);\n }\n }\n const useSpecularAA = (block.serialized as { enableSpecularAntiAliasing?: boolean }).enableSpecularAntiAliasing === true;\n const helperKey = `${HELPER_KEY_PREFIX}_${reflectionConnected ? \"env\" : \"noenv\"}_${useClearcoat ? \"cc\" : \"nocc\"}_${remapClearcoatF0 ? \"ccF0R\" : \"ccF0\"}_${useSheen ? \"sh\" : \"nosh\"}_${useRefraction ? \"refr\" : \"norefr\"}_${useSubsurface ? \"ss\" : \"noss\"}_${useAnisotropy ? \"ani\" : \"noani\"}_${useIridescence ? \"iri\" : \"noiri\"}_${useShAlbedoScaling ? \"shAS\" : \"noShAS\"}_${useCcBump ? \"ccB\" : \"\"}_${useCcTint ? \"ccT\" : \"\"}_${useSpecularAA ? \"aa\" : \"noaa\"}`;\n state.fragment.helpers.set(\n helperKey,\n buildPbrMrHelperFull({\n key: helperKey,\n useEnv: reflectionConnected,\n useClearcoat,\n useSheen,\n useRefraction,\n useSubsurface,\n useAnisotropy,\n useIridescence,\n useShAlbedoScaling,\n useCcBump,\n useCcTint,\n useSpecularAA,\n remapClearcoatF0,\n })\n );\n state.usesLightsUbo = true;\n\n const memoKey = `_pbrmr_${block.id}_call`;\n let callVar: string;\n const existing = state.fragment.memo.get(memoKey);\n if (existing) {\n callVar = existing.expr;\n } else {\n const wp = resolveOptional(block, \"worldPosition\", \"v3(0.0)\", \"vec3f\", stage, state, ctx);\n const gn = resolveOptional(block, \"worldNormal\", \"v3(0.0, 1.0, 0.0)\", \"vec3f\", stage, state, ctx);\n const perturbed = block.inputs.get(\"perturbedNormal\");\n const wn = perturbed?.source ? ctx.cast(ctx.resolve(block, \"perturbedNormal\", stage, state), \"vec3f\").expr : gn;\n const cp = resolveOptional(block, \"cameraPosition\", \"_NME_CAMERA_POS_\", \"vec3f\", stage, state, ctx);\n const bc = resolveOptional(block, \"baseColor\", \"v3(1.0)\", \"vec3f\", stage, state, ctx);\n const me = resolveOptional(block, \"metallic\", \"0.0\", \"f32\", stage, state, ctx);\n const ro = resolveOptional(block, \"roughness\", \"0.5\", \"f32\", stage, state, ctx);\n const ao = resolveOptional(block, \"ambientOcc\", \"1.0\", \"f32\", stage, state, ctx);\n const baseIorExpr = resolveOptional(block, \"indexOfRefraction\", \"1.5\", \"f32\", stage, state, ctx);\n const sf = state.shadowLights.length > 0 ? `nme_computeShadowFactors(in)` : SHADOW_FACTORS_ONE;\n callVar = `_pbrR${ctx.temp(state, \"pbr\")}`;\n state.fragment.body.push(\n `let ${callVar} = nme_pbr_mr_compute(${wp}, ${gn}, ${wn}, ${cp}, ${bc}, ${me}, ${ro}, ${ao}, ${ccIntensityExpr}, ${ccRoughnessExpr}, ${ccIorExpr}, ${ccBumpExpr}, ${ccBumpUvExpr}, ${ccTintColorExpr}, ${ccTintAtDistanceExpr}, ${ccTintThicknessExpr}, ${shIntensityExpr}, ${shColorExpr}, ${shRoughnessExpr}, ${baseIorExpr}, ${refrIntensityExpr}, ${refrIorExpr}, ${refrTintAtDistanceExpr}, ${ssTintColorExpr}, ${ssThicknessExpr}, ${ssTranslucencyIntensityExpr}, ${ssDiffusionDistExpr}, ${anisoIntensityExpr}, ${anisoDirectionExpr}, ${anisoUvExpr}, ${iriIntensityExpr}, ${iriIorExpr}, ${iriThicknessExpr}, ${sf});`\n );\n state.fragment.memo.set(memoKey, { expr: callVar, type: \"vec4f\" });\n }\n\n switch (outputName) {\n case \"lighting\":\n return { expr: `${callVar}.lighting`, type: \"vec3f\" };\n case \"diffuseDir\":\n return { expr: `${callVar}.diffuseDir`, type: \"vec3f\" };\n case \"specularDir\":\n return { expr: `${callVar}.specularDir`, type: \"vec3f\" };\n case \"diffuseInd\":\n return { expr: `${callVar}.diffuseInd`, type: \"vec3f\" };\n case \"specularInd\":\n return { expr: `${callVar}.specularInd`, type: \"vec3f\" };\n case \"shadow\":\n return { expr: `${callVar}.shadow`, type: \"f32\" };\n case \"alpha\": {\n const cfg = block.serialized as { useSpecularOverAlpha?: boolean; useRadianceOverAlpha?: boolean };\n const useOverAlpha = cfg.useSpecularOverAlpha === true || cfg.useRadianceOverAlpha === true;\n const op = block.inputs.get(\"opacity\");\n const baseAlpha = op?.source ? ctx.cast(ctx.resolve(block, \"opacity\", stage, state), \"f32\").expr : \"1.0\";\n if (useOverAlpha) {\n return { expr: `clamp(${baseAlpha} + ${callVar}.lumOverAlpha * ${callVar}.lumOverAlpha, 0.0, 1.0)`, type: \"f32\" };\n }\n return { expr: baseAlpha, type: \"f32\" };\n }\n case \"ambientClr\":\n case \"clearcoatDir\":\n case \"clearcoatInd\":\n case \"sheenDir\":\n case \"sheenInd\":\n case \"refraction\":\n return { expr: `v3(0.0)`, type: \"vec3f\" };\n default:\n return { expr: `${callVar}.lighting`, type: \"vec3f\" };\n }\n },\n};\n"],"names":[],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- import { M as MAX_LIGHTS } from "./index-B7Qhw0xL.js";
1
+ import { M as MAX_LIGHTS } from "./index-CLElg2Bo.js";
2
2
  function buildPbrMrHelperCore(request) {
3
3
  if (request.useClearcoat || request.useSheen || request.useRefraction || request.useSubsurface || request.useAnisotropy || request.useIridescence || request.useShAlbedoScaling || request.useCcBump || request.useCcTint || request.useSpecularAA || request.remapClearcoatF0) {
4
4
  throw new Error("NodeMaterial: PBR-MR core helper cannot emit optional PBR feature code");
@@ -234,4 +234,4 @@ ${iblBlock}
234
234
  export {
235
235
  buildPbrMrHelperCore
236
236
  };
237
- //# sourceMappingURL=pbr-mr-helper-core-R5tOZ8Ap.js.map
237
+ //# sourceMappingURL=pbr-mr-helper-core-BVWNR08D.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"pbr-mr-helper-core-R5tOZ8Ap.js","sources":["../src/material/node/blocks/pbr-mr-helper-core.ts"],"sourcesContent":["import type { NodePbrMrHelperRequest } from \"../node-types.js\";\nimport { MAX_LIGHTS } from \"../../../light/types.js\";\n\nexport function buildPbrMrHelperCore(request: NodePbrMrHelperRequest): string {\n if (\n request.useClearcoat ||\n request.useSheen ||\n request.useRefraction ||\n request.useSubsurface ||\n request.useAnisotropy ||\n request.useIridescence ||\n request.useShAlbedoScaling ||\n request.useCcBump ||\n request.useCcTint ||\n request.useSpecularAA ||\n request.remapClearcoatF0\n ) {\n throw new Error(\"NodeMaterial: PBR-MR core helper cannot emit optional PBR feature code\");\n }\n return HELPER_WGSL(request.useEnv);\n}\n\nfunction HELPER_WGSL(useEnv: boolean): string {\n const iblBlock = useEnv\n ? `\n let envRot = sceneU.envRotationY;\n let cosA = cos(envRot); let sinA = sin(envRot);\n let N_specSrc = N;\n let R_raw = reflect(-V, N_specSrc);\n let R = v3(R_raw.x * cosA + R_raw.z * sinA, R_raw.y, -R_raw.x * sinA + R_raw.z * cosA);\n let N_env = v3(Ng.x * cosA + Ng.z * sinA, Ng.y, -Ng.x * sinA + Ng.z * cosA);\n let environmentIrradiance = (sceneU.vSphericalL00.xyz\n + sceneU.vSphericalL1_1.xyz * N_env.y + sceneU.vSphericalL10.xyz * N_env.z + sceneU.vSphericalL11.xyz * N_env.x\n + sceneU.vSphericalL2_2.xyz * (N_env.y * N_env.x) + sceneU.vSphericalL2_1.xyz * (N_env.y * N_env.z)\n + sceneU.vSphericalL20.xyz * (3.0 * N_env.z * N_env.z - 1.0) + sceneU.vSphericalL21.xyz * (N_env.z * N_env.x)\n + sceneU.vSphericalL22.xyz * (N_env.x * N_env.x - N_env.y * N_env.y));\n let brdfSample = textureSample(nmeBrdfLUT, nmeBrdfSampler, v2(NdotV, rough_c));\n let envBrdf = brdfSample.rgb;\n let reflectanceF0Scalar = max(colorF0.r, max(colorF0.g, colorF0.b));\n let baseSpecEnvReflectance = (colorF90 - v3(reflectanceF0Scalar)) * envBrdf.x + v3(reflectanceF0Scalar) * envBrdf.y;\n let seo = clamp((NdotVUnclamped + ao_c) * (NdotVUnclamped + ao_c) - 1.0 + ao_c, 0.0, 1.0);\n let _geoNF = select(-Ng, Ng, dot(Ng, V) > 0.0);\n let _ehoRefl = reflect(-V, N);\n let _ehoT = clamp(1.0 + 1.1 * dot(_ehoRefl, _geoNF), 0.0, 1.0);\n let eho = _ehoT * _ehoT;\n let _coloredR0 = colorF0;\n let colorSpecEnvReflectance = ((colorF90 - _coloredR0) * envBrdf.x + _coloredR0 * envBrdf.y) * seo * eho;\n let energyConservation = 1.0 + _coloredR0 * (1.0 / max(envBrdf.y, 0.001) - 1.0);\n let maxLod = f32(textureNumLevels(nmeIblTexture) - 1);\n let cubemapDim = f32(textureDimensions(nmeIblTexture).x);\n let specLod = log2(cubemapDim * alphaG) * sceneU.vImageInfos.z;\n var environmentRadiance = textureSampleLevel(nmeIblTexture, nmeIblSampler, R, clamp(specLod, 0.0, maxLod)).rgb;\n var finalIrradiance = environmentIrradiance * surfaceAlbedo;\n let finalRadianceScaled = environmentRadiance * colorSpecEnvReflectance * energyConservation;\n let finalSpecularScaledDirect = specAcc * energyConservation;\n let finalRefraction = v3(0.0);\n let refractionOpacity = 1.0;\n let ssRefractionIrradiance = v3(0.0);\n finalIrradiance = finalIrradiance * ao_c;\n r.diffuseInd = finalIrradiance;\n r.specularInd = finalRadianceScaled;\n let shFinalIbl = v3(0.0);\n let shAlbedoScaling: f32 = 1.0;\n r.lighting = finalIrradiance * shAlbedoScaling + ssRefractionIrradiance * ao_c + (finalRadianceScaled + finalSpecularScaledDirect + diffuseAcc) * shAlbedoScaling + diffuseTransmissionAcc + shDirectAcc + shFinalIbl + finalRefraction;`\n : `\n r.diffuseInd = v3(0.0);\n r.specularInd = v3(0.0);\n r.lighting = diffuseAcc + diffuseTransmissionAcc + specAcc + shDirectAcc;`;\n\n return `alias v2 = vec2<f32>;\nalias v3 = vec3<f32>;\nalias v4 = vec4<f32>;\nstruct NmePbrMrResult {\n lighting: v3,\n diffuseDir: v3,\n specularDir: v3,\n diffuseInd: v3,\n specularInd: v3,\n shadow: f32,\n lumOverAlpha: f32,\n};\nconst NME_PBR_PI: f32 = 3.14159265358979323846;\nfn nme_pbr_distGGX(NdotH: f32, alphaG: f32) -> f32 {\n let a2 = alphaG * alphaG;\n let d = NdotH * NdotH * (a2 - 1.0) + 1.0;\n return a2 / (NME_PBR_PI * d * d);\n}\nfn nme_pbr_geomGGX(NdotL: f32, NdotV: f32, alphaG: f32) -> f32 {\n let a2 = alphaG * alphaG;\n let gl = NdotL * sqrt(NdotV * (NdotV - a2 * NdotV) + a2);\n let gv = NdotV * sqrt(NdotL * (NdotL - a2 * NdotL) + a2);\n return 0.5 / max(gl + gv, 0.00001);\n}\nfn nme_pbr_fresSchlick(c: f32, F0: v3, F90: v3) -> v3 {\n let t = 1.0 - c;\n let t2 = t * t;\n return F0 + (F90 - F0) * (t2 * t2 * t);\n}\nfn nme_pbr_diffuseEON(albedo: v3, sigma: f32, NdotL: f32, NdotV: f32, LdotV: f32) -> v3 {\n return albedo * (1.0 / NME_PBR_PI);\n}\nfn nme_pbr_mr_compute(\n worldPos: v3, geometricNormal: v3, worldNormal: v3, cameraPos: v3,\n baseColor: v3, metallic: f32, roughness: f32, ao: f32,\n ccIntensityIn: f32, ccRoughnessIn: f32, ccIor: f32,\n ccBumpColor: v3, ccBumpUv: v2,\n ccTintColor: v3, ccTintAtDistance: f32, ccTintThickness: f32,\n shIntensityIn: f32, shColorIn: v3, shRoughnessIn: f32,\n baseIor: f32,\n refrIntensityIn: f32, refrIor: f32, refrTintAtDistance: f32,\n ssTintColor: v3, ssThickness: f32,\n ssTranslucencyIntensityIn: f32, ssDiffusionDist: v3,\n anisoIntensityIn: f32, anisoDirection: v2, anisoUv: v2,\n shadowFactors: array<f32, ${MAX_LIGHTS}>\n) -> NmePbrMrResult {\n var r: NmePbrMrResult;\n let Ng = normalize(geometricNormal);\n let N = normalize(worldNormal);\n let V = normalize(cameraPos - worldPos);\n let NdotVUnclamped = dot(N, V);\n let NdotV = abs(NdotVUnclamped) + 0.0000001;\n let metallic_c = clamp(metallic, 0.0, 1.0);\n let rough_c = clamp(roughness, 0.0, 1.0);\n var alphaG = rough_c * rough_c + 0.0005;\n let AA_factor_x = 0.0;\n let AA_factor_y = 0.0;\n let dielectricF0Raw = (baseIor - 1.0) / (baseIor + 1.0);\n let dielectricF0Scalar = dielectricF0Raw * dielectricF0Raw;\n let dielectricF0 = v3(dielectricF0Scalar);\n var surfaceAlbedo = baseColor * (1.0 - metallic_c) * (1.0 - dielectricF0Scalar);\n let colorF0 = mix(dielectricF0, baseColor, metallic_c);\n let colorF90 = v3(1.0);\n let ao_c = clamp(ao, 0.0, 1.0);\n let directRoughness = max(rough_c, AA_factor_x);\n let directAlphaG = directRoughness * directRoughness + 0.0005;\n let anisoT = v3(1.0, 0.0, 0.0);\n let anisoB = v3(0.0, 0.0, 1.0);\n let aniAlphaTB = v2(alphaG, alphaG);\n let aniN = N;\n let ccDirectSpecAcc = v3(0.0);\n let directSpecR0 = colorF0;\n let ccNormalW = N;\n let ccNdotV: f32 = 0.0;\n let shDirectAcc = v3(0.0);\n let translucencyIntensity = 0.0;\n let ssTransmittance = v3(0.0);\n let directDiffuseTranslucencyScale = 1.0;\n var diffuseAcc = v3(0.0);\n var diffuseTransmissionAcc = v3(0.0);\n var specAcc = v3(0.0);\n var aggShadow: f32 = 0.0;\n var nLights: f32 = 0.0;\n let lc = min(meshU.lc, ${MAX_LIGHTS}u);\n for (var i: u32 = 0u; i < lc; i = i + 1u) {\n let lightIndex = nli(i);\n let entry = nmeLights.lights[lightIndex];\n let t = u32(entry.vLightData.w);\n let sh = shadowFactors[lightIndex];\n if (t == 3u) {\n let Ldir = normalize(entry.vLightData.xyz);\n let nl = clamp(0.5 + 0.5 * dot(N, Ldir), 0.0000001, 1.0);\n let groundSky = mix(entry.vLightDirection.xyz, entry.vLightDiffuse.rgb, nl);\n var baseLayerAtten: f32 = 1.0;\n var baseLayerAbsorption = v3(1.0);\n let H_h = normalize(V + Ldir);\n let NdotH_h = clamp(dot(N, H_h), 0.0000001, 1.0);\n let VdotH_h = saturate(dot(V, H_h));\n let cF_h = nme_pbr_fresSchlick(VdotH_h, directSpecR0, colorF90);\n let D_h = nme_pbr_distGGX(NdotH_h, directAlphaG);\n let G_h = nme_pbr_geomGGX(nl, NdotV, directAlphaG);\n specAcc = specAcc + cF_h * D_h * G_h * nl * entry.vLightDiffuse.rgb * sh * baseLayerAtten * baseLayerAbsorption;\n diffuseAcc = diffuseAcc + groundSky * surfaceAlbedo * sh * baseLayerAtten * baseLayerAbsorption;\n aggShadow = aggShadow + sh;\n nLights = nLights + 1.0;\n continue;\n }\n var L: v3;\n var atten: f32 = 1.0;\n let color = entry.vLightDiffuse.rgb;\n if (t == 1u) {\n L = normalize(-entry.vLightData.xyz);\n } else {\n let toL = entry.vLightData.xyz - worldPos;\n let d2 = dot(toL, toL);\n let dist = sqrt(d2);\n L = toL / max(dist, 0.0001);\n let range = entry.vLightDiffuse.a;\n if (t == 2u) {\n let invD2 = 1.0 / max(d2, 0.0000001);\n let cosHalfAngle = entry.vLightDirection.w;\n let kappa = 6.64385618977 / max(1.0 - cosHalfAngle, 0.0001);\n let cd = dot(-entry.vLightDirection.xyz, L);\n let dirFall = exp2(kappa * (cd - 1.0));\n atten = invD2 * dirFall;\n } else {\n atten = 1.0 / max(d2, 0.0000001);\n }\n }\n let NdotLUnclamped = dot(N, L);\n let NdotL = clamp(NdotLUnclamped, 0.0000001, 1.0);\n var baseLayerAtten: f32 = 1.0;\n var baseLayerAbsorption = v3(1.0);\n let _LdotV = select(0.0, dot(L, V), t == 1u);\n let _eonDiffuse = nme_pbr_diffuseEON(surfaceAlbedo, 0.0, NdotL, NdotV, _LdotV);\n diffuseAcc = diffuseAcc + _eonDiffuse * directDiffuseTranslucencyScale * NdotL * color * atten * sh * baseLayerAtten * baseLayerAbsorption;\n if (NdotLUnclamped < 0.0 && translucencyIntensity > 0.0) {\n let _trNdotL = abs(NdotLUnclamped) + 0.0000001;\n let _wrapW = 0.02;\n let _wrapT = 1.0 + _wrapW;\n let _wrapNdotL = clamp((_trNdotL + _wrapW) / (_wrapT * _wrapT), 0.0, 1.0);\n let _clampedAlbT = clamp(surfaceAlbedo, v3(0.1), v3(1.0));\n let _eonTransmit = nme_pbr_diffuseEON(_clampedAlbT, 0.0, max(NdotL, 0.0000001), NdotV, _LdotV) / _clampedAlbT;\n diffuseTransmissionAcc = diffuseTransmissionAcc + _eonTransmit * (ssTransmittance * _wrapNdotL) * color * atten * sh * baseLayerAtten * baseLayerAbsorption;\n }\n if (NdotL > 0.0 && atten > 0.0) {\n let H = normalize(V + L);\n let NdotH = clamp(dot(N, H), 0.0000001, 1.0);\n let VdotH = saturate(dot(V, H));\n let cF = nme_pbr_fresSchlick(VdotH, directSpecR0, colorF90);\n let D = nme_pbr_distGGX(NdotH, directAlphaG);\n let G = nme_pbr_geomGGX(NdotL, NdotV, directAlphaG);\n specAcc = specAcc + cF * D * G * NdotL * color * atten * sh * baseLayerAtten * baseLayerAbsorption;\n }\n aggShadow = aggShadow + sh;\n nLights = nLights + 1.0;\n }\n r.diffuseDir = diffuseAcc;\n r.specularDir = specAcc;\n${iblBlock}\n ${\n useEnv\n ? `let _radLum = clamp(dot(finalRadianceScaled * shAlbedoScaling, v3(0.2126, 0.7152, 0.0722)), 0.0, 1.0);\n let _specLum = clamp(dot(finalSpecularScaledDirect * shAlbedoScaling, v3(0.2126, 0.7152, 0.0722)), 0.0, 1.0);\n r.lumOverAlpha = _radLum + _specLum;`\n : `let _specLum = clamp(dot(specAcc, v3(0.2126, 0.7152, 0.0722)), 0.0, 1.0);\n r.lumOverAlpha = _specLum;`\n }\n var colorOut = max(r.lighting, v3(0.0)) * sceneU.vImageInfos.x;\n if (sceneU.vImageInfos.w > 0.5) {\n colorOut = 1.0 - exp2(-1.590579 * colorOut);\n }\n colorOut = pow(max(colorOut, v3(0.0)), v3(0.45454545));\n colorOut = clamp(colorOut, v3(0.0), v3(1.0));\n let highContrast = colorOut * colorOut * (v3(3.0) - colorOut * 2.0);\n if (sceneU.vImageInfos.y < 1.0) {\n colorOut = mix(v3(0.5), colorOut, sceneU.vImageInfos.y);\n } else {\n colorOut = mix(colorOut, highContrast, sceneU.vImageInfos.y - 1.0);\n }\n r.lighting = max(colorOut, v3(0.0));\n if (nLights > 0.0) { r.shadow = aggShadow / nLights; } else { r.shadow = 1.0; }\n return r;\n}\n`;\n}\n"],"names":[],"mappings":";AAGO,SAAS,qBAAqB,SAAyC;AAC1E,MACI,QAAQ,gBACR,QAAQ,YACR,QAAQ,iBACR,QAAQ,iBACR,QAAQ,iBACR,QAAQ,kBACR,QAAQ,sBACR,QAAQ,aACR,QAAQ,aACR,QAAQ,iBACR,QAAQ,kBACV;AACE,UAAM,IAAI,MAAM,wEAAwE;AAAA,EAC5F;AACA,SAAO,YAAY,QAAQ,MAAM;AACrC;AAEA,SAAS,YAAY,QAAyB;AAC1C,QAAM,WAAW,SACX;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,gPAwCA;AAAA;AAAA;AAAA;AAKN,SAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,gCA4CqB,UAAU;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,6BAuCb,UAAU;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EA4ErC,QAAQ;AAAA,MAEF,SACM;AAAA;AAAA,4CAGA;AAAA,+BAEV;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAkBJ;"}
1
+ {"version":3,"file":"pbr-mr-helper-core-BVWNR08D.js","sources":["../src/material/node/blocks/pbr-mr-helper-core.ts"],"sourcesContent":["import type { NodePbrMrHelperRequest } from \"../node-types.js\";\nimport { MAX_LIGHTS } from \"../../../light/types.js\";\n\nexport function buildPbrMrHelperCore(request: NodePbrMrHelperRequest): string {\n if (\n request.useClearcoat ||\n request.useSheen ||\n request.useRefraction ||\n request.useSubsurface ||\n request.useAnisotropy ||\n request.useIridescence ||\n request.useShAlbedoScaling ||\n request.useCcBump ||\n request.useCcTint ||\n request.useSpecularAA ||\n request.remapClearcoatF0\n ) {\n throw new Error(\"NodeMaterial: PBR-MR core helper cannot emit optional PBR feature code\");\n }\n return HELPER_WGSL(request.useEnv);\n}\n\nfunction HELPER_WGSL(useEnv: boolean): string {\n const iblBlock = useEnv\n ? `\n let envRot = sceneU.envRotationY;\n let cosA = cos(envRot); let sinA = sin(envRot);\n let N_specSrc = N;\n let R_raw = reflect(-V, N_specSrc);\n let R = v3(R_raw.x * cosA + R_raw.z * sinA, R_raw.y, -R_raw.x * sinA + R_raw.z * cosA);\n let N_env = v3(Ng.x * cosA + Ng.z * sinA, Ng.y, -Ng.x * sinA + Ng.z * cosA);\n let environmentIrradiance = (sceneU.vSphericalL00.xyz\n + sceneU.vSphericalL1_1.xyz * N_env.y + sceneU.vSphericalL10.xyz * N_env.z + sceneU.vSphericalL11.xyz * N_env.x\n + sceneU.vSphericalL2_2.xyz * (N_env.y * N_env.x) + sceneU.vSphericalL2_1.xyz * (N_env.y * N_env.z)\n + sceneU.vSphericalL20.xyz * (3.0 * N_env.z * N_env.z - 1.0) + sceneU.vSphericalL21.xyz * (N_env.z * N_env.x)\n + sceneU.vSphericalL22.xyz * (N_env.x * N_env.x - N_env.y * N_env.y));\n let brdfSample = textureSample(nmeBrdfLUT, nmeBrdfSampler, v2(NdotV, rough_c));\n let envBrdf = brdfSample.rgb;\n let reflectanceF0Scalar = max(colorF0.r, max(colorF0.g, colorF0.b));\n let baseSpecEnvReflectance = (colorF90 - v3(reflectanceF0Scalar)) * envBrdf.x + v3(reflectanceF0Scalar) * envBrdf.y;\n let seo = clamp((NdotVUnclamped + ao_c) * (NdotVUnclamped + ao_c) - 1.0 + ao_c, 0.0, 1.0);\n let _geoNF = select(-Ng, Ng, dot(Ng, V) > 0.0);\n let _ehoRefl = reflect(-V, N);\n let _ehoT = clamp(1.0 + 1.1 * dot(_ehoRefl, _geoNF), 0.0, 1.0);\n let eho = _ehoT * _ehoT;\n let _coloredR0 = colorF0;\n let colorSpecEnvReflectance = ((colorF90 - _coloredR0) * envBrdf.x + _coloredR0 * envBrdf.y) * seo * eho;\n let energyConservation = 1.0 + _coloredR0 * (1.0 / max(envBrdf.y, 0.001) - 1.0);\n let maxLod = f32(textureNumLevels(nmeIblTexture) - 1);\n let cubemapDim = f32(textureDimensions(nmeIblTexture).x);\n let specLod = log2(cubemapDim * alphaG) * sceneU.vImageInfos.z;\n var environmentRadiance = textureSampleLevel(nmeIblTexture, nmeIblSampler, R, clamp(specLod, 0.0, maxLod)).rgb;\n var finalIrradiance = environmentIrradiance * surfaceAlbedo;\n let finalRadianceScaled = environmentRadiance * colorSpecEnvReflectance * energyConservation;\n let finalSpecularScaledDirect = specAcc * energyConservation;\n let finalRefraction = v3(0.0);\n let refractionOpacity = 1.0;\n let ssRefractionIrradiance = v3(0.0);\n finalIrradiance = finalIrradiance * ao_c;\n r.diffuseInd = finalIrradiance;\n r.specularInd = finalRadianceScaled;\n let shFinalIbl = v3(0.0);\n let shAlbedoScaling: f32 = 1.0;\n r.lighting = finalIrradiance * shAlbedoScaling + ssRefractionIrradiance * ao_c + (finalRadianceScaled + finalSpecularScaledDirect + diffuseAcc) * shAlbedoScaling + diffuseTransmissionAcc + shDirectAcc + shFinalIbl + finalRefraction;`\n : `\n r.diffuseInd = v3(0.0);\n r.specularInd = v3(0.0);\n r.lighting = diffuseAcc + diffuseTransmissionAcc + specAcc + shDirectAcc;`;\n\n return `alias v2 = vec2<f32>;\nalias v3 = vec3<f32>;\nalias v4 = vec4<f32>;\nstruct NmePbrMrResult {\n lighting: v3,\n diffuseDir: v3,\n specularDir: v3,\n diffuseInd: v3,\n specularInd: v3,\n shadow: f32,\n lumOverAlpha: f32,\n};\nconst NME_PBR_PI: f32 = 3.14159265358979323846;\nfn nme_pbr_distGGX(NdotH: f32, alphaG: f32) -> f32 {\n let a2 = alphaG * alphaG;\n let d = NdotH * NdotH * (a2 - 1.0) + 1.0;\n return a2 / (NME_PBR_PI * d * d);\n}\nfn nme_pbr_geomGGX(NdotL: f32, NdotV: f32, alphaG: f32) -> f32 {\n let a2 = alphaG * alphaG;\n let gl = NdotL * sqrt(NdotV * (NdotV - a2 * NdotV) + a2);\n let gv = NdotV * sqrt(NdotL * (NdotL - a2 * NdotL) + a2);\n return 0.5 / max(gl + gv, 0.00001);\n}\nfn nme_pbr_fresSchlick(c: f32, F0: v3, F90: v3) -> v3 {\n let t = 1.0 - c;\n let t2 = t * t;\n return F0 + (F90 - F0) * (t2 * t2 * t);\n}\nfn nme_pbr_diffuseEON(albedo: v3, sigma: f32, NdotL: f32, NdotV: f32, LdotV: f32) -> v3 {\n return albedo * (1.0 / NME_PBR_PI);\n}\nfn nme_pbr_mr_compute(\n worldPos: v3, geometricNormal: v3, worldNormal: v3, cameraPos: v3,\n baseColor: v3, metallic: f32, roughness: f32, ao: f32,\n ccIntensityIn: f32, ccRoughnessIn: f32, ccIor: f32,\n ccBumpColor: v3, ccBumpUv: v2,\n ccTintColor: v3, ccTintAtDistance: f32, ccTintThickness: f32,\n shIntensityIn: f32, shColorIn: v3, shRoughnessIn: f32,\n baseIor: f32,\n refrIntensityIn: f32, refrIor: f32, refrTintAtDistance: f32,\n ssTintColor: v3, ssThickness: f32,\n ssTranslucencyIntensityIn: f32, ssDiffusionDist: v3,\n anisoIntensityIn: f32, anisoDirection: v2, anisoUv: v2,\n shadowFactors: array<f32, ${MAX_LIGHTS}>\n) -> NmePbrMrResult {\n var r: NmePbrMrResult;\n let Ng = normalize(geometricNormal);\n let N = normalize(worldNormal);\n let V = normalize(cameraPos - worldPos);\n let NdotVUnclamped = dot(N, V);\n let NdotV = abs(NdotVUnclamped) + 0.0000001;\n let metallic_c = clamp(metallic, 0.0, 1.0);\n let rough_c = clamp(roughness, 0.0, 1.0);\n var alphaG = rough_c * rough_c + 0.0005;\n let AA_factor_x = 0.0;\n let AA_factor_y = 0.0;\n let dielectricF0Raw = (baseIor - 1.0) / (baseIor + 1.0);\n let dielectricF0Scalar = dielectricF0Raw * dielectricF0Raw;\n let dielectricF0 = v3(dielectricF0Scalar);\n var surfaceAlbedo = baseColor * (1.0 - metallic_c) * (1.0 - dielectricF0Scalar);\n let colorF0 = mix(dielectricF0, baseColor, metallic_c);\n let colorF90 = v3(1.0);\n let ao_c = clamp(ao, 0.0, 1.0);\n let directRoughness = max(rough_c, AA_factor_x);\n let directAlphaG = directRoughness * directRoughness + 0.0005;\n let anisoT = v3(1.0, 0.0, 0.0);\n let anisoB = v3(0.0, 0.0, 1.0);\n let aniAlphaTB = v2(alphaG, alphaG);\n let aniN = N;\n let ccDirectSpecAcc = v3(0.0);\n let directSpecR0 = colorF0;\n let ccNormalW = N;\n let ccNdotV: f32 = 0.0;\n let shDirectAcc = v3(0.0);\n let translucencyIntensity = 0.0;\n let ssTransmittance = v3(0.0);\n let directDiffuseTranslucencyScale = 1.0;\n var diffuseAcc = v3(0.0);\n var diffuseTransmissionAcc = v3(0.0);\n var specAcc = v3(0.0);\n var aggShadow: f32 = 0.0;\n var nLights: f32 = 0.0;\n let lc = min(meshU.lc, ${MAX_LIGHTS}u);\n for (var i: u32 = 0u; i < lc; i = i + 1u) {\n let lightIndex = nli(i);\n let entry = nmeLights.lights[lightIndex];\n let t = u32(entry.vLightData.w);\n let sh = shadowFactors[lightIndex];\n if (t == 3u) {\n let Ldir = normalize(entry.vLightData.xyz);\n let nl = clamp(0.5 + 0.5 * dot(N, Ldir), 0.0000001, 1.0);\n let groundSky = mix(entry.vLightDirection.xyz, entry.vLightDiffuse.rgb, nl);\n var baseLayerAtten: f32 = 1.0;\n var baseLayerAbsorption = v3(1.0);\n let H_h = normalize(V + Ldir);\n let NdotH_h = clamp(dot(N, H_h), 0.0000001, 1.0);\n let VdotH_h = saturate(dot(V, H_h));\n let cF_h = nme_pbr_fresSchlick(VdotH_h, directSpecR0, colorF90);\n let D_h = nme_pbr_distGGX(NdotH_h, directAlphaG);\n let G_h = nme_pbr_geomGGX(nl, NdotV, directAlphaG);\n specAcc = specAcc + cF_h * D_h * G_h * nl * entry.vLightDiffuse.rgb * sh * baseLayerAtten * baseLayerAbsorption;\n diffuseAcc = diffuseAcc + groundSky * surfaceAlbedo * sh * baseLayerAtten * baseLayerAbsorption;\n aggShadow = aggShadow + sh;\n nLights = nLights + 1.0;\n continue;\n }\n var L: v3;\n var atten: f32 = 1.0;\n let color = entry.vLightDiffuse.rgb;\n if (t == 1u) {\n L = normalize(-entry.vLightData.xyz);\n } else {\n let toL = entry.vLightData.xyz - worldPos;\n let d2 = dot(toL, toL);\n let dist = sqrt(d2);\n L = toL / max(dist, 0.0001);\n let range = entry.vLightDiffuse.a;\n if (t == 2u) {\n let invD2 = 1.0 / max(d2, 0.0000001);\n let cosHalfAngle = entry.vLightDirection.w;\n let kappa = 6.64385618977 / max(1.0 - cosHalfAngle, 0.0001);\n let cd = dot(-entry.vLightDirection.xyz, L);\n let dirFall = exp2(kappa * (cd - 1.0));\n atten = invD2 * dirFall;\n } else {\n atten = 1.0 / max(d2, 0.0000001);\n }\n }\n let NdotLUnclamped = dot(N, L);\n let NdotL = clamp(NdotLUnclamped, 0.0000001, 1.0);\n var baseLayerAtten: f32 = 1.0;\n var baseLayerAbsorption = v3(1.0);\n let _LdotV = select(0.0, dot(L, V), t == 1u);\n let _eonDiffuse = nme_pbr_diffuseEON(surfaceAlbedo, 0.0, NdotL, NdotV, _LdotV);\n diffuseAcc = diffuseAcc + _eonDiffuse * directDiffuseTranslucencyScale * NdotL * color * atten * sh * baseLayerAtten * baseLayerAbsorption;\n if (NdotLUnclamped < 0.0 && translucencyIntensity > 0.0) {\n let _trNdotL = abs(NdotLUnclamped) + 0.0000001;\n let _wrapW = 0.02;\n let _wrapT = 1.0 + _wrapW;\n let _wrapNdotL = clamp((_trNdotL + _wrapW) / (_wrapT * _wrapT), 0.0, 1.0);\n let _clampedAlbT = clamp(surfaceAlbedo, v3(0.1), v3(1.0));\n let _eonTransmit = nme_pbr_diffuseEON(_clampedAlbT, 0.0, max(NdotL, 0.0000001), NdotV, _LdotV) / _clampedAlbT;\n diffuseTransmissionAcc = diffuseTransmissionAcc + _eonTransmit * (ssTransmittance * _wrapNdotL) * color * atten * sh * baseLayerAtten * baseLayerAbsorption;\n }\n if (NdotL > 0.0 && atten > 0.0) {\n let H = normalize(V + L);\n let NdotH = clamp(dot(N, H), 0.0000001, 1.0);\n let VdotH = saturate(dot(V, H));\n let cF = nme_pbr_fresSchlick(VdotH, directSpecR0, colorF90);\n let D = nme_pbr_distGGX(NdotH, directAlphaG);\n let G = nme_pbr_geomGGX(NdotL, NdotV, directAlphaG);\n specAcc = specAcc + cF * D * G * NdotL * color * atten * sh * baseLayerAtten * baseLayerAbsorption;\n }\n aggShadow = aggShadow + sh;\n nLights = nLights + 1.0;\n }\n r.diffuseDir = diffuseAcc;\n r.specularDir = specAcc;\n${iblBlock}\n ${\n useEnv\n ? `let _radLum = clamp(dot(finalRadianceScaled * shAlbedoScaling, v3(0.2126, 0.7152, 0.0722)), 0.0, 1.0);\n let _specLum = clamp(dot(finalSpecularScaledDirect * shAlbedoScaling, v3(0.2126, 0.7152, 0.0722)), 0.0, 1.0);\n r.lumOverAlpha = _radLum + _specLum;`\n : `let _specLum = clamp(dot(specAcc, v3(0.2126, 0.7152, 0.0722)), 0.0, 1.0);\n r.lumOverAlpha = _specLum;`\n }\n var colorOut = max(r.lighting, v3(0.0)) * sceneU.vImageInfos.x;\n if (sceneU.vImageInfos.w > 0.5) {\n colorOut = 1.0 - exp2(-1.590579 * colorOut);\n }\n colorOut = pow(max(colorOut, v3(0.0)), v3(0.45454545));\n colorOut = clamp(colorOut, v3(0.0), v3(1.0));\n let highContrast = colorOut * colorOut * (v3(3.0) - colorOut * 2.0);\n if (sceneU.vImageInfos.y < 1.0) {\n colorOut = mix(v3(0.5), colorOut, sceneU.vImageInfos.y);\n } else {\n colorOut = mix(colorOut, highContrast, sceneU.vImageInfos.y - 1.0);\n }\n r.lighting = max(colorOut, v3(0.0));\n if (nLights > 0.0) { r.shadow = aggShadow / nLights; } else { r.shadow = 1.0; }\n return r;\n}\n`;\n}\n"],"names":[],"mappings":";AAGO,SAAS,qBAAqB,SAAyC;AAC1E,MACI,QAAQ,gBACR,QAAQ,YACR,QAAQ,iBACR,QAAQ,iBACR,QAAQ,iBACR,QAAQ,kBACR,QAAQ,sBACR,QAAQ,aACR,QAAQ,aACR,QAAQ,iBACR,QAAQ,kBACV;AACE,UAAM,IAAI,MAAM,wEAAwE;AAAA,EAC5F;AACA,SAAO,YAAY,QAAQ,MAAM;AACrC;AAEA,SAAS,YAAY,QAAyB;AAC1C,QAAM,WAAW,SACX;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,gPAwCA;AAAA;AAAA;AAAA;AAKN,SAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,gCA4CqB,UAAU;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,6BAuCb,UAAU;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EA4ErC,QAAQ;AAAA,MAEF,SACM;AAAA;AAAA,4CAGA;AAAA,+BAEV;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAkBJ;"}
@@ -8,10 +8,10 @@ async function registerPbrRefraction(scene, engine, register) {
8
8
  break;
9
9
  }
10
10
  }
11
- const mod = await import("./pbr-transmission-ext-Dll8EYwE.js");
11
+ const mod = await import("./pbr-transmission-ext-BcLjRxfB.js");
12
12
  mod.registerPbrTransmission(scene, engine, register, dispersionSampleWgsl);
13
13
  }
14
14
  export {
15
15
  registerPbrRefraction
16
16
  };
17
- //# sourceMappingURL=pbr-refraction-Dd11HnaI.js.map
17
+ //# sourceMappingURL=pbr-refraction-C9FvFmAp.js.map