1 package me.shedaniel.lightoverlay.fabric;
3 import net.minecraft.client.render.Frustum;
4 import net.minecraft.client.util.math.Vector4f;
6 public class FrustumHelper {
7 public static boolean isVisible(Frustum frustum, double minX, double minY, double minZ, double maxX, double maxY, double maxZ) {
8 float x1 = (float) (minX - frustum.x);
9 float y1 = (float) (minY - frustum.y);
10 float z1 = (float) (minZ - frustum.z);
11 float x2 = (float) (maxX - frustum.x);
12 float y2 = (float) (maxY - frustum.y);
13 float z2 = (float) (maxZ - frustum.z);
14 return isAnyCornerVisible(frustum, x1, y1, z1, x2, y2, z2);
17 private static boolean isAnyCornerVisible(Frustum frustum, float x1, float y1, float z1, float x2, float y2, float z2) {
18 Vector4f[] homogeneousCoordinates = frustum.homogeneousCoordinates;
19 for (Vector4f vector4f : homogeneousCoordinates) {
20 if (dotProduct(vector4f, x1, y1, z1, 1.0F) <= 0.0F && dotProduct(vector4f, x2, y1, z1, 1.0F) <= 0.0F && dotProduct(vector4f, x1, y2, z1, 1.0F) <= 0.0F && dotProduct(vector4f, x2, y2, z1, 1.0F) <= 0.0F && dotProduct(vector4f, x1, y1, z2, 1.0F) <= 0.0F && dotProduct(vector4f, x2, y1, z2, 1.0F) <= 0.0F && dotProduct(vector4f, x1, y2, z2, 1.0F) <= 0.0F && dotProduct(vector4f, x2, y2, z2, 1.0F) <= 0.0F) {
28 private static float dotProduct(Vector4f self, float x, float y, float z, float w) {
29 return self.getX() * x + self.getY() * y + self.getZ() * z + self.getW() * w;