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.54 kB
import{a4 as e,a5 as i,a6 as r,a8 as n}from"./index-B8IgtevW.esm.min.js";const t=1<<17,s=1<<18,c=1<<19,a=1<<20,o=1<<21,f=1<<22,u=1<<23,l=[[s,"texture"],[c,"thicknessTexture"]];function m(e,i,r){return 0!==(e&r)&&128&i?"input.uv2":"input.uv"}function d(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 h(e){return[{_name:`${e}m`,_type:"vec4<f32>"},{_name:`${e}t`,_type:"vec4<f32>"}]}function _(e,i,r,n){const t=i.get(`${r}m`),s=i.get(`${r}t`);if(void 0===t||void 0===s)return;const c=t/4,a=s/4,o=n?.uScale??1,f=n?.vScale??1,u=n?.uAng??0,l=n?.uOffset??0,m=n?.vOffset??0;if(0===u)e[c]=o,e[c+1]=0,e[c+2]=0,e[c+3]=f;else{const i=Math.cos(u),r=Math.sin(u);e[c]=i*o,e[c+1]=r*f,e[c+2]=-r*o,e[c+3]=i*f}e[a]=l,e[a+1]=m,e[a+2]=0,e[a+3]=0}const p={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|=s,i.texture._hasTx&&(r|=a),1===i.texture._texCoord&&(r|=f)),i.thicknessTexture&&(r|=c,i.thicknessTexture._hasTx&&(r|=o),1===i.thicknessTexture._texCoord&&(r|=u)),{f:0,f2:r}},frag:n=>function(n,l,_){if(0===(l&t))return null;const p=0!==(l&s),x=0!==(l&c),v=0!==(l&a),T=0!==(l&o),I=[],y=[{_name:"iridescenceParams",_type:"vec4<f32>"}];p&&(I.push({_name:"iridescenceTexture",_type:{_kind:"texture",_textureType:"texture_2d<f32>"},_visibility:2},{_name:"iridescenceSampler_",_type:{_kind:"sampler",_samplerType:"sampler"},_visibility:2}),v&&y.push(...h("iridescenceUV"))),x&&(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(...h("iridescenceThicknessUV")));const k=[];p&&k.push(d("iridescenceUV",m(l,_,f),v)),x&&k.push(d("iridescenceThicknessUV",m(l,_,u),T));const F=p?"material.iridescenceParams.x*textureSample(iridescenceTexture,iridescenceSampler_,iridescenceUV).r":"material.iridescenceParams.x",b=x?"mix(material.iridescenceParams.z,material.iridescenceParams.w,textureSample(iridescenceThicknessTexture,iridescenceThicknessSampler_,iridescenceThicknessUV).g)":"material.iridescenceParams.w";return{_id:"iridescence",_dependencies:0!==(n&(e|i))||0!==(l&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}`}}}(n._features,n._features2,n._meshFeatures),writeUbo:function(e,i,r){const n=i._iridescence;if(!n?.isEnabled||!r.has("iridescenceParams"))return;const t=r.get("iridescenceParams")/4;e[t]=n.intensity??1,e[t+1]=n.indexOfRefraction??1.3,e[t+2]=n.minimumThickness??100,e[t+3]=n.maximumThickness??400,_(e,r,"iridescenceUV",n.texture),_(e,r,"iridescenceThicknessUV",n.thicknessTexture)},bind(e,i,r){const n=e._material._iridescence;if(!n)return r;for(const[t,s]of l){const c=n[s];0!==(e._features2&t)&&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 n=r[e];n&&i.push(n)}}};const x={id:"KHR_materials_iridescence",async applyMaterial(e,i){const r=e._rawMatDef?.extensions?.KHR_materials_iridescence;if(!r)return null;const[t,s]=await Promise.all([i._texture(r.iridescenceTexture,!0),i._texture(r.iridescenceThicknessTexture,!0)]),c={};return function(e,i){e._iridescence=i,n(p)}(c,{isEnabled:!0,intensity:r.iridescenceFactor??0,indexOfRefraction:r.iridescenceIor??1.3,minimumThickness:r.iridescenceThicknessMinimum??100,maximumThickness:r.iridescenceThicknessMaximum??400,texture:t,thicknessTexture:s}),c}};export{x as default}; //# sourceMappingURL=gltf-ext-iridescence-DqCA_SWu.esm.min.js.map