@animech-public/playcanvas
Version:
PlayCanvas WebGL game engine
2 lines (1 loc) • 3.31 kB
JavaScript
import{SEMANTIC_POSITION as e,SEMANTIC_NORMAL as t,SEMANTIC_TANGENT as r,SEMANTIC_TEXCOORD0 as n,SEMANTIC_TEXCOORD1 as s,SEMANTIC_TEXCOORD2 as o,SEMANTIC_TEXCOORD3 as i,SEMANTIC_TEXCOORD4 as a,SEMANTIC_TEXCOORD5 as d,SEMANTIC_TEXCOORD6 as c,SEMANTIC_TEXCOORD7 as l,SEMANTIC_COLOR as f,SEMANTIC_BLENDINDICES as m,SEMANTIC_BLENDWEIGHT as u}from"./constants.js";import x from"./shader-chunks/frag/gles2.js";import v from"./shader-chunks/vert/gles2.js";import g from"./shader-chunks/frag/gles3.js";import p from"./shader-chunks/vert/gles3.js";import h from"./shader-chunks/frag/webgpu.js";import _ from"./shader-chunks/vert/webgpu.js";import C from"./shader-chunks/frag/shared.js";const b={vertex_position:e,vertex_normal:t,vertex_tangent:r,vertex_texCoord0:n,vertex_texCoord1:s,vertex_texCoord2:o,vertex_texCoord3:i,vertex_texCoord4:a,vertex_texCoord5:d,vertex_texCoord6:c,vertex_texCoord7:l,vertex_color:f,vertex_boneIndices:m,vertex_boneWeights:u};class ${static createDefinition(e,t){var r,n;const s=(t,r,n,s,o)=>{const i=e.isWebGPU?t:e.isWebGL2?r:$.gl1Extensions(e,o)+n;let a="";if(!s){var d;let t=null!=(d=o.fragmentOutputTypes)?d:"vec4";Array.isArray(t)||(t=[t]);for(let r=0;r<e.maxColorAttachments;r++){var c;a+=`#define COLOR_ATTACHMENT_${r}\n`;a+=`#define outType_${r} ${null!=(c=t[r])?c:"vec4"}\n`}}return a+i},o=null!=(r=t.name)?r:"Untitled",i=$.versionCode(e)+s(_,p,v,!0,t)+$.getDefinesCode(t.vertexDefines)+C+$.getShaderNameCode(o)+t.vertexCode,a=`${(t.fragmentPreamble||"")+$.versionCode(e)+s(h,g,x,!1,t)+$.getDefinesCode(t.fragmentDefines)+$.precisionCode(e)}\n${C}${$.getShaderNameCode(o)}${t.fragmentCode||$.dummyFragmentCode()}`;return{name:o,attributes:null!=(n=t.attributes)?n:$.collectAttributes(t.vertexCode),vshader:i,vincludes:t.vertexIncludes,fincludes:t.fragmentIncludes,fshader:a,useTransformFeedback:t.useTransformFeedback}}static getDefinesCode(e){let t="";return null==e||e.forEach(((e,r)=>{t+=`#define ${r} ${e}\n`})),t}static getShaderNameCode(e){return`#define SHADER_NAME ${e}\n`}static gl1Extensions(e,t,r){let n;return r?n=t.vertexExtensions?`${t.vertexExtensions}\n`:"":(n=t.fragmentExtensions?`${t.fragmentExtensions}\n`:"",e.extStandardDerivatives&&(n+="#extension GL_OES_standard_derivatives : enable\n"),e.extTextureLod&&(n+="#extension GL_EXT_shader_texture_lod : enable\n",n+="#define SUPPORTS_TEXLOD\n"),e.extDrawBuffers&&(n+="#extension GL_EXT_draw_buffers : require\n",n+="#define SUPPORTS_MRT\n")),n}static dummyFragmentCode(){return"void main(void) {gl_FragColor = vec4(0.0);}"}static versionCode(e){return e.isWebGPU?"#version 450\n":e.isWebGL2?"#version 300 es\n":""}static precisionCode(e,t){let r="";t&&"highp"!==t&&"mediump"!==t&&"lowp"!==t&&(t=null),t&&("highp"===t&&"highp"!==e.maxPrecision&&(t="mediump"),"mediump"===t&&"lowp"===e.maxPrecision&&(t="lowp"));const n=t||e.precision;return e.isWebGPU?r=`precision ${n} float;\nprecision ${n} int;\n`:(r=`precision ${n} float;\nprecision ${n} int;`,e.isWebGL2&&(r+=`precision ${n} sampler2DShadow;\n`)),r}static collectAttributes(e){const t={};let r=0,n=e.indexOf("attribute");for(;n>=0&&!(n>0&&"/"===e[n-1]);){const s=e.indexOf(";",n),o=e.lastIndexOf(" ",s),i=e.substring(o+1,s);if(t[i]);else{const e=b[i];void 0!==e?t[i]=e:(t[i]=`ATTR${r}`,r++)}n=e.indexOf("attribute",n+1)}return t}}export{$ as ShaderUtils};