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) 6.02 kB
import{Z as e,$ as i,a0 as r}from"./index-DFZFpUG-.esm.min.js";const t=1<<17,n=1<<18,s=1<<19,c=1<<20,a=1<<21,o=1<<22,f=1<<23,l=[[n,"texture"],[s,"thicknessTexture"]];function u(e,i,r){return 0!==(e&r)&&128&i?"input.uv2":"input.uv"}function m(e,i,r){return r?`let ${e}=vec2<f32>(dot(material.${e}m.xy,${i}),dot(material.${e}m.zw,${i}))+material.${e}t.xy;`:`let ${e}=${i};`}function d(e){return[{_name:`${e}m`,_type:"vec4<f32>"},{_name:`${e}t`,_type:"vec4<f32>"}]}function h(e,i,r,t){const n=i.get(`${r}m`),s=i.get(`${r}t`);if(void 0===n||void 0===s)return;const c=n/4,a=s/4,o=t?.uScale??1,f=t?.vScale??1,l=t?.uAng??0,u=t?.uOffset??0,m=t?.vOffset??0;if(0===l)e[c]=o,e[c+1]=0,e[c+2]=0,e[c+3]=f;else{const i=Math.cos(l),r=Math.sin(l);e[c]=i*o,e[c+1]=r*f,e[c+2]=-r*o,e[c+3]=i*f}e[a]=u,e[a+1]=m,e[a+2]=0,e[a+3]=0}function p(e,i,r){const t=i.iridescence;if(!t?.isEnabled||!r.has("iridescenceParams"))return;const n=r.get("iridescenceParams")/4;e[n]=t.intensity??1,e[n+1]=t.indexOfRefraction??1.3,e[n+2]=t.minimumThickness??100,e[n+3]=t.maximumThickness??400,h(e,r,"iridescenceUV",t.texture),h(e,r,"iridescenceThicknessUV",t.thicknessTexture)}const v={id:"iridescence",phase:"base-tex",detect(e){const i=e.iridescence;if(!i?.isEnabled)return{f:0,f2:0};let r=t;return i.texture&&(r|=n,i.texture._hasTx&&(r|=c),1===i.texture._texCoord&&(r|=o)),i.thicknessTexture&&(r|=s,i.thicknessTexture._hasTx&&(r|=a),1===i.thicknessTexture._texCoord&&(r|=f)),{f:0,f2:r}},frag:l=>function(l,h,p){if(0===(h&t))return null;const v=0!==(h&n),_=0!==(h&s),x=0!==(h&c),T=0!==(h&a),I=[],y=[{_name:"iridescenceParams",_type:"vec4<f32>"}];v&&(I.push({_name:"iridescenceTexture",_type:{_kind:"texture",_textureType:"texture_2d<f32>"},_visibility:2},{_name:"iridescenceSampler_",_type:{_kind:"sampler",_samplerType:"sampler"},_visibility:2}),x&&y.push(...d("iridescenceUV"))),_&&(I.push({_name:"iridescenceThicknessTexture",_type:{_kind:"texture",_textureType:"texture_2d<f32>"},_visibility:2},{_name:"iridescenceThicknessSampler_",_type:{_kind:"sampler",_samplerType:"sampler"},_visibility:2}),T&&y.push(...d("iridescenceThicknessUV")));const k=[];v&&k.push(m("iridescenceUV",u(h,p,o),x)),_&&k.push(m("iridescenceThicknessUV",u(h,p,f),T));const F=v?"material.iridescenceParams.x*textureSample(iridescenceTexture,iridescenceSampler_,iridescenceUV).r":"material.iridescenceParams.x",b=_?"mix(material.iridescenceParams.z,material.iridescenceParams.w,textureSample(iridescenceThicknessTexture,iridescenceThicknessSampler_,iridescenceThicknessUV).g)":"material.iridescenceParams.w";return{_id:"iridescence",_dependencies:0!==(l&(e|i))||0!==(h&r)?["reflectance"]:void 0,_uboFields:y,_bindings:I,_helperFunctions:"const IRI_XYZ_TO_REC709:mat3x3<f32>=mat3x3<f32>(\n3.2404542,-0.9692660,0.0556434,\n-1.5371385,1.8760108,-0.2040259,\n-0.4985314,0.0415560,1.0572252);\nfn iri_square3(x:vec3<f32>)->vec3<f32>{return x*x;}\nfn iri_iorFromAirF0(f0:vec3<f32>)->vec3<f32>{\nlet s=sqrt(clamp(f0,vec3<f32>(0.0),vec3<f32>(0.9999)));\nreturn (vec3<f32>(1.0)+s)/(vec3<f32>(1.0)-s);\n}\nfn iri_r0FromIor3(iorT:vec3<f32>,iorI:f32)->vec3<f32>{return iri_square3((iorT-vec3<f32>(iorI))/(iorT+vec3<f32>(iorI)));}\nfn iri_r0FromIor(iorT:f32,iorI:f32)->f32{let r=(iorT-iorI)/(iorT+iorI);return r*r;}\nfn iri_fresSchlick(c:f32,F0:vec3<f32>,F90:vec3<f32>)->vec3<f32>{\nlet t=1.0-c;\nlet t2=t*t;\nreturn F0+(F90-F0)*(t2*t2*t);\n}\nfn iri_evalSensitivity(opd:f32,shift:vec3<f32>)->vec3<f32>{\nlet phase=6.283185307179586*opd*1.0e-9;\nlet val=vec3<f32>(5.4856e-13,4.4201e-13,5.2481e-13);\nlet pos=vec3<f32>(1.6810e+06,1.7953e+06,2.2084e+06);\nlet vr=vec3<f32>(4.3278e+09,9.3046e+09,6.6121e+09);\nvar xyz=val*sqrt(6.283185307179586*vr)*cos(pos*phase+shift)*exp(-(phase*phase)*vr);\nxyz.x=xyz.x+9.7470e-14*sqrt(6.283185307179586*4.5282e+09)*cos(2.2399e+06*phase+shift.x)*exp(-4.5282e+09*phase*phase);\nxyz=xyz/1.0685e-7;\nreturn IRI_XYZ_TO_REC709*xyz;\n}\nfn iri_eval(outsideIor:f32,eta2:f32,cosTheta1:f32,thickness:f32,baseF0:vec3<f32>)->vec3<f32>{\nlet iridescenceIor=mix(outsideIor,eta2,smoothstep(0.0,0.03,thickness));\nlet eta=outsideIor/iridescenceIor;\nlet sinTheta2Sq=eta*eta*(1.0-cosTheta1*cosTheta1);\nlet cosTheta2Sq=1.0-sinTheta2Sq;\nif(cosTheta2Sq<0.0){return vec3<f32>(1.0);}\nlet cosTheta2=sqrt(cosTheta2Sq);\nlet r0=iri_r0FromIor(iridescenceIor,outsideIor);\nlet r12=iri_fresSchlick(cosTheta1,vec3<f32>(r0),vec3<f32>(1.0)).x;\nlet t121=1.0-r12;\nvar phi12=0.0;\nif(iridescenceIor<outsideIor){phi12=3.141592653589793;}\nlet phi21=3.141592653589793-phi12;\nlet baseIor=iri_iorFromAirF0(baseF0);\nlet r1=iri_r0FromIor3(baseIor,iridescenceIor);\nlet r23=iri_fresSchlick(cosTheta2,r1,vec3<f32>(1.0));\nvar phi23=vec3<f32>(0.0);\nif(baseIor.x<iridescenceIor){phi23.x=3.141592653589793;}\nif(baseIor.y<iridescenceIor){phi23.y=3.141592653589793;}\nif(baseIor.z<iridescenceIor){phi23.z=3.141592653589793;}\nlet opd=2.0*iridescenceIor*thickness*cosTheta2;\nlet phi=vec3<f32>(phi21)+phi23;\nlet r123=clamp(vec3<f32>(r12)*r23,vec3<f32>(1e-5),vec3<f32>(0.9999));\nlet smallR123=sqrt(r123);\nlet rs=(t121*t121)*r23/(vec3<f32>(1.0)-r123);\nvar outI=vec3<f32>(r12)+rs;\nvar cm=rs-vec3<f32>(t121);\nfor(var m:i32=1;m<=2;m=m+1){\ncm=cm*smallR123;\noutI=outI+cm*(2.0*iri_evalSensitivity(f32(m)*opd,f32(m)*phi));\n}\nreturn max(outI,vec3<f32>(0.0));\n}",_fragmentSlots:{...k.length?{SV:k.join("\n")}:void 0,MF:`{\nlet iriIntensity=clamp(${F},0.0,1.0);\nlet iriThickness=max(${b},0.0);\nlet iriF0=iri_eval(1.0,max(material.iridescenceParams.y,1.0001),NdotV,iriThickness,colorF0);\ncolorF0=mix(colorF0,iriF0,iriIntensity);\n}`}}}(l._features,l._features2,l._meshFeatures),writeUbo:p,bind(e,i,r){const t=e._material.iridescence;if(!t)return r;for(const[n,s]of l){const c=t[s];0!==(e._features2&n)&&c&&(i.push({binding:r++,resource:c.view}),i.push({binding:r++,resource:c.sampler}))}return r},textures(e,i){const r=e.iridescence;if(r)for(const[,e]of l){const t=r[e];t&&i.push(t)}}};export{v as pbrExt,p as writeIridescenceUBO}; //# sourceMappingURL=iridescence-fragment-CMgptpWw.esm.min.js.map