diff --git a/core/src/main/java/com/seibel/distanthorizons/core/api/internal/ClientApi.java b/core/src/main/java/com/seibel/distanthorizons/core/api/internal/ClientApi.java index c21c905e8..de413fa23 100644 --- a/core/src/main/java/com/seibel/distanthorizons/core/api/internal/ClientApi.java +++ b/core/src/main/java/com/seibel/distanthorizons/core/api/internal/ClientApi.java @@ -40,6 +40,7 @@ import com.seibel.distanthorizons.core.util.objects.Pair; import com.seibel.distanthorizons.core.util.objects.RollingAverage; import com.seibel.distanthorizons.core.util.threading.ThreadPoolUtil; import com.seibel.distanthorizons.core.wrapperInterfaces.minecraft.IMinecraftRenderWrapper; +import com.seibel.distanthorizons.core.wrapperInterfaces.render.renderPass.IDhMetaRenderer; import com.seibel.distanthorizons.core.wrapperInterfaces.render.renderPass.IDhTerrainRenderer; import com.seibel.distanthorizons.core.wrapperInterfaces.render.renderPass.IDhVanillaFadeRenderer; import com.seibel.distanthorizons.core.wrapperInterfaces.render.renderPass.IDhTestTriangleRenderer; @@ -623,16 +624,18 @@ public class ClientApi { if (!renderingDeferredLayer) { - IDhTerrainRenderer lodRenderer = SingletonInjector.INSTANCE.get(IDhTerrainRenderer.class); + IDhMetaRenderer metaRenderer = SingletonInjector.INSTANCE.get(IDhMetaRenderer.class); IDhTestTriangleRenderer testRenderer = SingletonInjector.INSTANCE.get(IDhTestTriangleRenderer.class); if (testRenderer != null - && lodRenderer != null) + && metaRenderer != null) { - lodRenderer.runRenderPassSetup(renderParams); + // meta renderer needed for render state/texture + // for setup on some APIs (IE openGL) + metaRenderer.runRenderPassSetup(renderParams); testRenderer.render(); - lodRenderer.runRenderPassCleanup(renderParams); + metaRenderer.runRenderPassCleanup(renderParams); } else { diff --git a/core/src/main/java/com/seibel/distanthorizons/core/render/renderer/LodRenderer.java b/core/src/main/java/com/seibel/distanthorizons/core/render/renderer/LodRenderer.java index 833d7dcc8..158c56447 100644 --- a/core/src/main/java/com/seibel/distanthorizons/core/render/renderer/LodRenderer.java +++ b/core/src/main/java/com/seibel/distanthorizons/core/render/renderer/LodRenderer.java @@ -55,8 +55,15 @@ public class LodRenderer public static final LodRenderer INSTANCE = new LodRenderer(); - private boolean vanillaSettingsOverridden = false; + private boolean renderersBound = false; + + private IDhMetaRenderer metaRenderer; + private IDhTerrainRenderer terrainRenderer; + private IDhSsaoRenderer ssaoRenderer; + private IDhFogRenderer fogRenderer; + private IDhFarFadeRenderer farFadeRenderer; + private AbstractDebugWireframeRenderer debugWireframeRenderer; @@ -67,6 +74,16 @@ public class LodRenderer private LodRenderer() { } + private void bindRenderers() + { + this.metaRenderer = SingletonInjector.INSTANCE.get(IDhMetaRenderer.class); + this.terrainRenderer = SingletonInjector.INSTANCE.get(IDhTerrainRenderer.class); + this.ssaoRenderer = SingletonInjector.INSTANCE.get(IDhSsaoRenderer.class); + this.fogRenderer = SingletonInjector.INSTANCE.get(IDhFogRenderer.class); + this.farFadeRenderer = SingletonInjector.INSTANCE.get(IDhFarFadeRenderer.class); + this.debugWireframeRenderer = SingletonInjector.INSTANCE.get(AbstractDebugWireframeRenderer.class); + } + //endregion @@ -98,6 +115,7 @@ public class LodRenderer //====================// // validate rendering // //====================// + //region boolean deferTransparentRendering = DhApiRenderProxy.INSTANCE.getDeferTransparentRendering(); if (runningDeferredPass @@ -113,24 +131,29 @@ public class LodRenderer throw new IllegalArgumentException("Render parameters validation"); } - RenderBufferHandler renderBufferHandler = renderParams.renderBufferHandler; - IDhGenericRenderer genericRenderer = renderParams.genericRenderer; + //endregion - IDhTerrainRenderer lodRenderer = SingletonInjector.INSTANCE.get(IDhTerrainRenderer.class); - IDhSsaoRenderer ssaoRenderer = SingletonInjector.INSTANCE.get(IDhSsaoRenderer.class); - IDhFogRenderer fogRenderer = SingletonInjector.INSTANCE.get(IDhFogRenderer.class); - IDhFarFadeRenderer farFadeRenderer = SingletonInjector.INSTANCE.get(IDhFarFadeRenderer.class); - AbstractDebugWireframeRenderer debugWireframeRenderer = SingletonInjector.INSTANCE.get(AbstractDebugWireframeRenderer.class); //=================// // rendering setup // //=================// + //region ApiEventInjector.INSTANCE.fireAllEvents(DhApiBeforeRenderSetupEvent.class, renderParams); profiler.push("LOD GL setup"); - lodRenderer.runRenderPassSetup(renderParams); + if (!this.renderersBound) + { + this.bindRenderers(); + this.renderersBound = true; + } + + RenderBufferHandler renderBufferHandler = renderParams.renderBufferHandler; + IDhGenericRenderer genericRenderer = renderParams.genericRenderer; + + + this.metaRenderer.runRenderPassSetup(renderParams); if (!this.vanillaSettingsOverridden) { @@ -149,11 +172,13 @@ public class LodRenderer if (firstPass) { - // we only need to sort/cull the LODs during the first frame + // we only need to sort/cull the LODs at the start of the frame profiler.popPush("LOD build render list"); renderBufferHandler.buildRenderList(renderParams); } + //endregion + //===========// @@ -162,8 +187,8 @@ public class LodRenderer if (!runningDeferredPass) { - lodRenderer.clearColor(); - lodRenderer.clearDepth(); + this.metaRenderer.clearDhDepthAndColorTextures(renderParams); + //=========================// @@ -174,7 +199,7 @@ public class LodRenderer // opaque LODs profiler.popPush("LOD Opaque"); - this.renderLodPass(lodRenderer, renderBufferHandler, renderParams, /*opaquePass*/ true, profiler); + this.renderLodPass(this.terrainRenderer, renderBufferHandler, renderParams, /*opaquePass*/ true, profiler); // custom objects with SSAO if (Config.Client.Advanced.Graphics.GenericRendering.enableGenericRendering.get()) @@ -187,7 +212,7 @@ public class LodRenderer if (Config.Client.Advanced.Graphics.Ssao.enableSsao.get()) { profiler.popPush("LOD SSAO"); - ssaoRenderer.render(renderParams.dhProjectionMatrix); + this.ssaoRenderer.render(renderParams.dhProjectionMatrix); } // custom objects without SSAO @@ -202,14 +227,14 @@ public class LodRenderer && Config.Client.Advanced.Graphics.Quality.transparency.get().transparencyEnabled) { profiler.popPush("LOD Transparent"); - this.renderLodPass(lodRenderer, renderBufferHandler, renderParams, /*opaquePass*/ false, profiler); + this.renderLodPass(this.terrainRenderer, renderBufferHandler, renderParams, /*opaquePass*/ false, profiler); } // far plane clip fading if (Config.Client.Advanced.Graphics.Quality.dhFadeFarClipPlane.get()) { profiler.popPush("Fade Far Clip Fade"); - farFadeRenderer.render(renderParams); + this.farFadeRenderer.render(renderParams); } // fog @@ -222,7 +247,7 @@ public class LodRenderer Mat4f combinedMatrix = new Mat4f(renderParams.dhProjectionMatrix); combinedMatrix.multiply(renderParams.dhModelViewMatrix); - fogRenderer.render(combinedMatrix, renderParams.partialTicks); + this.fogRenderer.render(combinedMatrix, renderParams.partialTicks); } @@ -236,11 +261,21 @@ public class LodRenderer profiler.popPush("Debug wireframes"); // Note: this can be very slow if a lot of boxes are being rendered - debugWireframeRenderer.renderPass(renderParams); + this.debugWireframeRenderer.renderPass(renderParams); } - profiler.popPush("Apply to MC"); - lodRenderer.applyToMcTexture(); + + + //=============================// + // Apply to the MC Framebuffer // + //=============================// + + boolean cancelApplyShader = ApiEventInjector.INSTANCE.fireAllEvents(DhApiBeforeApplyShaderRenderEvent.class, renderParams); + if (!cancelApplyShader) + { + profiler.popPush("Apply to MC"); + this.metaRenderer.applyToMcTexture(); + } } else @@ -252,7 +287,7 @@ public class LodRenderer if (Config.Client.Advanced.Graphics.Quality.transparency.get().transparencyEnabled) { profiler.popPush("LOD Transparent"); - this.renderLodPass(lodRenderer, renderBufferHandler, renderParams, /*opaquePass*/ false, profiler); + this.renderLodPass(this.terrainRenderer, renderBufferHandler, renderParams, /*opaquePass*/ false, profiler); if (Config.Client.Advanced.Graphics.Fog.enableDhFog.get() @@ -264,7 +299,7 @@ public class LodRenderer Mat4f combinedMatrix = new Mat4f(renderParams.dhProjectionMatrix); combinedMatrix.multiply(renderParams.dhModelViewMatrix); - fogRenderer.render(combinedMatrix, renderParams.partialTicks); + this.fogRenderer.render(combinedMatrix, renderParams.partialTicks); } } } @@ -278,7 +313,7 @@ public class LodRenderer profiler.popPush("LOD cleanup"); ApiEventInjector.INSTANCE.fireAllEvents(DhApiBeforeRenderCleanupEvent.class, renderParams); - lodRenderer.runRenderPassCleanup(renderParams); + this.metaRenderer.runRenderPassCleanup(renderParams); 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 13f573fa6..1d77eb5dd 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 @@ -27,6 +27,7 @@ public abstract class AbstractDhRenderApiDefinition implements IBindable //============// //region + public abstract IDhMetaRenderer getMetaRenderer(); public abstract IDhTerrainRenderer getTerrainRenderer(); public abstract IDhSsaoRenderer getSsaoRenderer(); public abstract IDhFogRenderer getFogRenderer(); @@ -39,6 +40,7 @@ public abstract class AbstractDhRenderApiDefinition implements IBindable { SingletonInjector.INSTANCE.bind(AbstractDhRenderApiDefinition.class, this); + SingletonInjector.INSTANCE.bind(IDhMetaRenderer.class, this.getMetaRenderer()); SingletonInjector.INSTANCE.bind(IDhTerrainRenderer.class, this.getTerrainRenderer()); SingletonInjector.INSTANCE.bind(IDhSsaoRenderer.class, this.getSsaoRenderer()); SingletonInjector.INSTANCE.bind(IDhFogRenderer.class, this.getFogRenderer()); diff --git a/core/src/main/java/com/seibel/distanthorizons/core/wrapperInterfaces/render/renderPass/IDhMetaRenderer.java b/core/src/main/java/com/seibel/distanthorizons/core/wrapperInterfaces/render/renderPass/IDhMetaRenderer.java new file mode 100644 index 000000000..fd471a312 --- /dev/null +++ b/core/src/main/java/com/seibel/distanthorizons/core/wrapperInterfaces/render/renderPass/IDhMetaRenderer.java @@ -0,0 +1,17 @@ +package com.seibel.distanthorizons.core.wrapperInterfaces.render.renderPass; + +import com.seibel.distanthorizons.core.render.RenderParams; +import com.seibel.distanthorizons.coreapi.interfaces.dependencyInjection.IBindable; + +/** + * Contains anything that's shared between + * render passes or doesn't cleanly fit into another render pass interface. + */ +public interface IDhMetaRenderer extends IBindable +{ + void runRenderPassSetup(RenderParams renderParams); + void runRenderPassCleanup(RenderParams renderParams); + void applyToMcTexture(); + void clearDhDepthAndColorTextures(RenderParams renderParams); + +} diff --git a/core/src/main/java/com/seibel/distanthorizons/core/wrapperInterfaces/render/renderPass/IDhTerrainRenderer.java b/core/src/main/java/com/seibel/distanthorizons/core/wrapperInterfaces/render/renderPass/IDhTerrainRenderer.java index ec5cb9119..e9b257f4e 100644 --- a/core/src/main/java/com/seibel/distanthorizons/core/wrapperInterfaces/render/renderPass/IDhTerrainRenderer.java +++ b/core/src/main/java/com/seibel/distanthorizons/core/wrapperInterfaces/render/renderPass/IDhTerrainRenderer.java @@ -32,12 +32,4 @@ public interface IDhTerrainRenderer extends IBindable SortedArraySet bufferContainers, IProfilerWrapper profiler); - - // TODO should these go somewhere else? - void runRenderPassSetup(RenderParams renderParams); - void runRenderPassCleanup(RenderParams renderParams); - void applyToMcTexture(); - void clearDepth(); - void clearColor(); - }