Skip to content

Commit a3fa73c

Browse files
committed
Improve panorama rendering code
1 parent 6628b37 commit a3fa73c

File tree

3 files changed

+57
-39
lines changed

3 files changed

+57
-39
lines changed

src/main/java/btw/mixces/animatium/mixins/v1/gui/MixinPanoramaRenderer.java

Lines changed: 15 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -110,7 +110,7 @@ public abstract class MixinPanoramaRenderer {
110110
@Inject(method = "render", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/renderer/CubeMap;render(Lnet/minecraft/client/Minecraft;FF)V", ordinal = 0, shift = At.Shift.AFTER))
111111
private void animatium$panoramaFinish(GuiGraphics guiGraphics, int width, int height, boolean bl, CallbackInfo ci) {
112112
if (AnimatiumClient.isEnabled() && AnimatiumConfig.instance().panoramaRendering) {
113-
RenderTarget renderTarget = minecraft.getMainRenderTarget();
113+
final RenderTarget renderTarget = minecraft.getMainRenderTarget();
114114
for (int i = 0; i < 6; ++i) {
115115
this.animatium$writeAndBlitBlurTexture(guiGraphics, renderTarget, animatium$backgroundTextureView, width, height);
116116
}
@@ -145,9 +145,10 @@ public abstract class MixinPanoramaRenderer {
145145
);
146146
}
147147

148-
ByteBufferBuilder byteBufferBuilder = new ByteBufferBuilder(DefaultVertexFormat.POSITION_TEX_COLOR.getVertexSize() * 12);
149-
BufferBuilder bufferBuilder = new BufferBuilder(byteBufferBuilder, VertexFormat.Mode.QUADS, DefaultVertexFormat.POSITION_TEX_COLOR);
150-
Matrix3x2f matrix = drawContext.pose();
148+
RenderPipeline pipeline = animatium$BLUR_TEXTURE;
149+
ByteBufferBuilder byteBufferBuilder = new ByteBufferBuilder(pipeline.getVertexFormat().getVertexSize() * 12);
150+
BufferBuilder bufferBuilder = new BufferBuilder(byteBufferBuilder, pipeline.getVertexFormatMode(), pipeline.getVertexFormat());
151+
final Matrix3x2f matrix = drawContext.pose();
151152
for (int i = 0; i < 3; ++i) {
152153
float growth = (float) (i - 1) / 256.0F;
153154
int color = ARGB.colorFromFloat(1.0F / (float) (i + 1), 1.0F, 1.0F, 1.0F);
@@ -157,23 +158,26 @@ public abstract class MixinPanoramaRenderer {
157158
bufferBuilder.addVertexWith2DPose(matrix, 0.0F, height).setUv(0.0F + growth, 0.0F).setColor(color);
158159
}
159160

160-
RenderSystem.setShaderTexture(0, texture);
161-
RenderUtils.drawBuffer(bufferBuilder, renderTarget, animatium$BLUR_TEXTURE);
161+
RenderUtils.drawBuffer(animatium$BLUR_TEXTURE, renderTarget, bufferBuilder.buildOrThrow(), (pass) -> {
162+
pass.bindSampler("Sampler0", texture);
163+
});
162164
}
163165

164166
@Unique
165167
private void animatium$renderFinalTexture(RenderTarget renderTarget, GlTextureView texture, int width, int height) {
166168
float f = 120.0F / (float) (Math.max(width, height));
167169
float g = (float) height * f / 256.0F;
168170
float h = (float) width * f / 256.0F;
169-
int color = ARGB.white(1.0F);
170-
ByteBufferBuilder byteBufferBuilder = new ByteBufferBuilder(DefaultVertexFormat.POSITION_TEX_COLOR.getVertexSize() * 4);
171-
BufferBuilder bufferBuilder = new BufferBuilder(byteBufferBuilder, VertexFormat.Mode.QUADS, DefaultVertexFormat.POSITION_TEX_COLOR);
171+
final int color = ARGB.white(1.0F);
172+
RenderPipeline pipeline = animatium$BASIC_TEXTURE;
173+
ByteBufferBuilder byteBufferBuilder = new ByteBufferBuilder(pipeline.getVertexFormat().getVertexSize() * 4);
174+
BufferBuilder bufferBuilder = new BufferBuilder(byteBufferBuilder, pipeline.getVertexFormatMode(), pipeline.getVertexFormat());
172175
bufferBuilder.addVertex(0.0F, height, 0.0F).setUv(0.5F - g, 0.5F + h).setColor(color);
173176
bufferBuilder.addVertex(width, height, 0.0F).setUv(0.5F - g, 0.5F - h).setColor(color);
174177
bufferBuilder.addVertex(width, 0.0F, 0.0F).setUv(0.5F + g, 0.5F - h).setColor(color);
175178
bufferBuilder.addVertex(0.0F, 0.0F, 0.0F).setUv(0.5F + g, 0.5F + h).setColor(color);
176-
RenderSystem.setShaderTexture(0, texture);
177-
RenderUtils.drawBuffer(bufferBuilder, renderTarget, animatium$BASIC_TEXTURE);
179+
RenderUtils.drawBuffer(animatium$BASIC_TEXTURE, renderTarget, bufferBuilder.buildOrThrow(), (pass) -> {
180+
pass.bindSampler("Sampler0", texture);
181+
});
178182
}
179183
}

src/main/java/btw/mixces/animatium/util/RenderUtils.java

Lines changed: 40 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626
import btw.mixces.animatium.config.AnimatiumConfig;
2727
import btw.mixces.animatium.mixins.accessor.ClientLevelDataAccessor;
2828
import com.mojang.blaze3d.buffers.GpuBuffer;
29+
import com.mojang.blaze3d.buffers.GpuBufferSlice;
2930
import com.mojang.blaze3d.pipeline.RenderPipeline;
3031
import com.mojang.blaze3d.pipeline.RenderTarget;
3132
import com.mojang.blaze3d.systems.RenderPass;
@@ -85,14 +86,12 @@ public static void fillRectangle(GuiGraphics context, int x, int y, int width, i
8586
context.fill(x, y, x + width, y + height, color);
8687
}
8788

88-
public static void drawBuffer(BufferBuilder builder, RenderTarget renderTarget, RenderPipeline renderPipeline) {
89-
GpuBuffer vertexBuffer;
90-
GpuBuffer indexBuffer;
91-
VertexFormat.IndexType indexType;
92-
int indexCount;
93-
try (MeshData meshData = builder.buildOrThrow()) {
94-
indexCount = meshData.drawState().indexCount();
95-
vertexBuffer = renderPipeline.getVertexFormat().uploadImmediateVertexBuffer(meshData.vertexBuffer());
89+
public static void drawBuffer(RenderPipeline renderPipeline, RenderTarget renderTarget, MeshData meshData, Consumer<RenderPass> renderPassConsumer) {
90+
GpuBufferSlice dynamicTransforms = DynamicTransformsBuilder.of().build();
91+
try {
92+
GpuBuffer vertexBuffer = renderPipeline.getVertexFormat().uploadImmediateVertexBuffer(meshData.vertexBuffer());
93+
GpuBuffer indexBuffer;
94+
VertexFormat.IndexType indexType;
9695
if (meshData.indexBuffer() == null) {
9796
RenderSystem.AutoStorageIndexBuffer autoStorageIndexBuffer = RenderSystem.getSequentialBuffer(meshData.drawState().mode());
9897
indexBuffer = autoStorageIndexBuffer.getBuffer(meshData.drawState().indexCount());
@@ -101,32 +100,45 @@ public static void drawBuffer(BufferBuilder builder, RenderTarget renderTarget,
101100
indexBuffer = renderPipeline.getVertexFormat().uploadImmediateIndexBuffer(meshData.indexBuffer());
102101
indexType = meshData.drawState().indexType();
103102
}
104-
} catch (Exception e) {
105-
vertexBuffer = null;
106-
indexBuffer = null;
107-
indexType = null;
108-
indexCount = 0;
109-
}
110103

111-
if (vertexBuffer == null) {
112-
throw new RuntimeException("Vertex buffer was null when trying to render buffer.");
113-
}
104+
GpuTextureView colorTextureView = RenderSystem.outputColorTextureOverride != null ? RenderSystem.outputColorTextureOverride : renderTarget.getColorTextureView();
105+
GpuTextureView depthTextureView = renderTarget.useDepth ? (RenderSystem.outputDepthTextureOverride != null ? RenderSystem.outputDepthTextureOverride : renderTarget.getDepthTextureView()) : null;
106+
try (RenderPass renderPass = RenderSystem.getDevice().createCommandEncoder().createRenderPass(() -> "Immediate draw for " + renderPipeline, colorTextureView, OptionalInt.empty(), depthTextureView, OptionalDouble.empty())) {
107+
renderPass.setPipeline(renderPipeline);
108+
for (int i = 0; i < 12; ++i) {
109+
GpuTextureView textureView = RenderSystem.getShaderTexture(i);
110+
if (textureView != null) {
111+
renderPass.bindSampler("Sampler" + i, textureView);
112+
}
113+
}
114114

115-
try (RenderPass renderPass = RenderSystem.getDevice()
116-
.createCommandEncoder()
117-
.createRenderPass(() -> "Immediate Rendering", renderTarget.getColorTextureView(), OptionalInt.empty(), renderTarget.useDepth ? renderTarget.getDepthTextureView() : null, OptionalDouble.empty())) {
118-
renderPass.setPipeline(renderPipeline);
119-
renderPass.setVertexBuffer(0, vertexBuffer);
120-
renderPass.setIndexBuffer(indexBuffer, indexType);
121-
for (int i = 0; i < 12; i++) {
122-
GpuTextureView gpuTexture = RenderSystem.getShaderTexture(i);
123-
if (gpuTexture != null) {
124-
renderPass.bindSampler("Sampler" + i, gpuTexture);
115+
renderPass.setUniform("DynamicTransforms", dynamicTransforms);
116+
renderPassConsumer.accept(renderPass);
117+
RenderSystem.bindDefaultUniforms(renderPass);
118+
renderPass.setVertexBuffer(0, vertexBuffer);
119+
renderPass.setIndexBuffer(indexBuffer, indexType);
120+
renderPass.drawIndexed(0, 0, meshData.drawState().indexCount(), 1);
121+
}
122+
} catch (Throwable var17) {
123+
if (meshData != null) {
124+
try {
125+
meshData.close();
126+
} catch (Throwable var14) {
127+
var17.addSuppressed(var14);
125128
}
126129
}
127130

128-
renderPass.drawIndexed(0, 0, indexCount, 1);
131+
throw var17;
129132
}
133+
134+
if (meshData != null) {
135+
meshData.close();
136+
}
137+
}
138+
139+
public static void drawBuffer(RenderPipeline renderPipeline, RenderTarget renderTarget, MeshData meshData) {
140+
drawBuffer(renderPipeline, renderTarget, meshData, (pass) -> {
141+
});
130142
}
131143

132144
// Sky Stuff

src/main/resources/assets/animatium/lang/en_us.json

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,8 @@
6969
"animatium.effectsInventoryPosition.description": "Restores the old potion effects status position in the inventory to like it was in <=1.11/1.19.",
7070
"animatium.recipeBook": "[*] Hide recipe book",
7171
"animatium.recipeBook.description": "Hides the recipe book from the inventory, including the button.",
72+
"animatium.panoramaRendering": "[1.12.2] Legacy Panorama Rendering",
73+
"animatium.panoramaRendering.description": "Restores the legacy way of rendering the panorama in the main menu like in 1.12.2 and below.\n\nNOTE: This replaces the panorama rendering including the resource pack overlay texture!",
7274
"animatium.cameraVersion": "[*] Change camera position to be as it was in",
7375
"animatium.cameraVersion.description": "Change the camera position to be as it was in said version range.",
7476
"animatium.enum.CameraVersion.LATEST": "Latest",

0 commit comments

Comments
 (0)