diff --git a/api/src/main/java/com/seibel/distanthorizons/api/enums/config/EDhApiRenderApi.java b/api/src/main/java/com/seibel/distanthorizons/api/enums/config/EDhApiRenderApi.java
new file mode 100644
index 000000000..f9c0b0c3b
--- /dev/null
+++ b/api/src/main/java/com/seibel/distanthorizons/api/enums/config/EDhApiRenderApi.java
@@ -0,0 +1,19 @@
+package com.seibel.distanthorizons.api.enums.config;
+
+import com.seibel.distanthorizons.coreapi.ModInfo;
+
+/**
+ * AUTO,
+ * OPEN_GL,
+ * BLAZE_3D,
+ *
+ * @since API 6.0.0
+ * @version 2024-6-8
+ */
+public enum EDhApiRenderApi
+{
+ AUTO,
+ OPEN_GL,
+ BLAZE_3D;
+
+}
diff --git a/api/src/main/java/com/seibel/distanthorizons/coreapi/DependencyInjection/DependencyInjector.java b/api/src/main/java/com/seibel/distanthorizons/coreapi/DependencyInjection/DependencyInjector.java
index dc9a4e5e6..f21673b96 100644
--- a/api/src/main/java/com/seibel/distanthorizons/coreapi/DependencyInjection/DependencyInjector.java
+++ b/api/src/main/java/com/seibel/distanthorizons/coreapi/DependencyInjection/DependencyInjector.java
@@ -74,6 +74,11 @@ public class DependencyInjector implements IDepe
throw new IllegalStateException("The dependency [" + dependencyInterface.getSimpleName() + "] has already been bound.");
}
+ if (dependencyImplementation == null)
+ {
+ throw new NullPointerException("Can't bind null to ["+dependencyInterface.getSimpleName()+"]");
+ }
+
// make sure the given dependency implements the necessary interfaces
boolean implementsInterface = this.checkIfClassImplements(dependencyImplementation.getClass(), dependencyInterface) ||
diff --git a/core/src/main/java/com/seibel/distanthorizons/core/config/Config.java b/core/src/main/java/com/seibel/distanthorizons/core/config/Config.java
index 0c413a863..cfe1a8f8b 100644
--- a/core/src/main/java/com/seibel/distanthorizons/core/config/Config.java
+++ b/core/src/main/java/com/seibel/distanthorizons/core/config/Config.java
@@ -833,6 +833,18 @@ public class Config
.addListener(IgnoredDimensionCsvHandler.INSTANCE)
.build();
+ public static ConfigEntry renderingApi = new ConfigEntry.Builder()
+ .set(EDhApiRenderApi.AUTO)
+ .setAppearance(EConfigEntryAppearance.ONLY_IN_FILE) // can't be changed while the game is running
+ .comment(""
+ + "Options: \n"
+ + EDhApiRenderApi.AUTO + " \n"
+ + EDhApiRenderApi.OPEN_GL + " \n"
+ + EDhApiRenderApi.BLAZE_3D + " \n"
+ + "")
+ .build();
+
+
}
}
diff --git a/core/src/main/java/com/seibel/distanthorizons/core/wrapperInterfaces/IWrapperFactory.java b/core/src/main/java/com/seibel/distanthorizons/core/wrapperInterfaces/IWrapperFactory.java
index b25607dc2..d5daec17d 100644
--- a/core/src/main/java/com/seibel/distanthorizons/core/wrapperInterfaces/IWrapperFactory.java
+++ b/core/src/main/java/com/seibel/distanthorizons/core/wrapperInterfaces/IWrapperFactory.java
@@ -110,7 +110,7 @@ public interface IWrapperFactory extends IDhApiWrapperFactory, IBindable
IVertexBufferWrapper createVboWrapper(String name);
ILodContainerUniformBufferWrapper createLodContainerUniformWrapper();
- IDhGenericObjectVertexBufferContainer createInstancedVboContainer();
+ IDhGenericObjectVertexBufferContainer createGenericObjectVboContainer();
IDhGenericRenderer createGenericRenderer();
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
new file mode 100644
index 000000000..97de9cd2f
--- /dev/null
+++ b/core/src/main/java/com/seibel/distanthorizons/core/wrapperInterfaces/render/AbstractDhRenderApiDefinition.java
@@ -0,0 +1,64 @@
+package com.seibel.distanthorizons.core.wrapperInterfaces.render;
+
+import com.seibel.distanthorizons.core.dependencyInjection.SingletonInjector;
+import com.seibel.distanthorizons.core.render.renderer.AbstractDebugWireframeRenderer;
+import com.seibel.distanthorizons.core.wrapperInterfaces.render.objects.IDhGenericObjectVertexBufferContainer;
+import com.seibel.distanthorizons.core.wrapperInterfaces.render.objects.ILodContainerUniformBufferWrapper;
+import com.seibel.distanthorizons.core.wrapperInterfaces.render.objects.IVertexBufferWrapper;
+import com.seibel.distanthorizons.core.wrapperInterfaces.render.renderPass.*;
+import com.seibel.distanthorizons.coreapi.interfaces.dependencyInjection.IBindable;
+
+public abstract class AbstractDhRenderApiDefinition implements IBindable
+{
+ //============//
+ // singletons //
+ //============//
+ //region
+
+ public abstract IDhTerrainRenderer getTerrainRenderer();
+ public abstract IDhSsaoRenderer getSsaoRenderer();
+ public abstract IDhFogRenderer getFogRenderer();
+ public abstract IDhFarFadeRenderer getFarFadeRenderer();
+ public abstract AbstractDebugWireframeRenderer getDebugWireframeRenderer();
+ public abstract IDhVanillaFadeRenderer getVanillaFadeRenderer();
+ public abstract IDhTestTriangleRenderer getTestTriangleRenderer();
+
+ public void bindRenderers()
+ {
+ SingletonInjector.INSTANCE.bind(AbstractDhRenderApiDefinition.class, this);
+
+ SingletonInjector.INSTANCE.bind(IDhTerrainRenderer.class, this.getTerrainRenderer());
+ SingletonInjector.INSTANCE.bind(IDhSsaoRenderer.class, this.getSsaoRenderer());
+ SingletonInjector.INSTANCE.bind(IDhFogRenderer.class, this.getFogRenderer());
+ SingletonInjector.INSTANCE.bind(IDhFarFadeRenderer.class, this.getFarFadeRenderer());
+ SingletonInjector.INSTANCE.bind(AbstractDebugWireframeRenderer.class, this.getDebugWireframeRenderer());
+ SingletonInjector.INSTANCE.bind(IDhVanillaFadeRenderer.class, this.getVanillaFadeRenderer());
+ SingletonInjector.INSTANCE.bind(IDhTestTriangleRenderer.class, this.getTestTriangleRenderer());
+ }
+
+ //endregion
+
+
+
+ //===========//
+ // factories //
+ //===========//
+ //region
+
+ // these methods are used by WrapperFactory
+
+ /**
+ * Generic renderers are created for each level they're used in
+ * so we can't just define a single instance.
+ */
+ public abstract IDhGenericRenderer createGenericRenderer();
+
+ public abstract IVertexBufferWrapper createVboWrapper(String name);
+ public abstract ILodContainerUniformBufferWrapper createLodContainerUniformWrapper();
+ public abstract IDhGenericObjectVertexBufferContainer createGenericVboContainer();
+
+ //endregion
+
+
+
+}
diff --git a/core/src/main/java/com/seibel/distanthorizons/core/wrapperInterfaces/render/renderPass/IDhGenericRenderer.java b/core/src/main/java/com/seibel/distanthorizons/core/wrapperInterfaces/render/renderPass/IDhGenericRenderer.java
index 0eb19a59e..56f6cc6e5 100644
--- a/core/src/main/java/com/seibel/distanthorizons/core/wrapperInterfaces/render/renderPass/IDhGenericRenderer.java
+++ b/core/src/main/java/com/seibel/distanthorizons/core/wrapperInterfaces/render/renderPass/IDhGenericRenderer.java
@@ -22,9 +22,8 @@ package com.seibel.distanthorizons.core.wrapperInterfaces.render.renderPass;
import com.seibel.distanthorizons.api.interfaces.render.IDhApiCustomRenderRegister;
import com.seibel.distanthorizons.core.render.RenderParams;
import com.seibel.distanthorizons.core.wrapperInterfaces.minecraft.IProfilerWrapper;
-import com.seibel.distanthorizons.coreapi.interfaces.dependencyInjection.IBindable;
-public interface IDhGenericRenderer extends IDhApiCustomRenderRegister, IBindable
+public interface IDhGenericRenderer extends IDhApiCustomRenderRegister
{
void render(RenderParams renderEventParam, IProfilerWrapper profiler, boolean renderingWithSsao);
diff --git a/core/src/main/resources/assets/distanthorizons/lang/en_us.json b/core/src/main/resources/assets/distanthorizons/lang/en_us.json
index 9ec5075d0..d86891dbe 100644
--- a/core/src/main/resources/assets/distanthorizons/lang/en_us.json
+++ b/core/src/main/resources/assets/distanthorizons/lang/en_us.json
@@ -415,7 +415,11 @@
"Ignored Dimension CSV",
"distanthorizons.config.client.advanced.graphics.experimental.ignoredDimensionCsv.@tooltip":
"A comma separated list of dimension resource locations where DH won't render. Example: \"minecraft:the_nether,minecraft:the_end\" \n\nNote: \nSome DH settings will be disabled and/or changed to improve \nvisuals when DH rendering is disabled.",
-
+ "distanthorizons.config.client.advanced.graphics.experimental.renderingApi":
+ "Rendering API",
+ "distanthorizons.config.client.advanced.graphics.experimental.renderingApi.@tooltip":
+ "",
+
"distanthorizons.config.client.advanced.autoUpdater":