]> git.lizzy.rs Git - BoundingBoxOutlineReloaded.git/blob - src/main/java/com/irtimaled/bbor/client/renderers/RenderBatch.java
General performance improvements and serverside fixes
[BoundingBoxOutlineReloaded.git] / src / main / java / com / irtimaled / bbor / client / renderers / RenderBatch.java
1 package com.irtimaled.bbor.client.renderers;
2
3 import com.irtimaled.bbor.client.Camera;
4 import com.irtimaled.bbor.client.models.Point;
5 import com.mojang.blaze3d.systems.RenderSystem;
6 import net.minecraft.client.render.BufferBuilder;
7 import net.minecraft.client.render.BufferRenderer;
8 import net.minecraft.client.render.GameRenderer;
9 import net.minecraft.client.render.VertexFormat;
10 import net.minecraft.client.render.VertexFormats;
11 import net.minecraft.client.util.math.MatrixStack;
12 import net.minecraft.util.math.Box;
13
14 import java.awt.*;
15 import java.util.concurrent.atomic.AtomicLong;
16
17 public class RenderBatch {
18
19     private static final BufferBuilder quadBufferBuilderNonMasked = new BufferBuilder(2097152);
20     private static final BufferBuilder quadBufferBuilderMasked = new BufferBuilder(2097152);
21     private static final BufferBuilder lineBufferBuilder = new BufferBuilder(2097152);
22
23     private static final Object mutex = new Object();
24     private static final AtomicLong quadNonMaskedCount = new AtomicLong(0L);
25     private static final AtomicLong quadMaskedCount = new AtomicLong(0L);
26     private static final AtomicLong lineCount = new AtomicLong(0L);
27     private static final AtomicLong quadNonMaskedCountLast = new AtomicLong(0L);
28     private static final AtomicLong quadMaskedCountLast = new AtomicLong(0L);
29     private static final AtomicLong lineCountLast = new AtomicLong(0L);
30
31     private static final AtomicLong lastDurationNanos = new AtomicLong(0L);
32
33     static void beginBatch() {
34         quadBufferBuilderMasked.begin(VertexFormat.DrawMode.QUADS, VertexFormats.POSITION_COLOR);
35         quadBufferBuilderNonMasked.begin(VertexFormat.DrawMode.QUADS, VertexFormats.POSITION_COLOR);
36         lineBufferBuilder.begin(VertexFormat.DrawMode.DEBUG_LINES, VertexFormats.POSITION_COLOR);
37     }
38
39     public static void drawSolidBox(MatrixStack.Entry matrixEntry, Box box, Color color, int alpha, boolean mask, boolean sameX, boolean sameY, boolean sameZ) {
40         final float minX = (float) box.minX;
41         final float minY = (float) box.minY;
42         final float minZ = (float) box.minZ;
43         final float maxX = (float) box.maxX;
44         final float maxY = (float) box.maxY;
45         final float maxZ = (float) box.maxZ;
46         final int red = color.getRed();
47         final int green = color.getGreen();
48         final int blue = color.getBlue();
49
50         final BufferBuilder bufferBuilder = mask ? RenderBatch.quadBufferBuilderMasked : RenderBatch.quadBufferBuilderNonMasked;
51
52         if (!sameX && !sameZ) {
53             if (mask) quadMaskedCount.getAndIncrement();
54             else quadNonMaskedCount.getAndIncrement();
55             bufferBuilder.vertex(matrixEntry.getModel(), minX, minY, minZ).color(red, green, blue, alpha).next();
56             bufferBuilder.vertex(matrixEntry.getModel(), maxX, minY, minZ).color(red, green, blue, alpha).next();
57             bufferBuilder.vertex(matrixEntry.getModel(), maxX, minY, maxZ).color(red, green, blue, alpha).next();
58             bufferBuilder.vertex(matrixEntry.getModel(), minX, minY, maxZ).color(red, green, blue, alpha).next();
59             if (!sameY) {
60                 if (mask) quadMaskedCount.getAndIncrement();
61                 else quadNonMaskedCount.getAndIncrement();
62                 bufferBuilder.vertex(matrixEntry.getModel(), minX, maxY, minZ).color(red, green, blue, alpha).next();
63                 bufferBuilder.vertex(matrixEntry.getModel(), minX, maxY, maxZ).color(red, green, blue, alpha).next();
64                 bufferBuilder.vertex(matrixEntry.getModel(), maxX, maxY, maxZ).color(red, green, blue, alpha).next();
65                 bufferBuilder.vertex(matrixEntry.getModel(), maxX, maxY, minZ).color(red, green, blue, alpha).next();
66             }
67         }
68
69         if (!sameX && !sameY) {
70             if (mask) quadMaskedCount.getAndIncrement();
71             else quadNonMaskedCount.getAndIncrement();
72             bufferBuilder.vertex(matrixEntry.getModel(), minX, minY, minZ).color(red, green, blue, alpha).next();
73             bufferBuilder.vertex(matrixEntry.getModel(), minX, maxY, minZ).color(red, green, blue, alpha).next();
74             bufferBuilder.vertex(matrixEntry.getModel(), maxX, maxY, minZ).color(red, green, blue, alpha).next();
75             bufferBuilder.vertex(matrixEntry.getModel(), maxX, minY, minZ).color(red, green, blue, alpha).next();
76             if (!sameZ) {
77                 if (mask) quadMaskedCount.getAndIncrement();
78                 else quadNonMaskedCount.getAndIncrement();
79                 bufferBuilder.vertex(matrixEntry.getModel(), minX, minY, maxZ).color(red, green, blue, alpha).next();
80                 bufferBuilder.vertex(matrixEntry.getModel(), maxX, minY, maxZ).color(red, green, blue, alpha).next();
81                 bufferBuilder.vertex(matrixEntry.getModel(), maxX, maxY, maxZ).color(red, green, blue, alpha).next();
82                 bufferBuilder.vertex(matrixEntry.getModel(), minX, maxY, maxZ).color(red, green, blue, alpha).next();
83             }
84         }
85
86         if (!sameY && !sameZ) {
87             if (mask) quadMaskedCount.getAndIncrement();
88             else quadNonMaskedCount.getAndIncrement();
89             bufferBuilder.vertex(matrixEntry.getModel(), minX, minY, minZ).color(red, green, blue, alpha).next();
90             bufferBuilder.vertex(matrixEntry.getModel(), minX, minY, maxZ).color(red, green, blue, alpha).next();
91             bufferBuilder.vertex(matrixEntry.getModel(), minX, maxY, maxZ).color(red, green, blue, alpha).next();
92             bufferBuilder.vertex(matrixEntry.getModel(), minX, maxY, minZ).color(red, green, blue, alpha).next();
93             if (!sameX) {
94                 if (mask) quadMaskedCount.getAndIncrement();
95                 else quadNonMaskedCount.getAndIncrement();
96                 bufferBuilder.vertex(matrixEntry.getModel(), maxX, minY, minZ).color(red, green, blue, alpha).next();
97                 bufferBuilder.vertex(matrixEntry.getModel(), maxX, maxY, minZ).color(red, green, blue, alpha).next();
98                 bufferBuilder.vertex(matrixEntry.getModel(), maxX, maxY, maxZ).color(red, green, blue, alpha).next();
99                 bufferBuilder.vertex(matrixEntry.getModel(), maxX, minY, maxZ).color(red, green, blue, alpha).next();
100             }
101         }
102     }
103
104     static void drawLine(MatrixStack.Entry matrixEntry, Point startPoint, Point endPoint, Color color, int alpha) {
105         int regionX = (((int) Camera.getX()) >> 9) * 512;
106         int regionZ = (((int) Camera.getZ()) >> 9) * 512;
107
108         lineCount.getAndIncrement();
109
110         lineBufferBuilder
111                 .vertex(matrixEntry.getModel(),
112                         (float) startPoint.getX() - regionX,
113                         (float) startPoint.getY(),
114                         (float) startPoint.getZ() - regionZ)
115                 .color(color.getRed(), color.getGreen(), color.getBlue(), alpha)
116                 .next();
117         lineBufferBuilder
118                 .vertex(matrixEntry.getModel(),
119                         (float) endPoint.getX() - regionX,
120                         (float) endPoint.getY(),
121                         (float) endPoint.getZ() - regionZ)
122                 .color(color.getRed(), color.getGreen(), color.getBlue(), alpha)
123                 .next();
124     }
125
126     static void endBatch() {
127         RenderSystem.setShader(GameRenderer::getPositionColorShader);
128         long startTime = System.nanoTime();
129         quadBufferBuilderMasked.end();
130         quadBufferBuilderNonMasked.end();
131         lineBufferBuilder.end();
132
133         synchronized (mutex) {
134             quadMaskedCountLast.set(quadMaskedCount.get());
135             quadNonMaskedCountLast.set(quadNonMaskedCount.get());
136             lineCountLast.set(lineCount.get());
137             quadMaskedCount.set(0);
138             quadNonMaskedCount.set(0);
139             lineCount.set(0);
140         }
141
142         RenderSystem.depthMask(true);
143         BufferRenderer.draw(quadBufferBuilderMasked);
144         BufferRenderer.draw(lineBufferBuilder);
145
146         RenderSystem.depthMask(false);
147         BufferRenderer.draw(quadBufferBuilderNonMasked);
148         lastDurationNanos.set(System.nanoTime() - startTime);
149
150         RenderSystem.depthMask(true);
151     }
152
153     public static String debugString() {
154         return String.format("[BBOR] Statistics: Filled faces: %d,%d Lines: %d @ %.2fms", quadMaskedCountLast.get(), quadNonMaskedCountLast.get(), lineCountLast.get(), lastDurationNanos.get() / 1_000_000.0);
155     }
156
157 }