]> git.lizzy.rs Git - BoundingBoxOutlineReloaded.git/blob - src/main/java/com/irtimaled/bbor/client/ClientRenderer.java
4c6ba9d83d8715bc1347f0f1be685660de917a00
[BoundingBoxOutlineReloaded.git] / src / main / java / com / irtimaled / bbor / client / ClientRenderer.java
1 package com.irtimaled.bbor.client;
2
3 import com.irtimaled.bbor.client.config.ConfigManager;
4 import com.irtimaled.bbor.client.interop.ClientInterop;
5 import com.irtimaled.bbor.client.models.*;
6 import com.irtimaled.bbor.client.providers.*;
7 import com.irtimaled.bbor.client.renderers.*;
8 import com.irtimaled.bbor.common.MathHelper;
9 import com.irtimaled.bbor.common.models.AbstractBoundingBox;
10 import com.irtimaled.bbor.common.models.BoundingBoxCuboid;
11 import org.lwjgl.opengl.GL11;
12
13 import java.util.HashMap;
14 import java.util.HashSet;
15 import java.util.Map;
16 import java.util.Set;
17
18 public class ClientRenderer {
19     private static final int CHUNK_SIZE = 16;
20     private static final Map<Class<? extends AbstractBoundingBox>, AbstractRenderer> boundingBoxRendererMap = new HashMap<>();
21
22     private static boolean active;
23     private static final Set<IBoundingBoxProvider> providers = new HashSet<>();
24
25     public static boolean getActive() {
26         return active;
27     }
28
29     public static void toggleActive() {
30         active = !active;
31         if (!active) return;
32
33         Player.setActiveY();
34     }
35
36     static void deactivate() {
37         active = false;
38     }
39
40     static {
41         registerRenderer(BoundingBoxSlimeChunk.class, new SlimeChunkRenderer());
42         registerRenderer(BoundingBoxWorldSpawn.class, new WorldSpawnRenderer());
43         registerRenderer(BoundingBoxCuboid.class, new CuboidRenderer());
44         registerRenderer(BoundingBoxMobSpawner.class, new MobSpawnerRenderer());
45         registerRenderer(BoundingBoxSpawningSphere.class, new SpawningSphereRenderer());
46         registerRenderer(BoundingBoxBeacon.class, new BeaconRenderer());
47         registerRenderer(BoundingBoxBiomeBorder.class, new BiomeBorderRenderer());
48         registerRenderer(BoundingBoxConduit.class, new ConduitRenderer());
49         registerRenderer(BoundingBoxSpawnableBlocks.class, new SpawnableBlocksRenderer());
50         registerRenderer(BoundingBoxLine.class, new LineRenderer());
51         registerRenderer(BoundingBoxSphere.class, new SphereRenderer());
52
53         registerProvider(new SlimeChunkProvider());
54         registerProvider(new WorldSpawnProvider());
55         registerProvider(new SpawningSphereProvider());
56         registerProvider(new BeaconProvider());
57         registerProvider(new CustomBoxProvider());
58         registerProvider(new CustomBeaconProvider());
59         registerProvider(new BiomeBorderProvider());
60         registerProvider(new MobSpawnerProvider());
61         registerProvider(new ConduitProvider());
62         registerProvider(new SpawnableBlocksProvider());
63         registerProvider(new CustomLineProvider());
64         registerProvider(new CustomSphereProvider());
65     }
66
67     public static <T extends AbstractBoundingBox> void registerProvider(IBoundingBoxProvider<T> provider) {
68         providers.add(provider);
69     }
70
71     public static <T extends AbstractBoundingBox> void registerRenderer(Class<? extends T> type, AbstractRenderer<T> renderer) {
72         boundingBoxRendererMap.put(type, renderer);
73     }
74
75     private static boolean isWithinRenderDistance(AbstractBoundingBox boundingBox) {
76         int renderDistanceBlocks = ClientInterop.getRenderDistanceChunks() * CHUNK_SIZE;
77         int minX = MathHelper.floor(Player.getX() - renderDistanceBlocks);
78         int maxX = MathHelper.floor(Player.getX() + renderDistanceBlocks);
79         int minZ = MathHelper.floor(Player.getZ() - renderDistanceBlocks);
80         int maxZ = MathHelper.floor(Player.getZ() + renderDistanceBlocks);
81
82         return boundingBox.intersectsBounds(minX, minZ, maxX, maxZ);
83     }
84
85     public static void render(int dimensionId) {
86         if (!active) return;
87
88         Set<AbstractBoundingBox> boundingBoxes = getBoundingBoxes(dimensionId);
89
90         GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA);
91         GL11.glLineWidth(2.0f);
92         GL11.glDisable(GL11.GL_TEXTURE_2D);
93         GL11.glDisable(GL11.GL_CULL_FACE);
94
95         if (ConfigManager.alwaysVisible.get()) {
96             GL11.glClear(GL11.GL_DEPTH_BUFFER_BIT);
97         }
98
99         for (AbstractBoundingBox key : boundingBoxes) {
100             AbstractRenderer renderer = boundingBoxRendererMap.get(key.getClass());
101             if (renderer == null) continue;
102
103             renderer.render(key);
104         }
105
106         GL11.glPolygonMode(GL11.GL_FRONT_AND_BACK, GL11.GL_FILL);
107         GL11.glEnable(GL11.GL_CULL_FACE);
108         GL11.glEnable(GL11.GL_TEXTURE_2D);
109     }
110
111     private static Set<AbstractBoundingBox> getBoundingBoxes(int dimensionId) {
112         Set<AbstractBoundingBox> boundingBoxes = new HashSet<>();
113         for (IBoundingBoxProvider<?> provider : providers) {
114             if (provider.canProvide(dimensionId)) {
115                 for (AbstractBoundingBox boundingBox : provider.get(dimensionId)) {
116                     if (isWithinRenderDistance(boundingBox)) {
117                         boundingBoxes.add(boundingBox);
118                     }
119                 }
120             }
121         }
122         return boundingBoxes;
123     }
124 }