Skip to content

Commit 05652fa

Browse files
committed
PanoramaRendererUtility WORKING (1:0.1) almost 1:1
1 parent 9d19bb6 commit 05652fa

File tree

3 files changed

+56
-144
lines changed

3 files changed

+56
-144
lines changed

src/main/java/org/visuals/legacy/animatium/util/PanoramaRendererUtility.java

Lines changed: 23 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -27,14 +27,16 @@
2727

2828
import com.mojang.blaze3d.ProjectionType;
2929
import com.mojang.blaze3d.buffers.GpuBufferSlice;
30+
import com.mojang.blaze3d.opengl.GlTexture;
31+
import com.mojang.blaze3d.opengl.GlTextureView;
3032
import com.mojang.blaze3d.pipeline.BlendFunction;
3133
import com.mojang.blaze3d.pipeline.RenderPipeline;
34+
import com.mojang.blaze3d.pipeline.RenderTarget;
3235
import com.mojang.blaze3d.platform.DestFactor;
3336
import com.mojang.blaze3d.platform.SourceFactor;
3437
import com.mojang.blaze3d.systems.GpuDevice;
3538
import com.mojang.blaze3d.systems.RenderSystem;
3639
import com.mojang.blaze3d.textures.FilterMode;
37-
import com.mojang.blaze3d.textures.GpuTexture;
3840
import com.mojang.blaze3d.textures.GpuTextureView;
3941
import com.mojang.blaze3d.textures.TextureFormat;
4042
import com.mojang.blaze3d.vertex.*;
@@ -53,6 +55,7 @@
5355
import org.jetbrains.annotations.Nullable;
5456
import org.joml.Matrix3x2f;
5557
import org.joml.Matrix4fStack;
58+
import org.joml.Vector4i;
5659
import org.visuals.legacy.animatium.Animatium;
5760

