UNPKG

@absulit/points

Version:

A Generative Art library made in WebGPU

191 lines (156 loc) 4.73 kB
/* @ts-self-types="./RenderPass.d.ts" */ /** * A RenderPass is a way to have a block of shaders to pass to your application pipeline and * these render passes will be executed in the order you pass them in the {@link Points#init} method. * * @example * import Points, { RenderPass } from 'points'; * // vert, frag and compute are strings with the wgsl shaders. * let renderPasses = [ * new RenderPass(vert1, frag1, compute1), * new RenderPass(vert2, frag2, compute2) * ]; * // we pass the array of renderPasses * await points.init(renderPasses); */ class RenderPass { #vertexShader; #computeShader; #fragmentShader; #compiledShaders #computePipeline = null; #renderPipeline = null; #computeBindGroup = null; #uniformBindGroup = null; #bindGroupLayout = null; #bindGroupLayoutCompute = null; #entries = null; #internal = false; #hasComputeShader; #hasVertexShader; #hasFragmentShader; #hasVertexAndFragmentShader; #workgroupCountX; #workgroupCountY; #workgroupCountZ; /** * A collection of Vertex, Compute and Fragment shaders that represent a RenderPass. * This is useful for PostProcessing. * @param {String} vertexShader WGSL Vertex Shader in a String. * @param {String} fragmentShader WGSL Fragment Shader in a String. * @param {String} computeShader WGSL Compute Shader in a String. */ constructor(vertexShader, fragmentShader, computeShader, workgroupCountX, workgroupCountY, workgroupCountZ) { this.#vertexShader = vertexShader; this.#computeShader = computeShader; this.#fragmentShader = fragmentShader; this.#compiledShaders = { vertex: '', compute: '', fragment: '', }; this.#hasComputeShader = !!this.#computeShader; this.#hasVertexShader = !!this.#vertexShader; this.#hasFragmentShader = !!this.#fragmentShader; this.#hasVertexAndFragmentShader = this.#hasVertexShader && this.#hasFragmentShader; this.#workgroupCountX = workgroupCountX || 8; this.#workgroupCountY = workgroupCountY || 8; this.#workgroupCountZ = workgroupCountZ || 1; Object.seal(this); } /** * To use with {link RenderPasses} so it's internal * @ignore */ get internal() { return this.#internal; } set internal(value) { this.#internal = value; } /** * get the vertex shader content */ get vertexShader() { return this.#vertexShader; } /** * get the compute shader content */ get computeShader() { return this.#computeShader; } /** * get the fragment shader content */ get fragmentShader() { return this.#fragmentShader; } set computePipeline(value) { this.#computePipeline = value; } get computePipeline() { return this.#computePipeline; } set renderPipeline(value) { this.#renderPipeline = value; } get renderPipeline() { return this.#renderPipeline; } set computeBindGroup(value) { this.#computeBindGroup = value; } get computeBindGroup() { return this.#computeBindGroup; } set uniformBindGroup(value) { this.#uniformBindGroup = value; } get uniformBindGroup() { return this.#uniformBindGroup; } set bindGroupLayout(value) { this.#bindGroupLayout = value; } get bindGroupLayout() { return this.#bindGroupLayout; } set bindGroupLayoutCompute(value) { this.#bindGroupLayoutCompute = value; } get bindGroupLayoutCompute() { return this.#bindGroupLayoutCompute; } set entries(value) { this.#entries = value; } get entries() { return this.#entries; } get compiledShaders() { return this.#compiledShaders; } get hasComputeShader() { return this.#hasComputeShader; } get hasVertexShader() { return this.#hasVertexShader; } get hasFragmentShader() { return this.#hasFragmentShader; } get hasVertexAndFragmentShader() { return this.#hasVertexAndFragmentShader; } get workgroupCountX() { return this.#workgroupCountX; } get workgroupCountY() { return this.#workgroupCountY; } get workgroupCountZ() { return this.#workgroupCountZ; } } export { RenderPass as default };