]> git.lizzy.rs Git - BoundingBoxOutlineReloaded.git/blob - src/main/java/com/irtimaled/bbor/client/RenderCulling.java
General performance improvements and serverside fixes
[BoundingBoxOutlineReloaded.git] / src / main / java / com / irtimaled / bbor / client / RenderCulling.java
1 package com.irtimaled.bbor.client;
2
3 import net.minecraft.client.render.Frustum;
4 import net.minecraft.util.math.Box;
5
6 import java.util.concurrent.atomic.AtomicInteger;
7
8 public class RenderCulling {
9
10     private static volatile Frustum frustum = null;
11     private static final Object mutex = new Object();
12     private static final AtomicInteger culledCount = new AtomicInteger();
13     private static final AtomicInteger totalCount = new AtomicInteger();
14     private static final AtomicInteger culledCountLast = new AtomicInteger();
15     private static final AtomicInteger totalCountLast = new AtomicInteger();
16
17     public static void setFrustum(Frustum frustum) {
18         RenderCulling.frustum = frustum;
19     }
20
21     public static void flushStats() {
22         synchronized (mutex) {
23             culledCountLast.set(culledCount.get());
24             totalCountLast.set(totalCount.get());
25             culledCount.set(0);
26             totalCount.set(0);
27         }
28     }
29
30     public static String debugString() {
31         final int culledCountLast;
32         final int totalCountLast;
33         synchronized (mutex) {
34             culledCountLast = RenderCulling.culledCountLast.get();
35             totalCountLast = RenderCulling.totalCountLast.get();
36         }
37         if (totalCountLast != 0) {
38             return String.format("[BBOR] Rendering culling: %d / %d (%.1f%%)", culledCountLast, totalCountLast, (culledCountLast / (float) totalCountLast) * 100.0);
39         } else {
40             return "[BBOR] Rendering not enabled";
41         }
42     }
43
44     private static boolean cullFrustum(Box box) {
45         final Frustum frustum = RenderCulling.frustum;
46         if (frustum != null) {
47             return frustum.isVisible(box);
48         } else {
49             return true;
50         }
51     }
52
53     public static boolean isVisibleCulling(double minX, double minY, double minZ, double maxX, double maxY, double maxZ) {
54         return isVisibleCulling(new Box(minX, minY, minZ, maxX, maxY, maxZ));
55     }
56
57     public static boolean isVisibleCulling(Box box) {
58         final boolean cullResult = cullFrustum(box);
59         totalCount.incrementAndGet();
60         if (!cullResult) culledCount.incrementAndGet();
61         return cullResult;
62     }
63
64 }