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

package com.hypixel.hytale.builtin.hytalegenerator.density.nodes;

import com.hypixel.hytale.builtin.hytalegenerator.VectorUtil;
import com.hypixel.hytale.builtin.hytalegenerator.framework.math.Calculator;
import com.hypixel.hytale.math.vector.Vector3d;
import javax.annotation.Nonnull;
import it.unimi.dsi.fastutil.doubles.Double2DoubleFunction;
import com.hypixel.hytale.builtin.hytalegenerator.density.Density;

public class ShellDensity extends Density
{
    public static final double ZERO_DELTA = 1.0E-9;
    @Nonnull
    private final Double2DoubleFunction angleCurve;
    @Nonnull
    private final Double2DoubleFunction distanceCurve;
    @Nonnull
    private final Vector3d axis;
    private final boolean isMirrored;
    
    public ShellDensity(@Nonnull final Double2DoubleFunction angleCurve, @Nonnull final Double2DoubleFunction distanceCurve, @Nonnull final Vector3d axis, final boolean isMirrored) {
        this.angleCurve = angleCurve;
        this.distanceCurve = distanceCurve;
        this.axis = axis;
        this.isMirrored = isMirrored;
    }
    
    @Override
    public double process(@Nonnull final Context context) {
        final double distance = Calculator.distance(context.position, Vector3d.ZERO);
        if (this.axis.length() == 0.0) {
            return 0.0;
        }
        final Vector3d radialVector = context.position.clone();
        final double amplitude = this.distanceCurve.applyAsDouble(distance);
        if (amplitude == 0.0) {
            return 0.0;
        }
        if (radialVector.length() <= 1.0E-9) {
            return amplitude;
        }
        double angle = VectorUtil.angle(radialVector, this.axis);
        angle /= 3.141592653589793;
        angle *= 180.0;
        if (this.isMirrored && angle > 90.0) {
            angle = 180.0 - angle;
        }
        return amplitude * this.angleCurve.applyAsDouble(angle);
    }
}
