Skip to content

Backend: Begin preparing for modern rendering - #3675

Merged
hannibal002 merged 22 commits into
hannibal002:betafrom
CalMWolfs:modern-rendering-part-1
Apr 10, 2025
Merged

Backend: Begin preparing for modern rendering#3675
hannibal002 merged 22 commits into
hannibal002:betafrom
CalMWolfs:modern-rendering-part-1

Conversation

@CalMWolfs

@CalMWolfs CalMWolfs commented Mar 29, 2025

Copy link
Copy Markdown
Collaborator

Dependencies

What

Started changes for modern rendering. This pr creates 3 classes, DrawContext, WorldRenderContext and MatrixStack which are used for rendering stuff. Modern versions do not allow calls such as GlStateManager.popMatrix() or GlStateManager.translate() and instead must use the MatrixStack that is stored in the respective contexts. This pr adds these contexts to the events that will need it and the context will be used in a future pr.

Merging up to this pr gets down to
image

Changelog Technical Details

  • Began preparing for modern rendering. - CalMWolfs
    • Introduced Contexts and MatrixStack, resembling modern rendering.

@CalMWolfs CalMWolfs added the Soon label Mar 29, 2025
@CalMWolfs CalMWolfs added this to the 3.0.0 milestone Mar 29, 2025
@CalMWolfs
CalMWolfs requested a review from Copilot March 29, 2025 03:03
@github-actions github-actions Bot added the Backend A backend pull request that will be merged soon label Mar 29, 2025

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull Request Overview

This PR begins laying the groundwork for modern rendering by introducing new context classes and a MatrixStack to replace deprecated OpenGL calls. Key changes include updating documentation to reflect modern rendering conventions, outlining compatibility considerations for modern Minecraft versions, and minor text formatting updates.

Files not reviewed (19)
  • src/main/java/at/hannibal2/skyhanni/api/minecraftevents/RenderEvents.kt: Language not supported
  • src/main/java/at/hannibal2/skyhanni/data/GuiEditManager.kt: Language not supported
  • src/main/java/at/hannibal2/skyhanni/data/RenderData.kt: Language not supported
  • src/main/java/at/hannibal2/skyhanni/data/mob/MobDebug.kt: Language not supported
  • src/main/java/at/hannibal2/skyhanni/events/DrawScreenAfterEvent.kt: Language not supported
  • src/main/java/at/hannibal2/skyhanni/events/GuiContainerEvent.kt: Language not supported
  • src/main/java/at/hannibal2/skyhanni/events/GuiRenderEvent.kt: Language not supported
  • src/main/java/at/hannibal2/skyhanni/events/GuiRenderItemEvent.kt: Language not supported
  • src/main/java/at/hannibal2/skyhanni/events/RenderGuiItemOverlayEvent.kt: Language not supported
  • src/main/java/at/hannibal2/skyhanni/events/minecraft/SkyHanniRenderWorldEvent.kt: Language not supported
  • src/main/java/at/hannibal2/skyhanni/events/render/gui/DrawBackgroundEvent.kt: Language not supported
  • src/main/java/at/hannibal2/skyhanni/events/render/gui/GameOverlayRenderPostEvent.kt: Language not supported
  • src/main/java/at/hannibal2/skyhanni/events/render/gui/GameOverlayRenderPreEvent.kt: Language not supported
  • src/main/java/at/hannibal2/skyhanni/events/render/gui/RenderingTickEvent.kt: Language not supported
  • src/main/java/at/hannibal2/skyhanni/events/render/gui/ScreenDrawnEvent.kt: Language not supported
  • src/main/java/at/hannibal2/skyhanni/features/chroma/ChromaManager.kt: Language not supported
  • src/main/java/at/hannibal2/skyhanni/features/dungeon/DungeonLividFinder.kt: Language not supported
  • src/main/java/at/hannibal2/skyhanni/features/fishing/trophy/GeyserFishing.kt: Language not supported
  • src/main/java/at/hannibal2/skyhanni/features/garden/pests/PestParticleLine.kt: Language not supported

Comment thread CONTRIBUTING.md Outdated
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

@DavidArthurCole DavidArthurCole left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🎉

@github-actions github-actions Bot added the Merge Conflicts There are open merge conflicts with the beta branch. label Apr 6, 2025
@github-actions

github-actions Bot commented Apr 6, 2025

Copy link
Copy Markdown

