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

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

import com.hypixel.hytale.math.vector.Vector3d;
import com.hypixel.hytale.builtin.hytalegenerator.framework.math.Calculator;
import com.hypixel.hytale.math.vector.Vector3i;
import com.hypixel.hytale.builtin.hytalegenerator.newsystem.bufferbundle.buffers.NVoxelBuffer;
import com.hypixel.hytale.builtin.hytalegenerator.VectorUtil;
import javax.annotation.Nonnull;
import com.hypixel.hytale.builtin.hytalegenerator.bounds.Bounds3i;

public class GridUtils
{
    public static final int BUFFER_COUNT_IN_CHUNK_Y;
    
    public static void toBufferGrid_fromVoxelGridOverlap(@Nonnull final Bounds3i bounds_voxelGrid) {
        assert bounds_voxelGrid.isCorrect();
        VectorUtil.bitShiftRight(3, bounds_voxelGrid.min);
        if (bounds_voxelGrid.max.x % NVoxelBuffer.SIZE.x == 0) {
            final Vector3i max = bounds_voxelGrid.max;
            --max.x;
        }
        if (bounds_voxelGrid.max.y % NVoxelBuffer.SIZE.y == 0) {
            final Vector3i max2 = bounds_voxelGrid.max;
            --max2.y;
        }
        if (bounds_voxelGrid.max.z % NVoxelBuffer.SIZE.z == 0) {
            final Vector3i max3 = bounds_voxelGrid.max;
            --max3.z;
        }
        final Vector3i max4 = bounds_voxelGrid.max;
        max4.x >>= 3;
        final Vector3i max5 = bounds_voxelGrid.max;
        max5.y >>= 3;
        final Vector3i max6 = bounds_voxelGrid.max;
        max6.z >>= 3;
    }
    
    @Nonnull
    public static Bounds3i createColumnBounds_voxelGrid(@Nonnull final Vector3i position_bufferGrid, final int minY_voxelSpace, final int maxY_voxelSpace) {
        assert minY_voxelSpace <= maxY_voxelSpace;
        final Vector3i min = position_bufferGrid.clone();
        VectorUtil.bitShiftLeft(3, min);
        final Vector3i max = min.clone().add(NVoxelBuffer.SIZE);
        min.y = minY_voxelSpace;
        max.y = maxY_voxelSpace;
        return new Bounds3i(min, max);
    }
    
    @Nonnull
    public static Bounds3i createBufferBoundsInclusive_fromVoxelBounds(@Nonnull final Bounds3i bounds_voxelGrid) {
        assert bounds_voxelGrid.isCorrect();
        final Vector3i min = bounds_voxelGrid.min.clone();
        final Vector3i max = bounds_voxelGrid.max.clone();
        min.x = Calculator.floor(min.x, NVoxelBuffer.SIZE.x);
        final Vector3i vector3i = min;
        vector3i.x >>= 3;
        min.y = Calculator.floor(min.y, NVoxelBuffer.SIZE.y);
        final Vector3i vector3i2 = min;
        vector3i2.y >>= 3;
        min.z = Calculator.floor(min.z, NVoxelBuffer.SIZE.z);
        final Vector3i vector3i3 = min;
        vector3i3.z >>= 3;
        int mod = Calculator.wrap(max.x, NVoxelBuffer.SIZE.x);
        max.x = Calculator.ceil(max.x, NVoxelBuffer.SIZE.x);
        final Vector3i vector3i4 = max;
        vector3i4.x >>= 3;
        if (mod == 0) {
            final Vector3i vector3i5 = max;
            vector3i5.x += 2;
        }
        else {
            final Vector3i vector3i6 = max;
            ++vector3i6.x;
        }
        mod = Calculator.wrap(max.y, NVoxelBuffer.SIZE.y);
        max.y = Calculator.ceil(max.y, NVoxelBuffer.SIZE.y);
        final Vector3i vector3i7 = max;
        vector3i7.y >>= 3;
        if (mod == 0) {
            final Vector3i vector3i8 = max;
            vector3i8.y += 2;
        }
        else {
            final Vector3i vector3i9 = max;
            ++vector3i9.y;
        }
        mod = Calculator.wrap(max.z, NVoxelBuffer.SIZE.z);
        max.z = Calculator.ceil(max.z, NVoxelBuffer.SIZE.z);
        final Vector3i vector3i10 = max;
        vector3i10.z >>= 3;
        if (mod == 0) {
            final Vector3i vector3i11 = max;
            vector3i11.z += 2;
        }
        else {
            final Vector3i vector3i12 = max;
            ++vector3i12.z;
        }
        min.dropHash();
        max.dropHash();
        return new Bounds3i(min, max);
    }
    
    @Nonnull
    public static Bounds3i createColumnBounds_bufferGrid(@Nonnull final Vector3i position_bufferGrid, final int minY_bufferGrid, final int maxY_bufferGrid) {
        assert minY_bufferGrid <= maxY_bufferGrid;
        final Vector3i min = position_bufferGrid.clone();
        final Vector3i max = min.clone().add(Vector3i.ALL_ONES);
        min.y = minY_bufferGrid;
        max.y = maxY_bufferGrid;
        return new Bounds3i(min, max);
    }
    
