From 9db045d614e8dea74f2a3eed0778b7c8880d10db Mon Sep 17 00:00:00 2001 From: James Seibel Date: Tue, 19 May 2026 21:52:11 -0500 Subject: [PATCH] document openGL interfaces not used on Blaze3D Also add API logic to determine if DH is handling the rendering natively or using an interpretation layer --- .../override/rendering/IDhApiFramebuffer.java | 12 ++++++ .../IDhApiGenericObjectShaderProgram.java | 11 +++++ .../rendering/IDhApiShaderProgram.java | 11 +++++ .../interfaces/render/IDhApiRenderProxy.java | 30 +++++++++++++ .../core/render/DhApiRenderProxy.java | 42 +++++++++++++++++++ .../core/render/EDhRenderApi.java | 12 ------ .../minecraft/IMinecraftRenderWrapper.java | 4 +- .../render/AbstractDhRenderApiDefinition.java | 14 ++++++- 8 files changed, 120 insertions(+), 16 deletions(-) delete mode 100644 core/src/main/java/com/seibel/distanthorizons/core/render/EDhRenderApi.java diff --git a/api/src/main/java/com/seibel/distanthorizons/api/interfaces/override/rendering/IDhApiFramebuffer.java b/api/src/main/java/com/seibel/distanthorizons/api/interfaces/override/rendering/IDhApiFramebuffer.java index 7bd7db3dc..7f3fb4b11 100644 --- a/api/src/main/java/com/seibel/distanthorizons/api/interfaces/override/rendering/IDhApiFramebuffer.java +++ b/api/src/main/java/com/seibel/distanthorizons/api/interfaces/override/rendering/IDhApiFramebuffer.java @@ -19,9 +19,21 @@ package com.seibel.distanthorizons.api.interfaces.override.rendering; +import com.seibel.distanthorizons.api.enums.config.EDhApiRenderApi; import com.seibel.distanthorizons.api.interfaces.override.IDhApiOverrideable; +import com.seibel.distanthorizons.api.interfaces.render.IDhApiRenderProxy; /** + * Note:
+ * This is only used if Distant Horizons' + * {@link IDhApiRenderProxy#getRenderingApi()} returns {@link EDhApiRenderApi#OPEN_GL} + * and {@link IDhApiRenderProxy#isNativeRenderer()} returns true. + * ie this is only used when DH is doing native OpenGL rendering, + * if DH is using Blaze3D this interface will be ignored. + * + * @see IDhApiRenderProxy#getRenderingApi() + * @see IDhApiRenderProxy#isNativeRenderer() + * * @author James Seibel * @version 2024-1-24 * @since API 2.0.0 diff --git a/api/src/main/java/com/seibel/distanthorizons/api/interfaces/override/rendering/IDhApiGenericObjectShaderProgram.java b/api/src/main/java/com/seibel/distanthorizons/api/interfaces/override/rendering/IDhApiGenericObjectShaderProgram.java index ecc7e744d..51c46895d 100644 --- a/api/src/main/java/com/seibel/distanthorizons/api/interfaces/override/rendering/IDhApiGenericObjectShaderProgram.java +++ b/api/src/main/java/com/seibel/distanthorizons/api/interfaces/override/rendering/IDhApiGenericObjectShaderProgram.java @@ -19,7 +19,9 @@ package com.seibel.distanthorizons.api.interfaces.override.rendering; +import com.seibel.distanthorizons.api.enums.config.EDhApiRenderApi; import com.seibel.distanthorizons.api.interfaces.override.IDhApiOverrideable; +import com.seibel.distanthorizons.api.interfaces.render.IDhApiRenderProxy; import com.seibel.distanthorizons.api.interfaces.render.IDhApiRenderableBoxGroup; import com.seibel.distanthorizons.api.methods.events.sharedParameterObjects.DhApiRenderParam; import com.seibel.distanthorizons.api.objects.math.DhApiVec3d; @@ -27,7 +29,16 @@ import com.seibel.distanthorizons.api.objects.render.DhApiRenderableBox; import com.seibel.distanthorizons.api.objects.render.DhApiRenderableBoxGroupShading; /** + * Note:
+ * This is only used if Distant Horizons' + * {@link IDhApiRenderProxy#getRenderingApi()} returns {@link EDhApiRenderApi#OPEN_GL} + * and {@link IDhApiRenderProxy#isNativeRenderer()} returns true. + * ie this is only used when DH is doing native OpenGL rendering, + * if DH is using Blaze3D this interface will be ignored. + * * @see IDhApiShaderProgram + * @see IDhApiRenderProxy#getRenderingApi() + * @see IDhApiRenderProxy#isNativeRenderer() * * @author James Seibel * @version 2024-7-11 diff --git a/api/src/main/java/com/seibel/distanthorizons/api/interfaces/override/rendering/IDhApiShaderProgram.java b/api/src/main/java/com/seibel/distanthorizons/api/interfaces/override/rendering/IDhApiShaderProgram.java index c5110cb7b..58c246b6f 100644 --- a/api/src/main/java/com/seibel/distanthorizons/api/interfaces/override/rendering/IDhApiShaderProgram.java +++ b/api/src/main/java/com/seibel/distanthorizons/api/interfaces/override/rendering/IDhApiShaderProgram.java @@ -19,12 +19,23 @@ package com.seibel.distanthorizons.api.interfaces.override.rendering; +import com.seibel.distanthorizons.api.enums.config.EDhApiRenderApi; import com.seibel.distanthorizons.api.interfaces.override.IDhApiOverrideable; +import com.seibel.distanthorizons.api.interfaces.render.IDhApiRenderProxy; import com.seibel.distanthorizons.api.methods.events.sharedParameterObjects.DhApiRenderParam; import com.seibel.distanthorizons.api.objects.math.DhApiVec3f; /** + * Note:
+ * This is only used if Distant Horizons' + * {@link IDhApiRenderProxy#getRenderingApi()} returns {@link EDhApiRenderApi#OPEN_GL} + * and {@link IDhApiRenderProxy#isNativeRenderer()} returns true. + * ie this is only used when DH is doing native OpenGL rendering, + * if DH is using Blaze3D this interface will be ignored. + * * @see IDhApiGenericObjectShaderProgram + * @see IDhApiRenderProxy#getRenderingApi() + * @see IDhApiRenderProxy#isNativeRenderer() * * @author James Seibel * @version 2024-1-24 diff --git a/api/src/main/java/com/seibel/distanthorizons/api/interfaces/render/IDhApiRenderProxy.java b/api/src/main/java/com/seibel/distanthorizons/api/interfaces/render/IDhApiRenderProxy.java index 01e931ec2..52bf20d17 100644 --- a/api/src/main/java/com/seibel/distanthorizons/api/interfaces/render/IDhApiRenderProxy.java +++ b/api/src/main/java/com/seibel/distanthorizons/api/interfaces/render/IDhApiRenderProxy.java @@ -19,6 +19,8 @@ package com.seibel.distanthorizons.api.interfaces.render; +import com.seibel.distanthorizons.api.enums.config.EDhApiRenderApi; +import com.seibel.distanthorizons.api.methods.events.abstractEvents.DhApiAfterDhInitEvent; import com.seibel.distanthorizons.api.objects.DhApiResult; @@ -44,6 +46,34 @@ public interface IDhApiRenderProxy */ DhApiResult clearRenderDataCache(); + /** + * Returns which specific {@link EDhApiRenderApi} + * Distant Horizons will use for rendering.
+ * Will not return {@link EDhApiRenderApi#AUTO}.
+ * + * @throws IllegalStateException if no renderer has been bound yet, + * wait till after {@link DhApiAfterDhInitEvent} has been fired + * + * @see DhApiAfterDhInitEvent + * @since API 7.0.0 + */ + EDhApiRenderApi getRenderingApi() throws IllegalStateException; + /** + * Returns true if the current renderer + * is calling the base rendering API's method calls.
+ * ie GL.drawArrays() for OpenGL.

+ * + * If DH is using a rendering interpretation layer like Blaze3D (Mojang's rendering API) + * this will return false. + * + * @throws IllegalStateException if no renderer has been bound yet, + * wait till after {@link DhApiAfterDhInitEvent} has been fired + * + * @see DhApiAfterDhInitEvent + * @since API 7.0.0 + */ + boolean isNativeRenderer() throws IllegalStateException; + //=======================// diff --git a/core/src/main/java/com/seibel/distanthorizons/core/render/DhApiRenderProxy.java b/core/src/main/java/com/seibel/distanthorizons/core/render/DhApiRenderProxy.java index a76c1e253..dee4ccb21 100644 --- a/core/src/main/java/com/seibel/distanthorizons/core/render/DhApiRenderProxy.java +++ b/core/src/main/java/com/seibel/distanthorizons/core/render/DhApiRenderProxy.java @@ -19,6 +19,7 @@ package com.seibel.distanthorizons.core.render; +import com.seibel.distanthorizons.api.enums.config.EDhApiRenderApi; import com.seibel.distanthorizons.api.interfaces.render.IDhApiRenderProxy; import com.seibel.distanthorizons.api.objects.DhApiResult; import com.seibel.distanthorizons.core.api.internal.SharedApi; @@ -28,6 +29,8 @@ import com.seibel.distanthorizons.core.level.IDhLevel; import com.seibel.distanthorizons.core.util.RenderUtil; import com.seibel.distanthorizons.core.world.AbstractDhWorld; import com.seibel.distanthorizons.core.wrapperInterfaces.minecraft.IMinecraftRenderWrapper; +import com.seibel.distanthorizons.core.wrapperInterfaces.render.AbstractDhRenderApiDefinition; +import org.jetbrains.annotations.Nullable; /** * Used to interact with Distant Horizons' rendering systems. @@ -43,6 +46,18 @@ public class DhApiRenderProxy implements IDhApiRenderProxy private boolean deferTransparentRendering = false; + private static AbstractDhRenderApiDefinition renderApiDef = null; + @Nullable + private static AbstractDhRenderApiDefinition tryGetApiDef() + { + if (renderApiDef == null) + { + renderApiDef = SingletonInjector.INSTANCE.get(AbstractDhRenderApiDefinition.class); + } + + return renderApiDef; + } + //=============// @@ -57,6 +72,7 @@ public class DhApiRenderProxy implements IDhApiRenderProxy // methods // //=========// + @Override public DhApiResult clearRenderDataCache() { // make sure this is a valid time to run the method @@ -80,6 +96,32 @@ public class DhApiRenderProxy implements IDhApiRenderProxy return DhApiResult.createSuccess(); } + @Override + public EDhApiRenderApi getRenderingApi() throws IllegalStateException + { + AbstractDhRenderApiDefinition apiDef = tryGetApiDef(); + if (apiDef == null) + { + // The rendering API hasn't been set up yet + throw new IllegalStateException("Distant Horizons hasn't finished setup yet. No renderer has been set."); + } + + return apiDef.getRenderApi(); + } + + @Override + public boolean isNativeRenderer() throws IllegalStateException + { + AbstractDhRenderApiDefinition apiDef = tryGetApiDef(); + if (apiDef == null) + { + // The rendering API hasn't been set up yet + throw new IllegalStateException("Distant Horizons hasn't finished setup yet. No renderer has been set."); + } + + return apiDef.isNativeRenderer(); + } + public static int activeOpenGlDhDepthTextureId = -1; @Override diff --git a/core/src/main/java/com/seibel/distanthorizons/core/render/EDhRenderApi.java b/core/src/main/java/com/seibel/distanthorizons/core/render/EDhRenderApi.java deleted file mode 100644 index 0369d6f3d..000000000 --- a/core/src/main/java/com/seibel/distanthorizons/core/render/EDhRenderApi.java +++ /dev/null @@ -1,12 +0,0 @@ -package com.seibel.distanthorizons.core.render; - -/** - * VULKAN,
- * OPEN_GL,
- */ -public enum EDhRenderApi -{ - VULKAN, - OPEN_GL; - -} diff --git a/core/src/main/java/com/seibel/distanthorizons/core/wrapperInterfaces/minecraft/IMinecraftRenderWrapper.java b/core/src/main/java/com/seibel/distanthorizons/core/wrapperInterfaces/minecraft/IMinecraftRenderWrapper.java index 2c922e815..153756d82 100644 --- a/core/src/main/java/com/seibel/distanthorizons/core/wrapperInterfaces/minecraft/IMinecraftRenderWrapper.java +++ b/core/src/main/java/com/seibel/distanthorizons/core/wrapperInterfaces/minecraft/IMinecraftRenderWrapper.java @@ -21,9 +21,9 @@ package com.seibel.distanthorizons.core.wrapperInterfaces.minecraft; import java.awt.Color; +import com.seibel.distanthorizons.api.enums.config.EDhApiRenderApi; import com.seibel.distanthorizons.core.api.internal.rendering.DhRenderState; import com.seibel.distanthorizons.core.enums.EDhDirection; -import com.seibel.distanthorizons.core.render.EDhRenderApi; import com.seibel.distanthorizons.core.wrapperInterfaces.misc.ILightMapWrapper; import com.seibel.distanthorizons.coreapi.interfaces.dependencyInjection.IBindable; import com.seibel.distanthorizons.core.util.math.Vec3d; @@ -77,7 +77,7 @@ public interface IMinecraftRenderWrapper extends IBindable boolean mcRendersToFrameBuffer(); boolean runningLegacyOpenGL(); /** Returns the API Minecraft is currently using for rendering */ - EDhRenderApi getMcRenderingApi(); + EDhApiRenderApi getMcRenderingApi(); /** @return -1 if no valid framebuffer is available yet */ int getTargetFramebuffer(); // Note: Iris is now hooking onto this for DH + Iris compat, try not to change (unless we wanna deal with some annoyances) diff --git a/core/src/main/java/com/seibel/distanthorizons/core/wrapperInterfaces/render/AbstractDhRenderApiDefinition.java b/core/src/main/java/com/seibel/distanthorizons/core/wrapperInterfaces/render/AbstractDhRenderApiDefinition.java index 4738f1a2b..5fba84ff8 100644 --- a/core/src/main/java/com/seibel/distanthorizons/core/wrapperInterfaces/render/AbstractDhRenderApiDefinition.java +++ b/core/src/main/java/com/seibel/distanthorizons/core/wrapperInterfaces/render/AbstractDhRenderApiDefinition.java @@ -1,8 +1,8 @@ package com.seibel.distanthorizons.core.wrapperInterfaces.render; +import com.seibel.distanthorizons.api.enums.config.EDhApiRenderApi; import com.seibel.distanthorizons.core.dependencyInjection.SingletonInjector; import com.seibel.distanthorizons.core.jar.EPlatform; -import com.seibel.distanthorizons.core.render.EDhRenderApi; import com.seibel.distanthorizons.core.render.EDhRenderDepth; import com.seibel.distanthorizons.core.render.renderer.AbstractDebugWireframeRenderer; import com.seibel.distanthorizons.core.wrapperInterfaces.render.objects.IDhGenericObjectVertexBufferContainer; @@ -32,7 +32,17 @@ public abstract class AbstractDhRenderApiDefinition implements IBindable public boolean useSingleIbo() { return this.useSingleIbo; } public abstract EDhRenderDepth getRenderDepth(); - public abstract EDhRenderApi getRenderApi(); + /** will not return {@link EDhApiRenderApi#AUTO} */ + public abstract EDhApiRenderApi getRenderApi(); + /** + * Returns true if the current renderer + * is calling the base rendering API's method calls.
+ * ie GL.drawArrays() for OpenGL.

+ * + * If DH is using Blaze3D (Mojang's rendering API) + * this will return false. + */ + public abstract boolean isNativeRenderer(); //endregion