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

package com.hypixel.hytale.math.raycast;

import javax.annotation.Nonnull;

public class RaycastAABB
{
    public static final double EPSILON = -1.0E-8;
    
    public static double intersect(final double minX, final double minY, final double minZ, final double maxX, final double maxY, final double maxZ, final double ox, final double oy, final double oz, final double dx, final double dy, final double dz) {
        double tNear = Double.POSITIVE_INFINITY;
        double t = (minX - ox) / dx;
        if (t < tNear && t > -1.0E-8) {
            final double u = oz + dz * t;
            final double v = oy + dy * t;
            if (u >= minZ && u <= maxZ && v >= minY && v <= maxY) {
                tNear = t;
            }
        }
        t = (maxX - ox) / dx;
        if (t < tNear && t > -1.0E-8) {
            final double u = oz + dz * t;
            final double v = oy + dy * t;
            if (u >= minZ && u <= maxZ && v >= minY && v <= maxY) {
                tNear = t;
            }
        }
        t = (minY - oy) / dy;
        if (t < tNear && t > -1.0E-8) {
            final double u = ox + dx * t;
            final double v = oz + dz * t;
            if (u >= minX && u <= maxX && v >= minZ && v <= maxZ) {
                tNear = t;
            }
        }
        t = (maxY - oy) / dy;
        if (t < tNear && t > -1.0E-8) {
            final double u = ox + dx * t;
            final double v = oz + dz * t;
            if (u >= minX && u <= maxX && v >= minZ && v <= maxZ) {
                tNear = t;
            }
        }
        t = (minZ - oz) / dz;
        if (t < tNear && t > -1.0E-8) {
            final double u = ox + dx * t;
            final double v = oy + dy * t;
            if (u >= minX && u <= maxX && v >= minY && v <= maxY) {
                tNear = t;
            }
        }
        t = (maxZ - oz) / dz;
        if (t < tNear && t > -1.0E-8) {
            final double u = ox + dx * t;
            final double v = oy + dy * t;
            if (u >= minX && u <= maxX && v >= minY && v <= maxY) {
                tNear = t;
            }
        }
        return tNear;
    }
    
    public static void intersect(final double minX, final double minY, final double minZ, final double maxX, final double maxY, final double maxZ, final double ox, final double oy, final double oz, final double dx, final double dy, final double dz, @Nonnull final RaycastConsumer consumer) {
        double tNear = Double.POSITIVE_INFINITY;
        double nx = 0.0;
        double ny = 0.0;
        double nz = 0.0;
        double t = (minX - ox) / dx;
        if (t < tNear && t > -1.0E-8) {
            final double u = oz + dz * t;
            final double v = oy + dy * t;
            if (u >= minZ && u <= maxZ && v >= minY && v <= maxY) {
                tNear = t;
                nx = -1.0;
            }
        }
        t = (maxX - ox) / dx;
        if (t < tNear && t > -1.0E-8) {
            final double u = oz + dz * t;
            final double v = oy + dy * t;
            if (u >= minZ && u <= maxZ && v >= minY && v <= maxY) {
                tNear = t;
                nx = 1.0;
            }
        }
        t = (minY - oy) / dy;
        if (t < tNear && t > -1.0E-8) {
            final double u = ox + dx * t;
            final double v = oz + dz * t;
            if (u >= minX && u <= maxX && v >= minZ && v <= maxZ) {
                tNear = t;
                ny = -1.0;
            }
        }
        t = (maxY - oy) / dy;
        if (t < tNear && t > -1.0E-8) {
            final double u = ox + dx * t;
            final double v = oz + dz * t;
            if (u >= minX && u <= maxX && v >= minZ && v <= maxZ) {
                tNear = t;
                ny = 1.0;
            }
        }
        t = (minZ - oz) / dz;
        if (t < tNear && t > -1.0E-8) {
            final double u = ox + dx * t;
            final double v = oy + dy * t;
            if (u >= minX && u <= maxX && v >= minY && v <= maxY) {
                tNear = t;
                nz = -1.0;
            }
        }
        t = (maxZ - oz) / dz;
        if (t < tNear && t > -1.0E-8) {
            final double u = ox + dx * t;
            final double v = oy + dy * t;
            if (u >= minX && u <= maxX && v >= minY && v <= maxY) {
                tNear = t;
                nz = 1.0;
            }
        }
        consumer.accept(tNear != Double.POSITIVE_INFINITY, ox, oy, oz, dx, dy, dz, tNear, nx, ny, nz);
    }
    
