From 6e5fc58696937f0e922ce0c61bbfe5b67743bb59 Mon Sep 17 00:00:00 2001
From: ArtDev <45949002+artdeell@users.noreply.github.com>
Date: Mon, 18 Sep 2023 11:14:29 +0300
Subject: [PATCH 01/15] Use IDENTITY preTransform instead of currentTransform

This should fix issues with the output being rotated when using SurfaceView on Android
---
 src/main/java/net/vulkanmod/vulkan/framebuffer/SwapChain.java | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/src/main/java/net/vulkanmod/vulkan/framebuffer/SwapChain.java b/src/main/java/net/vulkanmod/vulkan/framebuffer/SwapChain.java
index 32e80f80e..dd75f4012 100644
--- a/src/main/java/net/vulkanmod/vulkan/framebuffer/SwapChain.java
+++ b/src/main/java/net/vulkanmod/vulkan/framebuffer/SwapChain.java
@@ -129,7 +129,7 @@ public void createSwapChain() {
                 createInfo.imageSharingMode(VK_SHARING_MODE_EXCLUSIVE);
             }
 
-            createInfo.preTransform(surfaceProperties.capabilities.currentTransform());
+            createInfo.preTransform(VK_SURFACE_TRANSFORM_IDENTITY_BIT_KHR);
             createInfo.compositeAlpha(VK_COMPOSITE_ALPHA_OPAQUE_BIT_KHR);
             createInfo.presentMode(presentMode);
             createInfo.clipped(true);

From 9fedf1501110984c8a52a5b54bc7659992ca2108 Mon Sep 17 00:00:00 2001
From: artdeell <ultramaksim@gmail.com>
Date: Tue, 19 Sep 2023 07:39:34 +0300
Subject: [PATCH 02/15] Feat[renderer]: Implement surface pre-rotation

---
 .../java/net/vulkanmod/vulkan/Renderer.java   | 72 ++++++++++++++++++-
 .../net/vulkanmod/vulkan/VRenderSystem.java   |  3 +-
 .../java/net/vulkanmod/vulkan/Vulkan.java     | 10 ++-
 .../vulkan/framebuffer/SwapChain.java         | 50 ++++++++++++-
 4 files changed, 127 insertions(+), 8 deletions(-)

diff --git a/src/main/java/net/vulkanmod/vulkan/Renderer.java b/src/main/java/net/vulkanmod/vulkan/Renderer.java
index f6598ab8d..a9ef27dc3 100644
--- a/src/main/java/net/vulkanmod/vulkan/Renderer.java
+++ b/src/main/java/net/vulkanmod/vulkan/Renderer.java
@@ -31,6 +31,7 @@
 import static org.lwjgl.system.MemoryStack.stackGet;
 import static org.lwjgl.system.MemoryStack.stackPush;
 import static org.lwjgl.vulkan.EXTDebugUtils.*;
+import static org.lwjgl.vulkan.KHRSurface.*;
 import static org.lwjgl.vulkan.KHRSwapchain.*;
 import static org.lwjgl.vulkan.VK10.*;
 
