UNPKG

@animech-public/playcanvas

Version:
2 lines (1 loc) 2.06 kB
import{SHADERLANGUAGE_WGSL as e}from"../constants.js";import{ShaderProcessor as t}from"../shader-processor.js";class r{constructor(t){this._vertexCode=null,this._fragmentCode=null,this._computeCode=null,this.vertexEntryPoint="main",this.fragmentEntryPoint="main",this.computeEntryPoint="main",this.shader=t;const r=t.definition;var o,s,i;r.shaderLanguage===e?(this._vertexCode=null!=(o=r.vshader)?o:null,this._fragmentCode=null!=(s=r.fshader)?s:null,this._computeCode=null!=(i=r.cshader)?i:null,this.meshUniformBufferFormat=r.meshUniformBufferFormat,this.meshBindGroupFormat=r.meshBindGroupFormat,this.computeUniformBufferFormats=r.computeUniformBufferFormats,this.computeBindGroupFormat=r.computeBindGroupFormat,this.vertexEntryPoint="vertexMain",this.fragmentEntryPoint="fragmentMain",t.ready=!0):r.processingOptions&&this.process()}destroy(e){this._vertexCode=null,this._fragmentCode=null}createShaderModule(e,t){return this.shader.device.wgpu.createShaderModule({code:e})}getVertexShaderModule(){return this.createShaderModule(this._vertexCode,"Vertex")}getFragmentShaderModule(){return this.createShaderModule(this._fragmentCode,"Fragment")}getComputeShaderModule(){return this.createShaderModule(this._computeCode,"Compute")}process(){const e=this.shader,r=t.run(e.device,e.definition,e);this._vertexCode=this.transpile(r.vshader,"vertex",e.definition.vshader),this._fragmentCode=this.transpile(r.fshader,"fragment",e.definition.fshader),this._vertexCode&&this._fragmentCode?e.ready=!0:e.failed=!0,e.meshUniformBufferFormat=r.meshUniformBufferFormat,e.meshBindGroupFormat=r.meshBindGroupFormat}transpile(e,t,r){try{const r=this.shader.device.glslang.compileGLSL(e,t);return this.shader.device.twgsl.convertSpirV2WGSL(r)}catch(o){console.error(`Failed to transpile webgl ${t} shader [${this.shader.label}] to WebGPU: [${o.message}] while rendering undefined`,{processed:e,original:r,shader:this.shader})}}get vertexCode(){return this._vertexCode}get fragmentCode(){return this._fragmentCode}loseContext(){}restoreContext(e,t){}}export{r as WebgpuShader};