UNPKG

xgpu

Version:

XGPU is an extendable library for WebGPU that provides a higher-level, easy-to-use interface for building rendering engines or processing numeric data. It handles automatic data binding, buffer alignment, variable declarations in shaders, and more. XGPU i

108 lines (107 loc) 3.94 kB
// Copyright (c) 2023 Thomas Le Coz. All rights reserved. // This code is governed by an MIT license that can be found in the LICENSE file. export class PipelinePlugin { target; requiredNames; bindgroupResources = {}; vertexShader = {}; fragmentShader = {}; constructor(target, required) { this.target = target; if (required) { this.requiredNames = {}; for (let z in required) { this.requiredNames[z] = target.getResourceName(required[z]); } } } apply(vertexShaderNode = null, fragmentShaderNode = null) { //if (!this.target.resources.bindgroups.plugins) this.target.resources.bindgroups.plugins = {}; //const plugins = this.target.resources.bindgroups.plugins; let plugins; for (let z in this.target.resources.bindgroups) { plugins = this.target.resources.bindgroups[z]; break; } for (let z in this.bindgroupResources) plugins[z] = this.bindgroupResources[z]; //------ VERTEX SHADER -------- let vs = this.target.resources.vertexShader; if (typeof vs === "string") vs = { main: vs }; if (this.vertexShader.outputs) { if (!vs.outputs) vs.outputs = {}; for (let z in this.vertexShader.outputs) { vs.outputs[z] = this.vertexShader.outputs[z]; } } if (this.vertexShader.inputs) { if (!vs.inputs) vs.inputs = {}; for (let z in this.vertexShader.inputs) { vs.inputs[z] = this.vertexShader.inputs[z]; } } if (this.vertexShader.constants) { if (!vs.constants) vs.constants = ""; vs.constants += this.vertexShader.constants; } if (this.vertexShader.main) { let main; if (typeof this.vertexShader.main === "string") main = this.vertexShader.main; else main = this.vertexShader.main.join("\n"); if (vertexShaderNode) vertexShaderNode.text = main; else { if (!vs.main) vs.main = ""; vs.main += main; } } this.target.resources.vertexShader = vs; //-------- FRAGMENT SHADER -------- let fs = this.target.resources.fragmentShader; if (typeof fs === "string") fs = { main: fs }; if (this.fragmentShader.outputs) { if (!fs.outputs) fs.outputs = {}; for (let z in this.fragmentShader.outputs) { fs.outputs[z] = this.fragmentShader.outputs[z]; } } if (this.fragmentShader.inputs) { if (!fs.inputs) fs.inputs = {}; for (let z in this.fragmentShader.inputs) { fs.inputs[z] = this.fragmentShader.inputs[z]; } } if (this.fragmentShader.constants) { if (!fs.constants) fs.constants = ""; fs.constants += this.fragmentShader.constants; } if (this.fragmentShader.main) { let main; if (typeof this.fragmentShader.main === "string") main = this.fragmentShader.main; else main = this.fragmentShader.main.join("\n"); if (fragmentShaderNode) fragmentShaderNode.text = main; else { if (!fs.main) fs.main = ""; fs.main += main; } } this.target.resources.fragmentShader = fs; this.target.initFromObject(this.target.resources); return this; } }