]> git.lizzy.rs Git - LightOverlay.git/blob - forge/src/main/java/me/shedaniel/lightoverlay/forge/FrustumHelper.java
918b4b295e56ee6b55f50571c91c08ab14dbaa4d
[LightOverlay.git] / forge / src / main / java / me / shedaniel / lightoverlay / forge / FrustumHelper.java
1 package me.shedaniel.lightoverlay.forge;
2
3 import net.minecraft.client.renderer.culling.ClippingHelper;
4 import net.minecraft.util.math.vector.Vector4f;
5
6 public class FrustumHelper {
7     public static boolean isVisible(ClippingHelper frustum, double minX, double minY, double minZ, double maxX, double maxY, double maxZ) {
8         float x1 = (float) (minX - frustum.cameraX);
9         float y1 = (float) (minY - frustum.cameraY);
10         float z1 = (float) (minZ - frustum.cameraZ);
11         float x2 = (float) (maxX - frustum.cameraX);
12         float y2 = (float) (maxY - frustum.cameraY);
13         float z2 = (float) (maxZ - frustum.cameraZ);
14         return isAnyCornerVisible(frustum, x1, y1, z1, x2, y2, z2);
15     }
16     
17     private static boolean isAnyCornerVisible(ClippingHelper frustum, float x1, float y1, float z1, float x2, float y2, float z2) {
18         Vector4f[] homogeneousCoordinates = frustum.frustum;
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) {
21                 return false;
22             }
23         }
24         
25         return true;
26     }
27     
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;
30     }
31 }