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

91 lines
3.4 KiB
JavaScript

'use strict';
var createIdFromString = require('../../shared/utils/createIdFromString.js');
var getMaxFragmentPrecision = require('./program/getMaxFragmentPrecision.js');
var addProgramDefines = require('./program/preprocessors/addProgramDefines.js');
var ensurePrecision = require('./program/preprocessors/ensurePrecision.js');
var insertVersion = require('./program/preprocessors/insertVersion.js');
var setProgramName = require('./program/preprocessors/setProgramName.js');
var stripVersion = require('./program/preprocessors/stripVersion.js');
"use strict";
const processes = {
// strips any version headers..
stripVersion: stripVersion.stripVersion,
// adds precision string if not already present
ensurePrecision: ensurePrecision.ensurePrecision,
// add some defines if WebGL1 to make it more compatible with WebGL2 shaders
addProgramDefines: addProgramDefines.addProgramDefines,
// add the program name to the shader
setProgramName: setProgramName.setProgramName,
// add the version string to the shader header
insertVersion: insertVersion.insertVersion
};
const programCache = /* @__PURE__ */ Object.create(null);
const _GlProgram = class _GlProgram {
/**
* Creates a shiny new GlProgram. Used by WebGL renderer.
* @param options - The options for the program.
*/
constructor(options) {
options = { ..._GlProgram.defaultOptions, ...options };
const isES300 = options.fragment.indexOf("#version 300 es") !== -1;
const preprocessorOptions = {
stripVersion: isES300,
ensurePrecision: {
requestedFragmentPrecision: options.preferredFragmentPrecision,
requestedVertexPrecision: options.preferredVertexPrecision,
maxSupportedVertexPrecision: "highp",
maxSupportedFragmentPrecision: getMaxFragmentPrecision.getMaxFragmentPrecision()
},
setProgramName: {
name: options.name
},
addProgramDefines: isES300,
insertVersion: isES300
};
let fragment = options.fragment;
let vertex = options.vertex;
Object.keys(processes).forEach((processKey) => {
const processOptions = preprocessorOptions[processKey];
fragment = processes[processKey](fragment, processOptions, true);
vertex = processes[processKey](vertex, processOptions, false);
});
this.fragment = fragment;
this.vertex = vertex;
this._key = createIdFromString.createIdFromString(`${this.vertex}:${this.fragment}`, "gl-program");
}
/** destroys the program */
destroy() {
this.fragment = null;
this.vertex = null;
this._attributeData = null;
this._uniformData = null;
this._uniformBlockData = null;
this.transformFeedbackVaryings = null;
}
/**
* Helper function that creates a program for a given source.
* It will check the program cache if the program has already been created.
* If it has that one will be returned, if not a new one will be created and cached.
* @param options - The options for the program.
* @returns A program using the same source
*/
static from(options) {
const key = `${options.vertex}:${options.fragment}`;
if (!programCache[key]) {
programCache[key] = new _GlProgram(options);
}
return programCache[key];
}
};
/** The default options used by the program. */
_GlProgram.defaultOptions = {
preferredVertexPrecision: "highp",
preferredFragmentPrecision: "mediump"
};
let GlProgram = _GlProgram;
exports.GlProgram = GlProgram;
//# sourceMappingURL=GlProgram.js.map