UNPKG

@animech-public/playcanvas

Version:
2 lines (1 loc) 10.2 kB
import{SHADER_FORWARD as e,SHADER_FORWARDHDR as a,SPRITE_RENDERMODE_SLICED as n,SPRITE_RENDERMODE_TILED as p,SPECULAR_PHONG as t,FRESNEL_SCHLICK as s,BLEND_NONE as i,DITHER_NONE as d,DITHER_BAYER8 as o}from"../../constants.js";import{ShaderPass as r}from"../../shader-pass.js";import{LitShader as l}from"./lit-shader.js";import{ChunkBuilder as c}from"../chunk-builder.js";import{ChunkUtils as h}from"../chunk-utils.js";import{StandardMaterialOptions as u}from"../../materials/standard-material-options.js";import{LitOptionsUtils as g}from"./lit-options-utils.js";import{ShaderGenerator as f}from"./shader-generator.js";const m=[],M=e=>Object.keys(e).filter((e=>"litOptions"!==e)).sort();const S=new class extends f{constructor(...e){super(...e),this.optionsContext=new u,this.optionsContextMin=new u}generateKey(e){let a;e===this.optionsContextMin?(this.propsMin||(this.propsMin=M(e)),a=this.propsMin):e===this.optionsContext?(this.props||(this.props=M(e)),a=this.props):a=M(e);return`standard:\n${a.map((a=>a+e[a])).join("\n")}${g.generateKey(e.litOptions)}`}_getUvSourceExpression(t,s,i){const d=i[t],o=i[s],r=i.litOptions.pass===e||i.litOptions.pass===a;let l;return r&&i.litOptions.nineSlicedMode===n||r&&i.litOptions.nineSlicedMode===p?l="nineSlicedUv":(l=0===d?`vUv${o}`:`vUV${o}_${d}`,i.heightMap&&"heightMapTransform"!==t&&(l+=" + dUvOffset")),l}_addMapDef(e,a){return a?`#define ${e}\n`:`#undef ${e}\n`}_addMapDefs(e,a,n,p,t){return this._addMapDef("MAPFLOAT",e)+this._addMapDef("MAPCOLOR",a)+this._addMapDef("MAPVERTEX",n)+this._addMapDef("MAPTEXTURE",p)+this._addMapDef("MAPINVERT",t)}_addMap(e,a,n,p,t,s=null){const i=`${e}Map`,d=`${i}Uv`,o=`${i}Identifier`,r=`${i}Transform`,l=`${i}Channel`,c=`${e}VertexColorChannel`,u=`${e}VertexColor`,g=`${e}Mode`,f=`${e}Invert`,m=n[`${e}Tint`],M=n[u],S=n[i],_=n[o],k=n[g];let D=p[a];if(S){const e=this._getUvSourceExpression(r,d,n);if(D=D.replace(/\$UV/g,e).replace(/\$CH/g,n[l]),t&&-1!==D.search(/\$SAMPLER/g)){let e=`texture_${i}`;const a=t[_];a?e=a:t[_]=e,D=D.replace(/\$SAMPLER/g,e)}if(s&&(D="aaa"===n[l]?D.replace(/\$DECODE/g,"passThrough"):D.replace(/\$DECODE/g,h.decodeFunc(n.litOptions.gamma||"srgb"!==s?s:"linear")),D.indexOf("$texture2DSAMPLE"))){const e={linear:"texture2D",srgb:"texture2DSRGB",rgbm:"texture2DRGBM",rgbe:"texture2DRGBE"};D=D.replace(/\$texture2DSAMPLE/g,e[s]||"texture2D")}}M&&(D=D.replace(/\$VC/g,n[c])),k&&(D=D.replace(/\$DETAILMODE/g,k));const A=!!(1&m),O=!!(2&m),P=!!n[f];return D=this._addMapDefs(A,O,M,S,P)+D,D.replace(/\$/g,"")}_correctChannel(e,a,n){if(n[e]>0){if(n[e]<a.length)return a.substring(0,n[e]);if(n[e]>a.length){let p=a;const t=p.charAt(p.length-1),s=n[e]-p.length;for(let e=0;e<s;e++)p+=t;return p}return a}}createShaderDefinition(e,a){const n=r.get(e).getByIndex(a.litOptions.pass).isForward,h=new l(e,a.litOptions),u=[],g=[],f=[],M={};for(const e in m){const n=`${e}Map`;if(a[`${e}VertexColor`]){const n=`${e}VertexColorChannel`;a[n]=this._correctChannel(e,a[n],m)}if(a[n]){const p=`${n}Channel`,t=`${n}Transform`,s=`${n}Uv`;a[s]=Math.min(a[s],1),a[p]=this._correctChannel(e,a[p],m);const i=a[s];u[i]=!0,g[i]=g[i]||a[n]&&!a[t],a[t]&&f.push({name:e,id:a[t],uv:a[s]})}}a.forceUv1&&(u[1]=!0,g[1]=void 0===g[1]||g[1]),h.generateVertexShader(u,g,f),a.litOptions.shadingModel===t?(a.litOptions.fresnelModel=0,a.litOptions.ambientSH=!1):a.litOptions.fresnelModel=0===a.litOptions.fresnelModel?s:a.litOptions.fresnelModel;const S=new c,_=new c,k=new c,D=new c;let A="";if(a.litOptions.nineSlicedMode===p?S.append("const float textureBias = -1000.0;"):S.append("uniform float textureBias;"),n){if(a.heightMap&&(S.append("vec2 dUvOffset;"),_.append(this._addMap("height","parallaxPS",a,h.chunks,M)),k.append("getParallax();")),a.litOptions.blendType!==i||a.litOptions.alphaTest||a.litOptions.alphaToCoverage||a.litOptions.opacityDither!==d){S.append("float dAlpha;"),_.append(this._addMap("opacity","opacityPS",a,h.chunks,M)),k.append("getOpacity();"),D.append("litArgs_opacity = dAlpha;"),a.litOptions.alphaTest&&(_.append(h.chunks.alphaTestPS),k.append("alphaTest(dAlpha);"));const e=a.litOptions.opacityDither;e!==d&&(e===o&&S.append(h.chunks.bayerPS),S.append(`#define DITHER_${e.toUpperCase()}\n`),S.append(h.chunks.opacityDitherPS),k.append("opacityDither(dAlpha, 0.0);"))}else S.append("float dAlpha = 1.0;");if(h.needsNormal){if((a.normalMap||a.clearCoatNormalMap)&&(_.append(a.packedNormal?h.chunks.normalXYPS:h.chunks.normalXYZPS),!a.litOptions.hasTangents)){const e=a.normalMap?"normalMap":"clearCoatNormalMap";A=this._getUvSourceExpression(`${e}Transform`,`${e}Uv`,a)}S.append("vec3 dNormalW;"),_.append(this._addMap("normalDetail","normalDetailMapPS",a,h.chunks,M)),_.append(this._addMap("normal","normalMapPS",a,h.chunks,M)),k.append("getNormal();"),D.append("litArgs_worldNormal = dNormalW;")}if(h.needsSceneColor&&S.append("uniform sampler2D uSceneColorMap;"),h.needsScreenSize&&S.append("uniform vec4 uScreenSize;"),h.needsTransforms&&(S.append("uniform mat4 matrix_viewProjection;"),S.append("uniform mat4 matrix_model;")),(a.diffuseDetail||a.aoDetail)&&_.append(h.chunks.detailModesPS),S.append("vec3 dAlbedo;"),a.diffuseDetail&&_.append(this._addMap("diffuseDetail","diffuseDetailMapPS",a,h.chunks,M,a.diffuseDetailEncoding)),_.append(this._addMap("diffuse","diffusePS",a,h.chunks,M,a.diffuseEncoding)),k.append("getAlbedo();"),D.append("litArgs_albedo = dAlbedo;"),a.litOptions.useRefraction&&(S.append("float dTransmission;"),_.append(this._addMap("refraction","transmissionPS",a,h.chunks,M)),k.append("getRefraction();"),D.append("litArgs_transmission = dTransmission;"),S.append("float dThickness;"),_.append(this._addMap("thickness","thicknessPS",a,h.chunks,M)),k.append("getThickness();"),D.append("litArgs_thickness = dThickness;"),a.litOptions.dispersion&&D.append("litArgs_dispersion = material_dispersion;")),a.litOptions.useIridescence&&(S.append("float dIridescence;"),_.append(this._addMap("iridescence","iridescencePS",a,h.chunks,M)),k.append("getIridescence();"),D.append("litArgs_iridescence_intensity = dIridescence;"),S.append("float dIridescenceThickness;"),_.append(this._addMap("iridescenceThickness","iridescenceThicknessPS",a,h.chunks,M)),k.append("getIridescenceThickness();"),D.append("litArgs_iridescence_thickness = dIridescenceThickness;")),h.lighting&&a.litOptions.useSpecular||h.reflections?(S.append("vec3 dSpecularity;"),S.append("float dGlossiness;"),a.litOptions.useSheen&&(S.append("vec3 sSpecularity;"),_.append(this._addMap("sheen","sheenPS",a,h.chunks,M,a.sheenEncoding)),k.append("getSheen();"),D.append("litArgs_sheen_specularity = sSpecularity;"),S.append("float sGlossiness;"),_.append(this._addMap("sheenGloss","sheenGlossPS",a,h.chunks,M)),k.append("getSheenGlossiness();"),D.append("litArgs_sheen_gloss = sGlossiness;")),a.litOptions.useMetalness&&(S.append("float dMetalness;"),_.append(this._addMap("metalness","metalnessPS",a,h.chunks,M)),k.append("getMetalness();"),D.append("litArgs_metalness = dMetalness;"),S.append("float dIor;"),_.append(this._addMap("ior","iorPS",a,h.chunks,M)),k.append("getIor();"),D.append("litArgs_ior = dIor;")),a.litOptions.useSpecularityFactor&&(S.append("float dSpecularityFactor;"),_.append(this._addMap("specularityFactor","specularityFactorPS",a,h.chunks,M)),k.append("getSpecularityFactor();"),D.append("litArgs_specularityFactor = dSpecularityFactor;")),a.useSpecularColor?_.append(this._addMap("specular","specularPS",a,h.chunks,M,a.specularEncoding)):_.append("void getSpecularity() { dSpecularity = vec3(1); }"),_.append(this._addMap("gloss","glossPS",a,h.chunks,M)),k.append("getGlossiness();"),k.append("getSpecularity();"),D.append("litArgs_specularity = dSpecularity;"),D.append("litArgs_gloss = dGlossiness;")):(S.append("vec3 dSpecularity = vec3(0.0);"),S.append("float dGlossiness = 0.0;")),a.aoDetail&&_.append(this._addMap("aoDetail","aoDetailMapPS",a,h.chunks,M)),(a.aoMap||a.aoVertexColor)&&(S.append("float dAo;"),_.append(this._addMap("ao","aoPS",a,h.chunks,M)),k.append("getAO();"),D.append("litArgs_ao = dAo;")),S.append("vec3 dEmission;"),_.append(this._addMap("emissive","emissivePS",a,h.chunks,M,a.emissiveEncoding)),k.append("getEmission();"),D.append("litArgs_emission = dEmission;"),a.litOptions.useClearCoat&&(S.append("float ccSpecularity;"),S.append("float ccGlossiness;"),S.append("vec3 ccNormalW;"),_.append(this._addMap("clearCoat","clearCoatPS",a,h.chunks,M)),_.append(this._addMap("clearCoatGloss","clearCoatGlossPS",a,h.chunks,M)),_.append(this._addMap("clearCoatNormal","clearCoatNormalPS",a,h.chunks,M)),k.append("getClearCoat();"),k.append("getClearCoatGlossiness();"),k.append("getClearCoatNormal();"),D.append("litArgs_clearcoat_specularity = ccSpecularity;"),D.append("litArgs_clearcoat_gloss = ccGlossiness;"),D.append("litArgs_clearcoat_worldNormal = ccNormalW;")),a.lightMap||a.lightVertexColor){const e=a.dirLightMap&&a.litOptions.useSpecular,n=e?"lightmapDirPS":"lightmapSinglePS";S.append("vec3 dLightmap;"),e&&S.append("vec3 dLightmapDir;"),_.append(this._addMap("light",n,a,h.chunks,M,a.lightMapEncoding)),k.append("getLightMap();"),D.append("litArgs_lightmap = dLightmap;"),e&&D.append("litArgs_lightmapDir = dLightmapDir;")}-1===_.code.indexOf("texture2DSRGB")&&-1===_.code.indexOf("texture2DRGBM")&&-1===_.code.indexOf("texture2DRGBE")||_.prepend(h.chunks.textureSamplePS)}else{const e=a.litOptions.opacityShadowDither;(a.litOptions.alphaTest||e)&&(S.append("float dAlpha;"),_.append(this._addMap("opacity","opacityPS",a,h.chunks,M)),k.append("getOpacity();"),D.append("litArgs_opacity = dAlpha;"),a.litOptions.alphaTest&&(_.append(h.chunks.alphaTestPS),k.append("alphaTest(dAlpha);")),e!==d&&(e===o&&S.append(h.chunks.bayerPS),S.append(`#define DITHER_${e.toUpperCase()}\n`),S.append(h.chunks.opacityDitherPS),k.append("opacityDither(dAlpha, 0.0);")))}S.append(h.chunks.litShaderArgsPS),_.append(`void evaluateFrontend() { \n${k.code}\n${D.code}\n }\n`),k.code="evaluateFrontend();";for(const e in M)S.append(`uniform sampler2D ${M[e]};`);return k.code=`\n${k.code.split("\n").map((e=>` ${e}`)).join("\n")}\n\n`,h.generateFragmentShader(S.code,_.code,k.code,A),h.getDefinition()}};export{m as _matTex2D,S as standard};