aboutsummaryrefslogtreecommitdiff
path: root/src/main/java/de/hysky/skyblocker
diff options
context:
space:
mode:
authorAaron <51387595+AzureAaron@users.noreply.github.com>2023-11-11 20:42:11 -0500
committerAaron <51387595+AzureAaron@users.noreply.github.com>2023-11-11 20:43:43 -0500
commit82dabc1f9f53ebe135096fb212f10ba9f5ff679b (patch)
treeb62913110354f49060e65dbe701df46b4863dc3d /src/main/java/de/hysky/skyblocker
parentc475bbba4cd28f3df65e5147b32e960600e452cb (diff)
downloadSkyblocker-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.java35
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;
+ }
}