Separate out some rendering logic

This commit is contained in:
James Seibel
2026-03-10 14:50:53 -05:00
parent 1b0f93db07
commit 0362d89173
5 changed files with 84 additions and 35 deletions
@@ -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
{
@@ -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);
@@ -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());
@@ -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);
}
@@ -32,12 +32,4 @@ public interface IDhTerrainRenderer extends IBindable
SortedArraySet<LodBufferContainer> bufferContainers,
IProfilerWrapper profiler);
// TODO should these go somewhere else?
void runRenderPassSetup(RenderParams renderParams);
void runRenderPassCleanup(RenderParams renderParams);
void applyToMcTexture();
void clearDepth();
void clearColor();
}