From d50d19b609070d0beae9a05ba3f197c898848b21 Mon Sep 17 00:00:00 2001 From: Klesti Selimaj Date: Wed, 25 Mar 2026 19:09:36 +0100 Subject: [PATCH] Refactored RenderScope and MatrixStack for 1.21.5 #59 --- .../features/mixins/render/RenderMixin.java | 4 +- .../impl/mixins/MatrixStackMixin.java | 48 +- .../impl/ui/EntityDrawerImpl.java | 36 +- .../saturnclient/impl/ui/RenderScopeImpl.java | 650 +++++++++--------- 4 files changed, 354 insertions(+), 384 deletions(-) diff --git a/versions/1.21.5/src/main/java/org/saturnclient/impl/features/mixins/render/RenderMixin.java b/versions/1.21.5/src/main/java/org/saturnclient/impl/features/mixins/render/RenderMixin.java index 063261a..f4efb30 100644 --- a/versions/1.21.5/src/main/java/org/saturnclient/impl/features/mixins/render/RenderMixin.java +++ b/versions/1.21.5/src/main/java/org/saturnclient/impl/features/mixins/render/RenderMixin.java @@ -65,8 +65,8 @@ public class RenderMixin { ModLayout dim = hud.getDimensions(); scope.getMatrixStack().push(); - scope.getMatrixStack().translate(dim.x.value, (float) dim.y.value, 0f); - scope.getMatrixStack().scale(dim.scale.value, dim.scale.value, 1.0f); + scope.getMatrixStack().translate(dim.x.value, (float) dim.y.value); + scope.getMatrixStack().scale(dim.scale.value, dim.scale.value); if (dim.renderBackground) { scope.drawRoundedRectangle(0, 0, dim.width, dim.height, diff --git a/versions/1.21.5/src/main/java/org/saturnclient/impl/mixins/MatrixStackMixin.java b/versions/1.21.5/src/main/java/org/saturnclient/impl/mixins/MatrixStackMixin.java index 2823f6a..4c4ae39 100644 --- a/versions/1.21.5/src/main/java/org/saturnclient/impl/mixins/MatrixStackMixin.java +++ b/versions/1.21.5/src/main/java/org/saturnclient/impl/mixins/MatrixStackMixin.java @@ -1,45 +1,49 @@ package org.saturnclient.impl.mixins; + import org.joml.Quaternionfc; import org.saturnclient.common.ref.render.MatrixStackRef; -import org.saturnclient.common.ref.render.QuaternionfRef; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; -import org.spongepowered.asm.mixin.gen.Invoker; import net.minecraft.client.util.math.MatrixStack; +import net.minecraft.util.math.RotationAxis; @Mixin(MatrixStack.class) public abstract class MatrixStackMixin implements MatrixStackRef { - @Shadow - public abstract void translate(double x, double y, double z); - @Shadow - public abstract void translate(float x, float y, float z); - @Shadow - public abstract void scale(float x, float y, float z); - @Shadow - public abstract void multiply(Quaternionfc quaternion); - @Shadow - public abstract void multiply(Quaternionfc quaternion, float originX, float originY, float originZ); @Shadow public abstract void push(); + @Shadow public abstract void pop(); - @Invoker("peek") - public abstract MatrixStack.Entry peekM(); + @Shadow - public abstract boolean isEmpty(); + public abstract void translate(float x, float y, float z); + @Shadow - public abstract void loadIdentity(); + public abstract void scale(float x, float y, float z); + + @Shadow + public abstract void multiply(Quaternionfc quaternion); + + @Shadow + public abstract void multiply(Quaternionfc quaternion, float originX, float originY, float originZ); @Override - public void multiply(QuaternionfRef quaternion) { - this.multiply((Quaternionfc) quaternion); + public void translate(float x, float y) { + translate(x, y, 0); } + @Override - public void multiply(QuaternionfRef quaternion, float originX, float originY, float originZ) { - this.multiply((Quaternionfc) quaternion, originX, originY, originZ); + public void scale(float x, float y) { + scale(x, y, 1.0f); } + @Override - public Object peek() { - return this.peekM(); + public void rotate(float angle, float originX, float originY, float originZ) { + multiply(RotationAxis.NEGATIVE_Z.rotationDegrees(angle), originX, originY, originZ); + } + + @Override + public void rotate(float angle) { + multiply(RotationAxis.NEGATIVE_Z.rotationDegrees(angle)); } } \ No newline at end of file diff --git a/versions/1.21.5/src/main/java/org/saturnclient/impl/ui/EntityDrawerImpl.java b/versions/1.21.5/src/main/java/org/saturnclient/impl/ui/EntityDrawerImpl.java index beb41b6..7f0674b 100644 --- a/versions/1.21.5/src/main/java/org/saturnclient/impl/ui/EntityDrawerImpl.java +++ b/versions/1.21.5/src/main/java/org/saturnclient/impl/ui/EntityDrawerImpl.java @@ -3,7 +3,6 @@ package org.saturnclient.impl.ui; import org.jetbrains.annotations.Nullable; import org.joml.Quaternionf; import org.joml.Vector3f; -import org.saturnclient.common.ref.render.QuaternionfRef; import org.saturnclient.saturnclient.SaturnClient; import org.saturnclient.ui.ElementContext; import org.saturnclient.ui.RenderScope; @@ -51,27 +50,28 @@ public class EntityDrawerImpl implements EntityDrawer { public static void drawEntity(RenderScope renderScope, float x, float y, float size, Vector3f vector3f, Quaternionf quaternionf, @Nullable Quaternionf quaternionf2, LivingEntity entity) { - renderScope.getMatrixStack().push(); - renderScope.getMatrixStack().translate((double) x, (double) y, 50.0); - renderScope.getMatrixStack().scale(size, size, -size); - renderScope.getMatrixStack().translate(vector3f.x, vector3f.y, vector3f.z); - renderScope.getMatrixStack().multiply((QuaternionfRef) quaternionf); - renderScope.draw(); - DiffuseLighting.disableGuiDepthLighting(); - EntityRenderDispatcher entityRenderDispatcher = SaturnClient.client.getEntityRenderDispatcher(); + if (renderScope instanceof RenderScopeImpl scopeImpl) { + scopeImpl.matrices.push(); + scopeImpl.matrices.translate((double) x, (double) y, 0); + scopeImpl.matrices.scale(size, size, -size); + scopeImpl.matrices.translate(vector3f.x, vector3f.y, vector3f.z); + scopeImpl.matrices.multiply(quaternionf); + scopeImpl.draw(); + DiffuseLighting.disableGuiDepthLighting(); + EntityRenderDispatcher entityRenderDispatcher = SaturnClient.client.getEntityRenderDispatcher(); - entityRenderDispatcher.setRenderShadows(false); - if (renderScope instanceof RenderScopeImpl r) { - r.draw((vertexConsumers) -> { + entityRenderDispatcher.setRenderShadows(false); + scopeImpl.draw((vertexConsumers) -> { entityRenderDispatcher.render(entity, 0.0, 0.0, 0.0, 1.0F, - r.matrices, vertexConsumers, - 15728880); + scopeImpl.matrices, vertexConsumers, 15728880); }); + + scopeImpl.draw(); + entityRenderDispatcher.setRenderShadows(true); + scopeImpl.getMatrixStack().pop(); + DiffuseLighting.enableGuiDepthLighting(); } - renderScope.draw(); - entityRenderDispatcher.setRenderShadows(true); - renderScope.getMatrixStack().pop(); - DiffuseLighting.enableGuiDepthLighting(); + } @Override diff --git a/versions/1.21.5/src/main/java/org/saturnclient/impl/ui/RenderScopeImpl.java b/versions/1.21.5/src/main/java/org/saturnclient/impl/ui/RenderScopeImpl.java index 24f087b..4124776 100644 --- a/versions/1.21.5/src/main/java/org/saturnclient/impl/ui/RenderScopeImpl.java +++ b/versions/1.21.5/src/main/java/org/saturnclient/impl/ui/RenderScopeImpl.java @@ -35,8 +35,9 @@ import net.minecraft.client.texture.Sprite; import net.minecraft.client.util.Window; import net.minecraft.client.util.math.MatrixStack; import net.minecraft.entity.LivingEntity; -import net.minecraft.item.ItemStack; import net.minecraft.item.ItemDisplayContext; +import net.minecraft.item.ItemStack; + import net.minecraft.text.Text; import net.minecraft.util.Identifier; import net.minecraft.util.crash.CrashException; @@ -46,12 +47,18 @@ import net.minecraft.util.math.RotationAxis; import net.minecraft.world.World; public class RenderScopeImpl implements RenderScope { + // ---------------------------- + // Fields + // ---------------------------- public MatrixStack matrices; public VertexConsumerProvider.Immediate vertexConsumers; private ScissorStack scissorStack = new ScissorStack(); private int opacity = 255 << 24; private final ItemRenderState itemRenderState; + // ---------------------------- + // Constructors + // ---------------------------- public RenderScopeImpl(DrawContext context) { this(context.getMatrices(), ((DrawContextAccessor) context).getVertexConsumers()); } @@ -63,11 +70,17 @@ public class RenderScopeImpl implements RenderScope { this.itemRenderState = new ItemRenderState(); } + // ---------------------------- + // Matrix & Transform + // ---------------------------- @Override public MatrixStackRef getMatrixStack() { return (MatrixStackRef) matrices; } + // ---------------------------- + // Color & Opacity + // ---------------------------- @Override public void setOpacity(float alpha) { this.opacity = (int) (alpha * 255) << 24; @@ -81,132 +94,12 @@ public class RenderScopeImpl implements RenderScope { return (mixedAlpha << 24) | (color & 0x00FFFFFF); } + // ---------------------------- + // Draw / Window Info + // ---------------------------- @Override - public void drawRectangle(int x, int y, int width, int height, int color) { - if (color == 0) - return; - color = getColor(color); - Matrix4f matrix4f = this.matrices.peek().getPositionMatrix(); - - int x1 = x; - int x2 = x + width; - int y1 = y; - int y2 = y + height; - - int i; - if (x1 < x2) { - i = x1; - x1 = x2; - x2 = i; - } - - if (y1 < y2) { - i = y1; - y1 = y2; - y2 = i; - } - - VertexConsumer vertexConsumer = this.vertexConsumers.getBuffer(RenderLayer.getGui()); - vertexConsumer.vertex(matrix4f, (float) x1, (float) y1, 0).color(color); - vertexConsumer.vertex(matrix4f, (float) x1, (float) y2, 0).color(color); - vertexConsumer.vertex(matrix4f, (float) x2, (float) y2, 0).color(color); - vertexConsumer.vertex(matrix4f, (float) x2, (float) y1, 0).color(color); - } - - @Override - public void drawText(String text, int x, int y, int font, int color) { - drawText(1.0f, text, x, y, font, color); - } - - @Override - public void drawText(float scale, String text, int x, int y, int font, int color) { - if (color == 0) - return; - if (font == 0) { - scale *= 2; - } - int i = 0; - for (String line : text.split("\n")) { - color = getColor(color); - matrices.push(); - matrices.translate(x, y + (i * Fonts.getHeight()), 0); - matrices.scale(scale, scale, 1.0f); - TextRenderer textRenderer = SaturnClient.client.textRenderer; - textRenderer.draw((Text) Fonts.setFont(line, font), 0, - font == 0 ? 1 : 7, color, false, - this.matrices.peek().getPositionMatrix(), - this.vertexConsumers, TextLayerType.NORMAL, 0, 15728880); - matrices.pop(); - i++; - } - } - - private void drawRoundedCorner(int width, int height, int radius, int color) { - int w = width * 20; - int h = height * 20; - - for (int y = 0; y < h; y++) { - int startX = 0; - - if (y < radius) { - double dy = radius - y - 0.5; - double dx = Math.sqrt(Math.max(0, radius * radius - dy * dy)); - startX = radius - (int) dx; - } - - this.drawRectangle(startX, y, w - startX, 1, color); - } - } - - private void drawRoundedSide(int cornerWidth, int cornerHeight, int radius, int color) { - // Top - this.matrices.push(); - - this.matrices.scale(0.05f, 0.05f, 1.0f); - - this.drawRoundedCorner(cornerWidth, cornerHeight, radius * 10, color); - - this.matrices.pop(); - - // Bottom - this.matrices.push(); - - this.matrices.translate(cornerWidth, cornerHeight * 2, 0); - - this.matrices.multiply(RotationAxis.NEGATIVE_Z.rotationDegrees(90)); - - this.matrices.translate(0, -cornerWidth, 0); - - this.matrices.scale(0.05f, 0.05f, 1.0f); - - this.drawRoundedCorner(cornerHeight, cornerWidth, radius * 10, color); - - this.matrices.pop(); - } - - @Override - public void drawRoundedRectangle(int x, int y, int width, int height, int radius, int color) { - if (color == 0) - return; - radius = Math.min(radius, Math.min(width, height)); - int cornerWidth = width / 2; - int cornerHeight = height / 2; - - this.matrices.push(); - - this.matrices.translate(x, y, 0); - - this.drawRoundedSide(cornerWidth, cornerHeight, radius, color); - - this.matrices.translate(cornerWidth * 2, cornerHeight * 2, 0); - - this.matrices.multiply(RotationAxis.NEGATIVE_Z.rotationDegrees(180)); - - this.matrices.translate(0, 0, 0); - - this.drawRoundedSide(cornerWidth, cornerHeight, radius, color); - - this.matrices.pop(); + public void draw() { + this.vertexConsumers.draw(); } @Override @@ -219,66 +112,221 @@ public class RenderScopeImpl implements RenderScope { return SaturnClient.client.getWindow().getScaledHeight(); } + public void draw(Consumer drawer) { + drawer.accept(this.vertexConsumers); + this.vertexConsumers.draw(); + } + + // ---------------------------- + // Shapes + // ---------------------------- @Override - public void drawTexture(IdentifierRef sprite, int x, int y, float u, float v, int width, int height, int color) { - this.drawTexture(sprite, x, y, u, v, width, height, width, height, width, height, color); - } - - @Override - public void drawTexture(IdentifierRef sprite, int x, int y, float u, float v, int width, int height) { - this.drawTexture(sprite, x, y, u, v, width, height, width, height, width, height); - } - - @Override - public void drawTexture(IdentifierRef sprite, int x, int y, float u, float v, int width, int height, - int regionWith, - int regionHeight, int textureWidth, int textureHeight) { - this.drawTexture(sprite, x, y, u, v, width, height, regionWith, regionHeight, textureWidth, textureHeight, -1); - } - - @Override - public void drawTexture(IdentifierRef sprite, int x, int y, float u, float v, int width, int height, - int regionWidth, - int regionHeight, int textureWidth, int textureHeight, int color) { - this.drawTexturedQuad((Identifier) (Object) sprite, x, x + width, y, y + height, - (u + 0.0F) / (float) textureWidth, - (u + (float) regionWidth) / (float) textureWidth, (v + 0.0F) / (float) textureHeight, - (v + (float) regionHeight) / (float) textureHeight, color); - } - - /* Minecraft sprites */ - - public void drawTexture(Identifier sprite, int x, int y, float u, float v, int width, int height, int color) { - this.drawTexture(sprite, x, y, u, v, width, height, width, height, width, height, color); - } - - public void drawTexture(Identifier sprite, int x, int y, float u, float v, int width, int height) { - this.drawTexture(sprite, x, y, u, v, width, height, width, height, width, height); - } - - public void drawTexture(Identifier sprite, int x, int y, float u, float v, int width, int height, int regionWith, - int regionHeight, int textureWidth, int textureHeight) { - this.drawTexture(sprite, x, y, u, v, width, height, regionWith, regionHeight, textureWidth, textureHeight, -1); - } - - public void drawTexture(Identifier sprite, int x, int y, float u, float v, int width, int height, int regionWidth, - int regionHeight, int textureWidth, int textureHeight, int color) { - this.drawTexturedQuad(sprite, x, x + width, y, y + height, (u + 0.0F) / (float) textureWidth, - (u + (float) regionWidth) / (float) textureWidth, (v + 0.0F) / (float) textureHeight, - (v + (float) regionHeight) / (float) textureHeight, color); - } - - private void drawTexturedQuad(Identifier sprite, int x1, int x2, int y1, int y2, float u1, float u2, float v1, - float v2, int color) { - - if (sprite.toString().endsWith(".svg")) { - sprite = (Identifier) (Object) SvgTexture.getSvg(Providers.saturn.getClient(), - (IdentifierRef) (Object) sprite, - (x2 - x1) * 2, (y2 - y1) * 2); - } - + public void drawRectangle(int x, int y, int width, int height, int color) { if (color == 0) return; + color = getColor(color); + + Matrix4f matrix4f = this.matrices.peek().getPositionMatrix(); + + int x1 = x; + int x2 = x + width; + int y1 = y; + int y2 = y + height; + + if (x1 < x2) { + int tmp = x1; + x1 = x2; + x2 = tmp; + } + if (y1 < y2) { + int tmp = y1; + y1 = y2; + y2 = tmp; + } + + VertexConsumer vertexConsumer = this.vertexConsumers.getBuffer(RenderLayer.getGui()); + vertexConsumer.vertex(matrix4f, x1, y1, 0).color(color); + vertexConsumer.vertex(matrix4f, x1, y2, 0).color(color); + vertexConsumer.vertex(matrix4f, x2, y2, 0).color(color); + vertexConsumer.vertex(matrix4f, x2, y1, 0).color(color); + } + + @Override + public void fill(int x1, int y1, int x2, int y2, int color) { + fill(x1, y1, x2, y2, 0, color); + } + + public void fill(int x1, int y1, int x2, int y2, int z, int color) { + fill(RenderLayer.getGui(), x1, y1, x2, y2, z, color); + } + + public void fill(RenderLayer layer, int x1, int y1, int x2, int y2, int color) { + fill(layer, x1, y1, x2, y2, 0, color); + } + + public void fill(RenderLayer layer, int x1, int y1, int x2, int y2, int z, int color) { + Matrix4f matrix4f = this.matrices.peek().getPositionMatrix(); + if (x1 < x2) { + int tmp = x1; + x1 = x2; + x2 = tmp; + } + if (y1 < y2) { + int tmp = y1; + y1 = y2; + y2 = tmp; + } + + VertexConsumer vertexConsumer = this.vertexConsumers.getBuffer(layer); + vertexConsumer.vertex(matrix4f, x1, y1, z).color(color); + vertexConsumer.vertex(matrix4f, x1, y2, z).color(color); + vertexConsumer.vertex(matrix4f, x2, y2, z).color(color); + vertexConsumer.vertex(matrix4f, x2, y1, z).color(color); + } + + @Override + public void drawBorder(int x, int y, int width, int height, int color) { + fill(x, y, x + width, y + 1, color); + fill(x, y + height - 1, x + width, y + height, color); + fill(x, y + 1, x + 1, y + height - 1, color); + fill(x + width - 1, y + 1, x + width, y + height - 1, color); + } + + @Override + public void drawRoundedRectangle(int x, int y, int width, int height, int radius, int color) { + if (color == 0) + return; + + radius = Math.min(radius, Math.min(width, height)); + int cornerWidth = width / 2; + int cornerHeight = height / 2; + + matrices.push(); + matrices.translate(x, y, 0); + + drawRoundedSide(cornerWidth, cornerHeight, radius, color); + + matrices.translate(cornerWidth * 2, cornerHeight * 2, 0); + matrices.multiply(RotationAxis.NEGATIVE_Z.rotationDegrees(180)); + drawRoundedSide(cornerWidth, cornerHeight, radius, color); + + matrices.pop(); + } + + // Rounded rectangle helpers + private void drawRoundedCorner(int width, int height, int radius, int color) { + int w = width * 20; + int h = height * 20; + + for (int y = 0; y < h; y++) { + int startX = 0; + if (y < radius) { + double dy = radius - y - 0.5; + double dx = Math.sqrt(Math.max(0, radius * radius - dy * dy)); + startX = radius - (int) dx; + } + drawRectangle(startX, y, w - startX, 1, color); + } + } + + private void drawRoundedSide(int cornerWidth, int cornerHeight, int radius, int color) { + // Top + matrices.push(); + matrices.scale(0.05f, 0.05f, 1.0f); + drawRoundedCorner(cornerWidth, cornerHeight, radius * 10, color); + matrices.pop(); + + // Bottom + matrices.push(); + matrices.translate(cornerWidth, cornerHeight * 2, 0); + matrices.multiply(RotationAxis.NEGATIVE_Z.rotationDegrees(90)); + matrices.translate(0, -cornerWidth, 0); + matrices.scale(0.05f, 0.05f, 1.0f); + drawRoundedCorner(cornerHeight, cornerWidth, radius * 10, color); + matrices.pop(); + } + + // ---------------------------- + // Text + // ---------------------------- + @Override + public void drawText(String text, int x, int y, int font, int color) { + drawText(1.0f, text, x, y, font, color); + } + + @Override + public void drawText(float scale, String text, int x, int y, int font, int color) { + if (color == 0) + return; + if (font == 0) + scale *= 2; + + int i = 0; + for (String line : text.split("\n")) { + color = getColor(color); + matrices.push(); + matrices.translate(x, y + i * Fonts.getHeight(), 0); + matrices.scale(scale, scale, 1.0f); + TextRenderer textRenderer = SaturnClient.client.textRenderer; + textRenderer.draw((Text) Fonts.setFont(line, font), 0, font == 0 ? 1 : 7, color, false, + matrices.peek().getPositionMatrix(), vertexConsumers, TextLayerType.NORMAL, 0, 15728880); + matrices.pop(); + i++; + } + } + + // ---------------------------- + // Textures & Sprites + // ---------------------------- + @Override + public void drawTexture(IdentifierRef sprite, int x, int y, float u, float v, int width, int height) { + drawTexture(sprite, x, y, u, v, width, height, width, height, width, height); + } + + @Override + public void drawTexture(IdentifierRef sprite, int x, int y, float u, float v, int width, int height, int color) { + drawTexture(sprite, x, y, u, v, width, height, width, height, width, height, color); + } + + @Override + public void drawTexture(IdentifierRef sprite, int x, int y, float u, float v, int width, int height, + int regionWidth, int regionHeight, int textureWidth, int textureHeight) { + drawTexture(sprite, x, y, u, v, width, height, regionWidth, regionHeight, textureWidth, textureHeight, -1); + } + + @Override + public void drawTexture(IdentifierRef sprite, int x, int y, float u, float v, int width, int height, + int regionWidth, int regionHeight, int textureWidth, int textureHeight, int color) { + drawTexturedQuad((Identifier) (Object) sprite, x, x + width, y, y + height, + (u + 0.0f) / textureWidth, (u + regionWidth) / textureWidth, + (v + 0.0f) / textureHeight, (v + regionHeight) / textureHeight, color); + } + + @Override + public void drawSpriteStretched(SpriteRef sprite, int x, int y, int width, int height) { + drawSpriteStretched(sprite, x, y, width, height, -1); + } + + @Override + public void drawSpriteStretched(SpriteRef saturnSprite, int x, int y, int width, int height, int color) { + Sprite sprite = (Sprite) saturnSprite; + if (color == 0) + return; + if (width != 0 && height != 0) { + drawTexturedQuad(sprite.getAtlasId(), x, x + width, y, y + height, + sprite.getMinU(), sprite.getMaxU(), sprite.getMinV(), sprite.getMaxV(), color); + } + } + + private void drawTexturedQuad(Identifier sprite, int x1, int x2, int y1, int y2, + float u1, float u2, float v1, float v2, int color) { + if (sprite.toString().endsWith(".svg")) { + sprite = (Identifier) (Object) SvgTexture.getSvg(Providers.saturn.getClient(), + (IdentifierRef) (Object) sprite, (x2 - x1) * 2, (y2 - y1) * 2); + } + if (color == 0) + return; + x1 *= 4; x2 *= 4; y1 *= 4; @@ -287,58 +335,104 @@ public class RenderScopeImpl implements RenderScope { matrices.push(); matrices.scale(0.25f, 0.25f, 1.0f); - RenderLayer renderLayer = (RenderLayer) RenderLayer.getGuiTextured(sprite); - Matrix4f matrix4f = this.matrices.peek().getPositionMatrix(); - VertexConsumer vertexConsumer = this.vertexConsumers.getBuffer(renderLayer); - vertexConsumer.vertex(matrix4f, (float) x1, (float) y1, 0.0F).texture(u1, v1).color(color); - vertexConsumer.vertex(matrix4f, (float) x1, (float) y2, 0.0F).texture(u1, v2).color(color); - vertexConsumer.vertex(matrix4f, (float) x2, (float) y2, 0.0F).texture(u2, v2).color(color); - vertexConsumer.vertex(matrix4f, (float) x2, (float) y1, 0.0F).texture(u2, v1).color(color); + RenderLayer renderLayer = RenderLayer.getGuiTextured(sprite); + Matrix4f matrix4f = matrices.peek().getPositionMatrix(); + VertexConsumer vertexConsumer = vertexConsumers.getBuffer(renderLayer); + vertexConsumer.vertex(matrix4f, x1, y1, 0).texture(u1, v1).color(color); + vertexConsumer.vertex(matrix4f, x1, y2, 0).texture(u1, v2).color(color); + vertexConsumer.vertex(matrix4f, x2, y2, 0).texture(u2, v2).color(color); + vertexConsumer.vertex(matrix4f, x2, y1, 0).texture(u2, v1).color(color); matrices.pop(); } + // ---------------------------- + // Items + // ---------------------------- + @Override + public void drawItem(ItemStackRef item, int x, int y) { + drawItem(SaturnClient.client.player, SaturnClient.client.world, item, x, y, 0); + } + + private void drawItem(@Nullable LivingEntity entity, @Nullable World world, ItemStackRef stack, int x, int y, + int seed) { + drawItem(entity, world, (ItemStack) (Object) stack, x, y, seed, 0); + } + + private void drawItem(@Nullable LivingEntity entity, @Nullable World world, ItemStack stack, int x, int y, int seed, + int z) { + if (stack.isEmpty()) + return; + + SaturnClient.client.getItemModelManager().update(itemRenderState, stack, ItemDisplayContext.GUI, world, entity, + seed); + + if (!stack.isEmpty()) { + SaturnClient.client.getItemModelManager().clearAndUpdate(this.itemRenderState, stack, + ItemDisplayContext.GUI, world, + entity, seed); + this.matrices.push(); + this.matrices.translate((float) (x + 8), (float) (y + 8), (float) (150 + z)); + + try { + this.matrices.scale(16.0F, -16.0F, 16.0F); + boolean bl = !this.itemRenderState.isSideLit(); + if (bl) { + this.draw(); + DiffuseLighting.disableGuiDepthLighting(); + } + + this.itemRenderState.render(this.matrices, this.vertexConsumers, 15728880, OverlayTexture.DEFAULT_UV); + this.draw(); + if (bl) { + DiffuseLighting.enableGuiDepthLighting(); + } + } catch (Throwable throwable) { + CrashReport crashReport = CrashReport.create(throwable, "Rendering item"); + CrashReportSection crashReportSection = crashReport.addElement("Item being rendered"); + crashReportSection.add("Item Type", () -> String.valueOf(stack.getItem())); + crashReportSection.add("Item Components", () -> String.valueOf(stack.getComponents())); + crashReportSection.add("Item Foil", () -> String.valueOf(stack.hasGlint())); + throw new CrashException(crashReport); + } + + this.matrices.pop(); + } + } + + // ---------------------------- + // Scissor / Clipping + // ---------------------------- @Override public void enableScissor(int x1, int y1, int x2, int y2) { - ScreenRect screenRect = (new ScreenRect(x1, y1, x2 - x1, y2 - y1)) - .transform(this.matrices.peek().getPositionMatrix()); - this.setScissor(this.scissorStack.push(screenRect)); + ScreenRect screenRect = new ScreenRect(x1, y1, x2 - x1, y2 - y1) + .transform(matrices.peek().getPositionMatrix()); + setScissor(scissorStack.push(screenRect)); } @Override public void disableScissor() { - this.setScissor(this.scissorStack.pop()); + setScissor(scissorStack.pop()); } @Override public boolean scissorContains(int x, int y) { - return this.scissorStack.containsPoint(x, y); + return scissorStack.containsPoint(x, y); } private void setScissor(@Nullable ScreenRect rect) { - this.draw(); + draw(); if (rect != null) { Window window = SaturnClient.client.getWindow(); - int i = window.getFramebufferHeight(); - double d = window.getScaleFactor(); - double e = (double) rect.getLeft() * d; - double f = (double) i - (double) rect.getBottom() * d; - double g = (double) rect.width() * d; - double h = (double) rect.height() * d; - RenderSystem.enableScissor((int) e, (int) f, Math.max(0, (int) g), Math.max(0, (int) h)); + int framebufferHeight = window.getFramebufferHeight(); + double scaleFactor = window.getScaleFactor(); + RenderSystem.enableScissor( + (int) (rect.getLeft() * scaleFactor), + (int) (framebufferHeight - rect.getBottom() * scaleFactor), + Math.max(0, (int) (rect.width() * scaleFactor)), + Math.max(0, (int) (rect.height() * scaleFactor))); } else { RenderSystem.disableScissor(); } - - } - - @Override - public void draw() { - this.vertexConsumers.draw(); - } - - public void draw(Consumer drawer) { - drawer.accept(this.vertexConsumers); - this.vertexConsumers.draw(); } static class ScissorStack { @@ -371,132 +465,4 @@ public class RenderScopeImpl implements RenderScope { return this.stack.isEmpty() ? true : this.stack.peek().contains(p_329411_, p_333404_); } } - - @Override - public void drawItem(ItemStackRef item, int x, int y) { - this.drawItem(SaturnClient.client.player, SaturnClient.client.world, item, x, y, 0); - } - - @Override - public void drawItem(ItemStackRef stack, int x, int y, int seed) { - this.drawItem(SaturnClient.client.player, SaturnClient.client.world, stack, x, y, seed); - } - - @Override - public void drawItem(ItemStackRef stack, int x, int y, int seed, int z) { - this.drawItem(SaturnClient.client.player, SaturnClient.client.world, (ItemStack) (Object) stack, x, y, seed, z); - } - - @Override - public void drawItemWithoutEntity(ItemStackRef stack, int x, int y) { - this.drawItemWithoutEntity(stack, x, y, 0); - } - - @Override - public void drawItemWithoutEntity(ItemStackRef stack, int x, int y, int seed) { - this.drawItem((LivingEntity) null, SaturnClient.client.world, stack, x, y, seed); - } - - private void drawItem(@Nullable LivingEntity entity, @Nullable World world, ItemStackRef stack, int x, int y, - int seed) { - this.drawItem(entity, world, (ItemStack) (Object) stack, x, y, seed, 0); - } - - private void drawItem(@Nullable LivingEntity entity, @Nullable World world, ItemStack stack, int x, int y, int seed, - int z) { - if (!stack.isEmpty()) { - SaturnClient.client.getItemModelManager().update(this.itemRenderState, stack, ItemDisplayContext.GUI, world, - entity, seed); - this.matrices.push(); - this.matrices.translate((float) (x + 8), (float) (y + 8), - (float) (150 + z)); // always has depth - - try { - this.matrices.scale(16.0F, -16.0F, 16.0F); - boolean bl = !this.itemRenderState.isSideLit(); - if (bl) { - this.draw(); - DiffuseLighting.disableGuiDepthLighting(); - } - - this.itemRenderState.render(this.matrices, this.vertexConsumers, 15728880, OverlayTexture.DEFAULT_UV); - this.draw(); - if (bl) { - DiffuseLighting.enableGuiDepthLighting(); - } - } catch (Throwable var11) { - CrashReport crashReport = CrashReport.create(var11, "Rendering item"); - CrashReportSection crashReportSection = crashReport.addElement("Item being rendered"); - crashReportSection.add("Item Type", () -> { - return String.valueOf(stack.getItem()); - }); - crashReportSection.add("Item Components", () -> { - return String.valueOf(stack.getComponents()); - }); - crashReportSection.add("Item Foil", () -> { - return String.valueOf(stack.hasGlint()); - }); - throw new CrashException(crashReport); - } - - this.matrices.pop(); - } - } - - @Override - public void drawSpriteStretched(SpriteRef sprite, int x, int y, int width, int height) { - this.drawSpriteStretched(sprite, x, y, width, height, -1); - } - - @Override - public void drawSpriteStretched(SpriteRef saturnSprite, int x, int y, int width, int height, int color) { - Sprite sprite = (Sprite) saturnSprite; - if (color == 0) - return; - if (width != 0 && height != 0) { - this.drawTexturedQuad(sprite.getAtlasId(), x, x + width, y, y + height, sprite.getMinU(), sprite.getMaxU(), - sprite.getMinV(), sprite.getMaxV(), color); - } - } - - public void fill(int x1, int y1, int x2, int y2, int color) { - this.fill(x1, y1, x2, y2, 0, color); - } - - public void fill(int x1, int y1, int x2, int y2, int z, int color) { - this.fill(RenderLayer.getGui(), x1, y1, x2, y2, z, color); - } - - public void fill(RenderLayer layer, int x1, int y1, int x2, int y2, int color) { - this.fill(layer, x1, y1, x2, y2, 0, color); - } - - public void fill(RenderLayer layer, int x1, int y1, int x2, int y2, int z, int color) { - Matrix4f matrix4f = this.matrices.peek().getPositionMatrix(); - int i; - if (x1 < x2) { - i = x1; - x1 = x2; - x2 = i; - } - - if (y1 < y2) { - i = y1; - y1 = y2; - y2 = i; - } - - VertexConsumer vertexConsumer = this.vertexConsumers.getBuffer(layer); - vertexConsumer.vertex(matrix4f, (float) x1, (float) y1, (float) z).color(color); - vertexConsumer.vertex(matrix4f, (float) x1, (float) y2, (float) z).color(color); - vertexConsumer.vertex(matrix4f, (float) x2, (float) y2, (float) z).color(color); - vertexConsumer.vertex(matrix4f, (float) x2, (float) y1, (float) z).color(color); - } - - public void drawBorder(int x, int y, int width, int height, int color) { - this.fill(x, y, x + width, y + 1, color); - this.fill(x, y + height - 1, x + width, y + height, color); - this.fill(x, y + 1, x + 1, y + height - 1, color); - this.fill(x + width - 1, y + 1, x + width, y + height - 1, color); - } }