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

package com.hypixel.hytale.procedurallib.logic.point;

import javax.annotation.Nullable;
import javax.annotation.Nonnull;
import com.hypixel.hytale.procedurallib.logic.ResultBuffer;

public class ScaledPointGenerator implements IPointGenerator
{
    protected final PointGenerator pointGenerator;
    protected final double scale;
    
    public ScaledPointGenerator(final PointGenerator pointGenerator, final double scale) {
        this.pointGenerator = pointGenerator;
        this.scale = scale;
    }
    
    @Nonnull
    @Override
    public ResultBuffer.ResultBuffer2d nearest2D(final int seed, final double x, final double y) {
        final ResultBuffer.ResultBuffer2d nearest2D;
        final ResultBuffer.ResultBuffer2d buf = nearest2D = this.pointGenerator.nearest2D(seed, x * this.scale, y * this.scale);
        nearest2D.x /= this.scale;
        final ResultBuffer.ResultBuffer2d resultBuffer2d = buf;
        resultBuffer2d.y /= this.scale;
        buf.distance = Math.sqrt(buf.distance) / this.scale;
        return buf;
    }
    
    @Nonnull
    @Override
    public ResultBuffer.ResultBuffer3d nearest3D(final int seed, final double x, final double y, final double z) {
        final ResultBuffer.ResultBuffer3d nearest3D;
        final ResultBuffer.ResultBuffer3d buf = nearest3D = this.pointGenerator.nearest3D(seed, x * this.scale, y * this.scale, z * this.scale);
        nearest3D.x /= this.scale;
        final ResultBuffer.ResultBuffer3d resultBuffer3d = buf;
        resultBuffer3d.y /= this.scale;
        final ResultBuffer.ResultBuffer3d resultBuffer3d2 = buf;
        resultBuffer3d2.z /= this.scale;
        buf.distance = Math.sqrt(buf.distance) / this.scale;
        return buf;
    }
    
    @Nonnull
    @Override
    public ResultBuffer.ResultBuffer2d transition2D(final int seed, final double x, final double y) {
        final ResultBuffer.ResultBuffer2d transition2D;
        final ResultBuffer.ResultBuffer2d buf = transition2D = this.pointGenerator.transition2D(seed, x * this.scale, y * this.scale);
        transition2D.x /= this.scale;
        final ResultBuffer.ResultBuffer2d resultBuffer2d = buf;
        resultBuffer2d.x2 /= this.scale;
        final ResultBuffer.ResultBuffer2d resultBuffer2d2 = buf;
        resultBuffer2d2.y /= this.scale;
        final ResultBuffer.ResultBuffer2d resultBuffer2d3 = buf;
        resultBuffer2d3.y2 /= this.scale;
        buf.distance = Math.sqrt(buf.distance) / this.scale;
        buf.distance2 = Math.sqrt(buf.distance2) / this.scale;
        return buf;
    }
    
    @Nonnull
    @Override
    public ResultBuffer.ResultBuffer3d transition3D(final int seed, final double x, final double y, final double z) {
        final ResultBuffer.ResultBuffer3d transition3D;
        final ResultBuffer.ResultBuffer3d buf = transition3D = this.pointGenerator.transition3D(seed, x * this.scale, y * this.scale, z * this.scale);
        transition3D.x /= this.scale;
        final ResultBuffer.ResultBuffer3d resultBuffer3d = buf;
        resultBuffer3d.x2 /= this.scale;
        final ResultBuffer.ResultBuffer3d resultBuffer3d2 = buf;
        resultBuffer3d2.y /= this.scale;
        final ResultBuffer.ResultBuffer3d resultBuffer3d3 = buf;
        resultBuffer3d3.y2 /= this.scale;
        final ResultBuffer.ResultBuffer3d resultBuffer3d4 = buf;
        resultBuffer3d4.z /= this.scale;
        final ResultBuffer.ResultBuffer3d resultBuffer3d5 = buf;
        resultBuffer3d5.z2 /= this.scale;
        buf.distance = Math.sqrt(buf.distance) / this.scale;
        buf.distance2 = Math.sqrt(buf.distance2) / this.scale;
        return buf;
    }
    
    @Override
    public double getInterval() {
        return this.pointGenerator.getInterval() / this.scale;
    }
    
    @Override
    public void collect(final int seed, double minX, double minY, double maxX, double maxY, final PointConsumer2d consumer) {
        minX *= this.scale;
        minY *= this.scale;
        maxX *= this.scale;
        maxY *= this.scale;
        this.pointGenerator.collect0(seed, minX, minY, maxX, maxY, (x, y, t) -> t.accept(x / this.scale, y / this.scale), consumer);
    }
    
    @Override
    public boolean equals(@Nullable final Object o) {
        if (this == o) {
            return true;
        }
        if (o == null || this.getClass() != o.getClass()) {
            return false;
        }
        final ScaledPointGenerator that = (ScaledPointGenerator)o;
        return Double.compare(that.scale, this.scale) == 0 && this.pointGenerator.equals(that.pointGenerator);
    }
    
    @Override
    public int hashCode() {
        int result = this.pointGenerator.hashCode();
        final long temp = Double.doubleToLongBits(this.scale);
        result = 31 * result + (int)(temp ^ temp >>> 32);
        return result;
    }
    
    @Nonnull
    @Override
    public String toString() {
        return "ScaledPointGenerator{pointGenerator=" + String.valueOf(this.pointGenerator) + ", scale=" + this.scale;
    }
}
