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

package com.hypixel.hytale.procedurallib.logic;

import javax.annotation.Nonnull;
import com.hypixel.hytale.procedurallib.NoiseFunction;

public class SimplexNoise implements NoiseFunction
{
    public static final SimplexNoise INSTANCE;
    private static final double F2 = 0.5;
    private static final double P1_F2 = -0.5;
    private static final double G2 = 0.25;
    private static final double F3 = 0.3333333333333333;
    private static final double G3 = 0.16666666666666666;
    private static final double G33 = -0.5;
    
    private SimplexNoise() {
    }
    
    @Override
    public double get(final int seed, final int offsetSeed, final double x, final double y) {
        double t = (x + y) * 0.5;
        final int i = GeneralNoise.fastFloor(x + t);
        final int j = GeneralNoise.fastFloor(y + t);
        t = (i + j) * 0.25;
        final double X0 = i - t;
        final double Y0 = j - t;
        final double x2 = x - X0;
        final double y2 = y - Y0;
        int i2;
        int j2;
        if (x2 > y2) {
            i2 = 1;
            j2 = 0;
        }
        else {
            i2 = 0;
            j2 = 1;
        }
        t = 0.5 - x2 * x2 - y2 * y2;
        double n0;
        if (t < 0.0) {
            n0 = 0.0;
        }
        else {
            t *= t;
            n0 = t * t * GeneralNoise.gradCoord2D(offsetSeed, i, j, x2, y2);
        }
        final double x3 = x2 - i2 + 0.25;
        final double y3 = y2 - j2 + 0.25;
        t = 0.5 - x3 * x3 - y3 * y3;
        double n2;
        if (t < 0.0) {
            n2 = 0.0;
        }
        else {
            t *= t;
            n2 = t * t * GeneralNoise.gradCoord2D(offsetSeed, i + i2, j + j2, x3, y3);
        }
        final double x4 = x2 - 0.5;
        final double y4 = y2 - 0.5;
        t = 0.5 - x4 * x4 - y4 * y4;
        double n3;
        if (t < 0.0) {
            n3 = 0.0;
        }
        else {
            t *= t;
            n3 = t * t * GeneralNoise.gradCoord2D(offsetSeed, i + 1, j + 1, x4, y4);
        }
        return 50.0 * (n0 + n2 + n3);
    }
    
    @Override
    public double get(final int seed, final int offsetSeed, final double x, final double y, final double z) {
        double t = (x + y + z) * 0.3333333333333333;
        final int i = GeneralNoise.fastFloor(x + t);
        final int j = GeneralNoise.fastFloor(y + t);
        final int k = GeneralNoise.fastFloor(z + t);
        t = (i + j + k) * 0.16666666666666666;
        final double x2 = x - (i - t);
        final double y2 = y - (j - t);
        final double z2 = z - (k - t);
        int i2;
        int j2;
        int k2;
        int i3;
        int j3;
        int k3;
        if (x2 >= y2) {
            if (y2 >= z2) {
                i2 = 1;
                j2 = 0;
                k2 = 0;
                i3 = 1;
                j3 = 1;
                k3 = 0;
            }
            else if (x2 >= z2) {
                i2 = 1;
                j2 = 0;
                k2 = 0;
                i3 = 1;
                j3 = 0;
                k3 = 1;
            }
            else {
                i2 = 0;
                j2 = 0;
                k2 = 1;
                i3 = 1;
                j3 = 0;
                k3 = 1;
            }
        }
        else if (y2 < z2) {
            i2 = 0;
            j2 = 0;
            k2 = 1;
            i3 = 0;
            j3 = 1;
            k3 = 1;
        }
        else if (x2 < z2) {
            i2 = 0;
            j2 = 1;
            k2 = 0;
            i3 = 0;
            j3 = 1;
            k3 = 1;
        }
        else {
            i2 = 0;
            j2 = 1;
            k2 = 0;
            i3 = 1;
            j3 = 1;
            k3 = 0;
        }
        final double x3 = x2 - i2 + 0.16666666666666666;
        final double y3 = y2 - j2 + 0.16666666666666666;
        final double z3 = z2 - k2 + 0.16666666666666666;
        final double x4 = x2 - i3 + 0.3333333333333333;
        final double y4 = y2 - j3 + 0.3333333333333333;
        final double z4 = z2 - k3 + 0.3333333333333333;
        final double x5 = x2 - 0.5;
        final double y5 = y2 - 0.5;
        final double z5 = z2 - 0.5;
        t = 0.6 - x2 * x2 - y2 * y2 - z2 * z2;
        double n0;
        if (t < 0.0) {
            n0 = 0.0;
        }
        else {
            t *= t;
            n0 = t * t * GeneralNoise.gradCoord3D(offsetSeed, i, j, k, x2, y2, z2);
        }
        t = 0.6 - x3 * x3 - y3 * y3 - z3 * z3;
        double n2;
        if (t < 0.0) {
            n2 = 0.0;
        }
        else {
            t *= t;
            n2 = t * t * GeneralNoise.gradCoord3D(offsetSeed, i + i2, j + j2, k + k2, x3, y3, z3);
        }
        t = 0.6 - x4 * x4 - y4 * y4 - z4 * z4;
        double n3;
        if (t < 0.0) {
            n3 = 0.0;
        }
        else {
            t *= t;
            n3 = t * t * GeneralNoise.gradCoord3D(offsetSeed, i + i3, j + j3, k + k3, x4, y4, z4);
        }
        t = 0.6 - x5 * x5 - y5 * y5 - z5 * z5;
        double n4;
        if (t < 0.0) {
            n4 = 0.0;
        }
        else {
            t *= t;
            n4 = t * t * GeneralNoise.gradCoord3D(offsetSeed, i + 1, j + 1, k + 1, x5, y5, z5);
        }
        return 32.0 * (n0 + n2 + n3 + n4);
    }
    
    @Nonnull
    @Override
    public String toString() {
        return "SimplexNoise{}";
    }
    
    static {
        INSTANCE = new SimplexNoise();
    }
}
