Skip to content

Commit b5815ff

Browse files
Add renderer with depth test enabled into Render3DEvent, improvements to MeshBuilder
* eagerly resize meshbuilder buffers * forgot capacity check * lazily allocate buffers * pre-sized mesh builders * add depth-tested buffers to renderer3d * more depth overloads * use `Renderer3D` for `LightOverlay` * use a separate `Renderer3D` object for depth-test * Add missing ensureCapacity call to FullScreenRenderer * fix buffer resize crash when using pre-sized meshbuilder ctor * correct primitive vertex size * add dev environment debugging * unmagic the numbers * Add debug call into MeshBuilder.color() --------- Co-authored-by: MineGame159 <[email protected]>
1 parent 1643f09 commit b5815ff

File tree

10 files changed

+134
-58
lines changed

10 files changed

+134
-58
lines changed

src/main/java/meteordevelopment/meteorclient/events/render/Render3DEvent.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,13 +14,15 @@ public class Render3DEvent {
1414

1515
public MatrixStack matrices;
1616
public Renderer3D renderer;
17+
public Renderer3D depthRenderer;
1718
public double frameTime;
1819
public float tickDelta;
1920
public double offsetX, offsetY, offsetZ;
2021

21-
public static Render3DEvent get(MatrixStack matrices, Renderer3D renderer, float tickDelta, double offsetX, double offsetY, double offsetZ) {
22+
public static Render3DEvent get(MatrixStack matrices, Renderer3D renderer, Renderer3D depthRenderer, float tickDelta, double offsetX, double offsetY, double offsetZ) {
2223
INSTANCE.matrices = matrices;
2324
INSTANCE.renderer = renderer;
25+
INSTANCE.depthRenderer = depthRenderer;
2426
INSTANCE.frameTime = Utils.frameTime;
2527
INSTANCE.tickDelta = tickDelta;
2628
INSTANCE.offsetX = offsetX;

src/main/java/meteordevelopment/meteorclient/gui/renderer/GuiDebugRenderer.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,8 @@ private void lineBox(double x, double y, double width, double height, Color colo
5353
}
5454

5555
private void line(double x1, double y1, double x2, double y2, Color color) {
56+
mesh.ensureLineCapacity();
57+
5658
mesh.line(
5759
mesh.vec3(x1, y1, 0).color(color).next(),
5860
mesh.vec3(x2, y2, 0).color(color).next()

src/main/java/meteordevelopment/meteorclient/mixin/GameRendererMixin.java

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
import meteordevelopment.meteorclient.events.render.Render3DEvent;
1515
import meteordevelopment.meteorclient.events.render.RenderAfterWorldEvent;
1616
import meteordevelopment.meteorclient.mixininterface.IVec3d;
17+
import meteordevelopment.meteorclient.renderer.MeteorRenderPipelines;
1718
import meteordevelopment.meteorclient.renderer.Renderer3D;
1819
import meteordevelopment.meteorclient.systems.modules.Modules;
1920
import meteordevelopment.meteorclient.systems.modules.player.LiquidInteract;
@@ -64,6 +65,9 @@ public abstract class GameRendererMixin {
6465
@Unique
6566
private Renderer3D renderer;
6667

68+
@Unique
69+
private Renderer3D depthRenderer;
70+
6771
@Unique
6872
private final MatrixStack matrices = new MatrixStack();
6973

@@ -81,8 +85,9 @@ private void onRenderWorld(RenderTickCounter tickCounter, CallbackInfo ci, @Loca
8185

8286
// Create renderer and event
8387

84-
if (renderer == null) renderer = new Renderer3D();
85-
Render3DEvent event = Render3DEvent.get(matrixStack, renderer, tickDelta, camera.getPos().x, camera.getPos().y, camera.getPos().z);
88+
if (renderer == null) renderer = new Renderer3D(MeteorRenderPipelines.WORLD_COLORED_LINES, MeteorRenderPipelines.WORLD_COLORED);
89+
if (depthRenderer == null) depthRenderer = new Renderer3D(MeteorRenderPipelines.WORLD_COLORED_LINES_DEPTH, MeteorRenderPipelines.WORLD_COLORED_DEPTH);
90+
Render3DEvent event = Render3DEvent.get(matrixStack, renderer, depthRenderer, tickDelta, camera.getPos().x, camera.getPos().y, camera.getPos().z);
8691

8792
// Call utility classes
8893

@@ -102,8 +107,10 @@ private void onRenderWorld(RenderTickCounter tickCounter, CallbackInfo ci, @Loca
102107
// Render
103108

104109
renderer.begin();
110+
depthRenderer.begin();
105111
MeteorClient.EVENT_BUS.post(event);
106112
renderer.render(matrixStack);
113+
depthRenderer.render(matrixStack);
107114

108115
// Revert model view matrix
109116

src/main/java/meteordevelopment/meteorclient/renderer/FullScreenRenderer.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,8 +15,10 @@ private FullScreenRenderer() {}
1515

1616
@PreInit
1717
public static void init() {
18-
mesh = new MeshBuilder(MeteorVertexFormats.POS2, VertexFormat.DrawMode.TRIANGLES);
18+
mesh = new MeshBuilder(MeteorVertexFormats.POS2, VertexFormat.DrawMode.TRIANGLES, 4, 6);
19+
1920
mesh.begin();
21+
mesh.ensureQuadCapacity();
2022

2123
mesh.quad(
2224
mesh.vec2(-1, -1).next(),

src/main/java/meteordevelopment/meteorclient/renderer/MeshBuilder.java

Lines changed: 67 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
import com.mojang.blaze3d.vertex.VertexFormat;
1111
import meteordevelopment.meteorclient.utils.Utils;
1212
import meteordevelopment.meteorclient.utils.render.color.Color;
13+
import net.fabricmc.loader.api.FabricLoader;
1314
import net.minecraft.util.math.Vec3d;
1415
import org.lwjgl.BufferUtils;
1516

@@ -19,16 +20,18 @@
1920
import static org.lwjgl.system.MemoryUtil.*;
2021

2122
public class MeshBuilder {
23+
private static final boolean DEBUG = FabricLoader.getInstance().isDevelopmentEnvironment() || Boolean.getBoolean("meteor.render.debug");
24+
2225
public double alpha = 1;
2326

2427
private final VertexFormat format;
2528
private final int primitiveVerticesSize;
2629
private final int primitiveIndicesCount;
2730

28-
private ByteBuffer vertices;
31+
private ByteBuffer vertices = null;
2932
private long verticesPointerStart, verticesPointer;
3033

31-
private ByteBuffer indices;
34+
private ByteBuffer indices = null;
3235
private long indicesPointer;
3336

3437
private int vertexI, indicesCount;
@@ -42,14 +45,13 @@ public MeshBuilder(RenderPipeline pipeline) {
4245

4346
public MeshBuilder(VertexFormat format, VertexFormat.DrawMode drawMode) {
4447
this.format = format;
45-
primitiveVerticesSize = format.getVertexSize() * drawMode.firstVertexCount;
48+
primitiveVerticesSize = format.getVertexSize();
4649
primitiveIndicesCount = drawMode.firstVertexCount;
50+
}
4751

48-
vertices = BufferUtils.createByteBuffer(primitiveVerticesSize * 256 * 4);
49-
verticesPointerStart = memAddress0(vertices);
50-
51-
indices = BufferUtils.createByteBuffer(primitiveIndicesCount * 512 * 4);
52-
indicesPointer = memAddress0(indices);
52+
public MeshBuilder(VertexFormat format, VertexFormat.DrawMode drawMode, int vertexCount, int indexCount) {
53+
this(format, drawMode);
54+
allocateBuffers(vertexCount, indexCount);
5355
}
5456

5557
public void begin() {
@@ -74,6 +76,8 @@ public void begin() {
7476
}
7577

7678
public MeshBuilder vec3(double x, double y, double z) {
79+
debugVertexBufferCapacity();
80+
7781
long p = verticesPointer;
7882

7983
memPutFloat(p, (float) (x - cameraX));
@@ -85,6 +89,8 @@ public MeshBuilder vec3(double x, double y, double z) {
8589
}
8690

8791
public MeshBuilder vec2(double x, double y) {
92+
debugVertexBufferCapacity();
93+
8894
long p = verticesPointer;
8995

9096
memPutFloat(p, (float) x);
@@ -95,6 +101,8 @@ public MeshBuilder vec2(double x, double y) {
95101
}
96102

97103
public MeshBuilder color(Color c) {
104+
debugVertexBufferCapacity();
105+
98106
long p = verticesPointer;
99107

100108
memPutByte(p, (byte) c.r);
@@ -111,16 +119,19 @@ public int next() {
111119
}
112120

113121
public void line(int i1, int i2) {
122+
debugIndexBufferCapacity();
123+
114124
long p = indicesPointer + indicesCount * 4L;
115125

116126
memPutInt(p, i1);
117127
memPutInt(p + 4, i2);
118128

119129
indicesCount += 2;
120-
growIfNeeded();
121130
}
122131

123132
public void quad(int i1, int i2, int i3, int i4) {
133+
debugIndexBufferCapacity();
134+
124135
long p = indicesPointer + indicesCount * 4L;
125136

126137
memPutInt(p, i1);
@@ -132,27 +143,45 @@ public void quad(int i1, int i2, int i3, int i4) {
132143
memPutInt(p + 20, i1);
133144

134145
indicesCount += 6;
135-
growIfNeeded();
136146
}
137147

138148
public void triangle(int i1, int i2, int i3) {
149+
debugIndexBufferCapacity();
150+
139151
long p = indicesPointer + indicesCount * 4L;
140152

141153
memPutInt(p, i1);
142154
memPutInt(p + 4, i2);
143155
memPutInt(p + 8, i3);
144156

145157
indicesCount += 3;
146-
growIfNeeded();
147158
}
148159

149-
public void growIfNeeded() {
150-
// Vertices
151-
if ((vertexI + 1) * primitiveVerticesSize >= vertices.capacity()) {
152-
int offset = getVerticesOffset();
160+
public void ensureQuadCapacity() {
161+
ensureCapacity(4, 6);
162+
}
163+
164+
public void ensureTriCapacity() {
165+
ensureCapacity(3, 3);
166+
}
167+
168+
public void ensureLineCapacity() {
169+
ensureCapacity(2, 2);
170+
}
153171

172+
public void ensureCapacity(int vertexCount, int indexCount) {
173+
if (DEBUG && (indexCount % primitiveIndicesCount != 0)) {
174+
throw new IllegalArgumentException("Unexpected amount of indices written to MeshBuilder.");
175+
}
176+
177+
if (vertices == null || indices == null) {
178+
allocateBuffers(256 * 4, 512 * 4);
179+
return;
180+
}
181+
182+
if ((vertexI + vertexCount) * primitiveVerticesSize >= vertices.capacity()) {
183+
int offset = getVerticesOffset();
154184
int newSize = vertices.capacity() * 2;
155-
if (newSize % primitiveVerticesSize != 0) newSize += newSize % primitiveVerticesSize;
156185

157186
ByteBuffer newVertices = BufferUtils.createByteBuffer(newSize);
158187
memCopy(memAddress0(vertices), memAddress0(newVertices), offset);
@@ -162,10 +191,8 @@ public void growIfNeeded() {
162191
verticesPointer = verticesPointerStart + offset;
163192
}
164193

165-
// Indices
166-
if (indicesCount * 4 >= indices.capacity()) {
194+
if ((indicesCount + indexCount) * Integer.BYTES >= indices.capacity()) {
167195
int newSize = indices.capacity() * 2;
168-
if (newSize % primitiveIndicesCount != 0) newSize += newSize % (primitiveIndicesCount * 4);
169196

170197
ByteBuffer newIndices = BufferUtils.createByteBuffer(newSize);
171198
memCopy(memAddress0(indices), memAddress0(newIndices), indicesCount * 4L);
@@ -175,6 +202,14 @@ public void growIfNeeded() {
175202
}
176203
}
177204

205+
private void allocateBuffers(int vertexCount, int indexCount) {
206+
vertices = BufferUtils.createByteBuffer(primitiveVerticesSize * vertexCount);
207+
verticesPointer = verticesPointerStart = memAddress0(vertices);
208+
209+
indices = BufferUtils.createByteBuffer(indexCount * Integer.BYTES);
210+
indicesPointer = memAddress0(indices);
211+
}
212+
178213
public void end() {
179214
if (!building) throw new IllegalStateException("Mesh.end() called while not building.");
180215

@@ -191,7 +226,7 @@ public GpuBuffer getVertexBuffer() {
191226
}
192227

193228
public GpuBuffer getIndexBuffer() {
194-
indices.limit(indicesCount * 4);
229+
indices.limit(indicesCount * Integer.BYTES);
195230
return format.uploadImmediateIndexBuffer(indices);
196231
}
197232

@@ -202,4 +237,16 @@ public int getIndicesCount() {
202237
private int getVerticesOffset() {
203238
return (int) (verticesPointer - verticesPointerStart);
204239
}
240+
241+
private void debugVertexBufferCapacity() {
242+
if (DEBUG && vertexI * primitiveVerticesSize >= vertices.capacity()) {
243+
throw new IndexOutOfBoundsException("Vertices written to MeshBuilder without calling 'ensureCapacity()' first!");
244+
}
245+
}
246+
247+
private void debugIndexBufferCapacity() {
248+
if (DEBUG && indicesCount * Integer.BYTES >= indices.capacity()) {
249+
throw new IndexOutOfBoundsException("Indices written to MeshBuilder without calling 'ensureCapacity()' first!");
250+
}
251+
}
205252
}

src/main/java/meteordevelopment/meteorclient/renderer/Renderer2D.java

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -81,6 +81,8 @@ public void render(Consumer<RenderPass> setupCallback) {
8181

8282
// Tris
8383
public void triangle(double x1, double y1, double x2, double y2, double x3, double y3, Color color) {
84+
triangles.ensureTriCapacity();
85+
8486
triangles.triangle(
8587
triangles.vec2(x1, y1).color(color).next(),
8688
triangles.vec2(x2, y2).color(color).next(),
@@ -91,13 +93,17 @@ public void triangle(double x1, double y1, double x2, double y2, double x3, doub
9193
// Lines
9294

9395
public void line(double x1, double y1, double x2, double y2, Color color) {
96+
lines.ensureLineCapacity();
97+
9498
lines.line(
9599
lines.vec2(x1, y1).color(color).next(),
96100
lines.vec2(x2, y2).color(color).next()
97101
);
98102
}
99103

100104
public void boxLines(double x, double y, double width, double height, Color color) {
105+
lines.ensureCapacity(4, 8);
106+
101107
int i1 = lines.vec2(x, y).color(color).next();
102108
int i2 = lines.vec2(x, y + height).color(color).next();
103109
int i3 = lines.vec2(x + width, y + height).color(color).next();
@@ -112,6 +118,8 @@ public void boxLines(double x, double y, double width, double height, Color colo
112118
// Quads
113119

114120
public void quad(double x, double y, double width, double height, Color cTopLeft, Color cTopRight, Color cBottomRight, Color cBottomLeft) {
121+
triangles.ensureQuadCapacity();
122+
115123
triangles.quad(
116124
triangles.vec2(x, y).color(cTopLeft).next(),
117125
triangles.vec2(x, y + height).color(cBottomLeft).next(),
@@ -127,6 +135,8 @@ public void quad(double x, double y, double width, double height, Color color) {
127135
// Textured quads
128136

129137
public void texQuad(double x, double y, double width, double height, Color color) {
138+
triangles.ensureQuadCapacity();
139+
130140
triangles.quad(
131141
triangles.vec2(x, y).vec2(0, 0).color(color).next(),
132142
triangles.vec2(x, y + height).vec2(0, 1).color(color).next(),
@@ -136,6 +146,8 @@ public void texQuad(double x, double y, double width, double height, Color color
136146
}
137147

138148
public void texQuad(double x, double y, double width, double height, TextureRegion texture, Color color) {
149+
triangles.ensureQuadCapacity();
150+
139151
triangles.quad(
140152
triangles.vec2(x, y).vec2(texture.x1, texture.y1).color(color).next(),
141153
triangles.vec2(x, y + height).vec2(texture.x1, texture.y2).color(color).next(),
@@ -145,6 +157,8 @@ public void texQuad(double x, double y, double width, double height, TextureRegi
145157
}
146158

147159
public void texQuad(double x, double y, double width, double height, double rotation, double texX1, double texY1, double texX2, double texY2, Color color) {
160+
triangles.ensureQuadCapacity();
161+
148162
double rad = Math.toRadians(rotation);
149163
double cos = Math.cos(rad);
150164
double sin = Math.sin(rad);

0 commit comments

Comments
 (0)