diff --git a/common/src/main/java/com/seibel/distanthorizons/common/AbstractModInitializer.java b/common/src/main/java/com/seibel/distanthorizons/common/AbstractModInitializer.java index a292ad3ed..76211be17 100644 --- a/common/src/main/java/com/seibel/distanthorizons/common/AbstractModInitializer.java +++ b/common/src/main/java/com/seibel/distanthorizons/common/AbstractModInitializer.java @@ -22,6 +22,9 @@ import com.seibel.distanthorizons.core.logging.DhLoggerBuilder; import com.seibel.distanthorizons.core.render.renderer.AbstractDebugWireframeRenderer; import com.seibel.distanthorizons.core.render.renderer.StubDebugWireframeRenderer; import com.seibel.distanthorizons.core.util.NativeDialogUtil; +import com.seibel.distanthorizons.core.util.ThreadUtil; +import com.seibel.distanthorizons.core.util.threading.DhThreadFactory; +import com.seibel.distanthorizons.core.util.threading.ThreadPoolUtil; import com.seibel.distanthorizons.core.wrapperInterfaces.IVersionConstants; import com.seibel.distanthorizons.core.wrapperInterfaces.minecraft.IMinecraftClientWrapper; import com.seibel.distanthorizons.core.wrapperInterfaces.modAccessor.IIrisAccessor; @@ -34,6 +37,7 @@ import net.minecraft.server.MinecraftServer; import net.minecraft.server.dedicated.DedicatedServer; import com.seibel.distanthorizons.core.logging.DhLogger; +import java.util.concurrent.CompletableFuture; import java.util.function.Consumer; import java.util.function.Supplier; @@ -225,11 +229,35 @@ public abstract class AbstractModInitializer ApiEventInjector.INSTANCE.fireAllEvents(DhApiAfterDhInitEvent.class, null); } - private void postClientInit() { DependencySetup.setRenderingApiBindings(); } - private void postServerInit() + private void postClientInit() { - SingletonInjector.INSTANCE.bind(AbstractDebugWireframeRenderer.class, new StubDebugWireframeRenderer()); + CompletableFuture future = new CompletableFuture<>(); + + // This method may be called from either the render thread, + // or some other random setup thread. + // In order to avoid confusion we're always going to run + // this setup on our own thread. + Thread dhSetupThread = new Thread(() -> + { + try + { + DependencySetup.setRenderingApiBindings(); + } + catch (Exception e) + { + future.completeExceptionally(e); + } + finally + { + future.complete(null); + } + }); + dhSetupThread.setName(ThreadUtil.THREAD_NAME_PREFIX + "PostClientInit Thread"); + dhSetupThread.start(); + + future.join(); } + private void postServerInit() { SingletonInjector.INSTANCE.bind(AbstractDebugWireframeRenderer.class, new StubDebugWireframeRenderer()); } //endregion diff --git a/common/src/main/java/com/seibel/distanthorizons/common/render/openGl/GlDhMetaRenderer.java b/common/src/main/java/com/seibel/distanthorizons/common/render/openGl/GlDhMetaRenderer.java index 8450849de..1d14c2793 100644 --- a/common/src/main/java/com/seibel/distanthorizons/common/render/openGl/GlDhMetaRenderer.java +++ b/common/src/main/java/com/seibel/distanthorizons/common/render/openGl/GlDhMetaRenderer.java @@ -8,13 +8,12 @@ import com.seibel.distanthorizons.api.methods.events.sharedParameterObjects.DhAp import com.seibel.distanthorizons.api.methods.events.sharedParameterObjects.DhApiTextureCreatedParam; import com.seibel.distanthorizons.common.render.openGl.glObject.GLProxy; import com.seibel.distanthorizons.common.render.openGl.glObject.GlDhFramebuffer; -import com.seibel.distanthorizons.common.render.openGl.glObject.buffer.GlQuadIndexBuffer; import com.seibel.distanthorizons.common.render.openGl.glObject.texture.*; import com.seibel.distanthorizons.common.render.openGl.postProcessing.apply.GlDhApplyShader; +import com.seibel.distanthorizons.common.render.openGl.terrain.GlDhTerrainShaderProgram; import com.seibel.distanthorizons.common.wrappers.minecraft.MinecraftGLWrapper; import com.seibel.distanthorizons.common.wrappers.misc.LightMapWrapper; import com.seibel.distanthorizons.core.config.Config; -import com.seibel.distanthorizons.core.dataObjects.render.bufferBuilding.LodQuadBuilder; import com.seibel.distanthorizons.core.dependencyInjection.SingletonInjector; import com.seibel.distanthorizons.core.logging.DhLogger; import com.seibel.distanthorizons.core.logging.DhLoggerBuilder; @@ -96,7 +95,7 @@ public class GlDhMetaRenderer implements IDhMetaRenderer this.renderObjectsCreated = true; } - this.shaderProgramForThisFrame = GlDhTerrainShaderProgram.INSTANCE; + this.shaderProgramForThisFrame = GlDhTerrainRenderer.INSTANCE.getTerrainShaderProgram(); IDhApiShaderProgram lodShaderProgramOverride = OverrideInjector.INSTANCE.get(IDhApiShaderProgram.class); if (lodShaderProgramOverride != null && this.shaderProgramForThisFrame.overrideThisFrame()) { diff --git a/common/src/main/java/com/seibel/distanthorizons/common/render/openGl/GlDhRenderApiDefinition.java b/common/src/main/java/com/seibel/distanthorizons/common/render/openGl/GlDhRenderApiDefinition.java index 26f604c10..215347eac 100644 --- a/common/src/main/java/com/seibel/distanthorizons/common/render/openGl/GlDhRenderApiDefinition.java +++ b/common/src/main/java/com/seibel/distanthorizons/common/render/openGl/GlDhRenderApiDefinition.java @@ -2,13 +2,13 @@ package com.seibel.distanthorizons.common.render.openGl; import com.seibel.distanthorizons.common.render.openGl.generic.GlGenericObjectRenderer; import com.seibel.distanthorizons.common.render.openGl.generic.GlGenericObjectVertexContainer; -import com.seibel.distanthorizons.common.render.openGl.glObject.GLState; import com.seibel.distanthorizons.common.render.openGl.glObject.GlDummyUniformData; import com.seibel.distanthorizons.common.render.openGl.glObject.buffer.GLVertexBuffer; import com.seibel.distanthorizons.common.render.openGl.postProcessing.fade.GlDhFarFadeRenderer; import com.seibel.distanthorizons.common.render.openGl.postProcessing.fade.GlVanillaFadeRenderer; import com.seibel.distanthorizons.common.render.openGl.postProcessing.fog.GlDhFogRenderer; import com.seibel.distanthorizons.common.render.openGl.postProcessing.ssao.GlDhSSAORenderer; +import com.seibel.distanthorizons.common.render.openGl.terrain.GlDhTerrainShaderProgram; import com.seibel.distanthorizons.common.render.openGl.test.GlTestTriangleRenderer; import com.seibel.distanthorizons.core.render.renderer.AbstractDebugWireframeRenderer; import com.seibel.distanthorizons.core.wrapperInterfaces.render.AbstractDhRenderApiDefinition; @@ -36,7 +36,7 @@ public class GlDhRenderApiDefinition extends AbstractDhRenderApiDefinition //region @Override public IDhMetaRenderer getMetaRenderer() { return GlDhMetaRenderer.INSTANCE; } - @Override public IDhTerrainRenderer getTerrainRenderer() { return GlDhTerrainShaderProgram.INSTANCE; } + @Override public IDhTerrainRenderer getTerrainRenderer() { return GlDhTerrainRenderer.INSTANCE; } @Override public IDhSsaoRenderer getSsaoRenderer() { return GlDhSSAORenderer.INSTANCE; } @Override public IDhFogRenderer getFogRenderer() { return GlDhFogRenderer.INSTANCE; } @Override public IDhFarFadeRenderer getFarFadeRenderer() { return GlDhFarFadeRenderer.INSTANCE; } @@ -48,10 +48,7 @@ public class GlDhRenderApiDefinition extends AbstractDhRenderApiDefinition @Override public void bindRenderers() { - try (GLState state = new GLState()) - { - super.bindRenderers(); - } + super.bindRenderers(); } //endregion diff --git a/common/src/main/java/com/seibel/distanthorizons/common/render/openGl/GlDhTerrainRenderer.java b/common/src/main/java/com/seibel/distanthorizons/common/render/openGl/GlDhTerrainRenderer.java new file mode 100644 index 000000000..60afe3356 --- /dev/null +++ b/common/src/main/java/com/seibel/distanthorizons/common/render/openGl/GlDhTerrainRenderer.java @@ -0,0 +1,67 @@ +package com.seibel.distanthorizons.common.render.openGl; + +import com.seibel.distanthorizons.common.render.openGl.terrain.GlDhTerrainShaderProgram; +import com.seibel.distanthorizons.core.dataObjects.render.bufferBuilding.LodBufferContainer; +import com.seibel.distanthorizons.core.render.RenderParams; +import com.seibel.distanthorizons.core.util.objects.SortedArraySet; +import com.seibel.distanthorizons.core.wrapperInterfaces.minecraft.IProfilerWrapper; +import com.seibel.distanthorizons.core.wrapperInterfaces.render.renderPass.IDhTerrainRenderer; + +public class GlDhTerrainRenderer implements IDhTerrainRenderer +{ + public static final GlDhTerrainRenderer INSTANCE = new GlDhTerrainRenderer(); + + private GlDhTerrainShaderProgram terrainShaderProgram = null; + + + + //=============// + // constructor // + //=============// + //region + + private GlDhTerrainRenderer() {} + + //endregion + + + //=========// + // getters // + //=========// + //region + + /** must be called on the render thread the first time so GL can run it's setup */ + public GlDhTerrainShaderProgram getTerrainShaderProgram() + { + if (this.terrainShaderProgram == null) + { + this.terrainShaderProgram = new GlDhTerrainShaderProgram(); + } + + return this.terrainShaderProgram; + } + + + //endregion + + + + //========// + // render // + //========// + //region + + @Override + public void render(RenderParams renderEventParam, boolean opaquePass, SortedArraySet bufferContainers, IProfilerWrapper profiler) + { + this.getTerrainShaderProgram(); + + this.terrainShaderProgram.tryInit(); + this.terrainShaderProgram.render(renderEventParam, opaquePass, bufferContainers, profiler); + } + + //endregion + + + +} diff --git a/common/src/main/java/com/seibel/distanthorizons/common/render/openGl/glObject/buffer/GLVertexBuffer.java b/common/src/main/java/com/seibel/distanthorizons/common/render/openGl/glObject/buffer/GLVertexBuffer.java index 4889c9a6d..f5e5f5e4d 100644 --- a/common/src/main/java/com/seibel/distanthorizons/common/render/openGl/glObject/buffer/GLVertexBuffer.java +++ b/common/src/main/java/com/seibel/distanthorizons/common/render/openGl/glObject/buffer/GLVertexBuffer.java @@ -20,17 +20,13 @@ package com.seibel.distanthorizons.common.render.openGl.glObject.buffer; import java.nio.ByteBuffer; -import java.nio.ByteOrder; -import com.seibel.distanthorizons.common.render.openGl.GlDhTerrainShaderProgram; import com.seibel.distanthorizons.common.render.openGl.glObject.GLProxy; -import com.seibel.distanthorizons.common.render.openGl.glObject.enums.GLEnums; import com.seibel.distanthorizons.core.dataObjects.render.bufferBuilding.LodQuadBuilder; import com.seibel.distanthorizons.core.wrapperInterfaces.render.objects.IVertexBufferWrapper; import org.lwjgl.opengl.GL32; import com.seibel.distanthorizons.api.enums.config.EDhApiGpuUploadMethod; -import org.lwjgl.system.MemoryUtil; /** * This is a container for a OpenGL diff --git a/common/src/main/java/com/seibel/distanthorizons/common/render/openGl/GlDhTerrainShaderProgram.java b/common/src/main/java/com/seibel/distanthorizons/common/render/openGl/terrain/GlDhTerrainShaderProgram.java similarity index 96% rename from common/src/main/java/com/seibel/distanthorizons/common/render/openGl/GlDhTerrainShaderProgram.java rename to common/src/main/java/com/seibel/distanthorizons/common/render/openGl/terrain/GlDhTerrainShaderProgram.java index a046781a6..4de93df44 100644 --- a/common/src/main/java/com/seibel/distanthorizons/common/render/openGl/GlDhTerrainShaderProgram.java +++ b/common/src/main/java/com/seibel/distanthorizons/common/render/openGl/terrain/GlDhTerrainShaderProgram.java @@ -1,12 +1,12 @@ -package com.seibel.distanthorizons.common.render.openGl; +package com.seibel.distanthorizons.common.render.openGl.terrain; import com.seibel.distanthorizons.api.interfaces.override.rendering.IDhApiShaderProgram; import com.seibel.distanthorizons.api.methods.events.abstractEvents.*; import com.seibel.distanthorizons.api.methods.events.sharedParameterObjects.DhApiRenderParam; import com.seibel.distanthorizons.api.objects.math.DhApiVec3f; +import com.seibel.distanthorizons.common.render.openGl.GlDhMetaRenderer; import com.seibel.distanthorizons.common.render.openGl.glObject.GLProxy; import com.seibel.distanthorizons.common.render.openGl.glObject.buffer.GLVertexBuffer; -import com.seibel.distanthorizons.common.render.openGl.glObject.buffer.GlQuadIndexBuffer; import com.seibel.distanthorizons.common.render.openGl.glObject.shader.GlShaderProgram; import com.seibel.distanthorizons.common.render.openGl.glObject.vertexAttribute.GlAbstractVertexAttribute; import com.seibel.distanthorizons.common.render.openGl.glObject.vertexAttribute.GlVertexAttributePostGL43; @@ -30,7 +30,6 @@ import com.seibel.distanthorizons.core.util.objects.SortedArraySet; import com.seibel.distanthorizons.core.wrapperInterfaces.minecraft.IProfilerWrapper; import com.seibel.distanthorizons.core.wrapperInterfaces.modAccessor.IIrisAccessor; import com.seibel.distanthorizons.core.wrapperInterfaces.render.objects.IVertexBufferWrapper; -import com.seibel.distanthorizons.core.wrapperInterfaces.render.renderPass.IDhTerrainRenderer; import com.seibel.distanthorizons.coreapi.DependencyInjection.ApiEventInjector; import org.lwjgl.opengl.GL32; @@ -38,14 +37,12 @@ import org.lwjgl.opengl.GL32; * Handles rendering the normal LOD terrain. * @see LodQuadBuilder */ -public class GlDhTerrainShaderProgram extends GlShaderProgram implements IDhApiShaderProgram, IDhTerrainRenderer +public class GlDhTerrainShaderProgram extends GlShaderProgram implements IDhApiShaderProgram { public static final DhLogger LOGGER = new DhLoggerBuilder() .fileLevelConfig(Config.Common.Logging.logRendererEventToFile) .build(); - public static final GlDhTerrainShaderProgram INSTANCE = new GlDhTerrainShaderProgram(); - private static final MinecraftGLWrapper GLMC = MinecraftGLWrapper.INSTANCE; private static final IIrisAccessor IRIS_ACCESSOR = ModAccessorInjector.INSTANCE.get(IIrisAccessor.class); @@ -87,7 +84,7 @@ public class GlDhTerrainShaderProgram extends GlShaderProgram implements IDhApiS //=============// //region - private GlDhTerrainShaderProgram() + public GlDhTerrainShaderProgram() { super( "assets/distanthorizons/shaders/shared/gl/standard.vert", @@ -96,7 +93,7 @@ public class GlDhTerrainShaderProgram extends GlShaderProgram implements IDhApiS ); } - public void init() + public void tryInit() { if (this.init) { @@ -173,7 +170,7 @@ public class GlDhTerrainShaderProgram extends GlShaderProgram implements IDhApiS @Override public void bind() { - this.init(); + this.tryInit(); super.bind(); this.vao.bind(); } @@ -262,7 +259,6 @@ public class GlDhTerrainShaderProgram extends GlShaderProgram implements IDhApiS //===========// //region - @Override public void render(RenderParams renderEventParam, boolean opaquePass, SortedArraySet bufferContainers, IProfilerWrapper profiler) { //=======================// diff --git a/coreSubProjects b/coreSubProjects index c89abd414..6c0736a2a 160000 --- a/coreSubProjects +++ b/coreSubProjects @@ -1 +1 @@ -Subproject commit c89abd414b9ace91559677b25e6ba266b497aa0f +Subproject commit 6c0736a2a0928cf6f50f1e0a5966ffaf5323fd56 diff --git a/fabric/src/main/java/com/seibel/distanthorizons/fabric/mixins/client/MixinSharedConstants.java b/fabric/src/main/java/com/seibel/distanthorizons/fabric/mixins/client/MixinSharedConstants.java index c747d8335..3e7501235 100644 --- a/fabric/src/main/java/com/seibel/distanthorizons/fabric/mixins/client/MixinSharedConstants.java +++ b/fabric/src/main/java/com/seibel/distanthorizons/fabric/mixins/client/MixinSharedConstants.java @@ -15,11 +15,6 @@ import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.Redirect; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; -/** - * At the moment this is only used for the auto updater - * - * @author coolGi - */ @Mixin(SharedConstants.class) public abstract class MixinSharedConstants {