package com.hypixel.hytale.math.raycast;
import javax.annotation.Nonnull;
public class RaycastAABB {
public static final double EPSILON = -1.0E-8;
public RaycastAABB() {
}
public static double intersect(double minX, double minY, double minZ, double maxX, double maxY, double maxZ, double ox, double oy, double oz, double dx, double dy, double dz) {
double tNear = 1.0 / 0.0;
double t = (minX - ox) / dx;
if (t < tNear && t > -1.0E-8) {
double u = oz + dz * t;
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) {
double u = oz + dz * t;
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) {
double u = ox + dx * t;
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) {
double u = ox + dx * t;
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) {
double u = ox + dx * t;
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) {
double u = ox + dx * t;
double v = oy + dy * t;
if (u >= minX && u <= maxX && v >= minY && v <= maxY) {
tNear = t;
}
}
return tNear;
}
public static void intersect(double minX, double minY, double minZ, double maxX, double maxY, double maxZ, double ox, double oy, double oz, double dx, double dy, double dz, @Nonnull RaycastConsumer consumer) {
double tNear = 1.0 / 0.0;
double nx = 0.0;
double ny = 0.0;
double nz = 0.0;
double t = (minX - ox) / dx;
if (t < tNear && t > -1.0E-8) {
double u = oz + dz * t;
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) {
double u = oz + dz * t;
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) {
double u = ox + dx * t;
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) {
double u = ox + dx * t;
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) {
double u = ox + dx * t;
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) {
double u = ox + dx * t;
double v = oy + dy * t;
if (u >= minX && u <= maxX && v >= minY && v <= maxY) {
tNear = t;
nz = 1.0;
}
}
consumer.accept(tNear != 1.0 / 0.0, ox, oy, oz, dx, dy, dz, tNear, nx, ny, nz);
}
public static <T> void intersect(double minX, double minY, double minZ, double maxX, double maxY, double maxZ, double ox, double oy, double oz, double dx, double dy, double dz, @Nonnull RaycastConsumerPlus1<T> consumer, T obj1) {
double tNear = 1.0 / 0.0;
double nx = 0.0;
double ny = 0.0;
double nz = 0.0;
double t = (minX - ox) / dx;
if (t < tNear && t > -1.0E-8) {
double u = oz + dz * t;
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) {
double u = oz + dz * t;
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) {
double u = ox + dx * t;
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) {
double u = ox + dx * t;
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) {
double u = ox + dx * t;
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) {
double u = ox + dx * t;
double v = oy + dy * t;
if (u >= minX && u <= maxX && v >= minY && v <= maxY) {
tNear = t;
nz = 1.0;
}
}
consumer.accept(tNear != 1.0 / 0.0, ox, oy, oz, dx, dy, dz, tNear, nx, ny, nz, obj1);
}
public static <T, K> void intersect(double minX, double minY, double minZ, double maxX, double maxY, double maxZ, double ox, double oy, double oz, double dx, double dy, double dz, @Nonnull RaycastConsumerPlus2<T, K> consumer, T obj1, K obj2) {
double tNear = 1.0 / 0.0;
double nx = 0.0;
double ny = 0.0;
double nz = 0.0;
double t = (minX - ox) / dx;
if (t < tNear && t > -1.0E-8) {
double u = oz + dz * t;
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) {
double u = oz + dz * t;
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) {
double u = ox + dx * t;
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) {
double u = ox + dx * t;
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) {
double u = ox + dx * t;
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) {
double u = ox + dx * t;
double v = oy + dy * t;
if (u >= minX && u <= maxX && v >= minY && v <= maxY) {
tNear = t;
nz = 1.0;
}
}
consumer.accept(tNear != 1.0 / 0.0, ox, oy, oz, dx, dy, dz, tNear, nx, ny, nz, obj1, obj2);
}
public static <T, K, L> void intersect(double minX, double minY, double minZ, double maxX, double maxY, double maxZ, double ox, double oy, double oz, double dx, double dy, double dz, @Nonnull RaycastConsumerPlus3<T, K, L> consumer, T obj1, K obj2, L obj3) {
double tNear = 1.0 / 0.0;
double nx = 0.0;
double ny = 0.0;
double nz = 0.0;
double t = (minX - ox) / dx;
if (t < tNear && t > -1.0E-8) {
double u = oz + dz * t;
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) {
double u = oz + dz * t;
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) {
double u = ox + dx * t;
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) {
double u = ox + dx * t;
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) {
double u = ox + dx * t;
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) {
double u = ox + dx * t;
double v = oy + dy * t;
if (u >= minX && u <= maxX && v >= minY && v <= maxY) {
tNear = t;
nz = 1.0;
}
}
consumer.accept(tNear != 1.0 / 0.0, ox, oy, oz, dx, dy, dz, tNear, nx, ny, nz, obj1, obj2, obj3);
}
@FunctionalInterface
public interface RaycastConsumer {
void accept(boolean var1, double var2, double var4, double var6, double var8, double var10, double var12, double var14, double var16, double var18, double var20);
}
@FunctionalInterface
public interface RaycastConsumerPlus1<T> {
void accept(boolean var1, double var2, double var4, double var6, double var8, double var10, double var12, double var14, double var16, double var18, double var20, T var22);
}
@FunctionalInterface
public interface RaycastConsumerPlus2<T, K> {
void accept(boolean var1, double var2, double var4, double var6, double var8, double var10, double var12, double var14, double var16, double var18, double var20, T var22, K var23);
}
@FunctionalInterface
public interface RaycastConsumerPlus3<T, K, L> {
void accept(boolean var1, double var2, double var4, double var6, double var8, double var10, double var12, double var14, double var16, double var18, double var20, T var22, K var23, L var24);
}
}