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

package com.hypixel.hytale.procedurallib.logic.cell.evaluator;

import com.hypixel.hytale.procedurallib.condition.DefaultDoubleCondition;
import com.hypixel.hytale.procedurallib.supplier.IDoubleRange;
import javax.annotation.Nullable;
import com.hypixel.hytale.procedurallib.condition.IDoubleCondition;
import com.hypixel.hytale.procedurallib.logic.cell.PointDistanceFunction;
import javax.annotation.Nonnull;
import com.hypixel.hytale.procedurallib.logic.point.PointConsumer;
import com.hypixel.hytale.procedurallib.logic.ResultBuffer;
import com.hypixel.hytale.procedurallib.logic.cell.jitter.DefaultCellJitter;
import com.hypixel.hytale.procedurallib.logic.cell.jitter.CellJitter;

public interface PointEvaluator
{
    default CellJitter getJitter() {
        return DefaultCellJitter.DEFAULT_ONE;
    }
    
    void evalPoint(final int p0, final double p1, final double p2, final int p3, final int p4, final int p5, final double p6, final double p7, final ResultBuffer.ResultBuffer2d p8);
    
    void evalPoint2(final int p0, final double p1, final double p2, final int p3, final int p4, final int p5, final double p6, final double p7, final ResultBuffer.ResultBuffer2d p8);
    
    void evalPoint(final int p0, final double p1, final double p2, final double p3, final int p4, final int p5, final int p6, final int p7, final double p8, final double p9, final double p10, final ResultBuffer.ResultBuffer3d p11);
    
    void evalPoint2(final int p0, final double p1, final double p2, final double p3, final int p4, final int p5, final int p6, final int p7, final double p8, final double p9, final double p10, final ResultBuffer.ResultBuffer3d p11);
    
    default <T> void collectPoint(final int cellHash, final int cellX, final int cellY, final double cellCentreX, final double cellCentreY, final T ctx, @Nonnull final PointConsumer<T> consumer) {
        consumer.accept(cellCentreX, cellCentreY, ctx);
    }
    
    default PointEvaluator of(final PointDistanceFunction distanceFunction, @Nullable final IDoubleCondition density, @Nullable final IDoubleRange distanceMod, final CellJitter jitter) {
        return of(distanceFunction, density, distanceMod, 0, SkipCellPointEvaluator.DEFAULT_MODE, jitter);
    }
    
    default PointEvaluator of(final PointDistanceFunction distanceFunction, @Nullable final IDoubleCondition density, @Nullable final IDoubleRange distanceMod, final int skipCount, @Nonnull final SkipCellPointEvaluator.Mode skipMode, final CellJitter jitter) {
        PointEvaluator pointEvaluator = NormalPointEvaluator.of(distanceFunction);
        if (distanceMod != null) {
            pointEvaluator = new DistancePointEvaluator(distanceFunction, distanceMod);
        }
        if (density != null && density != DefaultDoubleCondition.DEFAULT_TRUE) {
            pointEvaluator = new DensityPointEvaluator(pointEvaluator, density);
        }
        if (skipCount > 0) {
            pointEvaluator = new SkipCellPointEvaluator(pointEvaluator, skipMode, skipCount);
        }
        if (jitter != DefaultCellJitter.DEFAULT_ONE) {
            pointEvaluator = new JitterPointEvaluator(pointEvaluator, jitter);
        }
        return pointEvaluator;
    }
}