    public static <T> void intersect(final double minX, final double minY, final double minZ, final double maxX, final double maxY, final double maxZ, final double ox, final double oy, final double oz, final double dx, final double dy, final double dz, @Nonnull final RaycastConsumerPlus1<T> consumer, final T obj1) {
        double tNear = Double.POSITIVE_INFINITY;
        double nx = 0.0;
        double ny = 0.0;
        double nz = 0.0;
        double t = (minX - ox) / dx;
        if (t < tNear && t > -1.0E-8) {
            final double u = oz + dz * t;
            final double v = oy + dy * t;
            if (u >= minZ && u <= maxZ && v >= minY && v <= maxY) {
                tNear = t;
                nx = -1.0;
            }
        }
        t = (maxX - ox) / dx;
        if (t < tNear && t > -1.0E-8) {
            final double u = oz + dz * t;
            final double v = oy + dy * t;
            if (u >= minZ && u <= maxZ && v >= minY && v <= maxY) {
                tNear = t;
                nx = 1.0;
            }
        }
        t = (minY - oy) / dy;
        if (t < tNear && t > -1.0E-8) {
            final double u = ox + dx * t;
            final double v = oz + dz * t;
            if (u >= minX && u <= maxX && v >= minZ && v <= maxZ) {
                tNear = t;
                ny = -1.0;
            }
        }
        t = (maxY - oy) / dy;
        if (t < tNear && t > -1.0E-8) {
            final double u = ox + dx * t;
            final double v = oz + dz * t;
            if (u >= minX && u <= maxX && v >= minZ && v <= maxZ) {
                tNear = t;
                ny = 1.0;
            }
        }
        t = (minZ - oz) / dz;
        if (t < tNear && t > -1.0E-8) {
            final double u = ox + dx * t;
            final double v = oy + dy * t;
            if (u >= minX && u <= maxX && v >= minY && v <= maxY) {
                tNear = t;
                nz = -1.0;
            }
        }
        t = (maxZ - oz) / dz;
        if (t < tNear && t > -1.0E-8) {
            final double u = ox + dx * t;
            final double v = oy + dy * t;
            if (u >= minX && u <= maxX && v >= minY && v <= maxY) {
                tNear = t;
                nz = 1.0;
            }
        }
        consumer.accept(tNear != Double.POSITIVE_INFINITY, ox, oy, oz, dx, dy, dz, tNear, nx, ny, nz, obj1);
    }
    
    public static <T, K> void intersect(final double minX, final double minY, final double minZ, final double maxX, final double maxY, final double maxZ, final double ox, final double oy, final double oz, final double dx, final double dy, final double dz, @Nonnull final RaycastConsumerPlus2<T, K> consumer, final T obj1, final K obj2) {
        double tNear = Double.POSITIVE_INFINITY;
        double nx = 0.0;
        double ny = 0.0;
        double nz = 0.0;
        double t = (minX - ox) / dx;
        if (t < tNear && t > -1.0E-8) {
            final double u = oz + dz * t;
            final double v = oy + dy * t;
            if (u >= minZ && u <= maxZ && v >= minY && v <= maxY) {
                tNear = t;
                nx = -1.0;
            }
        }
        t = (maxX - ox) / dx;
        if (t < tNear && t > -1.0E-8) {
            final double u = oz + dz * t;
            final double v = oy + dy * t;
            if (u >= minZ && u <= maxZ && v >= minY && v <= maxY) {
                tNear = t;
                nx = 1.0;
            }
        }
        t = (minY - oy) / dy;
        if (t < tNear && t > -1.0E-8) {
            final double u = ox + dx * t;
            final double v = oz + dz * t;
            if (u >= minX && u <= maxX && v >= minZ && v <= maxZ) {
                tNear = t;
                ny = -1.0;
            }
        }
        t = (maxY - oy) / dy;
        if (t < tNear && t > -1.0E-8) {
            final double u = ox + dx * t;
            final double v = oz + dz * t;
            if (u >= minX && u <= maxX && v >= minZ && v <= maxZ) {
                tNear = t;
                ny = 1.0;
            }
        }
        t = (minZ - oz) / dz;
        if (t < tNear && t > -1.0E-8) {
            final double u = ox + dx * t;
            final double v = oy + dy * t;
            if (u >= minX && u <= maxX && v >= minY && v <= maxY) {
                tNear = t;
                nz = -1.0;
            }
        }
        t = (maxZ - oz) / dz;
        if (t < tNear && t > -1.0E-8) {
            final double u = ox + dx * t;
            final double v = oy + dy * t;
            if (u >= minX && u <= maxX && v >= minY && v <= maxY) {
                tNear = t;
                nz = 1.0;
            }
        }
        consumer.accept(tNear != Double.POSITIVE_INFINITY, ox, oy, oz, dx, dy, dz, tNear, nx, ny, nz, obj1, obj2);
    }
    
