Files
nothoughts/node_modules/pixi.js/lib/rendering/renderers/gpu/shader/BindGroup.mjs
2025-08-04 18:57:35 +02:00

100 lines
2.7 KiB
JavaScript

"use strict";
class BindGroup {
/**
* Create a new instance eof the Bind Group.
* @param resources - The resources that are bound together for use by a shader.
*/
constructor(resources) {
/** The resources that are bound together for use by a shader. */
this.resources = /* @__PURE__ */ Object.create(null);
this._dirty = true;
let index = 0;
for (const i in resources) {
const resource = resources[i];
this.setResource(resource, index++);
}
this._updateKey();
}
/**
* Updates the key if its flagged as dirty. This is used internally to
* match this bind group to a WebGPU BindGroup.
* @internal
* @ignore
*/
_updateKey() {
if (!this._dirty)
return;
this._dirty = false;
const keyParts = [];
let index = 0;
for (const i in this.resources) {
keyParts[index++] = this.resources[i]._resourceId;
}
this._key = keyParts.join("|");
}
/**
* Set a resource at a given index. this function will
* ensure that listeners will be removed from the current resource
* and added to the new resource.
* @param resource - The resource to set.
* @param index - The index to set the resource at.
*/
setResource(resource, index) {
const currentResource = this.resources[index];
if (resource === currentResource)
return;
if (currentResource) {
resource.off?.("change", this.onResourceChange, this);
}
resource.on?.("change", this.onResourceChange, this);
this.resources[index] = resource;
this._dirty = true;
}
/**
* Returns the resource at the current specified index.
* @param index - The index of the resource to get.
* @returns - The resource at the specified index.
*/
getResource(index) {
return this.resources[index];
}
/**
* Used internally to 'touch' each resource, to ensure that the GC
* knows that all resources in this bind group are still being used.
* @param tick - The current tick.
* @internal
* @ignore
*/
_touch(tick) {
const resources = this.resources;
for (const i in resources) {
resources[i]._touched = tick;
}
}
/** Destroys this bind group and removes all listeners. */
destroy() {
const resources = this.resources;
for (const i in resources) {
const resource = resources[i];
resource.off?.("change", this.onResourceChange, this);
}
this.resources = null;
}
onResourceChange(resource) {
this._dirty = true;
if (resource.destroyed) {
const resources = this.resources;
for (const i in resources) {
if (resources[i] === resource) {
resources[i] = null;
}
}
} else {
this._updateKey();
}
}
}
export { BindGroup };
//# sourceMappingURL=BindGroup.mjs.map