Files
Foundry-VTT-Docker/resources/app/client/pixi/webgl/shaders/region/adjust-darkness-level.js
2025-01-04 00:34:03 +01:00

131 lines
3.4 KiB
JavaScript

/**
* Abstract shader used for Adjust Darkness Level region behavior.
* @abstract
* @internal
* @ignore
*/
class AbstractDarknessLevelRegionShader extends RegionShader {
/** @inheritDoc */
static defaultUniforms = {
...super.defaultUniforms,
bottom: 0,
top: 0,
depthTexture: null
};
/* ---------------------------------------- */
/**
* The darkness level adjustment mode.
* @type {number}
*/
mode = foundry.data.regionBehaviors.AdjustDarknessLevelRegionBehaviorType.MODES.OVERRIDE;
/* ---------------------------------------- */
/**
* The darkness level modifier.
* @type {number}
*/
modifier = 0;
/* ---------------------------------------- */
/**
* Current darkness level of this mesh.
* @type {number}
*/
get darknessLevel() {
const M = foundry.data.regionBehaviors.AdjustDarknessLevelRegionBehaviorType.MODES;
switch ( this.mode ) {
case M.OVERRIDE: return this.modifier;
case M.BRIGHTEN: return canvas.environment.darknessLevel * (1 - this.modifier);
case M.DARKEN: return 1 - ((1 - canvas.environment.darknessLevel) * (1 - this.modifier));
default: throw new Error("Invalid mode");
}
}
/* ---------------------------------------- */
/** @inheritDoc */
_preRender(mesh, renderer) {
super._preRender(mesh, renderer);
const u = this.uniforms;
u.bottom = canvas.masks.depth.mapElevation(mesh.region.bottom);
u.top = canvas.masks.depth.mapElevation(mesh.region.top);
if ( !u.depthTexture ) u.depthTexture = canvas.masks.depth.renderTexture;
}
}
/* ---------------------------------------- */
/**
* Render the RegionMesh with darkness level adjustments.
* @internal
* @ignore
*/
class AdjustDarknessLevelRegionShader extends AbstractDarknessLevelRegionShader {
/** @override */
static fragmentShader = `
precision ${PIXI.settings.PRECISION_FRAGMENT} float;
uniform sampler2D depthTexture;
uniform float darknessLevel;
uniform float top;
uniform float bottom;
uniform vec4 tintAlpha;
varying vec2 vScreenCoord;
void main() {
vec2 depthColor = texture2D(depthTexture, vScreenCoord).rg;
float depth = step(depthColor.g, top) * step(bottom, (254.5 / 255.0) - depthColor.r);
gl_FragColor = vec4(darknessLevel, 0.0, 0.0, 1.0) * tintAlpha * depth;
}
`;
/* ---------------------------------------- */
/** @inheritDoc */
static defaultUniforms = {
...super.defaultUniforms,
darknessLevel: 0
};
/* ---------------------------------------- */
/** @inheritDoc */
_preRender(mesh, renderer) {
super._preRender(mesh, renderer);
this.uniforms.darknessLevel = this.darknessLevel;
}
}
/* ---------------------------------------- */
/**
* Render the RegionMesh with darkness level adjustments.
* @internal
* @ignore
*/
class IlluminationDarknessLevelRegionShader extends AbstractDarknessLevelRegionShader {
/** @override */
static fragmentShader = `
precision ${PIXI.settings.PRECISION_FRAGMENT} float;
uniform sampler2D depthTexture;
uniform float top;
uniform float bottom;
uniform vec4 tintAlpha;
varying vec2 vScreenCoord;
void main() {
vec2 depthColor = texture2D(depthTexture, vScreenCoord).rg;
float depth = step(depthColor.g, top) * step(bottom, (254.5 / 255.0) - depthColor.r);
gl_FragColor = vec4(1.0) * tintAlpha * depth;
}
`;
}