103 lines
2.9 KiB
JavaScript
103 lines
2.9 KiB
JavaScript
/**
|
|
* This class defines an interface which all shaders utilize.
|
|
* @extends {PIXI.Shader}
|
|
* @property {PIXI.Program} program The program to use with this shader.
|
|
* @property {object} uniforms The current uniforms of the Shader.
|
|
* @mixes BaseShaderMixin
|
|
* @abstract
|
|
*/
|
|
class AbstractBaseShader extends BaseShaderMixin(PIXI.Shader) {
|
|
constructor(program, uniforms) {
|
|
super(program, foundry.utils.deepClone(uniforms));
|
|
|
|
/**
|
|
* The initial values of the shader uniforms.
|
|
* @type {object}
|
|
*/
|
|
this.initialUniforms = uniforms;
|
|
}
|
|
|
|
/* -------------------------------------------- */
|
|
|
|
/**
|
|
* The raw vertex shader used by this class.
|
|
* A subclass of AbstractBaseShader must implement the vertexShader static field.
|
|
* @type {string}
|
|
*/
|
|
static vertexShader = "";
|
|
|
|
/**
|
|
* The raw fragment shader used by this class.
|
|
* A subclass of AbstractBaseShader must implement the fragmentShader static field.
|
|
* @type {string}
|
|
*/
|
|
static fragmentShader = "";
|
|
|
|
/**
|
|
* The default uniform values for the shader.
|
|
* A subclass of AbstractBaseShader must implement the defaultUniforms static field.
|
|
* @type {object}
|
|
*/
|
|
static defaultUniforms = {};
|
|
|
|
/* -------------------------------------------- */
|
|
|
|
/**
|
|
* A factory method for creating the shader using its defined default values
|
|
* @param {object} initialUniforms
|
|
* @returns {AbstractBaseShader}
|
|
*/
|
|
static create(initialUniforms) {
|
|
const program = PIXI.Program.from(this.vertexShader, this.fragmentShader);
|
|
const uniforms = foundry.utils.mergeObject(this.defaultUniforms, initialUniforms,
|
|
{inplace: false, insertKeys: false});
|
|
const shader = new this(program, uniforms);
|
|
shader._configure();
|
|
return shader;
|
|
}
|
|
|
|
/* -------------------------------------------- */
|
|
|
|
/**
|
|
* Reset the shader uniforms back to their initial values.
|
|
*/
|
|
reset() {
|
|
for (let [k, v] of Object.entries(this.initialUniforms)) {
|
|
this.uniforms[k] = foundry.utils.deepClone(v);
|
|
}
|
|
}
|
|
|
|
/* ---------------------------------------- */
|
|
|
|
/**
|
|
* A one time initialization performed on creation.
|
|
* @protected
|
|
*/
|
|
_configure() {}
|
|
|
|
/* ---------------------------------------- */
|
|
|
|
/**
|
|
* Perform operations which are required before binding the Shader to the Renderer.
|
|
* @param {PIXI.DisplayObject} mesh The mesh display object linked to this shader.
|
|
* @param {PIXI.Renderer} renderer The renderer
|
|
* @protected
|
|
* @internal
|
|
*/
|
|
_preRender(mesh, renderer) {}
|
|
|
|
/* -------------------------------------------- */
|
|
/* Deprecations and Compatibility */
|
|
/* -------------------------------------------- */
|
|
|
|
/**
|
|
* @deprecated since v12
|
|
* @ignore
|
|
*/
|
|
get _defaults() {
|
|
const msg = "AbstractBaseShader#_defaults is deprecated in favor of AbstractBaseShader#initialUniforms.";
|
|
foundry.utils.logCompatibilityWarning(msg, {since: 12, until: 14});
|
|
return this.initialUniforms;
|
|
}
|
|
}
|