From 31826c94150549234d5ce55e446e8c756052ed6a Mon Sep 17 00:00:00 2001 From: Ven Date: Fri, 30 Jun 2023 10:55:11 +0100 Subject: [PATCH 1/7] RenderUtil cleanup --- .../com/falsepattern/lib/util/RenderUtil.java | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/src/main/java/com/falsepattern/lib/util/RenderUtil.java b/src/main/java/com/falsepattern/lib/util/RenderUtil.java index 409cbf9..4bda6d1 100644 --- a/src/main/java/com/falsepattern/lib/util/RenderUtil.java +++ b/src/main/java/com/falsepattern/lib/util/RenderUtil.java @@ -39,15 +39,7 @@ import static net.minecraft.client.Minecraft.getMinecraft; @NoArgsConstructor(access = PRIVATE) @StableAPI(since = "0.8.0") public final class RenderUtil { - private final static Timer MINECRAFT_TIMER = getMinecraftTimer(); - - @StableAPI.Expose - @SneakyThrows - private static Timer getMinecraftTimer() { - val timerField = ReflectionHelper.findField(Minecraft.class, "timer", "field_71428_T"); - timerField.setAccessible(true); - return (Timer) timerField.get(getMinecraft()); - } + private static final Timer MINECRAFT_TIMER = getMinecraftTimer(); @StableAPI.Expose(since = "0.10.0") public static IIcon getFullTextureIcon(String iconName, int width, int height) { @@ -103,4 +95,12 @@ public final class RenderUtil { public static float partialTick() { return MINECRAFT_TIMER.renderPartialTicks; } + + @StableAPI.Expose + @SneakyThrows + private static Timer getMinecraftTimer() { + val timerField = ReflectionHelper.findField(Minecraft.class, "timer", "field_71428_T"); + timerField.setAccessible(true); + return (Timer) timerField.get(getMinecraft()); + } } From 294a4c7504e7d95b149cb35ff0bacbf7b97b5805 Mon Sep 17 00:00:00 2001 From: Ven Date: Fri, 30 Jun 2023 10:57:30 +0100 Subject: [PATCH 2/7] Utility classes have been marked as such --- src/main/java/com/falsepattern/lib/util/FileUtil.java | 4 +++- src/main/java/com/falsepattern/lib/util/LangUtil.java | 3 ++- src/main/java/com/falsepattern/lib/util/MathUtil.java | 6 ++++-- src/main/java/com/falsepattern/lib/util/RenderUtil.java | 3 ++- src/main/java/com/falsepattern/lib/util/ResourceUtil.java | 4 +++- 5 files changed, 14 insertions(+), 6 deletions(-) diff --git a/src/main/java/com/falsepattern/lib/util/FileUtil.java b/src/main/java/com/falsepattern/lib/util/FileUtil.java index c351ab2..1523a67 100644 --- a/src/main/java/com/falsepattern/lib/util/FileUtil.java +++ b/src/main/java/com/falsepattern/lib/util/FileUtil.java @@ -22,12 +22,14 @@ package com.falsepattern.lib.util; import com.falsepattern.lib.StableAPI; +import lombok.experimental.UtilityClass; import net.minecraft.launchwrapper.Launch; import java.io.File; +@UtilityClass @StableAPI(since = "0.8.2") -public class FileUtil { +public final class FileUtil { @StableAPI.Expose public static File getMinecraftHome() { return Launch.minecraftHome == null ? new File(".") : Launch.minecraftHome; diff --git a/src/main/java/com/falsepattern/lib/util/LangUtil.java b/src/main/java/com/falsepattern/lib/util/LangUtil.java index 3ed8c60..ca48f5c 100644 --- a/src/main/java/com/falsepattern/lib/util/LangUtil.java +++ b/src/main/java/com/falsepattern/lib/util/LangUtil.java @@ -23,6 +23,7 @@ package com.falsepattern.lib.util; import com.falsepattern.lib.StableAPI; import lombok.NoArgsConstructor; import lombok.NonNull; +import lombok.experimental.UtilityClass; import lombok.val; import cpw.mods.fml.common.registry.LanguageRegistry; @@ -32,7 +33,7 @@ import java.util.Map; import static lombok.AccessLevel.PRIVATE; -@NoArgsConstructor(access = PRIVATE) +@UtilityClass @StableAPI(since = "0.8.0") public final class LangUtil { @StableAPI.Expose diff --git a/src/main/java/com/falsepattern/lib/util/MathUtil.java b/src/main/java/com/falsepattern/lib/util/MathUtil.java index 4378b3f..07f41e3 100644 --- a/src/main/java/com/falsepattern/lib/util/MathUtil.java +++ b/src/main/java/com/falsepattern/lib/util/MathUtil.java @@ -22,12 +22,14 @@ package com.falsepattern.lib.util; import com.falsepattern.lib.StableAPI; import com.falsepattern.lib.compat.Vec3i; +import lombok.experimental.UtilityClass; import java.util.Random; import java.util.UUID; +@UtilityClass @StableAPI(since = "0.10.0") -public class MathUtil { +public final class MathUtil { @StableAPI.Expose public static final float SQRT_2 = sqrt(2.0F); /** @@ -621,4 +623,4 @@ public class MathUtil { x = x ^ x >>> 16; return x; } -} \ No newline at end of file +} diff --git a/src/main/java/com/falsepattern/lib/util/RenderUtil.java b/src/main/java/com/falsepattern/lib/util/RenderUtil.java index 4bda6d1..56b0cb9 100644 --- a/src/main/java/com/falsepattern/lib/util/RenderUtil.java +++ b/src/main/java/com/falsepattern/lib/util/RenderUtil.java @@ -23,6 +23,7 @@ package com.falsepattern.lib.util; import com.falsepattern.lib.StableAPI; import lombok.NoArgsConstructor; import lombok.SneakyThrows; +import lombok.experimental.UtilityClass; import lombok.val; import net.minecraft.client.Minecraft; @@ -36,7 +37,7 @@ import static lombok.AccessLevel.PRIVATE; import static net.minecraft.client.Minecraft.getMinecraft; @SideOnly(CLIENT) -@NoArgsConstructor(access = PRIVATE) +@UtilityClass @StableAPI(since = "0.8.0") public final class RenderUtil { private static final Timer MINECRAFT_TIMER = getMinecraftTimer(); diff --git a/src/main/java/com/falsepattern/lib/util/ResourceUtil.java b/src/main/java/com/falsepattern/lib/util/ResourceUtil.java index 87cfb0e..d0ab20b 100644 --- a/src/main/java/com/falsepattern/lib/util/ResourceUtil.java +++ b/src/main/java/com/falsepattern/lib/util/ResourceUtil.java @@ -21,6 +21,7 @@ package com.falsepattern.lib.util; import com.falsepattern.lib.StableAPI; +import lombok.experimental.UtilityClass; import lombok.val; import java.io.ByteArrayOutputStream; @@ -34,8 +35,9 @@ import java.nio.charset.StandardCharsets; /** * A utility class for reading resources in many ways. */ +@UtilityClass @StableAPI(since = "0.6.0") -public class ResourceUtil { +public final class ResourceUtil { /** * Reads a resource as a string, using the {@link StandardCharsets#UTF_8} charset, from a specific jar file. See From f4c2a32f38baead44086c00c94bfcae00e4cb6f1 Mon Sep 17 00:00:00 2001 From: Ven Date: Fri, 30 Jun 2023 11:00:13 +0100 Subject: [PATCH 3/7] Added render utility for translating the camera relative to the player --- .../com/falsepattern/lib/util/RenderUtil.java | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/falsepattern/lib/util/RenderUtil.java b/src/main/java/com/falsepattern/lib/util/RenderUtil.java index 56b0cb9..7f36e2f 100644 --- a/src/main/java/com/falsepattern/lib/util/RenderUtil.java +++ b/src/main/java/com/falsepattern/lib/util/RenderUtil.java @@ -21,7 +21,6 @@ package com.falsepattern.lib.util; import com.falsepattern.lib.StableAPI; -import lombok.NoArgsConstructor; import lombok.SneakyThrows; import lombok.experimental.UtilityClass; import lombok.val; @@ -31,9 +30,9 @@ import net.minecraft.util.IIcon; import net.minecraft.util.Timer; import cpw.mods.fml.relauncher.ReflectionHelper; import cpw.mods.fml.relauncher.SideOnly; +import org.lwjgl.opengl.GL11; import static cpw.mods.fml.relauncher.Side.CLIENT; -import static lombok.AccessLevel.PRIVATE; import static net.minecraft.client.Minecraft.getMinecraft; @SideOnly(CLIENT) @@ -42,6 +41,18 @@ import static net.minecraft.client.Minecraft.getMinecraft; public final class RenderUtil { private static final Timer MINECRAFT_TIMER = getMinecraftTimer(); + @StableAPI.Expose(since = "0.12.0") + public static void setGLTranslationRelativeToPlayer() { + val player = getMinecraft().thePlayer; + val partialTick = partialTick(); + + val offsetX = (float) (player.lastTickPosX + (player.posX - player.lastTickPosX) * partialTick); + val offsetY = (float) (player.lastTickPosY + (player.posY - player.lastTickPosY) * partialTick); + val offsetZ = (float) (player.lastTickPosZ + (player.posZ - player.lastTickPosZ) * partialTick); + + GL11.glTranslatef(-offsetX, -offsetY, -offsetZ); + } + @StableAPI.Expose(since = "0.10.0") public static IIcon getFullTextureIcon(String iconName, int width, int height) { return new IIcon() { From d3b1461664252425f0ba023b979379115b4a7688 Mon Sep 17 00:00:00 2001 From: Ven Date: Fri, 30 Jun 2023 11:08:40 +0100 Subject: [PATCH 4/7] Documented RenderUtils --- .../com/falsepattern/lib/util/RenderUtil.java | 24 +++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/src/main/java/com/falsepattern/lib/util/RenderUtil.java b/src/main/java/com/falsepattern/lib/util/RenderUtil.java index 7f36e2f..62365b3 100644 --- a/src/main/java/com/falsepattern/lib/util/RenderUtil.java +++ b/src/main/java/com/falsepattern/lib/util/RenderUtil.java @@ -41,6 +41,13 @@ import static net.minecraft.client.Minecraft.getMinecraft; public final class RenderUtil { private static final Timer MINECRAFT_TIMER = getMinecraftTimer(); + /** + * Sets the OpenGL translation, relative to the player's position. + *

+ * This is useful for rendering things that are not part of the world mesh, but should be rendered as if they were. + *

+ * It's good practice to make this call inside a {@link GL11#glPushMatrix() push}/{@link GL11#glPopMatrix() pop} matrix block. + */ @StableAPI.Expose(since = "0.12.0") public static void setGLTranslationRelativeToPlayer() { val player = getMinecraft().thePlayer; @@ -53,6 +60,16 @@ public final class RenderUtil { GL11.glTranslatef(-offsetX, -offsetY, -offsetZ); } + /** + * Provides a texture icon with the given name and dimensions. + *

+ * This is useful for rendering textures that are not part of the Minecraft texture atlas. + * + * @param iconName The icon name + * @param width The icon width in pixels + * @param height The icon height in pixels + * @return The full resolution texture icon. + */ @StableAPI.Expose(since = "0.10.0") public static IIcon getFullTextureIcon(String iconName, int width, int height) { return new IIcon() { @@ -103,6 +120,13 @@ public final class RenderUtil { }; } + /** + * Provides the partial tick between the last and next client tick, in the range of 0 to 1. + *

+ * Sometimes referred to as 'subTick', it is used mostly for interpolation in rendering. + * + * @return The current partial tick + */ @StableAPI.Expose public static float partialTick() { return MINECRAFT_TIMER.renderPartialTicks; From 49ec327c9751302b3fd23cd016317e2a366c900c Mon Sep 17 00:00:00 2001 From: Ven Date: Fri, 30 Jun 2023 11:13:28 +0100 Subject: [PATCH 5/7] Extracted full texture icon --- .../lib/internal/render/FullTextureIcon.java | 44 +++++++++++++++++ .../com/falsepattern/lib/util/RenderUtil.java | 48 +------------------ 2 files changed, 46 insertions(+), 46 deletions(-) create mode 100644 src/main/java/com/falsepattern/lib/internal/render/FullTextureIcon.java diff --git a/src/main/java/com/falsepattern/lib/internal/render/FullTextureIcon.java b/src/main/java/com/falsepattern/lib/internal/render/FullTextureIcon.java new file mode 100644 index 0000000..7a70888 --- /dev/null +++ b/src/main/java/com/falsepattern/lib/internal/render/FullTextureIcon.java @@ -0,0 +1,44 @@ +package com.falsepattern.lib.internal.render; + +import lombok.AllArgsConstructor; +import lombok.Getter; +import net.minecraft.util.IIcon; + +@Getter +@AllArgsConstructor +public final class FullTextureIcon implements IIcon { + private final String iconName; + + private final int iconWidth; + private final int iconHeight; + + @Override + public float getMinU() { + return 0F; + } + + @Override + public float getMinV() { + return 0F; + } + + @Override + public float getMaxU() { + return 1F; + } + + @Override + public float getMaxV() { + return 1F; + } + + @Override + public float getInterpolatedU(double textureU) { + return (float) textureU / 16F; + } + + @Override + public float getInterpolatedV(double textureV) { + return (float) textureV / 16F; + } +} diff --git a/src/main/java/com/falsepattern/lib/util/RenderUtil.java b/src/main/java/com/falsepattern/lib/util/RenderUtil.java index 62365b3..ff75a3f 100644 --- a/src/main/java/com/falsepattern/lib/util/RenderUtil.java +++ b/src/main/java/com/falsepattern/lib/util/RenderUtil.java @@ -21,6 +21,7 @@ package com.falsepattern.lib.util; import com.falsepattern.lib.StableAPI; +import com.falsepattern.lib.internal.render.FullTextureIcon; import lombok.SneakyThrows; import lombok.experimental.UtilityClass; import lombok.val; @@ -72,52 +73,7 @@ public final class RenderUtil { */ @StableAPI.Expose(since = "0.10.0") public static IIcon getFullTextureIcon(String iconName, int width, int height) { - return new IIcon() { - @Override - public int getIconWidth() { - return width; - } - - @Override - public int getIconHeight() { - return height; - } - - @Override - public float getMinU() { - return 0; - } - - @Override - public float getMaxU() { - return 1; - } - - @Override - public float getInterpolatedU(double u) { - return (float) (u / 16D); - } - - @Override - public float getMinV() { - return 0; - } - - @Override - public float getMaxV() { - return 1; - } - - @Override - public float getInterpolatedV(double v) { - return (float) (v / 16D); - } - - @Override - public String getIconName() { - return iconName; - } - }; + return new FullTextureIcon(iconName, width, height); } /** From adf1e7146d8fd309a0acc473bc0b360a4e43bac8 Mon Sep 17 00:00:00 2001 From: Ven Date: Fri, 30 Jun 2023 11:21:05 +0100 Subject: [PATCH 6/7] Added clamped icon --- .../lib/internal/render/ClampedIcon.java | 59 +++++++++++++++++++ .../com/falsepattern/lib/util/RenderUtil.java | 18 ++++++ 2 files changed, 77 insertions(+) create mode 100644 src/main/java/com/falsepattern/lib/internal/render/ClampedIcon.java diff --git a/src/main/java/com/falsepattern/lib/internal/render/ClampedIcon.java b/src/main/java/com/falsepattern/lib/internal/render/ClampedIcon.java new file mode 100644 index 0000000..dc80c24 --- /dev/null +++ b/src/main/java/com/falsepattern/lib/internal/render/ClampedIcon.java @@ -0,0 +1,59 @@ +package com.falsepattern.lib.internal.render; + +import com.falsepattern.lib.util.MathUtil; +import lombok.AllArgsConstructor; +import net.minecraft.util.IIcon; + +@AllArgsConstructor +public final class ClampedIcon implements IIcon { + private final IIcon delegate; + + @Override + public int getIconWidth() { + return delegate.getIconWidth(); + } + + @Override + public int getIconHeight() { + return delegate.getIconHeight(); + } + + @Override + public float getMinU() { + return delegate.getMinU(); + } + + @Override + public float getMaxU() { + return delegate.getMaxU(); + } + + @Override + public float getMinV() { + return delegate.getMinV(); + } + + @Override + public float getMaxV() { + return delegate.getMaxV(); + } + + @Override + public float getInterpolatedU(double textureU) { + return delegate.getInterpolatedU(clampTextureCoordinate(textureU)); + } + + @Override + public float getInterpolatedV(double textureV) { + return delegate.getInterpolatedV(clampTextureCoordinate(textureV)); + } + + @Override + public String getIconName() { + return delegate.getIconName(); + } + + private double clampTextureCoordinate(double textureCoordinate) { + return MathUtil.clamp(textureCoordinate, 0D, 16D); + } +} diff --git a/src/main/java/com/falsepattern/lib/util/RenderUtil.java b/src/main/java/com/falsepattern/lib/util/RenderUtil.java index ff75a3f..6c3f043 100644 --- a/src/main/java/com/falsepattern/lib/util/RenderUtil.java +++ b/src/main/java/com/falsepattern/lib/util/RenderUtil.java @@ -21,18 +21,22 @@ package com.falsepattern.lib.util; import com.falsepattern.lib.StableAPI; +import com.falsepattern.lib.internal.render.ClampedIcon; import com.falsepattern.lib.internal.render.FullTextureIcon; import lombok.SneakyThrows; import lombok.experimental.UtilityClass; import lombok.val; import net.minecraft.client.Minecraft; +import net.minecraft.client.renderer.RenderBlocks; import net.minecraft.util.IIcon; import net.minecraft.util.Timer; import cpw.mods.fml.relauncher.ReflectionHelper; import cpw.mods.fml.relauncher.SideOnly; import org.lwjgl.opengl.GL11; +import java.util.Collections; + import static cpw.mods.fml.relauncher.Side.CLIENT; import static net.minecraft.client.Minecraft.getMinecraft; @@ -76,6 +80,20 @@ public final class RenderUtil { return new FullTextureIcon(iconName, width, height); } + /** + * Wraps the given icon as a clamped icon. + *

+ * A clamped icon will clamp the coordinates given to {@link IIcon#getInterpolatedU(double)} and {@link IIcon#getInterpolatedV(double)} to the range of 0 to 16. + *

+ * This is helpful when using {@link RenderBlocks} but having different bounds. + * + * @param icon The icon to clamp + */ + @StableAPI.Expose(since = "0.10.0") + public static IIcon wrapAsClampedIcon(IIcon icon) { + return new ClampedIcon(icon); + } + /** * Provides the partial tick between the last and next client tick, in the range of 0 to 1. *

From 502577bd0ed9b66e52ce1c5f2b65b86f213a27bf Mon Sep 17 00:00:00 2001 From: FalsePattern <30945458+FalsePattern@users.noreply.github.com> Date: Mon, 3 Jul 2023 11:34:18 +0200 Subject: [PATCH 7/7] fix mis-versioned StableAPI --- src/main/java/com/falsepattern/lib/util/RenderUtil.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/falsepattern/lib/util/RenderUtil.java b/src/main/java/com/falsepattern/lib/util/RenderUtil.java index 6c3f043..d04b0bf 100644 --- a/src/main/java/com/falsepattern/lib/util/RenderUtil.java +++ b/src/main/java/com/falsepattern/lib/util/RenderUtil.java @@ -89,7 +89,7 @@ public final class RenderUtil { * * @param icon The icon to clamp */ - @StableAPI.Expose(since = "0.10.0") + @StableAPI.Expose(since = "0.12.0") public static IIcon wrapAsClampedIcon(IIcon icon) { return new ClampedIcon(icon); }