diff options
author | Aaron <51387595+AzureAaron@users.noreply.github.com> | 2023-11-11 20:42:11 -0500 |
---|---|---|
committer | Aaron <51387595+AzureAaron@users.noreply.github.com> | 2023-11-11 20:43:43 -0500 |
commit | 82dabc1f9f53ebe135096fb212f10ba9f5ff679b (patch) | |
tree | b62913110354f49060e65dbe701df46b4863dc3d /src/main/java/de/hysky/skyblocker | |
parent | c475bbba4cd28f3df65e5147b32e960600e452cb (diff) | |
download | Skyblocker-82dabc1f9f53ebe135096fb212f10ba9f5ff679b.tar.gz Skyblocker-82dabc1f9f53ebe135096fb212f10ba9f5ff679b.tar.bz2 Skyblocker-82dabc1f9f53ebe135096fb212f10ba9f5ff679b.zip |
Reflection, meet Skyblocker.
For compatibility with Sodium's upcoming RenderSystem access
restrictions.
Diffstat (limited to 'src/main/java/de/hysky/skyblocker')
-rw-r--r-- | src/main/java/de/hysky/skyblocker/utils/render/RenderHelper.java | 35 |
1 files changed, 34 insertions, 1 deletions
diff --git a/src/main/java/de/hysky/skyblocker/utils/render/RenderHelper.java b/src/main/java/de/hysky/skyblocker/utils/render/RenderHelper.java index 7f3a63a3..020252e7 100644 --- a/src/main/java/de/hysky/skyblocker/utils/render/RenderHelper.java +++ b/src/main/java/de/hysky/skyblocker/utils/render/RenderHelper.java @@ -1,6 +1,8 @@ package de.hysky.skyblocker.utils.render; import com.mojang.blaze3d.systems.RenderSystem; +import com.mojang.logging.LogUtils; + import de.hysky.skyblocker.mixin.accessor.BeaconBlockEntityRendererInvoker; import de.hysky.skyblocker.utils.render.culling.OcclusionCulling; import de.hysky.skyblocker.utils.render.title.Title; @@ -17,11 +19,19 @@ import net.minecraft.text.Text; import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.Box; import net.minecraft.util.math.Vec3d; + +import java.lang.invoke.MethodHandle; +import java.lang.invoke.MethodHandles; +import java.lang.invoke.MethodType; + import org.joml.Matrix3f; import org.joml.Matrix4f; import org.lwjgl.opengl.GL11; +import org.slf4j.Logger; public class RenderHelper { + private static final Logger LOGGER = LogUtils.getLogger(); + private static final MethodHandle SCHEDULE_DEFERRED_RENDER_TASK = getDeferredRenderTaskHandle(); private static final Vec3d ONE = new Vec3d(1, 1, 1); private static final int MAX_OVERWORLD_BUILD_HEIGHT = 319; private static final MinecraftClient client = MinecraftClient.getInstance(); @@ -253,7 +263,17 @@ public class RenderHelper { public static void runOnRenderThread(Runnable runnable) { if (RenderSystem.isOnRenderThread()) { runnable.run(); - } else { + + return; + } else if (SCHEDULE_DEFERRED_RENDER_TASK != null) { //Sodium + try { + SCHEDULE_DEFERRED_RENDER_TASK.invokeExact(runnable); + } catch (Throwable t) { + LOGGER.error("[Skyblocker] Failed to schedule a render task!", t); + } + + return; + } else { //Vanilla RenderSystem.recordRenderCall(() -> runnable.run()); } } @@ -292,4 +312,17 @@ public class RenderHelper { public static boolean pointIsInArea(double x, double y, double x1, double y1, double x2, double y2) { return x >= x1 && x <= x2 && y >= y1 && y <= y2; } + + private static MethodHandle getDeferredRenderTaskHandle() { + try { + Class<?> deferredTaskClass = Class.forName("me.jellysquid.mods.sodium.client.render.util.DeferredRenderTask"); + + MethodHandles.Lookup lookup = MethodHandles.publicLookup(); + MethodType mt = MethodType.methodType(void.class, Runnable.class); + + return lookup.findStatic(deferredTaskClass, "schedule", mt); + } catch (Throwable ignored) {} + + return null; + } } |