UNPKG

@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) 8.39 kB
import{aT as c,a4 as e,a5 as t,a8 as n}from"./index-B8IgtevW.esm.min.js";const r=1<<25,a=c=>`(vec2<f32>(dot(material.${c}m.xy, input.uv), dot(material.${c}m.zw, input.uv)) + material.${c}t.xy)`;function l(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 i(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 o(c,e,t,n){const r=e.get(`${t}m`),a=e.get(`${t}t`);if(void 0===r||void 0===a)return;const l=n?.uScale??1,i=n?.vScale??1,o=n?.uAng??0,_=r/4;if(0===o)c[_]=l,c[_+1]=0,c[_+2]=0,c[_+3]=i;else{const e=Math.cos(o),t=Math.sin(o);c[_]=e*l,c[_+1]=t*i,c[_+2]=-t*l,c[_+3]=e*i}const s=a/4;c[s]=n?.uOffset??0,c[s+1]=n?.vOffset??0}const _=[[1,"texture"],[2,"roughnessTexture"],[4,"bumpTexture"]],s={id:"clearcoat",phase:"base-tex",detect(e){const t=e._clearCoat;if(!t?.isEnabled)return{f:0,f2:0};let n=0;for(const[c,e]of _)t[e]&&(n|=c);const a=c=>!!c?._hasTx;return(a(t.texture)||a(t.roughnessTexture)||a(t.bumpTexture))&&(n|=r),!1===t.useF0Remap&&(n|=8),{f:c,f2:n}},frag:n=>function(n,o,_,s,u){if(0===(n&c))return null;const m=0!==(n&(e|t)),d=!!(1&o),p=!!(2&o),f=!!(4&o),b=!!(8&o),x=0!==(o&r),v=x?a("ccIntUV"):"input.uv",h=x?a("ccRoughUV"):"input.uv",g=x?a("ccNormUV"):"input.uv",y=d?`material.ccParams.x * textureSample(ccIntensityTexture, ccIntensitySampler_, ${v}).r`:"material.ccParams.x",R=p?(T=h,`clamp(material.ccParams.y * textureSample(ccRoughnessTexture, ccRoughnessSampler_, ${T}).g, 0.0, 1.0)`):"material.ccParams.y",S={MF:b?"":l(y),AD:i(y,R,f),BL:"var ccDirectAttenuation = 1.0;\nvar ccDirectSpecularTerm = vec3<f32>(0.0);"};var T;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`)(g)),_?S.AI=function(c,e,t,n,r){const a=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, ${a});\nlet ccR_ibl = rotateY(ccR_raw, scene.envRotationY);\nlet ccNdotV_ibl = abs(dot(${a}, V)) + 0.0000001;\n${n?`let ccAlphaG_ibl_base = ccRough_ibl * ccRough_ibl + 0.0005;\nlet cc_nDfdx_AA = dpdx(${a});\nlet cc_nDfdy_AA = dpdy(${a});\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${r?`let ccEho_ibl = environmentHorizonOcclusion(-V, ${a}, 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`}(y,R,f,u,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`}(y);const A=[];_&&A.push("ibl"),m&&A.push("reflectance");const F=(d?"I":"")+(p?"R":"")+(f?"N":"")+(b?"X":"")+(u?"A":"")+(s?"B":"")+(x?"U":""),I=[];d&&I.push({_name:"ccIntensityTexture",_type:{_kind:"texture",_textureType:"texture_2d<f32>"},_visibility:2},{_name:"ccIntensitySampler_",_type:{_kind:"sampler",_samplerType:"sampler"},_visibility:2}),p&&I.push({_name:"ccRoughnessTexture",_type:{_kind:"texture",_textureType:"texture_2d<f32>"},_visibility:2},{_name:"ccRoughnessSampler_",_type:{_kind:"sampler",_samplerType:"sampler"},_visibility:2}),f&&I.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 x&&(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:F?`clearcoat-${F}`:"clearcoat",_dependencies:A.length>0?A:void 0,_uboFields:N,_bindings:I,_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}}(n._features,n._features2,n._hasIbl,n._hasAnyNormal,n._hasSpecularAA),writeUbo:function(c,e,t){const n=e._clearCoat;if(!n?.isEnabled||!t.has("ccParams"))return;const r=t.get("ccParams")/4,a=n.indexOfRefraction??1.5,l=1-a,i=1+a;c[r]=n.intensity??1,c[r+1]=n.roughness??0,c[r+2]=n.bumpTextureScale??1,c[r+4]=Math.pow(-l/i,2),c[r+5]=1/a,c[r+6]=l,c[r+7]=i,o(c,t,"ccIntUV",n.texture),o(c,t,"ccRoughUV",n.roughnessTexture),o(c,t,"ccNormUV",n.bumpTexture)},bind(c,e,t){const n=c._material._clearCoat;if(!n)return t;for(const[r,a]of _){const l=n[a];0!==(c._features2&r)&&l&&(e.push({binding:t++,resource:l.view}),e.push({binding:t++,resource:l.sampler}))}return t},textures(c,e){const t=c._clearCoat;if(t)for(const[,c]of _){const n=t[c];n&&e.push(n)}}};const u={id:"KHR_materials_clearcoat",async applyMaterial(c,e){const t=c._rawMatDef?.extensions?.KHR_materials_clearcoat;if(!t)return null;const[r,a,l]=await Promise.all([e._texture(t.clearcoatTexture,!1),e._texture(t.clearcoatRoughnessTexture,!1),e._texture(t.clearcoatNormalTexture,!1)]),i={};return function(c,e){c._clearCoat=e,n(s)}(i,{isEnabled:!0,intensity:t.clearcoatFactor??(t.clearcoatTexture?1:0),roughness:t.clearcoatRoughnessFactor??(t.clearcoatRoughnessTexture?1:0),texture:r,roughnessTexture:a,bumpTexture:l,bumpTextureScale:t.clearcoatNormalTexture?.scale??1,useF0Remap:!1}),i}};export{u as default}; //# sourceMappingURL=gltf-ext-clearcoat-Dsf17zse.esm.min.js.map