From f637615a65454f9b275b27ecd4d8d790fed8b084 Mon Sep 17 00:00:00 2001 From: Fabian Maurer Date: Sat, 10 May 2025 04:12:20 +0200 Subject: [PATCH 1/2] Make gradlew executable --- gradlew | 0 1 file changed, 0 insertions(+), 0 deletions(-) mode change 100644 => 100755 gradlew diff --git a/gradlew b/gradlew old mode 100644 new mode 100755 From 73ccb7003f111a22140a43daf9fc46a0a2c7eb16 Mon Sep 17 00:00:00 2001 From: Fabian Maurer Date: Sat, 10 May 2025 05:16:41 +0200 Subject: [PATCH 2/2] AO fixes for blocks smaller than one block --- .../triangulator/RenderBlocksUltraMixin.java | 119 +++++++++++++++--- 1 file changed, 103 insertions(+), 16 deletions(-) diff --git a/src/main/java/com/falsepattern/falsetweaks/mixin/mixins/client/triangulator/RenderBlocksUltraMixin.java b/src/main/java/com/falsepattern/falsetweaks/mixin/mixins/client/triangulator/RenderBlocksUltraMixin.java index ea3aa509..6ace554e 100644 --- a/src/main/java/com/falsepattern/falsetweaks/mixin/mixins/client/triangulator/RenderBlocksUltraMixin.java +++ b/src/main/java/com/falsepattern/falsetweaks/mixin/mixins/client/triangulator/RenderBlocksUltraMixin.java @@ -369,6 +369,22 @@ private boolean shouldSideBeRenderedQuick(Block block, int x, int y, int z, Faci } } + private float lerp(float start, float end, float percentage) { + return start + percentage * (end - start); + } + + // Assuming origin bottom left + private float lerpAO(float bottomLeft, float bottomRight, float topLeft, float topRight, float percentageX, float percentageY) { + float bottom = lerp(bottomLeft, bottomRight, percentageX); + float top = lerp(topLeft, topRight, percentageX); + return lerp(bottom, top, percentageY); + } + private int lerpBrightness(int bottomLeft, int bottomRight, int topLeft, int topRight, float percentageX, float percentageY) { + int sky = (int)lerpAO(bottomLeft & 0xFF, bottomRight & 0xFF, topLeft & 0xFF, topRight & 0xFF, percentageX, percentageY); + int block = (int)lerpAO((bottomLeft >> 16) & 0xFF, (bottomRight >> 16) & 0xFF, (topLeft >> 16) & 0xFF, (topRight >> 16) & 0xFF, percentageX, percentageY); + return (block << 16) | sky; + } + private boolean renderFace(Facing facing) { Block block = state.block; int x = state.x; @@ -449,10 +465,81 @@ private boolean renderFace(Facing facing) { float aoTopRight = (aoFront + lightTop + lightRight + lightTopRight) / 4.0F; float aoBottomRight = (lightBottom + aoFront + lightBottomRight + lightRight) / 4.0F; float aoBottomLeft = (lightBottomLeft + lightLeft + lightBottom + aoFront) / 4.0F; - this.brightnessTopLeft = getAoBrightness(brightnessLeft, brightnessTopLeft, brightnessTop, light); - this.brightnessBottomLeft = getAoBrightness(brightnessBottomLeft, brightnessLeft, brightnessBottom, light); - this.brightnessBottomRight = getAoBrightness(brightnessBottom, brightnessBottomRight, brightnessRight, light); - this.brightnessTopRight = getAoBrightness(brightnessTop, brightnessRight, brightnessTopRight, light); + int completeBrightnessTopLeft = getAoBrightness(brightnessLeft, brightnessTopLeft, brightnessTop, light); + int completeBrightnessBottomLeft = getAoBrightness(brightnessBottomLeft, brightnessLeft, brightnessBottom, light); + int completeBrightnessBottomRight = getAoBrightness(brightnessBottom, brightnessBottomRight, brightnessRight, light); + int completeBrightnessTopRight = getAoBrightness(brightnessTop, brightnessRight, brightnessTopRight, light); + + float renderLimitTop = 1; + float renderLimitBottom = 0; + float renderLimitLeft = 0; + float renderLimitRight = 1; + + switch (facing) + { + case XNEG: + case XPOS: + renderLimitLeft = (float)renderMinY; + renderLimitRight = (float)renderMaxY; + renderLimitBottom = (float)renderMinZ; + renderLimitTop = (float)renderMaxZ; + break; + case YNEG: + case YPOS: + renderLimitLeft = (float)renderMinX; + renderLimitRight = (float)renderMaxX; + renderLimitBottom = (float)renderMinZ; + renderLimitTop = (float)renderMaxZ; + break; + case ZNEG: + case ZPOS: + renderLimitLeft = (float)renderMinX; + renderLimitRight = (float)renderMaxX; + renderLimitBottom = (float)renderMinY; + renderLimitTop = (float)renderMaxY; + break; + } + + float aoMixedTopLeft = lerpAO( + aoBottomLeft, aoBottomRight, + aoTopLeft, aoTopRight, + renderLimitLeft, renderLimitTop); + + float aoMixedBottomLeft = lerpAO( + aoBottomLeft, aoBottomRight, + aoTopLeft, aoTopRight, + renderLimitLeft, renderLimitBottom); + + float aoMixedBottomRight = lerpAO( + aoBottomLeft, aoBottomRight, + aoTopLeft, aoTopRight, + renderLimitRight, renderLimitBottom); + + float aoMixedTopRight = lerpAO( + aoBottomLeft, aoBottomRight, + aoTopLeft, aoTopRight, + renderLimitRight, renderLimitTop); + + + this.brightnessTopLeft = lerpBrightness( + completeBrightnessBottomLeft, completeBrightnessBottomRight, + completeBrightnessTopLeft, completeBrightnessTopRight, + renderLimitLeft, renderLimitTop); + + this.brightnessBottomLeft = lerpBrightness( + completeBrightnessBottomLeft, completeBrightnessBottomRight, + completeBrightnessTopLeft, completeBrightnessTopRight, + renderLimitLeft, renderLimitBottom); + + this.brightnessBottomRight = lerpBrightness( + completeBrightnessBottomLeft, completeBrightnessBottomRight, + completeBrightnessTopLeft, completeBrightnessTopRight, + renderLimitRight, renderLimitBottom); + + this.brightnessTopRight = lerpBrightness( + completeBrightnessBottomLeft, completeBrightnessBottomRight, + completeBrightnessTopLeft, completeBrightnessTopRight, + renderLimitRight, renderLimitTop); if (facing.worldUp >= 0) { Block frontBlock = getBlockOffset(x, y, z, facing.front); @@ -493,18 +580,18 @@ private boolean renderFace(Facing facing) { } // @formatter:on - this.colorRedTopLeft *= aoTopLeft; - this.colorGreenTopLeft *= aoTopLeft; - this.colorBlueTopLeft *= aoTopLeft; - this.colorRedBottomLeft *= aoBottomLeft; - this.colorGreenBottomLeft *= aoBottomLeft; - this.colorBlueBottomLeft *= aoBottomLeft; - this.colorRedBottomRight *= aoBottomRight; - this.colorGreenBottomRight *= aoBottomRight; - this.colorBlueBottomRight *= aoBottomRight; - this.colorRedTopRight *= aoTopRight; - this.colorGreenTopRight *= aoTopRight; - this.colorBlueTopRight *= aoTopRight; + this.colorRedTopLeft *= aoMixedTopLeft; + this.colorGreenTopLeft *= aoMixedTopLeft; + this.colorBlueTopLeft *= aoMixedTopLeft; + this.colorRedBottomLeft *= aoMixedBottomLeft; + this.colorGreenBottomLeft *= aoMixedBottomLeft; + this.colorBlueBottomLeft *= aoMixedBottomLeft; + this.colorRedBottomRight *= aoMixedBottomRight; + this.colorGreenBottomRight *= aoMixedBottomRight; + this.colorBlueBottomRight *= aoMixedBottomRight; + this.colorRedTopRight *= aoMixedTopRight; + this.colorGreenTopRight *= aoMixedTopRight; + this.colorBlueTopRight *= aoMixedTopRight; IIcon icon = getBlockIcon(block, blockAccess, x, y, z, facing.face.ordinal()); switch (facing) { case YNEG: