util_noise_noise_stack.js

/**
 * @module NoiseStack
 * @fileOverview Contains NoiseStack class.
 */

/**
 * @class
 * Stack of noise layers.
 */
class NoiseStack {
    /**
     * Create a new noise stack.
     * @param {NoiseStackLayer[]} layers Noise stack layers to use
     * @param {number} scale Uniform scaling
     * @constructor
     */
    constructor(layers = [], scale = 1) {
        this.layers = layers;

        this.scale = scale;
    }

    /**
     * Execute the noise stack on data.
     * @param {number} x Value of x position (input)
     * @param {number} y Value of y position (input)
     * @returns {number} Resulting height value
     */
    get(x, y) {
        x /= this.scale;
        y /= this.scale;

        let total = 0;
        let count = 0;

        for (const layer of this.layers) {
            total += layer.get(x, y);
            count += layer.weight;
        }

        return total / count;
    }
}

export default NoiseStack;