// 
// Decompiled by Procyon v0.6.0
// 

package com.hypixel.hytale.procedurallib.logic;

import javax.annotation.Nonnull;
import com.hypixel.hytale.math.util.HashUtil;
import com.hypixel.hytale.procedurallib.NoiseFunction;

public class ValueNoise implements NoiseFunction
{
    protected final GeneralNoise.InterpolationFunction interpolationFunction;
    
    public ValueNoise(final GeneralNoise.InterpolationFunction interpolationFunction) {
        this.interpolationFunction = interpolationFunction;
    }
    
    public GeneralNoise.InterpolationFunction getInterpolationFunction() {
        return this.interpolationFunction;
    }
    
    @Override
    public double get(final int seed, final int offsetSeed, final double x, final double y) {
        final int x2 = GeneralNoise.fastFloor(x);
        final int y2 = GeneralNoise.fastFloor(y);
        final int x3 = x2 + 1;
        final int y3 = y2 + 1;
        final double xs = this.interpolationFunction.interpolate(x - x2);
        final double ys = this.interpolationFunction.interpolate(y - y2);
        final double xf0 = GeneralNoise.lerp(HashUtil.random(offsetSeed, x2, y2), HashUtil.random(offsetSeed, x3, y2), xs);
        final double xf2 = GeneralNoise.lerp(HashUtil.random(offsetSeed, x2, y3), HashUtil.random(offsetSeed, x3, y3), xs);
        return GeneralNoise.lerp(xf0, xf2, ys) * 2.0 - 1.0;
    }
    
    @Override
    public double get(final int seed, final int offsetSeed, final double x, final double y, final double z) {
        final int x2 = GeneralNoise.fastFloor(x);
        final int y2 = GeneralNoise.fastFloor(y);
        final int z2 = GeneralNoise.fastFloor(z);
        final int x3 = x2 + 1;
        final int y3 = y2 + 1;
        final int z3 = z2 + 1;
        final double xs = this.interpolationFunction.interpolate(x - x2);
        final double ys = this.interpolationFunction.interpolate(y - y2);
        final double zs = this.interpolationFunction.interpolate(z - z2);
        final double xf00 = GeneralNoise.lerp(HashUtil.random(offsetSeed, x2, y2, z2), HashUtil.random(offsetSeed, x3, y2, z2), xs);
        final double xf2 = GeneralNoise.lerp(HashUtil.random(offsetSeed, x2, y3, z2), HashUtil.random(offsetSeed, x3, y3, z2), xs);
        final double xf3 = GeneralNoise.lerp(HashUtil.random(offsetSeed, x2, y2, z3), HashUtil.random(offsetSeed, x3, y2, z3), xs);
        final double xf4 = GeneralNoise.lerp(HashUtil.random(offsetSeed, x2, y3, z3), HashUtil.random(offsetSeed, x3, y3, z3), xs);
        final double yf0 = GeneralNoise.lerp(xf00, xf2, ys);
        final double yf2 = GeneralNoise.lerp(xf3, xf4, ys);
        return GeneralNoise.lerp(yf0, yf2, zs) * 2.0 - 1.0;
    }
    
    @Nonnull
    @Override
    public String toString() {
        return "ValueNoise{interpolationFunction=" + String.valueOf(this.interpolationFunction);
    }
}