    public static <T, K, L> void intersect(final double minX, final double minY, final double minZ, final double maxX, final double maxY, final double maxZ, final double ox, final double oy, final double oz, final double dx, final double dy, final double dz, @Nonnull final RaycastConsumerPlus3<T, K, L> consumer, final T obj1, final K obj2, final L obj3) {
        double tNear = Double.POSITIVE_INFINITY;
        double nx = 0.0;
        double ny = 0.0;
        double nz = 0.0;
        double t = (minX - ox) / dx;
        if (t < tNear && t > -1.0E-8) {
            final double u = oz + dz * t;
            final double v = oy + dy * t;
            if (u >= minZ && u <= maxZ && v >= minY && v <= maxY) {
                tNear = t;
                nx = -1.0;
            }
        }
        t = (maxX - ox) / dx;
        if (t < tNear && t > -1.0E-8) {
            final double u = oz + dz * t;
            final double v = oy + dy * t;
            if (u >= minZ && u <= maxZ && v >= minY && v <= maxY) {
                tNear = t;
                nx = 1.0;
            }
        }
        t = (minY - oy) / dy;
        if (t < tNear && t > -1.0E-8) {
            final double u = ox + dx * t;
            final double v = oz + dz * t;
            if (u >= minX && u <= maxX && v >= minZ && v <= maxZ) {
                tNear = t;
                ny = -1.0;
            }
        }
        t = (maxY - oy) / dy;
        if (t < tNear && t > -1.0E-8) {
            final double u = ox + dx * t;
            final double v = oz + dz * t;
            if (u >= minX && u <= maxX && v >= minZ && v <= maxZ) {
                tNear = t;
                ny = 1.0;
            }
        }
        t = (minZ - oz) / dz;
        if (t < tNear && t > -1.0E-8) {
            final double u = ox + dx * t;
            final double v = oy + dy * t;
            if (u >= minX && u <= maxX && v >= minY && v <= maxY) {
                tNear = t;
                nz = -1.0;
            }
        }
        t = (maxZ - oz) / dz;
        if (t < tNear && t > -1.0E-8) {
            final double u = ox + dx * t;
            final double v = oy + dy * t;
            if (u >= minX && u <= maxX && v >= minY && v <= maxY) {
                tNear = t;
                nz = 1.0;
            }
        }
        consumer.accept(tNear != Double.POSITIVE_INFINITY, ox, oy, oz, dx, dy, dz, tNear, nx, ny, nz, obj1, obj2, obj3);
    }
    
    @FunctionalInterface
    public interface RaycastConsumer
    {
        void accept(final boolean p0, final double p1, final double p2, final double p3, final double p4, final double p5, final double p6, final double p7, final double p8, final double p9, final double p10);
    }
    
    @FunctionalInterface
    public interface RaycastConsumerPlus1<T>
    {
        void accept(final boolean p0, final double p1, final double p2, final double p3, final double p4, final double p5, final double p6, final double p7, final double p8, final double p9, final double p10, final T p11);
    }
    
    @FunctionalInterface
    public interface RaycastConsumerPlus2<T, K>
    {
        void accept(final boolean p0, final double p1, final double p2, final double p3, final double p4, final double p5, final double p6, final double p7, final double p8, final double p9, final double p10, final T p11, final K p12);
    }
    
    @FunctionalInterface
    public interface RaycastConsumerPlus3<T, K, L>
    {
        void accept(final boolean p0, final double p1, final double p2, final double p3, final double p4, final double p5, final double p6, final double p7, final double p8, final double p9, final double p10, final T p11, final K p12, final L p13);
    }
}