@@ -543,7 +544,15 @@ public static void clearAttachments(int v, int width, int height) {
 
     public static void setViewport(int x, int y, int width, int height) {
         try(MemoryStack stack = stackPush()) {
+            VkExtent2D transformedExtent = transformToExtent(VkExtent2D.calloc(stack), width, height);
+            VkOffset2D transformedOffset = transformToOffset(VkOffset2D.calloc(stack), x, y, width, height);
             VkViewport.Buffer viewport = VkViewport.calloc(1, stack);
+
+            x = transformedOffset.x();
+            y = transformedOffset.y();
+            width = transformedExtent.width();
+            height = transformedExtent.height();
+
             viewport.x(x);
             viewport.y(height + y);
             viewport.width(width);
@@ -553,20 +562,77 @@ public static void setViewport(int x, int y, int width, int height) {
 
             VkRect2D.Buffer scissor = VkRect2D.malloc(1, stack);
             scissor.offset(VkOffset2D.malloc(stack).set(0, 0));
-            scissor.extent(VkExtent2D.malloc(stack).set(width, height));
+            scissor.extent(transformedExtent);
 
             vkCmdSetViewport(INSTANCE.currentCmdBuffer, 0, viewport);
             vkCmdSetScissor(INSTANCE.currentCmdBuffer, 0, scissor);
         }
     }
 
+    /**
+     * Transform the X/Y coordinates from Minecraft coordinate space to Vulkan coordinate space
+     * and write them to VkOffset2D
+     * @param offset2D the offset to which the coordinates should be written
+     * @param x the X coordinate
+     * @param y the Y coordinate
+     * @param w the viewport/scissor operation width
+     * @param h the viewport/scissor operation height
+     * @return same offset2D with transformations applied as necessary
+     */
+    private static VkOffset2D transformToOffset(VkOffset2D offset2D, int x, int y, int w, int h) {
+        int pretransformFlags = Vulkan.getPretransformFlags();
+        if(pretransformFlags == 0) {
+            offset2D.set(x, y);
+            return offset2D;
+        }
+        Framebuffer boundFramebuffer = Renderer.getInstance().boundFramebuffer;
+        int framebufferWidth = boundFramebuffer.getWidth();
+        int framebufferHeight = boundFramebuffer.getHeight();
+        switch (pretransformFlags) {
+            case VK_SURFACE_TRANSFORM_ROTATE_90_BIT_KHR -> {
+                offset2D.x(framebufferWidth - h - y);
+                offset2D.y(x);
+            }
+            case VK_SURFACE_TRANSFORM_ROTATE_180_BIT_KHR -> {
+                offset2D.x(framebufferWidth - w - x);
+                offset2D.y(framebufferHeight - h - y);
+            }
+            case VK_SURFACE_TRANSFORM_ROTATE_270_BIT_KHR -> {
+                offset2D.x(y);
+                offset2D.y(framebufferHeight - w - x);
+            }
+            default -> {
+                offset2D.x(x);
+                offset2D.y(y);
+            }
+        }
+        return offset2D;
+    }
+
+    /**
+     * Transform the width and height from Minecraft coordinate space to the Vulkan coordinate space
+     * and write them to VkExtent2D
+     * @param extent2D the extent to which the values should be written
+     * @param w the viewport/scissor operation width
+     * @param h the viewport/scissor operation height
+     * @return the same VkExtent2D with transformations applied as necessary
+     */
+    private static VkExtent2D transformToExtent(VkExtent2D extent2D, int w, int h) {
+        int pretransformFlags = Vulkan.getPretransformFlags();
+        if(pretransformFlags == VK_SURFACE_TRANSFORM_ROTATE_90_BIT_KHR ||
+                pretransformFlags == VK_SURFACE_TRANSFORM_ROTATE_270_BIT_KHR) {
+            return extent2D.set(h, w);
+        }
+        return extent2D.set(w, h);
+    }
+
     public static void setScissor(int x, int y, int width, int height) {
         try(MemoryStack stack = stackPush()) {
             int framebufferHeight = Renderer.getInstance().boundFramebuffer.getHeight();
 
             VkRect2D.Buffer scissor = VkRect2D.malloc(1, stack);
-            scissor.offset(VkOffset2D.malloc(stack).set(x, framebufferHeight - (y + height)));
-            scissor.extent(VkExtent2D.malloc(stack).set(width, height));
+            scissor.offset(transformToOffset(VkOffset2D.malloc(stack), x, framebufferHeight - (y + height), width, height));
+            scissor.extent(transformToExtent(VkExtent2D.malloc(stack), width, height));
 
             vkCmdSetScissor(INSTANCE.currentCmdBuffer, 0, scissor);
         }
diff --git a/src/main/java/net/vulkanmod/vulkan/VRenderSystem.java b/src/main/java/net/vulkanmod/vulkan/VRenderSystem.java
index d6e3a6c96..23734dcb3 100644
--- a/src/main/java/net/vulkanmod/vulkan/VRenderSystem.java
+++ b/src/main/java/net/vulkanmod/vulkan/VRenderSystem.java
@@ -133,8 +133,7 @@ public static void applyProjectionMatrix(Matrix4f mat) {
     public static void calculateMVP() {
         org.joml.Matrix4f MV = new org.joml.Matrix4f(modelViewMatrix.buffer.asFloatBuffer());
         org.joml.Matrix4f P = new org.joml.Matrix4f(projectionMatrix.buffer.asFloatBuffer());
-
-        P.mul(MV).get(MVP.buffer);
+        (P.mul(MV)).mulLocal(Vulkan.getPretransformMatrix()).get(MVP.buffer);
     }
 
     public static void setTextureMatrix(Matrix4f mat) {
diff --git a/src/main/java/net/vulkanmod/vulkan/Vulkan.java b/src/main/java/net/vulkanmod/vulkan/Vulkan.java
index 27e67cc56..8814924e4 100644
--- a/src/main/java/net/vulkanmod/vulkan/Vulkan.java
+++ b/src/main/java/net/vulkanmod/vulkan/Vulkan.java
@@ -5,12 +5,11 @@
 import net.vulkanmod.vulkan.memory.MemoryManager;
 import net.vulkanmod.vulkan.memory.MemoryTypes;
 import net.vulkanmod.vulkan.memory.StagingBuffer;
-import net.vulkanmod.vulkan.queue.GraphicsQueue;
 import net.vulkanmod.vulkan.queue.Queue;
-import net.vulkanmod.vulkan.queue.TransferQueue;
 import net.vulkanmod.vulkan.shader.Pipeline;
 import net.vulkanmod.vulkan.texture.VulkanImage;
 import net.vulkanmod.vulkan.util.VUtil;
+import org.joml.Matrix4f;
 import org.lwjgl.PointerBuffer;
 import org.lwjgl.system.MemoryStack;
 import org.lwjgl.util.vma.VmaAllocatorCreateInfo;
@@ -462,6 +461,13 @@ public static VkExtent2D getSwapchainExtent()
         return swapChain.getExtent();
     }
 
+    public static Matrix4f getPretransformMatrix() {
+        return swapChain.getPretransformMatrix();
+    }
+    public static int getPretransformFlags() {
+        return swapChain.getPretransformFlags();
+    }
+
     public static List<VulkanImage> getSwapChainImages() { return swapChain.getImages(); }
 
     public static long getCommandPool()
diff --git a/src/main/java/net/vulkanmod/vulkan/framebuffer/SwapChain.java b/src/main/java/net/vulkanmod/vulkan/framebuffer/SwapChain.java
index dd75f4012..43bee7950 100644
--- a/src/main/java/net/vulkanmod/vulkan/framebuffer/SwapChain.java
+++ b/src/main/java/net/vulkanmod/vulkan/framebuffer/SwapChain.java
@@ -8,6 +8,7 @@
 import net.vulkanmod.vulkan.Vulkan;
 import net.vulkanmod.vulkan.queue.Queue;
 import net.vulkanmod.vulkan.texture.VulkanImage;
+import org.joml.Matrix4f;
 import org.lwjgl.system.MemoryStack;
 import org.lwjgl.vulkan.*;
 
@@ -39,6 +40,12 @@ public static int getDefaultDepthFormat() {
     private long swapChain = VK_NULL_HANDLE;
     private List<VulkanImage> swapChainImages;
     private VkExtent2D extent2D;
+    // A matrix that describes the transformations that should be applied
+    // to the output of the game.
+    private Matrix4f pretransformMatrix = new Matrix4f();
+    // The pretransform flags that were given to the swapchain,
+    // masked (see "setupPreRotation(VkExtent2D, VkSurfaceCapabilitiesKHR)")
+    private int pretransformFlags;
     public boolean isBGRAformat;
     private boolean vsync = false;
 
@@ -83,6 +90,7 @@ public void createSwapChain() {
             VkSurfaceFormatKHR surfaceFormat = getFormat(surfaceProperties.formats);
             int presentMode = getPresentMode(surfaceProperties.presentModes);
             VkExtent2D extent = getExtent(surfaceProperties.capabilities);
+            setupPreRotation(extent, surfaceProperties.capabilities);
 
             if(extent.width() == 0 && extent.height() == 0) {
                 if(swapChain != VK_NULL_HANDLE) {
@@ -129,7 +137,7 @@ public void createSwapChain() {
                 createInfo.imageSharingMode(VK_SHARING_MODE_EXCLUSIVE);
             }
 
-            createInfo.preTransform(VK_SURFACE_TRANSFORM_IDENTITY_BIT_KHR);
+            createInfo.preTransform(surfaceProperties.capabilities.currentTransform());
             createInfo.compositeAlpha(VK_COMPOSITE_ALPHA_OPAQUE_BIT_KHR);
             createInfo.presentMode(presentMode);
             createInfo.clipped(true);
@@ -327,6 +335,14 @@ public VkExtent2D getExtent() {
         return extent2D;
     }
 
+    public Matrix4f getPretransformMatrix(){
+        return pretransformMatrix;
+    }
+
+    public int getPretransformFlags() {
+        return pretransformFlags;
+    }
+
     public VulkanImage getColorAttachment() {
         return this.swapChainImages.get(Renderer.getCurrentFrame());
     }
@@ -393,6 +409,38 @@ private static VkExtent2D getExtent(VkSurfaceCapabilitiesKHR capabilities) {
         return actualExtent;
     }
 
+    private void setupPreRotation(VkExtent2D extent, VkSurfaceCapabilitiesKHR surfaceCapabilities) {
+        // Mask off anything else that does not interest us in the transform
+        pretransformFlags = surfaceCapabilities.currentTransform() &
+                (VK_SURFACE_TRANSFORM_ROTATE_90_BIT_KHR |
+                VK_SURFACE_TRANSFORM_ROTATE_180_BIT_KHR |
+                VK_SURFACE_TRANSFORM_ROTATE_270_BIT_KHR);
+        int rotateDegrees = 0;
+        boolean swapXY = false;
+        switch (pretransformFlags) {
+            case VK_SURFACE_TRANSFORM_ROTATE_90_BIT_KHR -> {
+                rotateDegrees = 90;
+                swapXY = true;
+            }
+            case VK_SURFACE_TRANSFORM_ROTATE_270_BIT_KHR -> {
+                rotateDegrees = 270;
+                swapXY = true;
+            }
+            case VK_SURFACE_TRANSFORM_ROTATE_180_BIT_KHR -> rotateDegrees = 180;
+        }
+        pretransformMatrix = pretransformMatrix.identity();
+        if(rotateDegrees != 0) {
+            pretransformMatrix.rotate((float) Math.toRadians(rotateDegrees), 0, 0, 1);
+            pretransformMatrix.invert();
+        }
+        if(swapXY) {
+            int originalWidth = extent.width();
+            int originalHeight = extent.height();
+            extent.width(originalHeight);
+            extent.height(originalWidth);
+        }
+    }
+
     public boolean isVsync() {
         return vsync;
     }

From 201afe02250548a831b2e06346a73a593f78b1e0 Mon Sep 17 00:00:00 2001
From: ArtDev <ultramaksim@gmail.com>
Date: Tue, 19 Sep 2023 13:57:34 +0300
Subject: [PATCH 03/15] Fix[scissor]: correctly transform from GL to VK
 coordinates

---
 src/main/java/net/vulkanmod/vulkan/Renderer.java | 10 ++++++++--
 1 file changed, 8 insertions(+), 2 deletions(-)

diff --git a/src/main/java/net/vulkanmod/vulkan/Renderer.java b/src/main/java/net/vulkanmod/vulkan/Renderer.java
index a9ef27dc3..2294fc1fe 100644
--- a/src/main/java/net/vulkanmod/vulkan/Renderer.java
+++ b/src/main/java/net/vulkanmod/vulkan/Renderer.java
@@ -628,11 +628,17 @@ private static VkExtent2D transformToExtent(VkExtent2D extent2D, int w, int h) {
 
     public static void setScissor(int x, int y, int width, int height) {
         try(MemoryStack stack = stackPush()) {
-            int framebufferHeight = Renderer.getInstance().boundFramebuffer.getHeight();
+        	VkExtent2D extent = VkExtent2D.malloc(stack);
+            Framebuffer boundFramebuffer = Renderer.getInstance().boundFramebuffer;
+            // Since our x and y are still in Minecraft's coordinate space, pre-transform the framebuffer's width and height to get expected results.
+            transformToExtent(extent, boundFramebuffer.getWidth(), boundFramebuffer.getHeight());
+            int framebufferHeight = extent.height();
 
             VkRect2D.Buffer scissor = VkRect2D.malloc(1, stack);
+            // Use this corrected height to transform from OpenGL to Vulkan coordinate space.
             scissor.offset(transformToOffset(VkOffset2D.malloc(stack), x, framebufferHeight - (y + height), width, height));
-            scissor.extent(transformToExtent(VkExtent2D.malloc(stack), width, height));
+            // Reuse the extent to transform the scissor width/height
+            scissor.extent(transformToExtent(extent, width, height));
 
             vkCmdSetScissor(INSTANCE.currentCmdBuffer, 0, scissor);
         }

From 2ad316526f1e585617540b33a0b415cf1454bc3f Mon Sep 17 00:00:00 2001
From: ArtDev <ultramaksim@gmail.com>
Date: Tue, 19 Sep 2023 17:43:31 +0300
Subject: [PATCH 04/15] Fix[transform]: apply pre-rotation on projection
 matrix, not MVP

---
 src/main/java/net/vulkanmod/vulkan/VRenderSystem.java | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/src/main/java/net/vulkanmod/vulkan/VRenderSystem.java b/src/main/java/net/vulkanmod/vulkan/VRenderSystem.java
index 23734dcb3..331a9e3dc 100644
--- a/src/main/java/net/vulkanmod/vulkan/VRenderSystem.java
+++ b/src/main/java/net/vulkanmod/vulkan/VRenderSystem.java
@@ -127,13 +127,13 @@ public static void applyModelViewMatrix(Matrix4f mat) {
     }
 
     public static void applyProjectionMatrix(Matrix4f mat) {
-        mat.get(projectionMatrix.buffer.asFloatBuffer());
+    	mat.mulLocal(Vulkan.getPretransformMatrix(), new Matrix4f()).get(projectionMatrix.buffer.asFloatBuffer());
     }
 
     public static void calculateMVP() {
         org.joml.Matrix4f MV = new org.joml.Matrix4f(modelViewMatrix.buffer.asFloatBuffer());
         org.joml.Matrix4f P = new org.joml.Matrix4f(projectionMatrix.buffer.asFloatBuffer());
-        (P.mul(MV)).mulLocal(Vulkan.getPretransformMatrix()).get(MVP.buffer);
+        P.mul(MV).get(MVP.buffer);
     }
 
     public static void setTextureMatrix(Matrix4f mat) {

From 385b0068ac9d15929993d1dbe556ebcd57144ee3 Mon Sep 17 00:00:00 2001
From: ArtDev <ultramaksim@gmail.com>
Date: Wed, 20 Sep 2023 11:20:05 +0300
Subject: [PATCH 05/15] Opt[transform]: skip matrix allocation if transform
 isn't necessary

---
 .../java/net/vulkanmod/vulkan/VRenderSystem.java     | 12 +++++++++++-
 1 file changed, 11 insertions(+), 1 deletion(-)

diff --git a/src/main/java/net/vulkanmod/vulkan/VRenderSystem.java b/src/main/java/net/vulkanmod/vulkan/VRenderSystem.java
index 331a9e3dc..588122596 100644
--- a/src/main/java/net/vulkanmod/vulkan/VRenderSystem.java
+++ b/src/main/java/net/vulkanmod/vulkan/VRenderSystem.java
@@ -127,7 +127,17 @@ public static void applyModelViewMatrix(Matrix4f mat) {
     }
 
     public static void applyProjectionMatrix(Matrix4f mat) {
-    	mat.mulLocal(Vulkan.getPretransformMatrix(), new Matrix4f()).get(projectionMatrix.buffer.asFloatBuffer());
+    	Matrix4f pretransformMatrix = Vulkan.getPretransformMatrix();
+        FloatBuffer projMatrixBuffer = projectionMatrix.buffer.asFloatBuffer();
+        // This allows us to skip allocating an object
+        // if the matrix is known to be an identity matrix.
+        // Tbh idk if the jvm will just optimize out the allocation but i can't be sure
+        // as java is sometimes pretty pedantic about object allocations.
+        if((pretransformMatrix.properties() & Matrix4f.PROPERTY_IDENTITY) != 0) {
+        	mat.get(projMatrixBuffer);
+        } else {
+        	mat.mulLocal(pretransformMatrix, new Matrix4f()).get(projMatrixBuffer);
+        }
     }
 
     public static void calculateMVP() {

From ef331bb7a1fd90c909cdc4380d2573159e693033 Mon Sep 17 00:00:00 2001
From: xCollateral <unknown>
Date: Tue, 19 Sep 2023 12:33:14 +0200
Subject: [PATCH 06/15] Removed spectator update chunks init leftover

---
 src/main/java/net/vulkanmod/render/chunk/WorldRenderer.java | 2 --
 1 file changed, 2 deletions(-)

diff --git a/src/main/java/net/vulkanmod/render/chunk/WorldRenderer.java b/src/main/java/net/vulkanmod/render/chunk/WorldRenderer.java
index 2fb75499e..0bbacb316 100644
--- a/src/main/java/net/vulkanmod/render/chunk/WorldRenderer.java
+++ b/src/main/java/net/vulkanmod/render/chunk/WorldRenderer.java
@@ -340,8 +340,6 @@ private void updateRenderChunks() {
     private void updateRenderChunksSpectator() {
         int maxDirectionsChanges = Initializer.CONFIG.advCulling;
 
-        this.initUpdate();
-
         int rebuildLimit = taskDispatcher.getIdleThreadsCount();
 
         if(rebuildLimit == 0)

From 2a22755358ddb3d61d45f061288b38c151d9b5cb Mon Sep 17 00:00:00 2001
From: xCollateral <unknown>
Date: Tue, 19 Sep 2023 12:40:05 +0200
Subject: [PATCH 07/15] Fixed crash when section is null

---
 .../vulkanmod/mixin/render/entity/EntityRendererM.java    | 8 +++++++-
 1 file changed, 7 insertions(+), 1 deletion(-)

diff --git a/src/main/java/net/vulkanmod/mixin/render/entity/EntityRendererM.java b/src/main/java/net/vulkanmod/mixin/render/entity/EntityRendererM.java
index e4af8f380..5b8faec1c 100644
--- a/src/main/java/net/vulkanmod/mixin/render/entity/EntityRendererM.java
+++ b/src/main/java/net/vulkanmod/mixin/render/entity/EntityRendererM.java
@@ -6,6 +6,7 @@
 import net.minecraft.world.phys.AABB;
 import net.minecraft.world.phys.Vec3;
 import net.vulkanmod.Initializer;
+import net.vulkanmod.render.chunk.RenderSection;
 import net.vulkanmod.render.chunk.WorldRenderer;
 import org.spongepowered.asm.mixin.Mixin;
 import org.spongepowered.asm.mixin.injection.At;
@@ -45,7 +46,12 @@ private boolean isVisible(Frustum frustum, AABB aABB) {
 
             Vec3 pos = aABB.getCenter();
 
-            return (worldRenderer.getLastFrame() == worldRenderer.getSectionGrid().getSectionAtBlockPos((int) pos.x(), (int) pos.y(), (int) pos.z()).getLastFrame());
+            RenderSection section = worldRenderer.getSectionGrid().getSectionAtBlockPos((int) pos.x(), (int) pos.y(), (int) pos.z());
+
+            if(section == null)
+                return frustum.isVisible(aABB);
+            
+            return worldRenderer.getLastFrame() == section.getLastFrame();
         } else {
             return frustum.isVisible(aABB);
         }

From f21cb7a4d5104d8262e6f29044179291e3c6cad3 Mon Sep 17 00:00:00 2001
From: xCollateral <unknown>
Date: Sat, 23 Sep 2023 12:37:09 +0200
Subject: [PATCH 08/15] Mip bias set to -0.5

---
 src/main/java/net/vulkanmod/vulkan/texture/VulkanImage.java | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/src/main/java/net/vulkanmod/vulkan/texture/VulkanImage.java b/src/main/java/net/vulkanmod/vulkan/texture/VulkanImage.java
index c2a231d75..aa9a7a92a 100644
--- a/src/main/java/net/vulkanmod/vulkan/texture/VulkanImage.java
+++ b/src/main/java/net/vulkanmod/vulkan/texture/VulkanImage.java
@@ -321,7 +321,7 @@ private void createTextureSampler(boolean blur, boolean clamp, boolean mipmap) {
                 samplerInfo.mipmapMode(VK_SAMPLER_MIPMAP_MODE_LINEAR);
                 samplerInfo.maxLod(mipLevels);
                 samplerInfo.minLod(0.0F);
-//                samplerInfo.mipLodBias(-1.0F);
+                samplerInfo.mipLodBias(-0.5F);
             } else {
                 samplerInfo.mipmapMode(VK_SAMPLER_MIPMAP_MODE_LINEAR);
                 samplerInfo.maxLod(0.0F);

From 35877ee9a5c16d8394157942a19c9775fe532794 Mon Sep 17 00:00:00 2001
From: xCollateral <unknown>
Date: Sat, 23 Sep 2023 12:38:03 +0200
Subject: [PATCH 09/15] Renamed methods

---
 .../java/net/vulkanmod/mixin/chunk/LevelRendererMixin.java  | 6 +++---
 src/main/java/net/vulkanmod/render/chunk/WorldRenderer.java | 6 +++---
 2 files changed, 6 insertions(+), 6 deletions(-)

diff --git a/src/main/java/net/vulkanmod/mixin/chunk/LevelRendererMixin.java b/src/main/java/net/vulkanmod/mixin/chunk/LevelRendererMixin.java
index a303b383a..a30aad134 100644
--- a/src/main/java/net/vulkanmod/mixin/chunk/LevelRendererMixin.java
+++ b/src/main/java/net/vulkanmod/mixin/chunk/LevelRendererMixin.java
@@ -96,7 +96,7 @@ private void setupRender(Camera camera, Frustum frustum, boolean isCapturedFrust
      */
     @Overwrite
     private void compileChunks(Camera camera) {
-        this.worldRenderer.compileChunks(camera);
+        this.worldRenderer.compileSections(camera);
     }
 
     /**
@@ -105,7 +105,7 @@ private void compileChunks(Camera camera) {
      */
     @Overwrite
     public boolean isChunkCompiled(BlockPos blockPos) {
-        return this.worldRenderer.isChunkCompiled(blockPos);
+        return this.worldRenderer.isSectionCompiled(blockPos);
     }
 
     /**
@@ -114,7 +114,7 @@ public boolean isChunkCompiled(BlockPos blockPos) {
      */
     @Overwrite
     private void renderChunkLayer(RenderType renderType, PoseStack poseStack, double camX, double camY, double camZ, Matrix4f projectionMatrix) {
-        this.worldRenderer.renderChunkLayer(renderType, poseStack, camX, camY, camZ, projectionMatrix);
+        this.worldRenderer.renderSectionLayer(renderType, poseStack, camX, camY, camZ, projectionMatrix);
     }
 
     /**
diff --git a/src/main/java/net/vulkanmod/render/chunk/WorldRenderer.java b/src/main/java/net/vulkanmod/render/chunk/WorldRenderer.java
index 0bbacb316..ab4fb2412 100644
--- a/src/main/java/net/vulkanmod/render/chunk/WorldRenderer.java
+++ b/src/main/java/net/vulkanmod/render/chunk/WorldRenderer.java
@@ -428,7 +428,7 @@ public boolean scheduleUpdate(RenderSection section, int limit) {
         return true;
     }
 
-    public void compileChunks(Camera camera) {
+    public void compileSections(Camera camera) {
         this.minecraft.getProfiler().push("populate_chunks_to_compile");
 //        RenderRegionCache renderregioncache = new RenderRegionCache();
 //        BlockPos cameraPos = camera.getBlockPosition();
@@ -463,7 +463,7 @@ public void compileChunks(Camera camera) {
         this.minecraft.getProfiler().pop();
     }
 
-    public boolean isChunkCompiled(BlockPos blockPos) {
+    public boolean isSectionCompiled(BlockPos blockPos) {
         RenderSection renderSection = this.sectionGrid.getSectionAtBlockPos(blockPos);
         return renderSection != null && renderSection.isCompiled();
     }
@@ -533,7 +533,7 @@ public void clearOnAllChangedCallbacks() {
         this.onAllChangedCallbacks.clear();
     }
 
-    public void renderChunkLayer(RenderType renderType, PoseStack poseStack, double camX, double camY, double camZ, Matrix4f projection) {
+    public void renderSectionLayer(RenderType renderType, PoseStack poseStack, double camX, double camY, double camZ, Matrix4f projection) {
         //debug
 //        Profiler p = Profiler.getProfiler("chunks");
         Profiler2 p = Profiler2.getMainProfiler();

From c0ad20827973cbe59665d43607deb51296d3cc7c Mon Sep 17 00:00:00 2001
From: xCollateral <unknown>
Date: Sat, 23 Sep 2023 12:53:46 +0200
Subject: [PATCH 10/15] Update to 1.20.2

---
 gradle.properties                             |  14 +-
 .../net/vulkanmod/config/OptionList2.java     |   2 +-
 .../net/vulkanmod/config/OptionScreenV.java   |  42 ++-
 .../config/widget/CustomButtonWidget.java     |   1 -
 .../config/widget/CyclingOptionWidget.java    |   3 +-
 .../vulkanmod/config/widget/OptionWidget.java |   2 +-
 .../config/widget/RangeOptionWidget.java      |   1 -
 src/main/java/net/vulkanmod/gl/GlTexture.java |   3 +
 .../mixin/chunk/LevelRendererMixin.java       |  17 +-
 .../mixin/debug/KeyboardHandlerM.java         |   2 +-
 .../vulkanmod/mixin/gui/ChatComponentM.java   |  16 +-
 .../java/net/vulkanmod/mixin/gui/GuiM.java    | 288 +++++++++---------
 .../vulkanmod/mixin/profiling/GuiMixin.java   |   6 +-
 .../mixin/render/LevelRendererMixin.java      |   4 -
 .../mixin/render/entity/EntityRendererM.java  |   2 +-
 .../render/chunk/build/LiquidRenderer.java    |  18 +-
 .../render/chunk/build/TaskDispatcher.java    |  15 +-
 src/main/resources/vulkanmod.accesswidener    |   2 -
 18 files changed, 228 insertions(+), 210 deletions(-)

diff --git a/gradle.properties b/gradle.properties
index ac202c580..a8a88adc6 100644
--- a/gradle.properties
+++ b/gradle.properties
@@ -3,14 +3,14 @@ org.gradle.jvmargs=-Xmx3G
 
 # Fabric Properties
 	# check these on https://fabricmc.net/develop
-	minecraft_version=1.20.1
-	yarn_mappings=1.20.1+build.1
-	loader_version=0.14.21
+	minecraft_version=1.20.2
+	yarn_mappings=1.20.2+build.1
+	loader_version=0.14.22
+
+	#Fabric api
+	fabric_version=0.89.0+1.20.2
 
 # Mod Properties
-	mod_version = 0.3.2_dev
+	mod_version = 0.3.3
 	maven_group = net.vulkanmod
 	archives_base_name = VulkanMod_1.20
-
-# Dependencies
-	fabric_version=0.88.0+1.20.1
diff --git a/src/main/java/net/vulkanmod/config/OptionList2.java b/src/main/java/net/vulkanmod/config/OptionList2.java
index f50c3439f..f29d08c91 100644
--- a/src/main/java/net/vulkanmod/config/OptionList2.java
+++ b/src/main/java/net/vulkanmod/config/OptionList2.java
@@ -75,7 +75,7 @@ public void render(GuiGraphics matrices, int mouseX, int mouseY, float delta) {
         int o;
         int n;
         int m;
-        this.renderBackground(matrices);
+//        this.renderBackground(matrices);
         int i = this.getScrollbarPosition();
         int j = i + 6;
         Tesselator tesselator = Tesselator.getInstance();
diff --git a/src/main/java/net/vulkanmod/config/OptionScreenV.java b/src/main/java/net/vulkanmod/config/OptionScreenV.java
index 335b9c6ec..56351a3f8 100644
--- a/src/main/java/net/vulkanmod/config/OptionScreenV.java
+++ b/src/main/java/net/vulkanmod/config/OptionScreenV.java
@@ -1,11 +1,13 @@
 package net.vulkanmod.config;
 
 import com.google.common.collect.ImmutableList;
+import com.google.common.collect.Lists;
 import com.mojang.blaze3d.vertex.PoseStack;
 import net.minecraft.Util;
 import net.minecraft.client.Minecraft;
 import net.minecraft.client.gui.GuiGraphics;
 import net.minecraft.client.gui.components.Button;
+import net.minecraft.client.gui.components.Renderable;
 import net.minecraft.client.gui.components.events.GuiEventListener;
 import net.minecraft.client.gui.screens.ConfirmLinkScreen;
 import net.minecraft.client.gui.screens.Screen;
@@ -18,6 +20,7 @@
 import net.vulkanmod.vulkan.util.VUtil;
 
 import java.util.ArrayList;
+import java.util.Iterator;
 import java.util.List;
 import java.util.Optional;
 
@@ -38,6 +41,8 @@ public class OptionScreenV extends Screen {
     private CustomButtonWidget doneButton;
     private CustomButtonWidget applyButton;
 
+    private final List<CustomButtonWidget> buttons = Lists.newArrayList();
+
     public OptionScreenV(Component title, Screen parent) {
         super(title);
         this.parent = parent;
@@ -87,9 +92,11 @@ protected void init() {
     }
 
     private void buildPage() {
+        this.buttons.clear();
         this.clearWidgets();
 
-        if(this.currentList == null) this.currentList = optionLists.get(0);
+        if(this.currentList == null)
+            this.currentList = optionLists.get(0);
 
         this.addWidget(currentList);
 
@@ -99,14 +106,19 @@ private void buildPage() {
     }
 
     private void buildHeader() {
-        this.addRenderableWidget(this.videoButton);
-        this.addRenderableWidget(this.graphicsButton);
-        this.addRenderableWidget(this.otherButton);
-        this.addRenderableWidget(this.supportButton);
+        buttons.add(this.videoButton);
+        buttons.add(this.graphicsButton);
+        buttons.add(this.otherButton);
+        buttons.add(this.supportButton);
+
+        this.addWidget(this.videoButton);
+        this.addWidget(this.graphicsButton);
+        this.addWidget(this.otherButton);
+        this.addWidget(this.supportButton);
     }
 
     private void addButtons() {
-        int buttonX = (int) (this.width - 150);
+        int buttonX = (this.width - 150);
         int buttonGap = 55;
         this.applyButton = new CustomButtonWidget(buttonX, this.height - 27, 50, 20, Component.literal("Apply"), button -> {
             Options.applyOptions(Initializer.CONFIG, new Option[][]{this.videoOpts, this.graphicsOpts, this.otherOpts});
@@ -115,8 +127,11 @@ private void addButtons() {
             this.minecraft.setScreen(this.parent);
         });
 
-        this.addRenderableWidget(this.applyButton);
-        this.addRenderableWidget(this.doneButton);
+        buttons.add(this.applyButton);
+        buttons.add(this.doneButton);
+
+        this.addWidget(this.applyButton);
+        this.addWidget(this.doneButton);
     }
 
     public boolean mouseClicked(double mouseX, double mouseY, int button) {
@@ -140,18 +155,21 @@ public void onClose() {
     public void render(GuiGraphics guiGraphics, int mouseX, int mouseY, float delta) {
         this.updateStatus();
 
-        this.renderBackground(guiGraphics);
         this.currentList.render(guiGraphics, mouseX, mouseY, delta);
-//        guiGraphics.fill(0, 0, width, height, VUtil.packColor(0.6f, 0.2f, 0.2f, 0.5f));
+        renderButtons(guiGraphics, mouseX, mouseY, delta);
 
-//        VideoOptionsScreen.drawCenteredComponent(matrices, this.textRenderer, this.title, this.width / 2, 5, 0xFFFFFF);
-        super.render(guiGraphics, mouseX, mouseY, delta);
         List<FormattedCharSequence> list = getHoveredButtonTooltip(this.currentList, mouseX, mouseY);
         if (list != null) {
             guiGraphics.renderTooltip(this.minecraft.font, list, mouseX, mouseY);
         }
     }
 
+    public void renderButtons(GuiGraphics guiGraphics, int mouseX, int mouseY, float delta) {
+        for (Renderable renderable : buttons) {
+            renderable.render(guiGraphics, mouseX, mouseY, delta);
+        }
+    }
+
     private List<FormattedCharSequence> getHoveredButtonTooltip(OptionList2 buttonList, int mouseX, int mouseY) {
         Optional<OptionWidget> optional = buttonList.getHoveredButton(mouseX, mouseY);
         if (optional.isPresent()) {
diff --git a/src/main/java/net/vulkanmod/config/widget/CustomButtonWidget.java b/src/main/java/net/vulkanmod/config/widget/CustomButtonWidget.java
index f4e27fa57..aa1993871 100644
--- a/src/main/java/net/vulkanmod/config/widget/CustomButtonWidget.java
+++ b/src/main/java/net/vulkanmod/config/widget/CustomButtonWidget.java
@@ -32,7 +32,6 @@ public void renderWidget(GuiGraphics guiGraphics, int mouseX, int mouseY, float
         Minecraft minecraftClient = Minecraft.getInstance();
         Font textRenderer = minecraftClient.font;
         RenderSystem.setShader(GameRenderer::getPositionTexShader);
-        RenderSystem.setShaderTexture(0, WIDGETS_TEXTURE);
         RenderSystem.setShaderColor(1.0f, 1.0f, 1.0f, this.alpha);
         int i = this.getTextureY();
         RenderSystem.enableBlend();
diff --git a/src/main/java/net/vulkanmod/config/widget/CyclingOptionWidget.java b/src/main/java/net/vulkanmod/config/widget/CyclingOptionWidget.java
index b8e90901d..c7522cd5f 100644
--- a/src/main/java/net/vulkanmod/config/widget/CyclingOptionWidget.java
+++ b/src/main/java/net/vulkanmod/config/widget/CyclingOptionWidget.java
@@ -32,7 +32,7 @@ protected int getYImage(boolean hovered) {
     }
 
     public void renderBackground(GuiGraphics guiGraphics, Minecraft client, int mouseX, int mouseY) {
-        RenderSystem.setShaderTexture(0, WIDGETS_TEXTURE);
+//        RenderSystem.setShaderTexture(0, WIDGETS_TEXTURE);
         RenderSystem.setShaderColor(1.0f, 1.0f, 1.0f, 1.0f);
         int i = (this.isHovered() ? 2 : 1) * 20;
 //        this.drawTexture(matrices, this.controlX, this.y, 0, 46 + i, 8, this.height);
@@ -105,7 +105,6 @@ void renderButton(PoseStack matrices, int mouseX, int mouseY) {
             Tesselator tesselator = Tesselator.getInstance();
             BufferBuilder bufferBuilder = tesselator.getBuilder();
 
-            RenderSystem.setShaderTexture(0, WIDGETS_TEXTURE);
             RenderSystem.setShaderColor(1.0f, 1.0f, 1.0f, 1.0f);
             int i = (this.isHovered(mouseX, mouseY) ? 2 : 1) * 20;
             i = this.active ? i : 0;
diff --git a/src/main/java/net/vulkanmod/config/widget/OptionWidget.java b/src/main/java/net/vulkanmod/config/widget/OptionWidget.java
index 40d4bda9c..ff87ba126 100644
--- a/src/main/java/net/vulkanmod/config/widget/OptionWidget.java
+++ b/src/main/java/net/vulkanmod/config/widget/OptionWidget.java
@@ -69,7 +69,7 @@ public void renderWidget(GuiGraphics guiGraphics, int mouseX, int mouseY, float
         Minecraft minecraftClient = Minecraft.getInstance();
         Font textRenderer = minecraftClient.font;
         RenderSystem.setShader(GameRenderer::getPositionTexShader);
-        RenderSystem.setShaderTexture(0, WIDGETS_TEXTURE);
+//        RenderSystem.setShaderTexture(0, WIDGETS_TEXTURE);
         RenderSystem.setShaderColor(1.0f, 1.0f, 1.0f, this.alpha);
         int i = this.getYImage(this.isHovered());
         RenderSystem.enableBlend();
diff --git a/src/main/java/net/vulkanmod/config/widget/RangeOptionWidget.java b/src/main/java/net/vulkanmod/config/widget/RangeOptionWidget.java
index 96c33700c..1800725db 100644
--- a/src/main/java/net/vulkanmod/config/widget/RangeOptionWidget.java
+++ b/src/main/java/net/vulkanmod/config/widget/RangeOptionWidget.java
@@ -35,7 +35,6 @@ protected int getYImage(boolean hovered) {
 
     @Override
     protected void renderBackground(GuiGraphics guiGraphics, Minecraft client, int mouseX, int mouseY) {
-        RenderSystem.setShaderTexture(0, WIDGETS_TEXTURE);
         RenderSystem.setShaderColor(1.0f, 1.0f, 1.0f, 1.0f);
         int i = (this.isHovered() ? 2 : 1) * 20;
 //        this.drawTexture(matrices, this.controlX + (int)(this.value * (this.controlWidth - 8)), this.y, 0, 46 + i, 4, 20);
diff --git a/src/main/java/net/vulkanmod/gl/GlTexture.java b/src/main/java/net/vulkanmod/gl/GlTexture.java
index dbbb65a48..dfe6879a2 100644
--- a/src/main/java/net/vulkanmod/gl/GlTexture.java
+++ b/src/main/java/net/vulkanmod/gl/GlTexture.java
@@ -26,6 +26,9 @@ public static int genTextureId() {
     }
 
     public static void bindTexture(int i) {
+        if(i == -1)
+            return;
+
         boundTextureId = i;
         boundTexture = map.get(i);
 
diff --git a/src/main/java/net/vulkanmod/mixin/chunk/LevelRendererMixin.java b/src/main/java/net/vulkanmod/mixin/chunk/LevelRendererMixin.java
index a30aad134..eaa178a2c 100644
--- a/src/main/java/net/vulkanmod/mixin/chunk/LevelRendererMixin.java
+++ b/src/main/java/net/vulkanmod/mixin/chunk/LevelRendererMixin.java
@@ -15,6 +15,7 @@
 import net.minecraft.server.level.BlockDestructionProgress;
 import net.minecraft.util.Mth;
 import net.minecraft.world.entity.Entity;
+import net.minecraft.world.level.ChunkPos;
 import net.minecraft.world.level.block.entity.BlockEntity;
 import net.minecraft.world.phys.Vec3;
 import net.vulkanmod.Initializer;
@@ -95,7 +96,7 @@ private void setupRender(Camera camera, Frustum frustum, boolean isCapturedFrust
      * @reason
      */
     @Overwrite
-    private void compileChunks(Camera camera) {
+    private void compileSections(Camera camera) {
         this.worldRenderer.compileSections(camera);
     }
 
@@ -104,7 +105,7 @@ private void compileChunks(Camera camera) {
      * @reason
      */
     @Overwrite
-    public boolean isChunkCompiled(BlockPos blockPos) {
+    public boolean isSectionCompiled(BlockPos blockPos) {
         return this.worldRenderer.isSectionCompiled(blockPos);
     }
 
@@ -113,10 +114,18 @@ public boolean isChunkCompiled(BlockPos blockPos) {
      * @reason
      */
     @Overwrite
-    private void renderChunkLayer(RenderType renderType, PoseStack poseStack, double camX, double camY, double camZ, Matrix4f projectionMatrix) {
+    private void renderSectionLayer(RenderType renderType, PoseStack poseStack, double camX, double camY, double camZ, Matrix4f projectionMatrix) {
         this.worldRenderer.renderSectionLayer(renderType, poseStack, camX, camY, camZ, projectionMatrix);
     }
 
+    /**
+     * @author
+     * @reason
+     */
+    @Overwrite
+    public void onChunkLoaded(ChunkPos chunkPos) {
+    }
+
     /**
      * @author
      * @reason
@@ -158,7 +167,7 @@ private void setSectionDirty(int x, int y, int z, boolean flag) {
      * @reason
      */
     @Overwrite
-    public String getChunkStatistics() {
+    public String getSectionStatistics() {
         return this.worldRenderer.getChunkStatistics();
     }
 
diff --git a/src/main/java/net/vulkanmod/mixin/debug/KeyboardHandlerM.java b/src/main/java/net/vulkanmod/mixin/debug/KeyboardHandlerM.java
index bed35e597..97a3bb9cc 100644
--- a/src/main/java/net/vulkanmod/mixin/debug/KeyboardHandlerM.java
+++ b/src/main/java/net/vulkanmod/mixin/debug/KeyboardHandlerM.java
@@ -16,7 +16,7 @@ public abstract class KeyboardHandlerM {
 
     @Shadow private boolean handledDebugKey;
 
-    @Inject(method = "keyPress", at = @At(value = "INVOKE", target = "Lcom/mojang/blaze3d/platform/InputConstants;isKeyDown(JI)Z", ordinal = 5, shift = At.Shift.AFTER))
+    @Inject(method = "keyPress", at = @At(value = "INVOKE", target = "Lcom/mojang/blaze3d/platform/InputConstants;isKeyDown(JI)Z", ordinal = 1, shift = At.Shift.AFTER))
     private void chunkDebug(long l, int i, int j, int k, int m, CallbackInfo ci) {
         this.handledDebugKey |= InputConstants.isKeyDown(Minecraft.getInstance().getWindow().getWindow(), 296) && this.handleChunkDebugKeys(i);
     }
diff --git a/src/main/java/net/vulkanmod/mixin/gui/ChatComponentM.java b/src/main/java/net/vulkanmod/mixin/gui/ChatComponentM.java
index 6ae9ebc96..ac11a03ab 100644
--- a/src/main/java/net/vulkanmod/mixin/gui/ChatComponentM.java
+++ b/src/main/java/net/vulkanmod/mixin/gui/ChatComponentM.java
@@ -126,7 +126,8 @@ public void render(GuiGraphics guiGraphics, int i, int j, int k) {
                                         int ad = this.getTagIconLeft(line);
                                         Objects.requireNonNull(this.minecraft.font);
                                         int ae = ab + 9;
-                                        this.drawTagIcon(mat1, ad, ae, guiMessageTag.icon());
+//                                        this.drawTagIcon(mat1, ad, ae, guiMessageTag.icon());
+                                        this.drawTagIcon(guiGraphics, ad, ae, guiMessageTag.icon());
                                     }
                                 }
 
@@ -227,11 +228,16 @@ public void render(GuiGraphics guiGraphics, int i, int j, int k) {
         }
     }
 
-    private void drawTagIcon(Matrix4f mat4f, int i, int j, GuiMessageTag.Icon icon) {
-        int k = j - icon.height - 1;
-        RenderSystem.setShaderTexture(0, TEXTURE_LOCATION);
+//    private void drawTagIcon(Matrix4f mat4f, int i, int j, GuiMessageTag.Icon icon) {
+//        int k = j - icon.height - 1;
+//        RenderSystem.setShaderTexture(0, TEXTURE_LOCATION);
+//
+//        GuiBatchRenderer.blit(mat4f, i, k, icon.u, icon.v, icon.width, icon.height, 32, 32);
+//    }
 
-        GuiBatchRenderer.blit(mat4f, i, k, icon.u, icon.v, icon.width, icon.height, 32, 32);
+    private void drawTagIcon(GuiGraphics guiGraphics, int i, int j, GuiMessageTag.Icon icon) {
+        int k = j - icon.height - 1;
+        icon.draw(guiGraphics, i, k);
     }
 
     private static double getTimeFactor(int i) {
diff --git a/src/main/java/net/vulkanmod/mixin/gui/GuiM.java b/src/main/java/net/vulkanmod/mixin/gui/GuiM.java
index 11273f683..041497b54 100644
--- a/src/main/java/net/vulkanmod/mixin/gui/GuiM.java
+++ b/src/main/java/net/vulkanmod/mixin/gui/GuiM.java
@@ -21,149 +21,147 @@
 @Mixin(Gui.class)
 public abstract class GuiM {
 
-    @Shadow @Final private Minecraft minecraft;
-
-    @Shadow protected abstract int getVisibleVehicleHeartRows(int i);
-
-    @Shadow private int tickCount;
-
-    @Shadow @Final private RandomSource random;
-
-    @Shadow protected abstract int getVehicleMaxHearts(LivingEntity livingEntity);
-
-    @Shadow protected abstract void renderHearts(GuiGraphics guiGraphics, Player player, int i, int j, int k, int l, float f, int m, int n, int o, boolean bl);
-
-    @Shadow protected abstract LivingEntity getPlayerVehicleWithHealth();
-
-    @Shadow private int screenWidth;
-
-    @Shadow private int screenHeight;
-
-    @Shadow private int displayHealth;
-
-    @Shadow private int lastHealth;
-
-    @Shadow private long lastHealthTime;
-
-    @Shadow private long healthBlinkTime;
-
-    @Shadow protected abstract Player getCameraPlayer();
-
-    @Shadow @Final private static ResourceLocation GUI_ICONS_LOCATION;
-
-    /**
-     * @author
-     */
-    @Overwrite()
-    private void renderPlayerHealth(GuiGraphics guiGraphics) {
-        int ac;
-        int ab;
-        int aa;
-        int z;
-        int y;
-        int x;
-        Player player = this.getCameraPlayer();
-        if (player == null) {
-            return;
-        }
-        int i = Mth.ceil(player.getHealth());
-        boolean bl = this.healthBlinkTime > (long)this.tickCount && (this.healthBlinkTime - (long)this.tickCount) / 3L % 2L == 1L;
-        long l = Util.getMillis();
-        if (i < this.lastHealth && player.invulnerableTime > 0) {
-            this.lastHealthTime = l;
-            this.healthBlinkTime = this.tickCount + 20;
-        } else if (i > this.lastHealth && player.invulnerableTime > 0) {
-            this.lastHealthTime = l;
-            this.healthBlinkTime = this.tickCount + 10;
-        }
-        if (l - this.lastHealthTime > 1000L) {
-            this.lastHealth = i;
-            this.displayHealth = i;
-            this.lastHealthTime = l;
-        }
-        this.lastHealth = i;
-        int j = this.displayHealth;
-        this.random.setSeed(this.tickCount * 312871);
-        FoodData foodData = player.getFoodData();
-        int k = foodData.getFoodLevel();
-        int m = this.screenWidth / 2 - 91;
-        int n = this.screenWidth / 2 + 91;
-        int o = this.screenHeight - 39;
-        float f = Math.max((float)player.getAttributeValue(Attributes.MAX_HEALTH), (float)Math.max(j, i));
-        int p = Mth.ceil(player.getAbsorptionAmount());
-        int q = Mth.ceil((f + (float)p) / 2.0f / 10.0f);
-        int r = Math.max(10 - (q - 2), 3);
-        int s = o - (q - 1) * r - 10;
-        int t = o - 10;
-        int u = player.getArmorValue();
-        int v = -1;
-        if (player.hasEffect(MobEffects.REGENERATION)) {
-            v = this.tickCount % Mth.ceil(f + 5.0f);
-        }
-        this.minecraft.getProfiler().push("armor");
-        for (int w = 0; w < 10; ++w) {
-            if (u <= 0) continue;
-            x = m + w * 8;
-            if (w * 2 + 1 < u) {
-                guiGraphics.blit(GUI_ICONS_LOCATION, x, s, 34, 9, 9, 9);
-            }
-            if (w * 2 + 1 == u) {
-                guiGraphics.blit(GUI_ICONS_LOCATION, x, s, 25, 9, 9, 9);
-            }
-            if (w * 2 + 1 <= u) continue;
-            guiGraphics.blit(GUI_ICONS_LOCATION, x, s, 16, 9, 9, 9);
-        }
-        this.minecraft.getProfiler().popPush("health");
-        this.renderHearts(guiGraphics, player, m, o, r, v, f, i, j, p, bl);
-        LivingEntity livingEntity = this.getPlayerVehicleWithHealth();
-        x = this.getVehicleMaxHearts(livingEntity);
-        if (x == 0) {
-            this.minecraft.getProfiler().popPush("food");
-            for (y = 0; y < 10; ++y) {
-                z = o;
-                aa = 16;
-                ab = 0;
-                if (player.hasEffect(MobEffects.HUNGER)) {
-                    aa += 36;
-                    ab = 13;
-                }
-                if (player.getFoodData().getSaturationLevel() <= 0.0f && this.tickCount % (k * 3 + 1) == 0) {
-                    z += this.random.nextInt(3) - 1;
-                }
-                ac = n - y * 8 - 9;
-                guiGraphics.blit(GUI_ICONS_LOCATION, ac, z, 16 + ab * 9, 27, 9, 9);
-                if (y * 2 + 1 < k) {
-                    guiGraphics.blit(GUI_ICONS_LOCATION, ac, z, aa + 36, 27, 9, 9);
-                }
-                if (y * 2 + 1 != k) continue;
-                guiGraphics.blit(GUI_ICONS_LOCATION, ac, z, aa + 45, 27, 9, 9);
-            }
-            t -= 10;
-        }
-        this.minecraft.getProfiler().popPush("air");
-        y = player.getMaxAirSupply();
-        z = Math.min(player.getAirSupply(), y);
-        if (player.isEyeInFluid(FluidTags.WATER) || z < y) {
-            aa = this.getVisibleVehicleHeartRows(x) - 1;
-            t -= aa * 10;
-            ab = Mth.ceil((double)(z - 2) * 10.0 / (double)y);
-            ac = Mth.ceil((double)z * 10.0 / (double)y) - ab;
-            for (int ad = 0; ad < ab + ac; ++ad) {
-                if (ad < ab) {
-                    guiGraphics.blit(GUI_ICONS_LOCATION, n - ad * 8 - 9, t, 16, 18, 9, 9);
-                    continue;
-                }
-                guiGraphics.blit(GUI_ICONS_LOCATION, n - ad * 8 - 9, t, 25, 18, 9, 9);
-            }
-        }
-        this.minecraft.getProfiler().pop();
-    }
-
-    /**
-     * @author
-     */
-    @Overwrite
-    private void renderHeart(GuiGraphics guiGraphics, Gui.HeartType heartType, int i, int j, int k, boolean bl, boolean bl2) {
-        guiGraphics.blit(GUI_ICONS_LOCATION, i, j, heartType.getX(bl2, bl), k, 9, 9);
-    }
+//    @Shadow @Final private Minecraft minecraft;
+//
+//    @Shadow protected abstract int getVisibleVehicleHeartRows(int i);
+//
+//    @Shadow private int tickCount;
+//
+//    @Shadow @Final private RandomSource random;
+//
+//    @Shadow protected abstract int getVehicleMaxHearts(LivingEntity livingEntity);
+//
+//    @Shadow protected abstract void renderHearts(GuiGraphics guiGraphics, Player player, int i, int j, int k, int l, float f, int m, int n, int o, boolean bl);
+//
+//    @Shadow protected abstract LivingEntity getPlayerVehicleWithHealth();
+//
+//    @Shadow private int screenWidth;
+//
+//    @Shadow private int screenHeight;
+//
+//    @Shadow private int displayHealth;
+//
+//    @Shadow private int lastHealth;
+//
+//    @Shadow private long lastHealthTime;
+//
+//    @Shadow private long healthBlinkTime;
+//
+//    @Shadow protected abstract Player getCameraPlayer();
+//
+//    /**
+//     * @author
+//     */
+//    @Overwrite()
+//    private void renderPlayerHealth(GuiGraphics guiGraphics) {
+//        int ac;
+//        int ab;
+//        int aa;
+//        int z;
+//        int y;
+//        int x;
+//        Player player = this.getCameraPlayer();
+//        if (player == null) {
+//            return;
+//        }
+//        int i = Mth.ceil(player.getHealth());
+//        boolean bl = this.healthBlinkTime > (long)this.tickCount && (this.healthBlinkTime - (long)this.tickCount) / 3L % 2L == 1L;
+//        long l = Util.getMillis();
+//        if (i < this.lastHealth && player.invulnerableTime > 0) {
+//            this.lastHealthTime = l;
+//            this.healthBlinkTime = this.tickCount + 20;
+//        } else if (i > this.lastHealth && player.invulnerableTime > 0) {
+//            this.lastHealthTime = l;
+//            this.healthBlinkTime = this.tickCount + 10;
+//        }
+//        if (l - this.lastHealthTime > 1000L) {
+//            this.lastHealth = i;
+//            this.displayHealth = i;
+//            this.lastHealthTime = l;
+//        }
+//        this.lastHealth = i;
+//        int j = this.displayHealth;
+//        this.random.setSeed(this.tickCount * 312871);
+//        FoodData foodData = player.getFoodData();
+//        int k = foodData.getFoodLevel();
+//        int m = this.screenWidth / 2 - 91;
+//        int n = this.screenWidth / 2 + 91;
+//        int o = this.screenHeight - 39;
+//        float f = Math.max((float)player.getAttributeValue(Attributes.MAX_HEALTH), (float)Math.max(j, i));
+//        int p = Mth.ceil(player.getAbsorptionAmount());
+//        int q = Mth.ceil((f + (float)p) / 2.0f / 10.0f);
+//        int r = Math.max(10 - (q - 2), 3);
+//        int s = o - (q - 1) * r - 10;
+//        int t = o - 10;
+//        int u = player.getArmorValue();
+//        int v = -1;
+//        if (player.hasEffect(MobEffects.REGENERATION)) {
+//            v = this.tickCount % Mth.ceil(f + 5.0f);
+//        }
+//        this.minecraft.getProfiler().push("armor");
+//        for (int w = 0; w < 10; ++w) {
+//            if (u <= 0) continue;
+//            x = m + w * 8;
+//            if (w * 2 + 1 < u) {
+//                guiGraphics.blit(GUI_ICONS_LOCATION, x, s, 34, 9, 9, 9);
+//            }
+//            if (w * 2 + 1 == u) {
+//                guiGraphics.blit(GUI_ICONS_LOCATION, x, s, 25, 9, 9, 9);
+//            }
+//            if (w * 2 + 1 <= u) continue;
+//            guiGraphics.blit(GUI_ICONS_LOCATION, x, s, 16, 9, 9, 9);
+//        }
+//        this.minecraft.getProfiler().popPush("health");
+//        this.renderHearts(guiGraphics, player, m, o, r, v, f, i, j, p, bl);
+//        LivingEntity livingEntity = this.getPlayerVehicleWithHealth();
+//        x = this.getVehicleMaxHearts(livingEntity);
+//        if (x == 0) {
+//            this.minecraft.getProfiler().popPush("food");
+//            for (y = 0; y < 10; ++y) {
+//                z = o;
+//                aa = 16;
+//                ab = 0;
+//                if (player.hasEffect(MobEffects.HUNGER)) {
+//                    aa += 36;
+//                    ab = 13;
+//                }
+//                if (player.getFoodData().getSaturationLevel() <= 0.0f && this.tickCount % (k * 3 + 1) == 0) {
+//                    z += this.random.nextInt(3) - 1;
+//                }
+//                ac = n - y * 8 - 9;
+//                guiGraphics.blit(GUI_ICONS_LOCATION, ac, z, 16 + ab * 9, 27, 9, 9);
+//                if (y * 2 + 1 < k) {
+//                    guiGraphics.blit(GUI_ICONS_LOCATION, ac, z, aa + 36, 27, 9, 9);
+//                }
+//                if (y * 2 + 1 != k) continue;
+//                guiGraphics.blit(GUI_ICONS_LOCATION, ac, z, aa + 45, 27, 9, 9);
+//            }
+//            t -= 10;
+//        }
+//        this.minecraft.getProfiler().popPush("air");
+//        y = player.getMaxAirSupply();
+//        z = Math.min(player.getAirSupply(), y);
+//        if (player.isEyeInFluid(FluidTags.WATER) || z < y) {
+//            aa = this.getVisibleVehicleHeartRows(x) - 1;
+//            t -= aa * 10;
+//            ab = Mth.ceil((double)(z - 2) * 10.0 / (double)y);
+//            ac = Mth.ceil((double)z * 10.0 / (double)y) - ab;
+//            for (int ad = 0; ad < ab + ac; ++ad) {
+//                if (ad < ab) {
+//                    guiGraphics.blit(GUI_ICONS_LOCATION, n - ad * 8 - 9, t, 16, 18, 9, 9);
+//                    continue;
+//                }
+//                guiGraphics.blit(GUI_ICONS_LOCATION, n - ad * 8 - 9, t, 25, 18, 9, 9);
+//            }
+//        }
+//        this.minecraft.getProfiler().pop();
+//    }
+//
+//    /**
+//     * @author
+//     */
+//    @Overwrite
+//    private void renderHeart(GuiGraphics guiGraphics, Gui.HeartType heartType, int i, int j, boolean bl, boolean bl2, boolean bl3) {
+//        guiGraphics.blitSprite(heartType.getSprite(bl, bl3, bl2), i, j, 9, 9);
+//    }
 }
diff --git a/src/main/java/net/vulkanmod/mixin/profiling/GuiMixin.java b/src/main/java/net/vulkanmod/mixin/profiling/GuiMixin.java
index 4e28f86dd..489aa66bf 100644
--- a/src/main/java/net/vulkanmod/mixin/profiling/GuiMixin.java
+++ b/src/main/java/net/vulkanmod/mixin/profiling/GuiMixin.java
@@ -1,9 +1,9 @@
 package net.vulkanmod.mixin.profiling;
 
-import com.mojang.blaze3d.vertex.PoseStack;
 import net.minecraft.client.Minecraft;
 import net.minecraft.client.gui.Gui;
 import net.minecraft.client.gui.GuiGraphics;
+import net.minecraft.client.gui.components.DebugScreenOverlay;
 import net.minecraft.client.renderer.entity.ItemRenderer;
 import net.vulkanmod.render.profiling.ProfilerOverlay;
 import org.spongepowered.asm.mixin.Final;
@@ -16,7 +16,7 @@
 @Mixin(Gui.class)
 public class GuiMixin {
 
-    @Shadow @Final private Minecraft minecraft;
+    @Shadow @Final private DebugScreenOverlay debugOverlay;
 
     @Inject(method = "<init>", at = @At("RETURN"))
     private void createProfilerOverlay(Minecraft minecraft, ItemRenderer itemRenderer, CallbackInfo ci) {
@@ -26,7 +26,7 @@ private void createProfilerOverlay(Minecraft minecraft, ItemRenderer itemRendere
     @Inject(method = "render", at = @At(value = "INVOKE",
             target = "Lnet/minecraft/client/gui/Gui;renderEffects(Lnet/minecraft/client/gui/GuiGraphics;)V", shift = At.Shift.AFTER))
     private void renderProfilerOverlay(GuiGraphics guiGraphics, float f, CallbackInfo ci) {
-        if(ProfilerOverlay.shouldRender && !this.minecraft.options.renderDebug)
+        if(ProfilerOverlay.shouldRender && !this.debugOverlay.showDebugScreen())
             ProfilerOverlay.INSTANCE.render(guiGraphics.pose());
     }
 }
diff --git a/src/main/java/net/vulkanmod/mixin/render/LevelRendererMixin.java b/src/main/java/net/vulkanmod/mixin/render/LevelRendererMixin.java
index 03e410a47..4b0d673f1 100644
--- a/src/main/java/net/vulkanmod/mixin/render/LevelRendererMixin.java
+++ b/src/main/java/net/vulkanmod/mixin/render/LevelRendererMixin.java
@@ -1,12 +1,8 @@
 package net.vulkanmod.mixin.render;
 
-import it.unimi.dsi.fastutil.objects.ObjectArrayList;
-import net.minecraft.client.Minecraft;
 import net.minecraft.client.renderer.LevelRenderer;
 import net.minecraft.client.renderer.PostChain;
-import net.minecraft.client.renderer.chunk.ChunkRenderDispatcher;
 import org.jetbrains.annotations.Nullable;
-import org.spongepowered.asm.mixin.Final;
 import org.spongepowered.asm.mixin.Mixin;
 import org.spongepowered.asm.mixin.Overwrite;
 import org.spongepowered.asm.mixin.Shadow;
diff --git a/src/main/java/net/vulkanmod/mixin/render/entity/EntityRendererM.java b/src/main/java/net/vulkanmod/mixin/render/entity/EntityRendererM.java
index 5b8faec1c..c8503bc8d 100644
--- a/src/main/java/net/vulkanmod/mixin/render/entity/EntityRendererM.java
+++ b/src/main/java/net/vulkanmod/mixin/render/entity/EntityRendererM.java
@@ -50,7 +50,7 @@ private boolean isVisible(Frustum frustum, AABB aABB) {
 
             if(section == null)
                 return frustum.isVisible(aABB);
-            
+
             return worldRenderer.getLastFrame() == section.getLastFrame();
         } else {
             return frustum.isVisible(aABB);
diff --git a/src/main/java/net/vulkanmod/render/chunk/build/LiquidRenderer.java b/src/main/java/net/vulkanmod/render/chunk/build/LiquidRenderer.java
index f68691121..71b321b17 100644
--- a/src/main/java/net/vulkanmod/render/chunk/build/LiquidRenderer.java
+++ b/src/main/java/net/vulkanmod/render/chunk/build/LiquidRenderer.java
@@ -151,11 +151,11 @@ public void tessellate(BlockAndTintGetter blockAndTintGetter, BlockPos blockPos,
                 float r1;
                 if (vec3.x == 0.0 && vec3.z == 0.0) {
                     textureAtlasSprite = textureAtlasSprites[0];
-                    z = textureAtlasSprite.getU(0.0);
-                    aa = textureAtlasSprite.getV(0.0);
+                    z = textureAtlasSprite.getU(0.0f);
+                    aa = textureAtlasSprite.getV(0.0f);
                     ab = z;
-                    ac = textureAtlasSprite.getV(16.0);
-                    ad = textureAtlasSprite.getU(16.0);
+                    ac = textureAtlasSprite.getV(16.0f);
+                    ad = textureAtlasSprite.getU(16.0f);
                     ae = ac;
                     af = ad;
                     ag = aa;
@@ -308,11 +308,11 @@ public void tessellate(BlockAndTintGetter blockAndTintGetter, BlockPos blockPos,
                     }
                 }
 
-                float av = textureAtlasSprite2.getU(0.0);
-                float aw = textureAtlasSprite2.getU(8.0);
-                float ax = textureAtlasSprite2.getV((double)((1.0F - af) * 16.0F * 0.5F));
-                float ay = textureAtlasSprite2.getV((double)((1.0F - aa) * 16.0F * 0.5F));
-                float az = textureAtlasSprite2.getV(8.0);
+                float av = textureAtlasSprite2.getU(0.0f);
+                float aw = textureAtlasSprite2.getU(8.0f);
+                float ax = textureAtlasSprite2.getV((1.0F - af) * 16.0F * 0.5F);
+                float ay = textureAtlasSprite2.getV((1.0F - aa) * 16.0F * 0.5F);
+                float az = textureAtlasSprite2.getV(8.0f);
                 float ba = direction.getAxis() == Direction.Axis.Z ? l : m;
                 float bb = k * ba * f;
                 float bc = k * ba * g;
diff --git a/src/main/java/net/vulkanmod/render/chunk/build/TaskDispatcher.java b/src/main/java/net/vulkanmod/render/chunk/build/TaskDispatcher.java
index 192e81275..635b27a20 100644
--- a/src/main/java/net/vulkanmod/render/chunk/build/TaskDispatcher.java
+++ b/src/main/java/net/vulkanmod/render/chunk/build/TaskDispatcher.java
@@ -1,24 +1,17 @@
 package net.vulkanmod.render.chunk.build;
 
-import com.google.common.collect.Lists;
 import com.google.common.collect.Queues;
 import com.mojang.logging.LogUtils;
-import net.minecraft.CrashReport;
-import net.minecraft.Util;
-import net.minecraft.client.Minecraft;
-import net.minecraft.client.renderer.ChunkBufferBuilderPack;
-import net.minecraft.util.thread.ProcessorMailbox;
-import net.vulkanmod.render.chunk.*;
+import net.vulkanmod.render.chunk.AreaUploadManager;
+import net.vulkanmod.render.chunk.ChunkArea;
+import net.vulkanmod.render.chunk.DrawBuffers;
+import net.vulkanmod.render.chunk.RenderSection;
 import net.vulkanmod.render.vertex.TerrainRenderType;
 import org.slf4j.Logger;
 
 import javax.annotation.Nullable;
 import java.util.EnumMap;
-import java.util.List;
 import java.util.Queue;
-import java.util.concurrent.CompletableFuture;
-import java.util.concurrent.Executor;
-import java.util.concurrent.LinkedBlockingDeque;
 
 public class TaskDispatcher {
     private static final Logger LOGGER = LogUtils.getLogger();
diff --git a/src/main/resources/vulkanmod.accesswidener b/src/main/resources/vulkanmod.accesswidener
index 3cb160449..dc42fdbd3 100644
--- a/src/main/resources/vulkanmod.accesswidener
+++ b/src/main/resources/vulkanmod.accesswidener
@@ -1,7 +1,5 @@
 accessWidener	v1	named
 
-accessible field net/minecraft/client/renderer/LevelRenderer$RenderChunkInfo chunk Lnet/minecraft/client/renderer/chunk/ChunkRenderDispatcher$RenderChunk;
-
 accessible field com/mojang/blaze3d/vertex/BufferBuilder buffer Ljava/nio/ByteBuffer;
 accessible field com/mojang/blaze3d/vertex/BufferBuilder nextElementByte I
 

From 1de757f7424978285f1ca11a49fdbc2b94e4157a Mon Sep 17 00:00:00 2001
From: xCollateral <unknown>
Date: Sat, 23 Sep 2023 16:23:17 +0200
Subject: [PATCH 11/15] Removed forced update

---
 src/main/java/net/vulkanmod/render/chunk/WorldRenderer.java | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/src/main/java/net/vulkanmod/render/chunk/WorldRenderer.java b/src/main/java/net/vulkanmod/render/chunk/WorldRenderer.java
index ab4fb2412..c14a5f5ea 100644
--- a/src/main/java/net/vulkanmod/render/chunk/WorldRenderer.java
+++ b/src/main/java/net/vulkanmod/render/chunk/WorldRenderer.java
@@ -193,7 +193,7 @@ public void setupRenderer(Camera camera, Frustum frustum, boolean isCapturedFrus
         if (!isCapturedFrustum) {
 
             //Debug
-            this.needsUpdate = true;
+//            this.needsUpdate = true;
 //            this.needsUpdate = false;
 
             if (this.needsUpdate) {

From 0ad4cc6bdd0fd14ef1275bfba5fd4541db8aa320 Mon Sep 17 00:00:00 2001
From: xCollateral <unknown>
Date: Mon, 25 Sep 2023 15:37:24 +0200
Subject: [PATCH 12/15] Block entities texture coords fix

---
 .../mixin/render/model/ModelPartCubeM.java    |  2 +-
 .../mixin/render/model/ModelPartM.java        |  8 ++-
 .../vertex/SpriteCoordinateExpanderM.java     |  2 +-
 .../net/vulkanmod/render/model/CubeModel.java | 57 ++++++++++++++-----
 4 files changed, 51 insertions(+), 18 deletions(-)

diff --git a/src/main/java/net/vulkanmod/mixin/render/model/ModelPartCubeM.java b/src/main/java/net/vulkanmod/mixin/render/model/ModelPartCubeM.java
index 92fe31ef4..2c5689dc8 100644
--- a/src/main/java/net/vulkanmod/mixin/render/model/ModelPartCubeM.java
+++ b/src/main/java/net/vulkanmod/mixin/render/model/ModelPartCubeM.java
@@ -22,7 +22,7 @@ public class ModelPartCubeM implements ModelPartCubeMixed {
     private void getVertices(int i, int j, float f, float g, float h, float k, float l, float m, float n, float o, float p, boolean bl, float q, float r, Set<Direction> set, CallbackInfo ci) {
         //TODO check if set is needed
         CubeModel cube = new CubeModel();
-        cube.setVertices(i, j, f, g, h, k, l, m, n, o, p, bl, q, r);
+        cube.setVertices(i, j, f, g, h, k, l, m, n, o, p, bl, q, r, set);
         this.cube = cube;
     }
 
diff --git a/src/main/java/net/vulkanmod/mixin/render/model/ModelPartM.java b/src/main/java/net/vulkanmod/mixin/render/model/ModelPartM.java
index e49be0220..d3bc80b60 100644
--- a/src/main/java/net/vulkanmod/mixin/render/model/ModelPartM.java
+++ b/src/main/java/net/vulkanmod/mixin/render/model/ModelPartM.java
@@ -10,11 +10,13 @@
 import org.joml.Matrix3f;
 import org.joml.Matrix4f;
 import org.joml.Vector3f;
+import org.joml.Vector4f;
 import org.spongepowered.asm.mixin.Final;
 import org.spongepowered.asm.mixin.Mixin;
 import org.spongepowered.asm.mixin.Overwrite;
 import org.spongepowered.asm.mixin.Shadow;
 
+import java.util.Iterator;
 import java.util.List;
 
 @Mixin(ModelPart.class)
@@ -38,12 +40,12 @@ protected void compile(PoseStack.Pose pose, VertexConsumer vertexConsumer, int i
             ModelPartCubeMixed cubeMixed = (ModelPartCubeMixed)(cube);
             CubeModel cubeModel = cubeMixed.getCubeModel();
 
-            ModelPart.Polygon[] var11 = cubeModel.getPolygons();
-//            int var12 = var11.length;
+            ModelPart.Polygon[] polygons = cubeModel.getPolygons();
+//            int var12 = polygons.length;
 
             cubeModel.transformVertices(matrix4f);
 
-            for (ModelPart.Polygon polygon : var11) {
+            for (ModelPart.Polygon polygon : polygons) {
                 Vector3f vector3f = matrix3f.transform(new Vector3f(polygon.normal));
 //                float l = vector3f.x();
 //                float m = vector3f.y();
diff --git a/src/main/java/net/vulkanmod/mixin/vertex/SpriteCoordinateExpanderM.java b/src/main/java/net/vulkanmod/mixin/vertex/SpriteCoordinateExpanderM.java
index f73645e9a..d6fed4243 100644
--- a/src/main/java/net/vulkanmod/mixin/vertex/SpriteCoordinateExpanderM.java
+++ b/src/main/java/net/vulkanmod/mixin/vertex/SpriteCoordinateExpanderM.java
@@ -27,6 +27,6 @@ private void getExtBuilder(VertexConsumer vertexConsumer, TextureAtlasSprite tex
 
     @Override
     public void vertex(float x, float y, float z, int packedColor, float u, float v, int overlay, int light, int packedNormal) {
-        this.extDelegate.vertex(x, y, z, packedColor, this.sprite.getU(u * 16.0F), this.sprite.getV(v * 16.0F), overlay, light, packedNormal);
+        this.extDelegate.vertex(x, y, z, packedColor, this.sprite.getU(u), this.sprite.getV(v), overlay, light, packedNormal);
     }
 }
diff --git a/src/main/java/net/vulkanmod/render/model/CubeModel.java b/src/main/java/net/vulkanmod/render/model/CubeModel.java
index fcc57301d..da988f39d 100644
--- a/src/main/java/net/vulkanmod/render/model/CubeModel.java
+++ b/src/main/java/net/vulkanmod/render/model/CubeModel.java
@@ -5,18 +5,32 @@
 import org.joml.Matrix4f;
 import org.joml.Vector3f;
 
+import java.util.Set;
+
 public class CubeModel {
 
-    private final ModelPart.Polygon[] polygons = new ModelPart.Polygon[6];
+    private ModelPart.Polygon[] polygons = new ModelPart.Polygon[6];
+    public float minX;
+    public float minY;
+    public float minZ;
+    public float maxX;
+    public float maxY;
+    public float maxZ;
 
     Vector3f[] vertices;
     Vector3f[] transformed = new Vector3f[8];
 
-    public void setVertices(int i, int j, float f, float g, float h, float k, float l, float m, float n, float o, float p, boolean bl, float q, float r) {
-
-        float s = f + k;
-        float t = g + l;
-        float u = h + m;
+    public void setVertices(int i, int j, float f, float g, float h, float k, float l, float m, float n, float o, float p, boolean bl, float q, float r, Set<Direction> set) {
+        this.minX = f;
+        this.minY = g;
+        this.minZ = h;
+        this.maxX = f + k;
+        this.maxY = g + l;
+        this.maxZ = h + m;
+        this.polygons = new ModelPart.Polygon[set.size()];
+        float s = maxX;
+        float t = maxY;
+        float u = maxZ;
         f -= n;
         g -= o;
         h -= p;
@@ -44,7 +58,6 @@ public void setVertices(int i, int j, float f, float g, float h, float k, float
             //pre-divide all vertices once
             this.vertices[i1].div(16.0f);
             this.transformed[i1] = new Vector3f(0.0f);
-//            this.tv[i1] = new Vector3f(this.vertices[i1]);
         }
 
         ModelPart.Vertex vertex1 = new ModelPart.Vertex(transformed[0], 0.0F, 0.0F);
@@ -65,12 +78,30 @@ public void setVertices(int i, int j, float f, float g, float h, float k, float
         float ac = (float)j;
         float ad = (float)j + m;
         float ae = (float)j + m + l;
-        this.polygons[2] = new ModelPart.Polygon(new ModelPart.Vertex[]{vertex6, vertex5, vertex1, vertex2}, x, ac, y, ad, q, r, bl, Direction.DOWN);
-        this.polygons[3] = new ModelPart.Polygon(new ModelPart.Vertex[]{vertex3, vertex4, vertex8, vertex7}, y, ad, z, ac, q, r, bl, Direction.UP);
-        this.polygons[1] = new ModelPart.Polygon(new ModelPart.Vertex[]{vertex1, vertex5, vertex8, vertex4}, w, ad, x, ae, q, r, bl, Direction.WEST);
-        this.polygons[4] = new ModelPart.Polygon(new ModelPart.Vertex[]{vertex2, vertex1, vertex4, vertex3}, x, ad, y, ae, q, r, bl, Direction.NORTH);
-        this.polygons[0] = new ModelPart.Polygon(new ModelPart.Vertex[]{vertex6, vertex2, vertex3, vertex7}, y, ad, aa, ae, q, r, bl, Direction.EAST);
-        this.polygons[5] = new ModelPart.Polygon(new ModelPart.Vertex[]{vertex5, vertex6, vertex7, vertex8}, aa, ad, ab, ae, q, r, bl, Direction.SOUTH);
+        int idx = 0;
+        if (set.contains(Direction.DOWN)) {
+            this.polygons[idx++] = new ModelPart.Polygon(new ModelPart.Vertex[]{vertex6, vertex5, vertex1, vertex2}, x, ac, y, ad, q, r, bl, Direction.DOWN);
+        }
+
+        if (set.contains(Direction.UP)) {
+            this.polygons[idx++] = new ModelPart.Polygon(new ModelPart.Vertex[]{vertex3, vertex4, vertex8, vertex7}, y, ad, z, ac, q, r, bl, Direction.UP);
+        }
+
+        if (set.contains(Direction.WEST)) {
+            this.polygons[idx++] = new ModelPart.Polygon(new ModelPart.Vertex[]{vertex1, vertex5, vertex8, vertex4}, w, ad, x, ae, q, r, bl, Direction.WEST);
+        }
+
+        if (set.contains(Direction.NORTH)) {
+            this.polygons[idx++] = new ModelPart.Polygon(new ModelPart.Vertex[]{vertex2, vertex1, vertex4, vertex3}, x, ad, y, ae, q, r, bl, Direction.NORTH);
+        }
+
+        if (set.contains(Direction.EAST)) {
+            this.polygons[idx++] = new ModelPart.Polygon(new ModelPart.Vertex[]{vertex6, vertex2, vertex3, vertex7}, y, ad, aa, ae, q, r, bl, Direction.EAST);
+        }
+
+        if (set.contains(Direction.SOUTH)) {
+            this.polygons[idx] = new ModelPart.Polygon(new ModelPart.Vertex[]{vertex5, vertex6, vertex7, vertex8}, aa, ad, ab, ae, q, r, bl, Direction.SOUTH);
+        }
     }
 
     public void transformVertices(Matrix4f matrix) {

From bf58ffb552e7024d1876b12609a6edab9bb25c0b Mon Sep 17 00:00:00 2001
From: xCollateral <unknown>
Date: Mon, 25 Sep 2023 15:38:44 +0200
Subject: [PATCH 13/15] Version bump

---
 gradle.properties                  | 2 +-
 src/main/resources/fabric.mod.json | 2 +-
 2 files changed, 2 insertions(+), 2 deletions(-)

diff --git a/gradle.properties b/gradle.properties
index a8a88adc6..1b1bd8fdb 100644
--- a/gradle.properties
+++ b/gradle.properties
@@ -11,6 +11,6 @@ org.gradle.jvmargs=-Xmx3G
 	fabric_version=0.89.0+1.20.2
 
 # Mod Properties
-	mod_version = 0.3.3
+	mod_version = 0.3.4_dev
 	maven_group = net.vulkanmod
 	archives_base_name = VulkanMod_1.20
diff --git a/src/main/resources/fabric.mod.json b/src/main/resources/fabric.mod.json
index fabc10e6a..b03b4eb48 100644
--- a/src/main/resources/fabric.mod.json
+++ b/src/main/resources/fabric.mod.json
@@ -1,7 +1,7 @@
 {
   "schemaVersion": 1,
   "id": "vulkanmod",
-  "version": "0.3.2_dev",
+  "version": "0.3.4_dev",
 
   "name": "VulkanMod",
   "description": "Bring Vulkan to Minecraft!",

From e38e10cba3edfa3c4c4e9422ff9afcf431ab8489 Mon Sep 17 00:00:00 2001
From: xCollateral <unknown>
Date: Mon, 25 Sep 2023 15:45:07 +0200
Subject: [PATCH 14/15] Added missing mixin

---
 src/main/resources/vulkanmod.mixins.json | 1 +
 1 file changed, 1 insertion(+)

diff --git a/src/main/resources/vulkanmod.mixins.json b/src/main/resources/vulkanmod.mixins.json
index 6f874367a..3b0769901 100644
--- a/src/main/resources/vulkanmod.mixins.json
+++ b/src/main/resources/vulkanmod.mixins.json
@@ -20,6 +20,7 @@
     "debug.ChunkBorderRendererM",
     "debug.GlDebugInfoM",
     "debug.KeyboardHandlerM",
+    "debug.DebugScreenOverlayM",
 
     "gui.ChatComponentM",
     "gui.DebugHudM",

From b223b074b851202114be4ad7dba0af389c99c4d9 Mon Sep 17 00:00:00 2001
From: xCollateral <unknown>
Date: Tue, 26 Sep 2023 15:58:42 +0200
Subject: [PATCH 15/15] Updated lwjgl version and added macOS libs

---
 build.gradle | 33 +++++++++------------------------
 1 file changed, 9 insertions(+), 24 deletions(-)

diff --git a/build.gradle b/build.gradle
index 039b98261..d7d0d90a8 100644
--- a/build.gradle
+++ b/build.gradle
@@ -10,7 +10,7 @@ archivesBaseName = project.archives_base_name
 version = project.mod_version
 group = project.maven_group
 
-project.ext.lwjglVersion = "3.3.1"
+project.ext.lwjglVersion = "3.3.2"
 project.ext.jomlVersion = "1.10.4"
 project.ext.winNatives = "natives-windows"
 project.ext.linuxNatives = "natives-linux"
@@ -18,38 +18,23 @@ project.ext.macosNatives = "natives-macos"
 project.ext.macosArmNatives = "natives-macos-arm64"
 
 dependencies {
-//	include(implementation("org.lwjgl:lwjgl:$lwjglVersion"))
-//	include(implementation("org.lwjgl:lwjgl-glfw:$lwjglVersion"))
-//	include(runtimeOnly("org.lwjgl:lwjgl-glfw:$lwjglVersion:$winNatives"))
-//	include(runtimeOnly("org.lwjgl:lwjgl-glfw:$lwjglVersion:$linuxNatives"))
-//	include(implementation("org.lwjgl:lwjgl-stb:$lwjglVersion"))
-//	include(runtimeOnly("org.lwjgl:lwjgl-stb:$lwjglVersion:$winNatives"))
-//	include(runtimeOnly("org.lwjgl:lwjgl-stb:$lwjglVersion:$linuxNatives"))
-//	include(implementation("org.lwjgl:lwjgl-openal:$lwjglVersion"))
-//	include(runtimeOnly("org.lwjgl:lwjgl-openal:$lwjglVersion:$winNatives"))
-//	include(runtimeOnly("org.lwjgl:lwjgl-openal:$lwjglVersion:$linuxNatives"))
-//	include(runtimeOnly("org.lwjgl:lwjgl:$lwjglVersion:$winNatives"))
-//	include(runtimeOnly("org.lwjgl:lwjgl:$lwjglVersion:$linuxNatives"))
-
 	include(implementation("org.lwjgl:lwjgl-vulkan:$lwjglVersion"))
+
 	include(implementation("org.lwjgl:lwjgl-vma:$lwjglVersion"))
-//	include(implementation("org.joml:joml:${jomlVersion}"))
 	include(runtimeOnly("org.lwjgl:lwjgl-vma:$lwjglVersion:$winNatives"))
 	include(runtimeOnly("org.lwjgl:lwjgl-vma:$lwjglVersion:$linuxNatives"))
+	include(runtimeOnly("org.lwjgl:lwjgl-vma:$lwjglVersion:$macosNatives"))
+	include(runtimeOnly("org.lwjgl:lwjgl-vma:$lwjglVersion:$macosArmNatives"))
 
 	include(implementation("org.lwjgl:lwjgl-shaderc:$lwjglVersion"))
 	include(runtimeOnly("org.lwjgl:lwjgl-shaderc:$lwjglVersion:$winNatives"))
 	include(runtimeOnly("org.lwjgl:lwjgl-shaderc:$lwjglVersion:$linuxNatives"))
+	include(runtimeOnly("org.lwjgl:lwjgl-shaderc:$lwjglVersion:$macosNatives"))
+	include(runtimeOnly("org.lwjgl:lwjgl-shaderc:$lwjglVersion:$macosArmNatives"))
 
-	//MacOS
-//	include(runtimeOnly("org.lwjgl:lwjgl-vulkan:$lwjglVersion:$macosNatives"))
-//	include(runtimeOnly("org.lwjgl:lwjgl-vulkan:$lwjglVersion:$macosArmNatives"))
-//	include(runtimeOnly("org.lwjgl:lwjgl-vma:$lwjglVersion:$macosNatives"))
-//	include(runtimeOnly("org.lwjgl:lwjgl-vma:$lwjglVersion:$macosArmNatives"))
-//	include(runtimeOnly("org.lwjgl:lwjgl-shaderc:$lwjglVersion:$macosNatives"))
-//	include(runtimeOnly("org.lwjgl:lwjgl-shaderc:$lwjglVersion:$macosArmNatives"))
-
-//	implementation("org.openjdk.jol:jol-core:0.17")
+	//MoltenVK
+	include(runtimeOnly("org.lwjgl:lwjgl-vulkan:$lwjglVersion:$macosNatives"))
+	include(runtimeOnly("org.lwjgl:lwjgl-vulkan:$lwjglVersion:$macosArmNatives"))
 }
 
 repositories {