pixi.js
Version:
<p align="center"> <a href="https://pixijs.com" target="_blank" rel="noopener noreferrer"> <img height="150" src="https://files.pixijs.download/branding/pixijs-logo-transparent-dark.svg?v=1" alt="PixiJS logo"> </a> </p> <br/> <p align="center">
88 lines (85 loc) • 3.06 kB
JavaScript
import { ExtensionType } from '../../../../extensions/Extensions.mjs';
import { generateUniformsSync } from './utils/generateUniformsSync.mjs';
"use strict";
class GlUniformGroupSystem {
/** @param renderer - The renderer this System works for. */
constructor(renderer) {
/** Cache to holds the generated functions. Stored against UniformObjects unique signature. */
this._cache = {};
this._uniformGroupSyncHash = {};
this._renderer = renderer;
this.gl = null;
this._cache = {};
}
contextChange(gl) {
this.gl = gl;
}
/**
* Uploads the uniforms values to the currently bound shader.
* @param group - the uniforms values that be applied to the current shader
* @param program
* @param syncData
* @param syncData.textureCount
*/
updateUniformGroup(group, program, syncData) {
const programData = this._renderer.shader._getProgramData(program);
if (!group.isStatic || group._dirtyId !== programData.uniformDirtyGroups[group.uid]) {
programData.uniformDirtyGroups[group.uid] = group._dirtyId;
const syncFunc = this._getUniformSyncFunction(group, program);
syncFunc(programData.uniformData, group.uniforms, this._renderer, syncData);
}
}
/**
* Overridable by the pixi.js/unsafe-eval package to use static syncUniforms instead.
* @param group
* @param program
*/
_getUniformSyncFunction(group, program) {
return this._uniformGroupSyncHash[group._signature]?.[program._key] || this._createUniformSyncFunction(group, program);
}
_createUniformSyncFunction(group, program) {
const uniformGroupSyncHash = this._uniformGroupSyncHash[group._signature] || (this._uniformGroupSyncHash[group._signature] = {});
const id = this._getSignature(group, program._uniformData, "u");
if (!this._cache[id]) {
this._cache[id] = this._generateUniformsSync(group, program._uniformData);
}
uniformGroupSyncHash[program._key] = this._cache[id];
return uniformGroupSyncHash[program._key];
}
_generateUniformsSync(group, uniformData) {
return generateUniformsSync(group, uniformData);
}
/**
* Takes a uniform group and data and generates a unique signature for them.
* @param group - The uniform group to get signature of
* @param group.uniforms
* @param uniformData - Uniform information generated by the shader
* @param preFix
* @returns Unique signature of the uniform group
*/
_getSignature(group, uniformData, preFix) {
const uniforms = group.uniforms;
const strings = [`${preFix}-`];
for (const i in uniforms) {
strings.push(i);
if (uniformData[i]) {
strings.push(uniformData[i].type);
}
}
return strings.join("-");
}
/** Destroys this System and removes all its textures. */
destroy() {
this._renderer = null;
this._cache = null;
}
}
/** @ignore */
GlUniformGroupSystem.extension = {
type: [
ExtensionType.WebGLSystem
],
name: "uniformGroup"
};
export { GlUniformGroupSystem };
//# sourceMappingURL=GlUniformGroupSystem.mjs.map