    @Nonnull
    public static Bounds3i createChunkBounds_voxelGrid(final int x_chunkGrid, final int z_chunkGrid) {
        final Vector3i min = new Vector3i(x_chunkGrid << 5, 0, z_chunkGrid << 5);
        final Vector3i max = min.clone().add(32, 320, 32);
        return new Bounds3i(min, max);
    }
    
    @Nonnull
    public static Bounds3i createUnitBounds3i(@Nonnull final Vector3i position) {
        return new Bounds3i(position, position.clone().add(Vector3i.ALL_ONES));
    }
    
    @Nonnull
    public static Bounds3i createBounds_fromRadius_originVoxelInclusive(final int radius) {
        final Vector3i min = new Vector3i(-radius, -radius, -radius);
        final Vector3i max = new Vector3i(radius + 1, radius + 1, radius + 1);
        return new Bounds3i(min, max);
    }
    
    @Nonnull
    public static Bounds3i createBounds_fromVector_originVoxelInclusive(@Nonnull final Vector3i range) {
        final Vector3i min = new Vector3i(range).scale(-1);
        final Vector3i max = new Vector3i(range).add(Vector3i.ALL_ONES);
        return new Bounds3i(min, max);
    }
    
    @Nonnull
    public static Bounds3i createChunkBounds_bufferGrid(final int x_chunkGrid, final int z_chunkGrid) {
        final int bits = 2;
        final Vector3i min = new Vector3i(x_chunkGrid << 2, 0, z_chunkGrid << 2);
        final Vector3i max = new Vector3i(x_chunkGrid + 1 << 2, 40, z_chunkGrid + 1 << 2);
        return new Bounds3i(min, max);
    }
    
    public static void toVoxelGrid_fromBufferGrid(@Nonnull final Bounds3i bounds_bufferGrid) {
        assert bounds_bufferGrid.isCorrect();
        VectorUtil.bitShiftLeft(3, bounds_bufferGrid.min);
        VectorUtil.bitShiftLeft(3, bounds_bufferGrid.max);
    }
    
    public static void toVoxelGrid_fromBufferGrid(@Nonnull final Vector3i position_voxelGrid) {
        VectorUtil.bitShiftLeft(3, position_voxelGrid);
    }
    
    public static void toBufferGrid_fromVoxelGrid(@Nonnull final Vector3i worldPosition_voxelGrid) {
        VectorUtil.bitShiftRight(3, worldPosition_voxelGrid);
    }
    
    public static int toBufferDistanceInclusive_fromVoxelDistance(final int distance_voxelGrid) {
        final int distance_bufferGrid = distance_voxelGrid >> 3;
        if (Calculator.wrap(distance_voxelGrid, NVoxelBuffer.SIZE.x) == 0) {
            return distance_bufferGrid;
        }
        return distance_bufferGrid + 1;
    }
    
    @Nonnull
    public static Vector3i toIntegerGrid_fromDecimalGrid(@Nonnull final Vector3d worldPosition_decimalGrid) {
        final Vector3i position = new Vector3i();
        position.x = Calculator.toIntFloored(worldPosition_decimalGrid.x);
        position.y = Calculator.toIntFloored(worldPosition_decimalGrid.y);
        position.z = Calculator.toIntFloored(worldPosition_decimalGrid.z);
        return position;
    }
    
    public static void toVoxelGridInsideBuffer_fromWorldGrid(@Nonnull final Vector3i worldPosition_voxelGrid) {
        worldPosition_voxelGrid.x = Calculator.wrap(worldPosition_voxelGrid.x, NVoxelBuffer.SIZE.x);
        worldPosition_voxelGrid.y = Calculator.wrap(worldPosition_voxelGrid.y, NVoxelBuffer.SIZE.y);
        worldPosition_voxelGrid.z = Calculator.wrap(worldPosition_voxelGrid.z, NVoxelBuffer.SIZE.z);
    }
    
    public static int toIndexFromPositionYXZ(@Nonnull final Vector3i position, @Nonnull final Bounds3i bounds) {
        assert bounds.contains(position);
        final int x = position.x - bounds.min.x;
        final int y = position.y - bounds.min.y;
        final int z = position.z - bounds.min.z;
        final int sizeX = bounds.max.x - bounds.min.x;
        final int sizeY = bounds.max.y - bounds.min.y;
        return y + x * sizeY + z * sizeY * sizeX;
    }
    
    public static void setBoundsYToWorldHeight_bufferGrid(@Nonnull final Bounds3i bounds_bufferGrid) {
        assert bounds_bufferGrid.isCorrect();
        bounds_bufferGrid.min.setY(0);
        bounds_bufferGrid.max.setY(40);
    }
    
    public static void setBoundsYToWorldHeight_voxelGrid(@Nonnull final Bounds3i bounds_voxelGrid) {
        assert bounds_voxelGrid.isCorrect();
        bounds_voxelGrid.min.setY(0);
        bounds_voxelGrid.max.setY(320);
    }
    
    public static void toVoxelPosition_fromChunkPosition(@Nonnull final Vector3i chunkPosition_voxelGrid) {
        chunkPosition_voxelGrid.x <<= 5;
        chunkPosition_voxelGrid.z <<= 5;
    }
    
    static {
        BUFFER_COUNT_IN_CHUNK_Y = 320 / NVoxelBuffer.SIZE.y;
    }
}