This pull request has conflicts with the base branch "beta". Please resolve those so we can test out your changes.

# Conflicts:
#	versions/mapping-1.21.4-1.16.5-fabric.txt
@github-actions

github-actions Bot commented Apr 6, 2025

Copy link
Copy Markdown

Conflicts have been resolved! 🎉

@github-actions github-actions Bot removed the Merge Conflicts There are open merge conflicts with the beta branch. label Apr 6, 2025

@hannibal002 hannibal002 left a comment

Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

SkyHanni 2.10.0: Caught a InvocationTargetException in at.hannibal2.skyhanni.features.misc.TimeFeatures.onRenderOverlay(at.hannibal2.skyhanni.events.GuiRenderEvent$GuiOverlayRenderEvent) at GuiRenderEvent.GuiOverlayRenderEvent: null
 
Caused by java.lang.reflect.InvocationTargetException: null
	at SH.api.event.EventListeners.createSingleParameterConsumer$lambda$9(EventListeners.kt:84)
	at SH.api.event.EventListeners.addListener$lambda$2(EventListeners.kt:32)
	at SH.data.RenderData.renderOverlay(RenderData.kt:61)
	at SH.data.RenderData.onRenderOverlayPre(RenderData.kt:29)
	at SH.api.event.EventListeners.createSingleParameterConsumer$lambda$9(EventListeners.kt:84)
	at SH.api.event.EventListeners.addListener$lambda$2(EventListeners.kt:32)
	at SH.api.minecraftevents.RenderEvents.onRenderOverlayPre(RenderEvents.kt:52)
	at FML.common.eventhandler.EventBus.post(EventBus.java:140)
Caused by java.lang.NullPointerException: null
	at SH.utils.RenderUtils.renderString0(RenderUtils.kt:459)
	at SH.utils.RenderUtils.renderString(RenderUtils.kt:439)
	at SH.utils.RenderUtils.renderString$default(RenderUtils.kt:437)
	at SH.features.misc.TimeFeatures.onRenderOverlay(TimeFeatures.kt:45)
	at SH.api.event.EventListeners.createSingleParameterConsumer$lambda$9(EventListeners.kt:84)
	at SH.api.event.EventListeners.addListener$lambda$2(EventListeners.kt:32)
	at SH.data.RenderData.renderOverlay(RenderData.kt:61)
	at SH.data.RenderData.onRenderOverlayPre(RenderData.kt:29)
	at SH.api.event.EventListeners.createSingleParameterConsumer$lambda$9(EventListeners.kt:84)
	at SH.api.event.EventListeners.addListener$lambda$2(EventListeners.kt:32)
	at SH.api.minecraftevents.RenderEvents.onRenderOverlayPre(RenderEvents.kt:52)
	at FML.common.eventhandler.EventBus.post(EventBus.java:140)

@hannibal002

Copy link
Copy Markdown
Owner

Joined skyblock. seems like this only happened once and not consistently. maybe a simple "?: return" might work?

@hannibal002

Copy link
Copy Markdown
Owner

Also once the pr got merged i suggest this patch (or even commit this in the pr directly, up to you @CalMWolfs )

