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

package com.hypixel.hytale.builtin.hytalegenerator.vectorproviders;

import com.hypixel.hytale.math.vector.Vector3d;
import javax.annotation.Nonnull;
import com.hypixel.hytale.builtin.hytalegenerator.density.Density;

public class DensityGradientVectorProvider extends VectorProvider
{
    @Nonnull
    private final Density density;
    private final double sampleDistance;
    
    public DensityGradientVectorProvider(@Nonnull final Density density, final double sampleDistance) {
        assert sampleDistance >= 0.0;
        this.density = density;
        this.sampleDistance = Math.max(0.0, sampleDistance);
    }
    
    @Nonnull
    @Override
    public Vector3d process(@Nonnull final Context context) {
        final double valueAtOrigin = this.density.process(new Density.Context(context));
        final double maxX = context.position.x + this.sampleDistance;
        final double maxY = context.position.y + this.sampleDistance;
        final double maxZ = context.position.z + this.sampleDistance;
        final Density.Context childContext = new Density.Context(context);
        childContext.position = new Vector3d(maxX, context.position.y, context.position.z);
        final double deltaX = this.density.process(childContext) - valueAtOrigin;
        childContext.position = new Vector3d(context.position.x, maxY, context.position.z);
        final double deltaY = this.density.process(childContext) - valueAtOrigin;
        childContext.position = new Vector3d(context.position.x, context.position.y, maxZ);
        final double deltaZ = this.density.process(childContext) - valueAtOrigin;
        return new Vector3d(deltaX, deltaY, deltaZ);
    }
}
