1 package com.irtimaled.bbor.client;
3 import net.minecraft.client.render.Frustum;
4 import net.minecraft.util.math.Box;
6 import java.util.concurrent.atomic.AtomicInteger;
8 public class RenderCulling {
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();
17 public static void setFrustum(Frustum frustum) {
18 RenderCulling.frustum = frustum;
21 public static void flushStats() {
22 synchronized (mutex) {
23 culledCountLast.set(culledCount.get());
24 totalCountLast.set(totalCount.get());
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();
37 if (totalCountLast != 0) {
38 return String.format("[BBOR] Rendering culling: %d / %d (%.1f%%)", culledCountLast, totalCountLast, (culledCountLast / (float) totalCountLast) * 100.0);
40 return "[BBOR] Rendering not enabled";
44 private static boolean cullFrustum(Box box) {
45 final Frustum frustum = RenderCulling.frustum;
46 if (frustum != null) {
47 return frustum.isVisible(box);
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));
57 public static boolean isVisibleCulling(Box box) {
58 final boolean cullResult = cullFrustum(box);
59 totalCount.incrementAndGet();
60 if (!cullResult) culledCount.incrementAndGet();