Skip to content

Commit 2d81376

Browse files
DEBUG_LINES support (#412)
* Drawing mode fixes and DEBUG_LINES support --------- Co-authored-by: xCollateral <[email protected]>
1 parent 4777d41 commit 2d81376

File tree

12 files changed

+242
-126
lines changed

12 files changed

+242
-126
lines changed

src/main/java/net/vulkanmod/mixin/compatibility/gl/GL11M.java

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,15 @@ public static void glBindTexture(@NativeType("GLenum") int target, @NativeType("
3636
GlTexture.bindTexture(texture);
3737
}
3838

39+
/**
40+
* @author
41+
* @reason
42+
*/
43+
@Overwrite(remap = false)
44+
public static void glLineWidth(@NativeType("GLfloat") float width) {
45+
VRenderSystem.setLineWidth(width);
46+
}
47+
3948
/**
4049
* @author
4150
* @reason

src/main/java/net/vulkanmod/mixin/render/BufferUploaderM.java

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,9 @@
66
import net.minecraft.client.renderer.ShaderInstance;
77
import net.vulkanmod.interfaces.ShaderMixed;
88
import net.vulkanmod.vulkan.Renderer;
9+
import net.vulkanmod.vulkan.VRenderSystem;
910
import net.vulkanmod.vulkan.shader.GraphicsPipeline;
10-
import net.vulkanmod.vulkan.shader.Pipeline;
11+
1112
import org.spongepowered.asm.mixin.Mixin;
1213
import org.spongepowered.asm.mixin.Overwrite;
1314

@@ -32,15 +33,17 @@ public static void drawWithShader(BufferBuilder.RenderedBuffer buffer) {
3233

3334
Renderer renderer = Renderer.getInstance();
3435

35-
if(parameters.vertexCount() <= 0)
36+
if(parameters.vertexCount() <= 0) {
3637
return;
38+
}
3739

3840
ShaderInstance shaderInstance = RenderSystem.getShader();
39-
//Used to update legacy shader uniforms
40-
//TODO it would be faster to allocate a buffer from stack and set all values
41+
// Used to update legacy shader uniforms
42+
// TODO it would be faster to allocate a buffer from stack and set all values
4143
shaderInstance.apply();
4244

4345
GraphicsPipeline pipeline = ((ShaderMixed)(shaderInstance)).getPipeline();
46+
VRenderSystem.setPrimitiveTopologyGL(parameters.mode().asGLMode);
4447
renderer.bindGraphicsPipeline(pipeline);
4548
renderer.uploadAndBindUBOs(pipeline);
4649
Renderer.getDrawer().draw(buffer.vertexBuffer(), parameters.mode(), parameters.format(), parameters.vertexCount());

src/main/java/net/vulkanmod/mixin/render/RenderSystemMixin.java

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -313,6 +313,15 @@ public static void disableCull() {
313313
VRenderSystem.disableCull();
314314
}
315315

316+
/**
317+
* @author
318+
*/
319+
@Overwrite(remap = false)
320+
public static void polygonMode(final int i, final int j) {
321+
assertOnGameThread();
322+
VRenderSystem.setPolygonModeGL(i);
323+
}
324+
316325
/**
317326
* @author
318327
*/

src/main/java/net/vulkanmod/render/VBO.java

Lines changed: 42 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -9,9 +9,11 @@
99
import net.vulkanmod.interfaces.ShaderMixed;
1010
import net.vulkanmod.vulkan.Renderer;
1111
import net.vulkanmod.vulkan.VRenderSystem;
12-
import net.vulkanmod.vulkan.memory.*;
12+
import net.vulkanmod.vulkan.memory.AutoIndexBuffer;
13+
import net.vulkanmod.vulkan.memory.IndexBuffer;
14+
import net.vulkanmod.vulkan.memory.MemoryTypes;
15+
import net.vulkanmod.vulkan.memory.VertexBuffer;
1316
import net.vulkanmod.vulkan.shader.GraphicsPipeline;
14-
import net.vulkanmod.vulkan.shader.Pipeline;
1517
import org.joml.Matrix4f;
1618

1719
import java.nio.ByteBuffer;
@@ -34,7 +36,6 @@ public void upload(BufferBuilder.RenderedBuffer buffer) {
3436

3537
this.indexCount = parameters.indexCount();
3638
this.vertexCount = parameters.vertexCount();
37-
// this.indexType = parameters.indexType();
3839
this.mode = parameters.mode();
3940

4041
this.configureVertexFormat(parameters, buffer.vertexBuffer());
@@ -47,11 +48,11 @@ public void upload(BufferBuilder.RenderedBuffer buffer) {
4748
private void configureVertexFormat(BufferBuilder.DrawState parameters, ByteBuffer data) {
4849
if (!parameters.indexOnly()) {
4950

50-
if(vertexBuffer != null)
51+
if (this.vertexBuffer != null)
5152
this.vertexBuffer.freeBuffer();
5253

5354
this.vertexBuffer = new VertexBuffer(data.remaining(), MemoryTypes.GPU_MEM);
54-
vertexBuffer.copyToVertexBuffer(parameters.format().getVertexSize(), parameters.vertexCount(), data);
55+
this.vertexBuffer.copyToVertexBuffer(parameters.format().getVertexSize(), parameters.vertexCount(), data);
5556

5657
}
5758
}
@@ -63,34 +64,43 @@ private void configureIndexBuffer(BufferBuilder.DrawState parameters, ByteBuffer
6364
switch (this.mode) {
6465
case TRIANGLE_FAN -> {
6566
autoIndexBuffer = Renderer.getDrawer().getTriangleFanIndexBuffer();
66-
this.indexCount = (vertexCount - 2) * 3;
67+
this.indexCount = AutoIndexBuffer.DrawType.getTriangleStripIndexCount(this.vertexCount);
68+
}
69+
case TRIANGLE_STRIP, LINE_STRIP -> {
70+
autoIndexBuffer = Renderer.getDrawer().getTriangleStripIndexBuffer();
71+
this.indexCount = AutoIndexBuffer.DrawType.getTriangleStripIndexCount(this.vertexCount);
6772
}
6873
case QUADS -> {
6974
autoIndexBuffer = Renderer.getDrawer().getQuadsIndexBuffer();
7075
}
71-
case TRIANGLES -> {
76+
case LINES -> {
77+
autoIndexBuffer = Renderer.getDrawer().getLinesIndexBuffer();
78+
}
79+
case DEBUG_LINE_STRIP -> {
80+
autoIndexBuffer = Renderer.getDrawer().getDebugLineStripIndexBuffer();
81+
}
82+
case TRIANGLES, DEBUG_LINES -> {
7283
autoIndexBuffer = null;
7384
}
74-
default -> throw new IllegalStateException("Unexpected draw mode:" + this.mode);
85+
default -> throw new IllegalStateException("Unexpected draw mode: %s".formatted(this.mode));
7586
}
7687

77-
if(indexBuffer != null && !this.autoIndexed)
78-
indexBuffer.freeBuffer();
88+
if (this.indexBuffer != null && !this.autoIndexed)
89+
this.indexBuffer.freeBuffer();
7990

80-
if(autoIndexBuffer != null) {
81-
autoIndexBuffer.checkCapacity(vertexCount);
82-
indexBuffer = autoIndexBuffer.getIndexBuffer();
91+
if (autoIndexBuffer != null) {
92+
autoIndexBuffer.checkCapacity(this.vertexCount);
93+
this.indexBuffer = autoIndexBuffer.getIndexBuffer();
8394
}
8495

8596
this.autoIndexed = true;
8697

87-
}
88-
else {
89-
if(indexBuffer != null)
98+
} else {
99+
if (this.indexBuffer != null)
90100
this.indexBuffer.freeBuffer();
101+
91102
this.indexBuffer = new IndexBuffer(data.remaining(), MemoryTypes.GPU_MEM);
92-
// this.indexBuffer = new AsyncIndexBuffer(data.remaining());
93-
indexBuffer.copyBuffer(data);
103+
this.indexBuffer.copyBuffer(data);
94104
}
95105

96106
}
@@ -101,7 +111,7 @@ public void drawWithShader(Matrix4f MV, Matrix4f P, ShaderInstance shader) {
101111

102112
RenderSystem.setShader(() -> shader);
103113

104-
drawWithShader(MV, P, ((ShaderMixed)shader).getPipeline());
114+
drawWithShader(MV, P, ((ShaderMixed) shader).getPipeline());
105115

106116
}
107117
}
@@ -116,10 +126,10 @@ public void drawWithShader(Matrix4f MV, Matrix4f P, GraphicsPipeline pipeline) {
116126
renderer.bindGraphicsPipeline(pipeline);
117127
renderer.uploadAndBindUBOs(pipeline);
118128

119-
if(indexBuffer != null)
120-
Renderer.getDrawer().drawIndexed(vertexBuffer, indexBuffer, indexCount);
129+
if (this.indexBuffer != null)
130+
Renderer.getDrawer().drawIndexed(this.vertexBuffer, this.indexBuffer, this.indexCount);
121131
else
122-
Renderer.getDrawer().draw(vertexBuffer, vertexCount);
132+
Renderer.getDrawer().draw(this.vertexBuffer, this.vertexCount);
123133

124134
VRenderSystem.applyMVP(RenderSystem.getModelViewMatrix(), RenderSystem.getProjectionMatrix());
125135

@@ -130,25 +140,24 @@ public void drawChunkLayer() {
130140
if (this.indexCount != 0) {
131141

132142
RenderSystem.assertOnRenderThread();
133-
Renderer.getDrawer().drawIndexed(vertexBuffer, indexBuffer, indexCount);
143+
Renderer.getDrawer().drawIndexed(this.vertexBuffer, this.indexBuffer, this.indexCount);
134144
}
135145
}
136146

137147
public void close() {
138-
if(vertexCount <= 0) return;
139-
vertexBuffer.freeBuffer();
140-
vertexBuffer = null;
141-
if(!autoIndexed) {
142-
indexBuffer.freeBuffer();
143-
indexBuffer = null;
148+
if (this.vertexCount <= 0)
149+
return;
150+
151+
this.vertexBuffer.freeBuffer();
152+
this.vertexBuffer = null;
153+
154+
if (!this.autoIndexed) {
155+
this.indexBuffer.freeBuffer();
156+
this.indexBuffer = null;
144157
}
145158

146159
this.vertexCount = 0;
147160
this.indexCount = 0;
148161
}
149162

150-
// public VertexFormat getFormat() {
151-
// return this.vertexFormat;
152-
// }
153-
154163
}

src/main/java/net/vulkanmod/render/chunk/WorldRenderer.java

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@
3838
import net.vulkanmod.vulkan.Renderer;
3939
import net.vulkanmod.vulkan.VRenderSystem;
4040
import net.vulkanmod.vulkan.memory.Buffer;
41+
import net.vulkanmod.vulkan.memory.IndexBuffer;
4142
import net.vulkanmod.vulkan.memory.IndirectBuffer;
4243
import net.vulkanmod.vulkan.memory.MemoryTypes;
4344
import net.vulkanmod.vulkan.shader.GraphicsPipeline;
@@ -312,7 +313,9 @@ public void renderSectionLayer(RenderType renderType, PoseStack poseStack, doubl
312313
Renderer renderer = Renderer.getInstance();
313314
GraphicsPipeline pipeline = PipelineManager.getTerrainShader(terrainRenderType);
314315
renderer.bindGraphicsPipeline(pipeline);
315-
Renderer.getDrawer().bindAutoIndexBuffer(Renderer.getCommandBuffer(), 7);
316+
317+
IndexBuffer indexBuffer = Renderer.getDrawer().getQuadsIndexBuffer().getIndexBuffer();
318+
Renderer.getDrawer().bindIndexBuffer(Renderer.getCommandBuffer(), indexBuffer);
316319

317320
int currentFrame = Renderer.getCurrentFrame();
318321
Set<TerrainRenderType> allowedRenderTypes = Initializer.CONFIG.uniqueOpaqueLayer ? TerrainRenderType.COMPACT_RENDER_TYPES : TerrainRenderType.SEMI_COMPACT_RENDER_TYPES;

src/main/java/net/vulkanmod/vulkan/Drawer.java

Lines changed: 37 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -36,11 +36,11 @@ public class Drawer {
3636

3737
public Drawer() {
3838
// Index buffers
39-
quadsIndexBuffer = new AutoIndexBuffer(MAX_QUAD_VERTICES_UINT16, AutoIndexBuffer.DrawType.QUADS);
40-
linesIndexBuffer = new AutoIndexBuffer(10000, AutoIndexBuffer.DrawType.LINES);
41-
debugLineStripIndexBuffer = new AutoIndexBuffer(10000, AutoIndexBuffer.DrawType.DEBUG_LINE_STRIP);
42-
triangleFanIndexBuffer = new AutoIndexBuffer(1000, AutoIndexBuffer.DrawType.TRIANGLE_FAN);
43-
triangleStripIndexBuffer = new AutoIndexBuffer(10000, AutoIndexBuffer.DrawType.TRIANGLE_STRIP);
39+
this.quadsIndexBuffer = new AutoIndexBuffer(MAX_QUAD_VERTICES_UINT16, AutoIndexBuffer.DrawType.QUADS);
40+
this.linesIndexBuffer = new AutoIndexBuffer(10000, AutoIndexBuffer.DrawType.LINES);
41+
this.debugLineStripIndexBuffer = new AutoIndexBuffer(10000, AutoIndexBuffer.DrawType.DEBUG_LINE_STRIP);
42+
this.triangleFanIndexBuffer = new AutoIndexBuffer(1000, AutoIndexBuffer.DrawType.TRIANGLE_FAN);
43+
this.triangleStripIndexBuffer = new AutoIndexBuffer(10000, AutoIndexBuffer.DrawType.TRIANGLE_STRIP);
4444
}
4545

4646
public void setCurrentFrame(int currentFrame) {
@@ -50,7 +50,7 @@ public void setCurrentFrame(int currentFrame) {
5050
public void createResources(int framesNum) {
5151
this.framesNum = framesNum;
5252

53-
if (vertexBuffers != null) {
53+
if (this.vertexBuffers != null) {
5454
Arrays.stream(this.vertexBuffers).iterator().forEachRemaining(
5555
Buffer::freeBuffer
5656
);
@@ -76,7 +76,7 @@ public void draw(ByteBuffer buffer, VertexFormat.Mode mode, VertexFormat vertexF
7676
AutoIndexBuffer autoIndexBuffer;
7777
int indexCount;
7878

79-
VertexBuffer vertexBuffer = this.vertexBuffers[currentFrame];
79+
VertexBuffer vertexBuffer = this.vertexBuffers[this.currentFrame];
8080
vertexBuffer.copyToVertexBuffer(vertexFormat.getVertexSize(), vertexCount, buffer);
8181

8282
switch (mode) {
@@ -117,18 +117,6 @@ public void draw(ByteBuffer buffer, VertexFormat.Mode mode, VertexFormat vertexF
117117

118118
}
119119

120-
public AutoIndexBuffer getQuadsIndexBuffer() {
121-
return quadsIndexBuffer;
122-
}
123-
124-
public AutoIndexBuffer getTriangleFanIndexBuffer() {
125-
return triangleFanIndexBuffer;
126-
}
127-
128-
public UniformBuffer getUniformBuffer() {
129-
return this.uniformBuffers[currentFrame];
130-
}
131-
132120
public void drawIndexed(VertexBuffer vertexBuffer, IndexBuffer indexBuffer, int indexCount) {
133121
VkCommandBuffer commandBuffer = Renderer.getCommandBuffer();
134122

@@ -150,22 +138,13 @@ public void draw(VertexBuffer vertexBuffer, int vertexCount) {
150138
vkCmdDraw(commandBuffer, vertexCount, 1, 0, 0);
151139
}
152140

153-
public void bindAutoIndexBuffer(VkCommandBuffer commandBuffer, int drawMode) {
154-
AutoIndexBuffer autoIndexBuffer;
155-
switch (drawMode) {
156-
case 7 -> autoIndexBuffer = this.quadsIndexBuffer;
157-
case 6 -> autoIndexBuffer = this.triangleFanIndexBuffer;
158-
case 5 -> autoIndexBuffer = this.triangleStripIndexBuffer;
159-
default -> throw new RuntimeException("unknown drawType");
160-
}
161-
IndexBuffer indexBuffer = autoIndexBuffer.getIndexBuffer();
162-
141+
public void bindIndexBuffer(VkCommandBuffer commandBuffer, IndexBuffer indexBuffer) {
163142
vkCmdBindIndexBuffer(commandBuffer, indexBuffer.getId(), indexBuffer.getOffset(), VK_INDEX_TYPE_UINT16);
164143
}
165144

166145
public void cleanUpResources() {
167146
Buffer buffer;
168-
for (int i = 0; i < framesNum; ++i) {
147+
for (int i = 0; i < this.framesNum; ++i) {
169148
buffer = this.vertexBuffers[i];
170149
MemoryManager.freeBuffer(buffer.getId(), buffer.getAllocation());
171150

@@ -174,12 +153,34 @@ public void cleanUpResources() {
174153

175154
}
176155

177-
buffer = this.quadsIndexBuffer.getIndexBuffer();
178-
MemoryManager.freeBuffer(buffer.getId(), buffer.getAllocation());
179-
buffer = this.triangleFanIndexBuffer.getIndexBuffer();
180-
MemoryManager.freeBuffer(buffer.getId(), buffer.getAllocation());
181-
buffer = this.triangleStripIndexBuffer.getIndexBuffer();
182-
MemoryManager.freeBuffer(buffer.getId(), buffer.getAllocation());
156+
this.quadsIndexBuffer.freeBuffer();
157+
this.linesIndexBuffer.freeBuffer();
158+
this.triangleFanIndexBuffer.freeBuffer();
159+
this.debugLineStripIndexBuffer.freeBuffer();
160+
}
161+
162+
public AutoIndexBuffer getQuadsIndexBuffer() {
163+
return this.quadsIndexBuffer;
164+
}
165+
166+
public AutoIndexBuffer getLinesIndexBuffer() {
167+
return this.linesIndexBuffer;
168+
}
169+
170+
public AutoIndexBuffer getTriangleFanIndexBuffer() {
171+
return this.triangleFanIndexBuffer;
172+
}
173+
174+
public AutoIndexBuffer getTriangleStripIndexBuffer() {
175+
return this.triangleStripIndexBuffer;
176+
}
177+
178+
public AutoIndexBuffer getDebugLineStripIndexBuffer() {
179+
return this.debugLineStripIndexBuffer;
180+
}
181+
182+
public UniformBuffer getUniformBuffer() {
183+
return this.uniformBuffers[this.currentFrame];
183184
}
184185

185186
}

src/main/java/net/vulkanmod/vulkan/Renderer.java

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -104,6 +104,13 @@ public Renderer() {
104104
imagesNum = getSwapChain().getImagesNum();
105105
}
106106

107+
public static void setLineWidth(float width) {
108+
if (INSTANCE.boundFramebuffer == null) {
109+
return;
110+
}
111+
vkCmdSetLineWidth(INSTANCE.currentCmdBuffer, width);
112+
}
113+
107114
private void init() {
108115
MemoryManager.createInstance(Renderer.getFramesNum());
109116
Vulkan.createStagingBuffers();
@@ -250,6 +257,8 @@ public void beginFrame() {
250257
mainPass.begin(commandBuffer, stack);
251258

252259
vkCmdSetDepthBias(commandBuffer, 0.0F, 0.0F, 0.0F);
260+
261+
vkCmdSetLineWidth(commandBuffer, 1.0F);
253262
}
254263

255264
p.pop();

0 commit comments

Comments
 (0)