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

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

import com.hypixel.hytale.procedurallib.logic.point.PointConsumer;
import com.hypixel.hytale.procedurallib.logic.ResultBuffer;
import com.hypixel.hytale.procedurallib.logic.cell.jitter.CellJitter;
import it.unimi.dsi.fastutil.HashCommon;
import javax.annotation.Nonnull;

public class SkipCellPointEvaluator implements PointEvaluator
{
    @Nonnull
    protected final PointEvaluator pointEvaluator;
    @Nonnull
    protected final Mode mode;
    protected final int mask;
    protected final int mid;
    public static final int DEFAULT_NO_SKIP = 0;
    public static final Mode DEFAULT_MODE;
    
    public SkipCellPointEvaluator(@Nonnull final PointEvaluator pointEvaluator, @Nonnull final Mode mode, final int period) {
        final int interval = HashCommon.nextPowerOfTwo(Math.max(0, period) + 1);
        this.pointEvaluator = pointEvaluator;
        this.mode = mode;
        this.mask = interval - 1;
        this.mid = interval >> 1;
    }
    
    @Override
    public CellJitter getJitter() {
        return this.pointEvaluator.getJitter();
    }
    
    @Override
    public void evalPoint(final int seed, final double x, final double y, final int cellHash, final int cellX, final int cellY, final double cellPointX, final double cellPointY, final ResultBuffer.ResultBuffer2d buffer) {
        if (this.skip(this.mode, cellX, cellY)) {
            return;
        }
        this.pointEvaluator.evalPoint(seed, x, y, cellHash, cellX, cellY, cellPointX, cellPointY, buffer);
    }
    
    @Override
    public void evalPoint2(final int seed, final double x, final double y, final int cellHash, final int cellX, final int cellY, final double cellPointX, final double cellPointY, final ResultBuffer.ResultBuffer2d buffer) {
        if (this.skip(this.mode, cellX, cellY)) {
            return;
        }
        this.pointEvaluator.evalPoint2(seed, x, y, cellHash, cellX, cellY, cellPointX, cellPointY, buffer);
    }
    
    @Override
    public void evalPoint(final int seed, final double x, final double y, final double z, final int cellHash, final int cellX, final int cellY, final int cellZ, final double cellPointX, final double cellPointY, final double cellPointZ, final ResultBuffer.ResultBuffer3d buffer) {
    }
    
    @Override
    public void evalPoint2(final int seed, final double x, final double y, final double z, final int cellHash, final int cellX, final int cellY, final int cellZ, final double cellPointX, final double cellPointY, final double cellPointZ, final ResultBuffer.ResultBuffer3d buffer) {
    }
    
    @Override
    public <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) {
        if (this.skip(this.mode, cellX, cellY)) {
            return;
        }
        this.pointEvaluator.collectPoint(cellHash, cellX, cellY, cellCentreX, cellCentreY, ctx, consumer);
    }
    
    protected boolean skip(final Mode mode, final int cx, final int cy) {
        final int x0 = cx & this.mask;
        final int y0 = cy & this.mask;
        final boolean result = (x0 == 0 && y0 == 0) || (mode == Mode.CHECKERBOARD && x0 == this.mid && y0 == this.mid);
        return !result;
    }
    
    static {
        DEFAULT_MODE = Mode.CHECKERBOARD;
    }
    
    public enum Mode
    {
        CHECKERBOARD, 
        GRID;
    }
}
