UNPKG

@woosh/meep-engine

Version:

Pure JavaScript game engine. Fully featured and production ready.

109 lines (89 loc) 2.93 kB
import { assert } from "../../../../core/assert.js"; /** * Allows you to declare resources for the pass, reading/writing/creating resources that will be used by the pass. * * @example * const pass_data = {}; * const pass_builder = graph.add("pass", pass_data, (data, resources, context) => { ... }); * pass_data.resource_a = pass_builder.create("A", {}); */ export class RenderPassBuilder { /** * * @type {RenderGraph} * @private */ #graph = null; /** * * @type {RenderPassNode} * @private */ #node = null; /** * * @param {RenderGraph} graph * @param {RenderPassNode} node */ init(graph, node) { assert.defined(graph, 'graph'); assert.defined(node, 'node'); this.#graph = graph; this.#node = node; } /** * Create a new resource. * Creation implies writing as well. * @param {string} name * @param {ResourceDescriptor} descriptor * @returns {number} resource ID */ create(name, descriptor) { const node = this.#graph.create_resource(name, descriptor); // remember resource this.#node.resource_creates.push(node); // creation implies writing as well this.#node.resource_writes.push(node); return node; } /** * Read an existing resource * @param {number} resource * @returns {number} resource ID same as the input */ read(resource) { assert.isNonNegativeInteger(resource, 'resource'); assert.defined(this.#graph.getResourceEntry(resource), 'resource node'); const node = this.#node; return node.read(resource); } /** * Write a resource * @param {number} resource * @returns {number} resource ID */ write(resource) { assert.isNonNegativeInteger(resource, 'resource'); const graph = this.#graph; const node = this.#node; if (graph.getResourceEntry(resource).isImported()) { // comes from outside the graph, and we write to it. That's a side effect node.has_side_effects = true; } if (node.creates(resource)) { return node.write(resource); } else { // writing to a resource produces a renamed handle node.read(resource); return node.write(graph.clone_resource(resource)); } } /** * Indicate that this pass has side effects. * Will force the node to always be executed, regardless if it contributes to the final outputs of the graph or not. * Useful for debug purposes or cases where some of the resources written are not part of the graph. */ make_side_effect() { this.#node.has_side_effects = true; } }