Patch
Index: src/main/java/at/hannibal2/skyhanni/events/render/gui/DrawBackgroundEvent.kt
===================================================================
diff --git a/src/main/java/at/hannibal2/skyhanni/events/render/gui/DrawBackgroundEvent.kt b/src/main/java/at/hannibal2/skyhanni/events/render/gui/DrawBackgroundEvent.kt
deleted file mode 100644
--- a/src/main/java/at/hannibal2/skyhanni/events/render/gui/DrawBackgroundEvent.kt(revision 8f44faca7b2f21bcbf20fce18d06a5ac0e082109)
+++ /dev/null(revision 8f44faca7b2f21bcbf20fce18d06a5ac0e082109)
@@ -1,6 +0,0 @@
-package at.hannibal2.skyhanni.events.render.gui
-
-import at.hannibal2.skyhanni.api.event.SkyHanniEvent
-import at.hannibal2.skyhanni.utils.compat.DrawContext
-
-class DrawBackgroundEvent(val context: DrawContext) : SkyHanniEvent()
Index: src/main/java/at/hannibal2/skyhanni/events/render/gui/GameOverlayRenderPostEvent.kt
===================================================================
diff --git a/src/main/java/at/hannibal2/skyhanni/events/render/gui/GameOverlayRenderPostEvent.kt b/src/main/java/at/hannibal2/skyhanni/events/render/gui/GameOverlayRenderPostEvent.kt
deleted file mode 100644
--- a/src/main/java/at/hannibal2/skyhanni/events/render/gui/GameOverlayRenderPostEvent.kt(revision 8f44faca7b2f21bcbf20fce18d06a5ac0e082109)
+++ /dev/null(revision 8f44faca7b2f21bcbf20fce18d06a5ac0e082109)
@@ -1,7 +0,0 @@
-package at.hannibal2.skyhanni.events.render.gui
-
-import at.hannibal2.skyhanni.api.event.SkyHanniEvent
-import at.hannibal2.skyhanni.utils.compat.DrawContext
-import net.minecraftforge.client.event.RenderGameOverlayEvent
-
-class GameOverlayRenderPostEvent(val context: DrawContext, val type: RenderGameOverlayEvent.ElementType) : SkyHanniEvent()
Index: src/main/java/at/hannibal2/skyhanni/events/render/gui/GameOverlayRenderPreEvent.kt
===================================================================
diff --git a/src/main/java/at/hannibal2/skyhanni/events/render/gui/GameOverlayRenderPreEvent.kt b/src/main/java/at/hannibal2/skyhanni/events/render/gui/GameOverlayRenderPreEvent.kt
deleted file mode 100644
--- a/src/main/java/at/hannibal2/skyhanni/events/render/gui/GameOverlayRenderPreEvent.kt(revision 8f44faca7b2f21bcbf20fce18d06a5ac0e082109)
+++ /dev/null(revision 8f44faca7b2f21bcbf20fce18d06a5ac0e082109)
@@ -1,7 +0,0 @@
-package at.hannibal2.skyhanni.events.render.gui
-
-import at.hannibal2.skyhanni.api.event.CancellableSkyHanniEvent
-import at.hannibal2.skyhanni.utils.compat.DrawContext
-import net.minecraftforge.client.event.RenderGameOverlayEvent
-
-class GameOverlayRenderPreEvent(val context: DrawContext, val type: RenderGameOverlayEvent.ElementType) : CancellableSkyHanniEvent()
Index: src/main/java/at/hannibal2/skyhanni/events/render/gui/RenderingTickEvent.kt
===================================================================
diff --git a/src/main/java/at/hannibal2/skyhanni/events/render/gui/RenderingTickEvent.kt b/src/main/java/at/hannibal2/skyhanni/events/render/gui/RenderingTickEvent.kt
deleted file mode 100644
--- a/src/main/java/at/hannibal2/skyhanni/events/render/gui/RenderingTickEvent.kt(revision 8f44faca7b2f21bcbf20fce18d06a5ac0e082109)
+++ /dev/null(revision 8f44faca7b2f21bcbf20fce18d06a5ac0e082109)
@@ -1,6 +0,0 @@
-package at.hannibal2.skyhanni.events.render.gui
-
-import at.hannibal2.skyhanni.api.event.SkyHanniEvent
-import at.hannibal2.skyhanni.utils.compat.DrawContext
-
-class RenderingTickEvent(val context: DrawContext, val startPhase: Boolean) : SkyHanniEvent()
Index: src/main/java/at/hannibal2/skyhanni/events/render/gui/ScreenDrawnEvent.kt
===================================================================
diff --git a/src/main/java/at/hannibal2/skyhanni/events/render/gui/ScreenDrawnEvent.kt b/src/main/java/at/hannibal2/skyhanni/events/render/gui/ScreenDrawnEvent.kt
deleted file mode 100644
--- a/src/main/java/at/hannibal2/skyhanni/events/render/gui/ScreenDrawnEvent.kt(revision 8f44faca7b2f21bcbf20fce18d06a5ac0e082109)
+++ /dev/null(revision 8f44faca7b2f21bcbf20fce18d06a5ac0e082109)
@@ -1,7 +0,0 @@
-package at.hannibal2.skyhanni.events.render.gui
-
-import at.hannibal2.skyhanni.api.event.SkyHanniEvent
-import at.hannibal2.skyhanni.utils.compat.DrawContext
-import net.minecraft.client.gui.GuiScreen
-
-class ScreenDrawnEvent(val context: DrawContext, val gui: GuiScreen?) : SkyHanniEvent()
Index: src/main/java/at/hannibal2/skyhanni/events/render/gui/RenderDrawContextEvents.kt
IDEA additional info:
Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP
<+>UTF-8
===================================================================
diff --git a/src/main/java/at/hannibal2/skyhanni/events/render/gui/RenderDrawContextEvents.kt b/src/main/java/at/hannibal2/skyhanni/events/render/gui/RenderDrawContextEvents.kt
new file mode 100644
--- /dev/null(date 1744227156124)
+++ b/src/main/java/at/hannibal2/skyhanni/events/render/gui/RenderDrawContextEvents.kt(date 1744227156124)
@@ -0,0 +1,18 @@
+package at.hannibal2.skyhanni.events.render.gui
+
+import at.hannibal2.skyhanni.api.event.SkyHanniEvent
+import at.hannibal2.skyhanni.utils.compat.DrawContext
+import net.minecraft.client.gui.GuiScreen
+import net.minecraftforge.client.event.RenderGameOverlayEvent
+
+open class RenderDrawContextEvent(val context: DrawContext = DrawContext()) : SkyHanniEvent()
+
+class RenderingTickEvent(val startPhase: Boolean) : RenderDrawContextEvent()
+
+class GameOverlayRenderPreEvent(val type: RenderGameOverlayEvent.ElementType) : RenderDrawContextEvent(), SkyHanniEvent.Cancellable
+
+class ScreenDrawnEvent(val gui: GuiScreen?) : RenderDrawContextEvent()
+
+class GameOverlayRenderPostEvent(val type: RenderGameOverlayEvent.ElementType) : RenderDrawContextEvent()
+
+class DrawBackgroundEvent : RenderDrawContextEvent()
Index: src/main/java/at/hannibal2/skyhanni/api/minecraftevents/RenderEvents.kt
IDEA additional info:
Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP
<+>UTF-8
===================================================================
diff --git a/src/main/java/at/hannibal2/skyhanni/api/minecraftevents/RenderEvents.kt b/src/main/java/at/hannibal2/skyhanni/api/minecraftevents/RenderEvents.kt
--- a/src/main/java/at/hannibal2/skyhanni/api/minecraftevents/RenderEvents.kt(revision 8f44faca7b2f21bcbf20fce18d06a5ac0e082109)
+++ b/src/main/java/at/hannibal2/skyhanni/api/minecraftevents/RenderEvents.kt(date 1744227156119)
@@ -39,24 +39,24 @@
 
     @SubscribeEvent
     fun onGuiRender(event: DrawScreenEvent.Post) {
-        ScreenDrawnEvent(DrawContext(), event.gui).post()
+        ScreenDrawnEvent(event.gui).post()
     }
 
     @SubscribeEvent
     fun onPostRenderTick(event: RenderTickEvent) {
-        RenderingTickEvent(DrawContext(), event.phase == TickEvent.Phase.START).post()
+        RenderingTickEvent(event.phase == TickEvent.Phase.START).post()
     }
 
     @SubscribeEvent
     fun onRenderOverlayPre(event: RenderGameOverlayEvent.Pre) {
-        if (GameOverlayRenderPreEvent(DrawContext(), event.type).post()) {
+        if (GameOverlayRenderPreEvent(event.type).post()) {
             event.isCanceled = true
         }
     }
 
     @SubscribeEvent
     fun onRenderOverlayPost(event: RenderGameOverlayEvent.Post) {
-        GameOverlayRenderPostEvent(DrawContext(), event.type).post()
+        GameOverlayRenderPostEvent(event.type).post()
     }
 
     @SubscribeEvent
@@ -88,7 +88,7 @@
 
     @SubscribeEvent
     fun onBackgroundDraw(event: GuiScreenEvent.BackgroundDrawnEvent) {
-        DrawBackgroundEvent(DrawContext()).post()
+        DrawBackgroundEvent().post()
     }
 
     @SubscribeEvent

@CalMWolfs

Copy link
Copy Markdown
Collaborator Author
SkyHanni 2.10.0: Caught a InvocationTargetException in at.hannibal2.skyhanni.features.misc.TimeFeatures.onRenderOverlay(at.hannibal2.skyhanni.events.GuiRenderEvent$GuiOverlayRenderEvent) at GuiRenderEvent.GuiOverlayRenderEvent: null
 
Caused by java.lang.reflect.InvocationTargetException: null
	at SH.api.event.EventListeners.createSingleParameterConsumer$lambda$9(EventListeners.kt:84)
	at SH.api.event.EventListeners.addListener$lambda$2(EventListeners.kt:32)
	at SH.data.RenderData.renderOverlay(RenderData.kt:61)
	at SH.data.RenderData.onRenderOverlayPre(RenderData.kt:29)
	at SH.api.event.EventListeners.createSingleParameterConsumer$lambda$9(EventListeners.kt:84)
	at SH.api.event.EventListeners.addListener$lambda$2(EventListeners.kt:32)
	at SH.api.minecraftevents.RenderEvents.onRenderOverlayPre(RenderEvents.kt:52)
	at FML.common.eventhandler.EventBus.post(EventBus.java:140)
Caused by java.lang.NullPointerException: null
	at SH.utils.RenderUtils.renderString0(RenderUtils.kt:459)
	at SH.utils.RenderUtils.renderString(RenderUtils.kt:439)
	at SH.utils.RenderUtils.renderString$default(RenderUtils.kt:437)
	at SH.features.misc.TimeFeatures.onRenderOverlay(TimeFeatures.kt:45)
	at SH.api.event.EventListeners.createSingleParameterConsumer$lambda$9(EventListeners.kt:84)
	at SH.api.event.EventListeners.addListener$lambda$2(EventListeners.kt:32)
	at SH.data.RenderData.renderOverlay(RenderData.kt:61)
	at SH.data.RenderData.onRenderOverlayPre(RenderData.kt:29)
	at SH.api.event.EventListeners.createSingleParameterConsumer$lambda$9(EventListeners.kt:84)
	at SH.api.event.EventListeners.addListener$lambda$2(EventListeners.kt:32)
	at SH.api.minecraftevents.RenderEvents.onRenderOverlayPre(RenderEvents.kt:52)
	at FML.common.eventhandler.EventBus.post(EventBus.java:140)

I don't get this error and it also doesnt look like its caused by this pr but idk? if you can give me more steps to reproduce i can try to fix but idk. I have the setting on an am joining sb + switching lobbies

@CalMWolfs

Copy link
Copy Markdown
Collaborator Author

Also once the pr got merged i suggest this patch (or even commit this in the pr directly, up to you @CalMWolfs )

Also no cant do this, while this works on 1.8.9 because DrawContext is a dummy class per se, on modern versions it actually needs to be passed to the events which this does not allow as you are just creating it, this defeats the whole purpose of the pr

@CalMWolfs
CalMWolfs requested a review from hannibal002 April 10, 2025 00:50
@hannibal002

Copy link
Copy Markdown
Owner

Don't get distracted by InvocationTargetException in the event handler part. This is something new the error manager doesn't yet filter out. The actual error here is the second catch the render element being null.
It just happened to me when I join SkyBlock. I assume a simple check if the render thingy is null and then return fixes it. This is probably necessary now since we render some guis all the time, and the changed mixin or whatever now causes the render event to fire even when there is no render context (not the newly created thingy but the font renderer instance or whatever it is that caused this npe)

Also for my patch: yeah fine. We should still eventually merge similar events into the same files though

@CalMWolfs

Copy link
Copy Markdown
Collaborator Author

Don't get distracted by InvocationTargetException in the event handler part. This is something new the error manager doesn't yet filter out. The actual error here is the second catch the render element being null. It just happened to me when I join SkyBlock. I assume a simple check if the render thingy is null and then return fixes it. This is probably necessary now since we render some guis all the time, and the changed mixin or whatever now causes the render event to fire even when there is no render context (not the newly created thingy but the font renderer instance or whatever it is that caused this npe)

Also for my patch: yeah fine. We should still eventually merge similar events into the same files though

Fixed error in latest commit

@github-actions github-actions Bot added the Detekt Has detekt problem label Apr 10, 2025
@github-actions

Copy link
Copy Markdown

2 Detekt Failures were detected:

@github-actions github-actions Bot removed the Detekt Has detekt problem label Apr 10, 2025
@hannibal002
hannibal002 merged commit c2a2704 into hannibal002:beta Apr 10, 2025
@github-actions github-actions Bot removed Soon Backend A backend pull request that will be merged soon labels Apr 10, 2025
@CalMWolfs
CalMWolfs deleted the modern-rendering-part-1 branch April 10, 2025 08:50
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants