]> git.lizzy.rs Git - BoundingBoxOutlineReloaded.git/blob - src/main/java/com/irtimaled/bbor/client/renderers/VillageRenderer.java
Add mob spawner bounding boxes
[BoundingBoxOutlineReloaded.git] / src / main / java / com / irtimaled / bbor / client / renderers / VillageRenderer.java
1 package com.irtimaled.bbor.client.renderers;
2
3 import com.irtimaled.bbor.common.models.BoundingBoxVillage;
4 import com.irtimaled.bbor.config.ConfigManager;
5 import net.minecraft.client.renderer.BufferBuilder;
6 import net.minecraft.client.renderer.Tessellator;
7 import net.minecraft.client.renderer.vertex.DefaultVertexFormats;
8 import net.minecraft.util.math.AxisAlignedBB;
9 import net.minecraft.util.math.BlockPos;
10 import org.lwjgl.opengl.GL11;
11
12 import java.awt.*;
13 import java.util.HashSet;
14 import java.util.Set;
15
16 public class VillageRenderer extends Renderer<BoundingBoxVillage> {
17     @Override
18     public void render(BoundingBoxVillage boundingBox) {
19         if (ConfigManager.renderVillageAsSphere.getBoolean()) {
20             renderBoundingBoxVillageAsSphere(boundingBox);
21         } else {
22             renderBoundingBox(boundingBox);
23         }
24         if (ConfigManager.drawIronGolemSpawnArea.getBoolean() &&
25                 boundingBox.getSpawnsIronGolems()) {
26             renderIronGolemSpawnArea(boundingBox);
27         }
28         if (ConfigManager.drawVillageDoors.getBoolean()) {
29             renderVillageDoors(boundingBox);
30         }
31     }
32
33     private void renderIronGolemSpawnArea(BoundingBoxVillage boundingBox) {
34         BlockPos center = boundingBox.getCenter();
35         AxisAlignedBB abb = new AxisAlignedBB(new BlockPos(center.getX() - 8,
36                 center.getY() - 3,
37                 center.getZ() - 8),
38                 new BlockPos(center.getX() + 8,
39                         center.getY() + 3,
40                         center.getZ() + 8))
41                 .offset(boundingBox.getCenterOffsetX(), 0.0, boundingBox.getCenterOffsetZ());
42
43         renderCuboid(abb, boundingBox.getColor(), false);
44     }
45
46     private void renderVillageDoors(BoundingBoxVillage boundingBox) {
47         OffsetPoint center = new OffsetPoint(boundingBox.getCenter())
48                 .add(boundingBox.getCenterOffsetX(), 0.0, boundingBox.getCenterOffsetZ());
49         Color color = boundingBox.getColor();
50         GL11.glPolygonMode(GL11.GL_FRONT_AND_BACK, GL11.GL_LINE);
51         Tessellator tessellator = Tessellator.getInstance();
52         BufferBuilder worldRenderer = tessellator.getBuffer();
53
54         int colorR = color.getRed();
55         int colorG = color.getGreen();
56         int colorB = color.getBlue();
57
58         worldRenderer.begin(GL11.GL_LINES, worldRenderer.getVertexFormat());
59         for (BlockPos door : boundingBox.getDoors()) {
60             OffsetPoint point = new OffsetPoint(door).add(0.5, 0, 0.5);
61
62             worldRenderer.pos(point.getX(), point.getY(), point.getZ()).color(colorR, colorG, colorB, 255).endVertex();
63             worldRenderer.pos(center.getX(), center.getY(), center.getZ()).color(colorR, colorG, colorB, 255).endVertex();
64         }
65         tessellator.draw();
66     }
67
68     private void renderBoundingBoxVillageAsSphere(BoundingBoxVillage boundingBox) {
69         OffsetPoint center = new OffsetPoint(boundingBox.getCenter())
70                 .add(boundingBox.getCenterOffsetX(), 0.0, boundingBox.getCenterOffsetZ());
71         int radius = boundingBox.getRadius();
72         Color color = boundingBox.getColor();
73         renderSphere(center, radius, color);
74     }
75
76     private void renderSphere(OffsetPoint center, double radius, Color color) {
77         GL11.glEnable(GL11.GL_POINT_SMOOTH);
78         GL11.glPointSize(2f);
79
80         Tessellator tessellator = Tessellator.getInstance();
81         BufferBuilder worldRenderer = tessellator.getBuffer();
82         worldRenderer.begin(GL11.GL_POINTS, DefaultVertexFormats.POSITION_COLOR);
83         for (OffsetPoint point : buildPoints(center, radius)) {
84             worldRenderer.pos(point.getX(), point.getY(), point.getZ())
85                     .color(color.getRed(), color.getGreen(), color.getBlue(), 255)
86                     .endVertex();
87         }
88         tessellator.draw();
89     }
90
91     private Set<OffsetPoint> buildPoints(OffsetPoint center, double radius) {
92         Set<OffsetPoint> points = new HashSet<>(1200);
93
94         double tau = 6.283185307179586D;
95         double pi = tau / 2D;
96         double segment = tau / 48D;
97
98         for (double t = 0.0D; t < tau; t += segment)
99             for (double theta = 0.0D; theta < pi; theta += segment) {
100                 double dx = radius * Math.sin(t) * Math.cos(theta);
101                 double dz = radius * Math.sin(t) * Math.sin(theta);
102                 double dy = radius * Math.cos(t);
103
104                 points.add(center.add(dx, dy, dz));
105             }
106         return points;
107     }
108 }