Home Reference Source

src/effects/VignetteEffect.js

import { Uniform } from "three";
import { VignetteTechnique } from "../enums/VignetteTechnique.js";
import { Effect } from "./Effect.js";

import fragmentShader from "./glsl/vignette.frag";

/**
 * A Vignette effect.
 */

export class VignetteEffect extends Effect {

	/**
	 * Constructs a new Vignette effect.
	 *
	 * @param {Object} [options] - The options.
	 * @param {BlendFunction} [options.blendFunction] - The blend function of this effect.
	 * @param {VignetteTechnique} [options.technique=VignetteTechnique.DEFAULT] - The Vignette technique.
	 * @param {Boolean} [options.eskil=false] - Deprecated. Use technique instead.
	 * @param {Number} [options.offset=0.5] - The Vignette offset.
	 * @param {Number} [options.darkness=0.5] - The Vignette darkness.
	 */

	constructor({
		blendFunction,
		eskil = false,
		technique = eskil ? VignetteTechnique.ESKIL : VignetteTechnique.DEFAULT,
		offset = 0.5,
		darkness = 0.5
	} = {}) {

		super("VignetteEffect", fragmentShader, {
			blendFunction: blendFunction,
			defines: new Map([
				["VIGNETTE_TECHNIQUE", technique.toFixed(0)]
			]),
			uniforms: new Map([
				["offset", new Uniform(offset)],
				["darkness", new Uniform(darkness)]
			])
		});

	}

	/**
	 * The Vignette technique.
	 *
	 * @type {VignetteTechnique}
	 */

	get technique() {

		return Number(this.defines.get("VIGNETTE_TECHNIQUE"));

	}

	set technique(value) {

		if(this.technique !== value) {

			this.defines.set("VIGNETTE_TECHNIQUE", value.toFixed(0));
			this.setChanged();

		}

	}

	/**
	 * Indicates whether Eskil's Vignette technique is enabled.
	 *
	 * @type {Boolean}
	 * @deprecated Use technique instead.
	 */

	get eskil() {

		return (this.technique === VignetteTechnique.ESKIL);

	}

	/**
	 * Indicates whether Eskil's Vignette technique is enabled.
	 *
	 * @type {Boolean}
	 * @deprecated Use technique instead.
	 */

	set eskil(value) {

		this.technique = value ? VignetteTechnique.ESKIL : VignetteTechnique.DEFAULT;

	}

	/**
	 * Returns the Vignette technique.
	 *
	 * @deprecated Use technique instead.
	 * @return {VignetteTechnique} The technique.
	 */

	getTechnique() {

		return this.technique;

	}

	/**
	 * Sets the Vignette technique.
	 *
	 * @deprecated Use technique instead.
	 * @param {VignetteTechnique} value - The technique.
	 */

	setTechnique(value) {

		this.technique = value;

	}

	/**
	 * The Vignette offset.
	 *
	 * @type {Number}
	 */

	get offset() {

		return this.uniforms.get("offset").value;

	}

	set offset(value) {

		this.uniforms.get("offset").value = value;

	}

	/**
	 * Returns the Vignette offset.
	 *
	 * @deprecated Use offset instead.
	 * @return {Number} The offset.
	 */

	getOffset() {

		return this.offset;

	}

	/**
	 * Sets the Vignette offset.
	 *
	 * @deprecated Use offset instead.
	 * @param {Number} value - The offset.
	 */

	setOffset(value) {

		this.offset = value;

	}

	/**
	 * The Vignette darkness.
	 *
	 * @type {Number}
	 */

	get darkness() {

		return this.uniforms.get("darkness").value;

	}

	set darkness(value) {

		this.uniforms.get("darkness").value = value;

	}

	/**
	 * Returns the Vignette darkness.
	 *
	 * @deprecated Use darkness instead.
	 * @return {Number} The darkness.
	 */

	getDarkness() {

		return this.darkness;

	}

	/**
	 * Sets the Vignette darkness.
	 *
	 * @deprecated Use darkness instead.
	 * @param {Number} value - The darkness.
	 */

	setDarkness(value) {

		this.darkness = value;

	}

}