5861
@UtilityClass
@@ -68,40 +71,36 @@ public class PanoramaRendererUtility {
6871
.withCull(false)
6972
.withDepthWrite(false)
7073
.withBlend(PANORAMA_BLEND)
71-
// .withColorWrite(true, false)
74+
// .withColorWrite(true, false) // TODO/NOTE: Causes it to not render (alpha becomes 0.0?!??!?!)
7275
.withSampler("Sampler0")
7376
.withVertexFormat(DefaultVertexFormat.POSITION_TEX_COLOR, VertexFormat.Mode.QUADS)
7477
.build();
7578

7679
private final CachedPerspectiveProjectionMatrixBuffer projectionMatrixBuffer = new CachedPerspectiveProjectionMatrixBuffer("panorama", 0.05F, 10.0F);
77-
private final PanoramaTarget panoramaTarget = new PanoramaTarget();
78-
private GpuTextureView backgroundTextureView = null;
80+
private final GlTexture backgroundTexture;
81+
private final GlTextureView backgroundTextureView;
7982
private float spin = 0.0F;
8083

8184
static {
82-
setup();
83-
}
84-
85-
private void setup() {
86-
if (backgroundTextureView == null) {
87-
final GpuDevice device = RenderSystem.getDevice();
88-
final GpuTexture backgroundTexture = device.createTexture(() -> "Background texture", 15, TextureFormat.RGBA8, 256, 256, 1, 1);
89-
backgroundTexture.setTextureFilter(FilterMode.LINEAR, FilterMode.LINEAR, false);
90-
backgroundTextureView = device.createTextureView(backgroundTexture);
91-
}
85+
final GpuDevice device = RenderSystem.getDevice();
86+
backgroundTexture = (GlTexture) device.createTexture(() -> "Background texture", 15, TextureFormat.RGBA8, 256, 256, 1, 1);
87+
backgroundTexture.setTextureFilter(FilterMode.LINEAR, FilterMode.LINEAR, false);
88+
backgroundTextureView = (GlTextureView) device.createTextureView(backgroundTexture);
9289
}
9390

9491
public void render(final GuiGraphics guiGraphics, final int width, final int height) {
95-
renderPanorama(PANORAMA, width, height);
92+
final RenderTarget renderTarget = Minecraft.getInstance().getMainRenderTarget();
93+
RenderUtils.setRenderOverrides(new RenderUtils.RenderOverrides(new Vector4i(0, 0, 256, 256)));
94+
renderPanorama(PANORAMA, renderTarget, width, height);
9695
for (int layer = 0; layer < 7; ++layer) {
97-
RenderSystem.getDevice().createCommandEncoder().copyTextureToTexture(panoramaTarget.getColorTexture(), backgroundTextureView.texture(), 0, 0, 0, 0, 0, 256, 256);
98-
RenderUtils.drawInGui(panoramaTarget, DynamicTransformsBuilder.of(), new BlitBlurTexture(guiGraphics.pose(), backgroundTextureView, width, height));
96+
RenderSystem.getDevice().createCommandEncoder().copyTextureToTexture(renderTarget.getColorTexture(), backgroundTexture, 0, 0, 0, 0, 0, 256, 256);
97+
RenderUtils.drawInGui(renderTarget, DynamicTransformsBuilder.of(), new BlitBlurTexture(guiGraphics.pose(), backgroundTextureView, width, height));
9998
}
100-
99+
RenderUtils.setRenderOverrides(RenderUtils.RenderOverrides.DISABLED);
101100
guiGraphics.guiRenderState.submitGuiElement(new BlitFinalTexture(guiGraphics.pose(), backgroundTextureView, width, height, ARGB.white(1.0F)));
102101
}
103102

104-
private void renderPanorama(final RenderPipeline pipeline, final int width, final int height) {
103+
private void renderPanorama(final RenderPipeline pipeline, final RenderTarget renderTarget, final int width, final int height) {
105104
RenderSystem.setProjectionMatrix(projectionMatrixBuffer.getBuffer(width, height, 120.0F), ProjectionType.PERSPECTIVE);
106105
final Matrix4fStack modelViewStack = RenderSystem.getModelViewStack();
107106
modelViewStack.pushMatrix();
@@ -140,7 +139,7 @@ private void renderPanorama(final RenderPipeline pipeline, final int width, fina
140139
final GpuBufferSlice dynamicTransforms = DynamicTransformsBuilder.of()
141140
.withModelViewMatrix(modelViewStack)
142141
.build();
143-
RenderUtils.drawWithPipeline(panoramaTarget, pipeline, builder.buildOrThrow(), (pass) -> {
142+
RenderUtils.drawWithPipeline(renderTarget, pipeline, builder.buildOrThrow(), (pass) -> {
144143
pass.setUniform("DynamicTransforms", dynamicTransforms);
145144
pass.bindSampler("Sampler0", panoramaTexture);
146145
});
@@ -179,7 +178,7 @@ private record BlitBlurTexture(
179178
@Override
180179
public void buildVertices(VertexConsumer consumer) {
181180
for (int cycle = 0; cycle < 3; cycle++) {
182-
final int color = ARGB.white(1.0F); // ARGB.white(1.0F / (cycle + 1)); // might be issue
181+
final int color = ARGB.white(1.0F / (cycle + 1));
183182
final float growth = (cycle - 1) / 256.0F;
184183
consumer.addVertexWith2DPose(this.pose, this.width, this.height).setUv(0.0F + growth, 1.0F).setColor(color);
185184
consumer.addVertexWith2DPose(this.pose, this.width, 0.0F).setUv(1.0F + growth, 1.0F).setColor(color);
@@ -193,7 +192,7 @@ public void buildVertices(VertexConsumer consumer) {
193192
return RenderPipeline.builder(RenderPipelines.GUI_TEXTURED_SNIPPET)
194193
.withLocation(Animatium.location("pipeline/panorama_blur"))
195194
.withBlend(PANORAMA_BLEND)
196-
// .withColorWrite(true, false)
195+
.withColorWrite(true, false)
197196
.build();
198197
}
199198

@@ -222,8 +221,8 @@ public record BlitFinalTexture(
222221
@Override
223222
public void buildVertices(VertexConsumer consumer) {
224223
final float aspect = 120.0F / (Math.max(this.width, this.height));
225-
final float sw = this.width * aspect / panoramaTarget.width;
226-
final float sh = this.height * aspect / panoramaTarget.height;
224+
final float sw = this.width * aspect / 256.0F;
225+
final float sh = this.height * aspect / 256.0F;
227226
consumer.addVertexWith2DPose(this.pose, 0.0F, this.height).setUv(0.5F - sh, 0.5F + sw).setColor(this.color);
228227
consumer.addVertexWith2DPose(this.pose, this.width, this.height).setUv(0.5F - sh, 0.5F - sw).setColor(this.color);
229228
consumer.addVertexWith2DPose(this.pose, this.width, 0.0F).setUv(0.5F + sh, 0.5F - sw).setColor(this.color);

src/main/java/org/visuals/legacy/animatium/util/PanoramaTarget.java

Lines changed: 0 additions & 119 deletions
This file was deleted.

src/main/java/org/visuals/legacy/animatium/util/RenderUtils.java

Lines changed: 33 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@
2828
import com.mojang.blaze3d.ProjectionType;
2929
import com.mojang.blaze3d.buffers.GpuBuffer;
3030
import com.mojang.blaze3d.buffers.GpuBufferSlice;
31+
import com.mojang.blaze3d.opengl.GlStateManager;
3132
import com.mojang.blaze3d.pipeline.RenderPipeline;
3233
import com.mojang.blaze3d.pipeline.RenderTarget;
3334
import com.mojang.blaze3d.platform.Window;
@@ -38,26 +39,35 @@
3839
import com.mojang.blaze3d.vertex.MeshData;
3940
import com.mojang.blaze3d.vertex.Tesselator;
4041
import com.mojang.blaze3d.vertex.VertexFormat;
42+
import lombok.Setter;
4143
import lombok.experimental.UtilityClass;
4244
import net.minecraft.client.Minecraft;
4345
import net.minecraft.client.gui.Font;
4446
import net.minecraft.client.gui.GuiGraphics;
4547
import net.minecraft.client.gui.render.TextureSetup;
4648
import net.minecraft.client.gui.render.state.GuiElementRenderState;
4749
import net.minecraft.client.multiplayer.ClientLevel;
50+
import org.jetbrains.annotations.Nullable;
4851
import org.joml.Matrix3x2fStack;
4952
import org.joml.Matrix4f;
53+
import org.joml.Vector4i;
54+
import org.lwjgl.BufferUtils;
55+
import org.lwjgl.opengl.GL11;
5056
import org.visuals.legacy.animatium.config.AnimatiumConfig;
5157
import org.visuals.legacy.animatium.mixins.accessor.ClientLevelDataAccessor;
5258
import org.visuals.legacy.animatium.mixins.accessor.GameRendererAccessor;
5359
import org.visuals.legacy.animatium.mixins.accessor.GuiRendererAccessor;
5460

61+
import java.nio.IntBuffer;
5562
import java.util.OptionalDouble;
5663
import java.util.OptionalInt;
5764
import java.util.function.Consumer;
5865

5966
@UtilityClass
6067
public class RenderUtils {
68+
@Setter
69+
private RenderOverrides renderOverrides;
70+
6171
// TODO/NOTE: To be removed in 1.21.11+
6272
private float LINE_WIDTH = -1.0F;
6373

@@ -133,6 +143,7 @@ public void drawWithPipeline(
133143
final GpuTextureView colorTextureView = RenderSystem.outputColorTextureOverride != null ? RenderSystem.outputColorTextureOverride : renderTarget.getColorTextureView();
134144
final GpuTextureView depthTextureView = renderTarget.useDepth ? (RenderSystem.outputDepthTextureOverride != null ? RenderSystem.outputDepthTextureOverride : renderTarget.getDepthTextureView()) : null;
135145
try (RenderPass renderPass = RenderSystem.getDevice().createCommandEncoder().createRenderPass(() -> "Immediate draw for " + renderPipeline, colorTextureView, OptionalInt.empty(), depthTextureView, OptionalDouble.empty())) {
146+
final IntBuffer viewportBuffer = renderOverrides.applyViewport();
136147
renderPass.setPipeline(renderPipeline);
137148
renderPass.setVertexBuffer(0, vertexBuffer);
138149
renderPass.setIndexBuffer(indexBuffer, indexType);
@@ -146,6 +157,9 @@ public void drawWithPipeline(
146157
RenderSystem.bindDefaultUniforms(renderPass);
147158
renderPassConsumer.accept(renderPass);
148159
renderPass.drawIndexed(0, 0, meshData.drawState().indexCount(), 1);
160+
if (viewportBuffer != null) {
161+
GlStateManager._viewport(viewportBuffer.get(), viewportBuffer.get(), viewportBuffer.get(), viewportBuffer.get());
162+
}
149163
}
150164
} catch (Throwable throwable) {
151165
if (meshData != null) {
@@ -196,6 +210,7 @@ public void drawInGui(
196210
final GpuTextureView colorTextureView = RenderSystem.outputColorTextureOverride != null ? RenderSystem.outputColorTextureOverride : renderTarget.getColorTextureView();
197211
final GpuTextureView depthTextureView = renderTarget.useDepth ? (RenderSystem.outputDepthTextureOverride != null ? RenderSystem.outputDepthTextureOverride : renderTarget.getDepthTextureView()) : null;
198212
try (final RenderPass renderPass = RenderSystem.getDevice().createCommandEncoder().createRenderPass(() -> "Immediate GUI RenderPass", colorTextureView, OptionalInt.empty(), depthTextureView, OptionalDouble.empty())) {
213+
final IntBuffer viewportBuffer = renderOverrides.applyViewport();
199214
renderPass.setPipeline(pipeline);
200215
renderPass.setVertexBuffer(0, vertexBuffer);
201216
renderPass.setIndexBuffer(indexBuffer, indexType);
@@ -216,10 +231,27 @@ public void drawInGui(
216231
renderPass.setUniform("DynamicTransforms", dynamicTransforms);
217232
RenderSystem.bindDefaultUniforms(renderPass);
218233
renderPass.drawIndexed(0, 0, meshData.drawState().indexCount(), 1);
234+
if (viewportBuffer != null) {
235+
GlStateManager._viewport(viewportBuffer.get(), viewportBuffer.get(), viewportBuffer.get(), viewportBuffer.get());
236+
}
219237
}
220238
}
221239

222240
RenderSystem.restoreProjectionMatrix();
223241
}
224-
}
225242

243+
public record RenderOverrides(@Nullable Vector4i viewport) {
244+
public static final RenderOverrides DISABLED = new RenderOverrides(null);
245+
246+
public @Nullable IntBuffer applyViewport() {
247+
IntBuffer viewportBuffer = null;
248+
if (this.viewport != null) {
249+
viewportBuffer = BufferUtils.createIntBuffer(4);
250+
GL11.glGetIntegerv(GL11.GL_VIEWPORT, viewportBuffer);
251+
GlStateManager._viewport(this.viewport.x, this.viewport.y, this.viewport.z, this.viewport.w);
252+
}
253+
254+
return viewportBuffer;
255+
}
256+
}
257+
}

0 commit comments

Comments
 (0)