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

120 lines
3.3 KiB
JavaScript

/**
* The default coloration shader used by standard rendering and animations.
* A fragment shader which creates a solid light source.
*/
class AdaptiveDarknessShader extends AdaptiveLightingShader {
/** @override */
update() {
super.update();
this.uniforms.darknessLevel = canvas.environment.darknessLevel;
}
/* -------------------------------------------- */
/**
* Flag whether the darkness shader is currently required.
* Check vision modes requirements first, then
* if key uniforms are at their default values, we don't need to render the background container.
* @type {boolean}
*/
get isRequired() {
const vs = canvas.visibility.lightingVisibility;
// Checking if darkness layer is disabled
if ( vs.darkness === VisionMode.LIGHTING_VISIBILITY.DISABLED ) return false;
// Otherwise, returns true in every circumstances
return true;
}
/* -------------------------------------------- */
/* GLSL Statics */
/* -------------------------------------------- */
/** @override */
static defaultUniforms = {
intensity: 5,
color: Color.from("#8651d5").rgb,
screenDimensions: [1, 1],
time: 0,
primaryTexture: null,
depthTexture: null,
visionTexture: null,
darknessLevelTexture: null,
depthElevation: 1,
ambientBrightest: [1, 1, 1],
ambientDarkness: [0, 0, 0],
ambientDaylight: [1, 1, 1],
weights: [0, 0, 0, 0],
dimLevelCorrection: 1,
brightLevelCorrection: 2,
borderDistance: 0,
darknessLevel: 0,
computeIllumination: false,
globalLight: false,
globalLightThresholds: [0, 0],
enableVisionMasking: false
};
static {
const initial = foundry.data.LightData.cleanData();
this.defaultUniforms.intensity = initial.animation.intensity;
}
/* -------------------------------------------- */
/**
* Shader final
* @type {string}
*/
static FRAGMENT_END = `
gl_FragColor = vec4(finalColor, 1.0) * depth;
`;
/* -------------------------------------------- */
/**
* Initialize fragment with common properties
* @type {string}
*/
static FRAGMENT_BEGIN = `
${this.COMPUTE_ILLUMINATION}
float dist = distance(vUvs, vec2(0.5)) * 2.0;
vec4 depthColor = texture2D(depthTexture, vSamplerUvs);
float depth = smoothstep(0.0, 1.0, vDepth) *
step(depthColor.g, depthElevation) *
step(depthElevation, (254.5 / 255.0) - depthColor.r) *
(enableVisionMasking ? 1.0 - step(texture2D(visionTexture, vSamplerUvs).r, 0.0) : 1.0) *
(1.0 - smoothstep(borderDistance, 1.0, dist));
vec4 baseColor = texture2D(primaryTexture, vSamplerUvs);
vec3 finalColor = baseColor.rgb;
`;
/* -------------------------------------------- */
/**
* Memory allocations for the Adaptive Background Shader
* @type {string}
*/
static SHADER_HEADER = `
${this.FRAGMENT_UNIFORMS}
${this.VERTEX_FRAGMENT_VARYINGS}
${this.FRAGMENT_FUNCTIONS}
${this.CONSTANTS}
`;
/* -------------------------------------------- */
/** @inheritdoc */
static fragmentShader = `
${this.SHADER_HEADER}
${this.PERCEIVED_BRIGHTNESS}
void main() {
${this.FRAGMENT_BEGIN}
finalColor *= (mix(color, color * 0.33, darknessLevel) * colorationAlpha);
${this.FRAGMENT_END}
}`;
}