@babylonjs/viewer
Version:
The Babylon Viewer aims to simplify a specific but common Babylon.js use case: loading, viewing, and interacting with a 3D model.
3 lines (2 loc) • 7.84 kB
JavaScript
import{az as c,Z as e,$ as t}from"./index-DFZFpUG-.esm.min.js";const n=1<<25,l=c=>`(vec2<f32>(dot(material.${c}m.xy, input.uv), dot(material.${c}m.zw, input.uv)) + material.${c}t.xy)`;function r(c){return`\n{\nlet ccInt_r = ${c};\nlet remappedF0 = getR0RemappedForClearCoat(colorF0, material.ccRefractionParams.z, material.ccRefractionParams.w);\ncolorF0 = mix(colorF0, remappedF0, ccInt_r);\n}\n`}function a(c,e,t){const n=t?"ccN":"N_geom";return`\nvar ccDirectAttenuation = 1.0;\nvar ccDirectSpecularTerm = vec3<f32>(0.0);\n{\nlet ccInt_dl = ${c};\nlet ccRough_dl = ${e};\nlet ccF0_dl = material.ccRefractionParams.x;\nlet ccAlphaG_dl = ccRough_dl * ccRough_dl + 0.0005;\nlet ccNdotL_dl = saturate(dot(${n}, L));\nlet ccH_dl = normalize(V + L);\nlet ccNdotH_dl = clamp(dot(${n}, ccH_dl), 0.0000001, 1.0);\nlet ccVdotH_dl = saturate(dot(V, ccH_dl));\nlet ccD_dl = distributionGGX(ccNdotH_dl, ccAlphaG_dl);\nlet ccVis_dl = visibility_Kelemen(ccVdotH_dl);\nlet ccFresnel_dl = ccSchlick(ccF0_dl, ccVdotH_dl);\nlet ccTerm = ccFresnel_dl * ccD_dl * ccVis_dl * ccNdotL_dl;\nccDirectSpecularTerm = vec3<f32>(ccTerm) * lightColor * lightAtten * material.directIntensity * ccInt_dl;\nccDirectAttenuation = 1.0 - ccFresnel_dl * ccInt_dl;\n}\n`}function i(i,_,o,s,m){if(0===(i&c))return null;const u=0!==(i&(e|t)),d=!!(1&_),p=!!(2&_),f=!!(4&_),b=!!(8&_),v=0!==(_&n),h=v?l("ccIntUV"):"input.uv",x=v?l("ccRoughUV"):"input.uv",y=v?l("ccNormUV"):"input.uv",g=d?`material.ccParams.x * textureSample(ccIntensityTexture, ccIntensitySampler_, ${h}).r`:"material.ccParams.x";const R=p?(c=>`clamp(material.ccParams.y * textureSample(ccRoughnessTexture, ccRoughnessSampler_, ${c}).g, 0.0, 1.0)`)(x):"material.ccParams.y",S={MF:b?"":r(g),AD:a(g,R,f),BL:"var ccDirectAttenuation = 1.0;\nvar ccDirectSpecularTerm = vec3<f32>(0.0);"};f&&(S.AC=(c=>`\nlet cc_dp1 = dpdx(input.worldPos);\nlet cc_dp2 = dpdy(input.worldPos);\nlet cc_duv1 = dpdx(input.uv);\nlet cc_duv2 = dpdy(input.uv);\nlet cc_dp2perp = cross(cc_dp2, N_geom);\nlet cc_dp1perp = cross(N_geom, cc_dp1);\nlet cc_tFrame = cc_dp2perp * cc_duv1.x + cc_dp1perp * cc_duv2.x;\nlet cc_bFrame = -(cc_dp2perp * cc_duv1.y + cc_dp1perp * cc_duv2.y);\nlet cc_det = max(dot(cc_tFrame, cc_tFrame), dot(cc_bFrame, cc_bFrame));\nlet cc_invmax = select(inverseSqrt(cc_det), 0.0, cc_det == 0.0);\nlet cc_frame = mat3x3<f32>(cc_tFrame * cc_invmax, cc_bFrame * cc_invmax, N_geom);\nlet ccNormSampleRaw = textureSample(ccNormalTexture, ccNormalSampler_, ${c}).rgb * 2.0 - 1.0;\nlet ccNormScale = material.ccParams.z;\nvar ccN = normalize(cc_frame * normalize(ccNormSampleRaw * vec3<f32>(ccNormScale, ccNormScale, 1.0)));\n`)(y)),o?S.AI=function(c,e,t,n,l){const r=t?"ccN":"N_geom";return`\n{\nlet ccInt_ibl = ${c};\nlet ccRough_ibl = ${e};\nlet ccF0_ibl = material.ccRefractionParams.x;\nlet ccR_raw = reflect(-V, ${r});\nlet ccR_ibl = rotateY(ccR_raw, scene.envRotationY);\nlet ccNdotV_ibl = abs(dot(${r}, V)) + 0.0000001;\n${n?`let ccAlphaG_ibl_base = ccRough_ibl * ccRough_ibl + 0.0005;\nlet cc_nDfdx_AA = dpdx(${r});\nlet cc_nDfdy_AA = dpdy(${r});\nlet cc_slopeSquare_AA = max(dot(cc_nDfdx_AA, cc_nDfdx_AA), dot(cc_nDfdy_AA, cc_nDfdy_AA));\nlet ccAlphaG_ibl = ccAlphaG_ibl_base + sqrt(cc_slopeSquare_AA) * 0.75;`:"let ccAlphaG_ibl = ccRough_ibl * ccRough_ibl + 0.0005;"}\nvar ccSpecLod_ibl = log2(cubemapDim * ccAlphaG_ibl) * scene.vImageInfos.z;\nlet ccEnvRadiance_ibl = textureSampleLevel(iblTexture, iblSampler, ccR_ibl, clamp(ccSpecLod_ibl, 0.0, maxLod)).rgb * material.environmentIntensity;\nlet ccBrdf_ibl = textureSample(brdfLUT, brdfSampler_, vec2<f32>(ccNdotV_ibl, ccRough_ibl)).rgb;\n${l?`let ccEho_ibl = environmentHorizonOcclusion(-V, ${r}, N_geom);`:"let ccEho_ibl = 1.0;"}\nlet ccSpecEnvRefl = (vec3<f32>(ccF0_ibl) * ccBrdf_ibl.y + (vec3<f32>(1.0) - vec3<f32>(ccF0_ibl)) * ccBrdf_ibl.x) * ccInt_ibl * ccEho_ibl;\nlet ccFresnelIBL = ccSchlick(ccF0_ibl, ccNdotV_ibl);\nlet ccConservation_ibl = 1.0 - ccFresnelIBL * ccInt_ibl;\nlet ccFinalRadiance_ibl = ccEnvRadiance_ibl * ccSpecEnvRefl;\ncolor = finalIrradiance * ccConservation_ibl\n + finalRadianceScaled * ccConservation_ibl\n + finalSpecularScaled * ccDirectAttenuation\n + directDiffuse * ccDirectAttenuation\n + ccDirectSpecularTerm\n + ccFinalRadiance_ibl\n + emissive;\n}\n`}(g,R,f,m,s):S.NI=function(c){return`\n{\nlet ccF0_noIbl = material.ccRefractionParams.x;\nlet ccInt_noIbl = ${c};\nlet ccFresnelNoIbl = ccSchlick(ccF0_noIbl, NdotV);\nlet ccCons_noIbl = 1.0 - ccFresnelNoIbl * ccInt_noIbl;\ncolor = (color - emissive) * ccCons_noIbl + emissive + ccDirectSpecularTerm;\n}\n`}(g);const A=[];o&&A.push("ibl"),u&&A.push("reflectance");const I=(d?"I":"")+(p?"R":"")+(f?"N":"")+(b?"X":"")+(m?"A":"")+(s?"B":"")+(v?"U":""),F=[];d&&F.push({_name:"ccIntensityTexture",_type:{_kind:"texture",_textureType:"texture_2d<f32>"},_visibility:2},{_name:"ccIntensitySampler_",_type:{_kind:"sampler",_samplerType:"sampler"},_visibility:2}),p&&F.push({_name:"ccRoughnessTexture",_type:{_kind:"texture",_textureType:"texture_2d<f32>"},_visibility:2},{_name:"ccRoughnessSampler_",_type:{_kind:"sampler",_samplerType:"sampler"},_visibility:2}),f&&F.push({_name:"ccNormalTexture",_type:{_kind:"texture",_textureType:"texture_2d<f32>"},_visibility:2},{_name:"ccNormalSampler_",_type:{_kind:"sampler",_samplerType:"sampler"},_visibility:2});const N=[{_name:"ccParams",_type:"vec4<f32>"},{_name:"ccRefractionParams",_type:"vec4<f32>"}];return v&&(d&&N.push({_name:"ccIntUVm",_type:"vec4<f32>"},{_name:"ccIntUVt",_type:"vec4<f32>"}),p&&N.push({_name:"ccRoughUVm",_type:"vec4<f32>"},{_name:"ccRoughUVt",_type:"vec4<f32>"}),f&&N.push({_name:"ccNormUVm",_type:"vec4<f32>"},{_name:"ccNormUVt",_type:"vec4<f32>"})),{_id:I?`clearcoat-${I}`:"clearcoat",_dependencies:A.length>0?A:void 0,_uboFields:N,_bindings:F,_helperFunctions:"\nfn visibility_Kelemen(VdotH_kl: f32) -> f32 {\nreturn 0.25 / (VdotH_kl * VdotH_kl + 0.0000001);\n}\nfn getR0RemappedForClearCoat(f0_rc: vec3<f32>, ccA: f32, ccB: f32) -> vec3<f32> {\nlet sf0 = sqrt(f0_rc);\nlet num = ccA + ccB * sf0;\nlet den = ccB + ccA * sf0;\nreturn saturate((num / den) * (num / den));\n}\nfn 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",_fragmentSlots:S}}function _(c,e,t){const n=e.clearCoat;if(!n?.isEnabled||!t.has("ccParams"))return;const l=t.get("ccParams")/4,r=n.indexOfRefraction??1.5,a=1-r,i=1+r;c[l]=n.intensity??1,c[l+1]=n.roughness??0,c[l+2]=n.bumpTextureScale??1,c[l+4]=Math.pow(-a/i,2),c[l+5]=1/r,c[l+6]=a,c[l+7]=i,o(c,t,"ccIntUV",n.texture),o(c,t,"ccRoughUV",n.roughnessTexture),o(c,t,"ccNormUV",n.bumpTexture)}function o(c,e,t,n){const l=e.get(`${t}m`),r=e.get(`${t}t`);if(void 0===l||void 0===r)return;const a=n?.uScale??1,i=n?.vScale??1,_=n?.uAng??0,o=l/4;if(0===_)c[o]=a,c[o+1]=0,c[o+2]=0,c[o+3]=i;else{const e=Math.cos(_),t=Math.sin(_);c[o]=e*a,c[o+1]=t*i,c[o+2]=-t*a,c[o+3]=e*i}const s=r/4;c[s]=n?.uOffset??0,c[s+1]=n?.vOffset??0}const s=[[1,"texture"],[2,"roughnessTexture"],[4,"bumpTexture"]],m={id:"clearcoat",phase:"base-tex",detect(e){const t=e.clearCoat;if(!t?.isEnabled)return{f:0,f2:0};let l=0;for(const[c,e]of s)t[e]&&(l|=c);const r=c=>!!c?._hasTx;return(r(t.texture)||r(t.roughnessTexture)||r(t.bumpTexture))&&(l|=n),!1===t.useF0Remap&&(l|=8),{f:c,f2:l}},frag:c=>i(c._features,c._features2,c._hasIbl,c._hasAnyNormal,c._hasSpecularAA),writeUbo:_,bind(c,e,t){const n=c._material.clearCoat;if(!n)return t;for(const[l,r]of s){const a=n[r];0!==(c._features2&l)&&a&&(e.push({binding:t++,resource:a.view}),e.push({binding:t++,resource:a.sampler}))}return t},textures(c,e){const t=c.clearCoat;if(t)for(const[,c]of s){const n=t[c];n&&e.push(n)}}};export{i as createClearcoatFragment,m as pbrExt,_ as writeClearcoatUBO};
//# sourceMappingURL=clearcoat-fragment-BNAR-eRu.esm.min.js.map