proof-of-concept test renderer

This commit is contained in:
James Seibel
2026-02-23 12:31:21 -06:00
parent ed0e94ccb7
commit 1b2992f1dc
6 changed files with 114 additions and 43 deletions
@@ -38,6 +38,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.IMcTestRenderer;
import com.seibel.distanthorizons.coreapi.DependencyInjection.ApiEventInjector;
import com.seibel.distanthorizons.core.config.Config;
import com.seibel.distanthorizons.core.network.messages.AbstractNetworkMessage;
@@ -485,6 +486,13 @@ public class ClientApi
///endregion
IMcTestRenderer testRenderer = SingletonInjector.INSTANCE.get(IMcTestRenderer.class);
if (testRenderer == null)
{
return;
}
//=================//
@@ -577,7 +585,9 @@ public class ClientApi
boolean renderingCancelled = ApiEventInjector.INSTANCE.fireAllEvents(DhApiBeforeRenderEvent.class, renderParams);
if (!renderingCancelled)
{
LodRenderer.INSTANCE.render(renderParams, profiler);
testRenderer.render();
//LodRenderer.INSTANCE.render(renderParams, profiler);
}
if (!DhApi.Delayed.renderProxy.getDeferTransparentRendering())
@@ -590,7 +600,7 @@ public class ClientApi
boolean renderingCancelled = ApiEventInjector.INSTANCE.fireAllEvents(DhApiBeforeDeferredRenderEvent.class, renderParams);
if (!renderingCancelled)
{
LodRenderer.INSTANCE.renderDeferred(renderParams, profiler);
//LodRenderer.INSTANCE.renderDeferred(renderParams, profiler);
}
@@ -50,8 +50,8 @@ import java.util.concurrent.ConcurrentLinkedQueue;
*/
public class GLProxy
{
private static final IMinecraftClientWrapper MC = SingletonInjector.INSTANCE.get(IMinecraftClientWrapper.class);
private static final IMinecraftRenderWrapper MC_RENDER = SingletonInjector.INSTANCE.get(IMinecraftRenderWrapper.class);
//private static final IMinecraftClientWrapper MC = SingletonInjector.INSTANCE.get(IMinecraftClientWrapper.class);
//private static final IMinecraftRenderWrapper MC_RENDER = SingletonInjector.INSTANCE.get(IMinecraftRenderWrapper.class);
public static final DhLogger LOGGER = new DhLoggerBuilder()
.fileLevelConfig(Config.Common.Logging.logRendererGLEventToFile)
@@ -145,6 +145,7 @@ public class GLProxy
String errorMessage = ModInfo.READABLE_NAME + " was initializing " + GLProxy.class.getSimpleName()
+ " and discovered this GPU doesn't meet the OpenGL requirements. Sorry I couldn't tell you sooner :(\n" +
"Additional info:\n" + supportedVersionInfo;
IMinecraftClientWrapper MC = SingletonInjector.INSTANCE.get(IMinecraftClientWrapper.class);
MC.crashMinecraft(errorMessage, new UnsupportedOperationException("Distant Horizon OpenGL requirements not met"));
}
LOGGER.info("minecraftGlCapabilities:\n" + this.versionInfoToString(this.glCapabilities));
@@ -287,6 +288,8 @@ public class GLProxy
*/
public void runRenderThreadTasks()
{
IMinecraftRenderWrapper MC_RENDER = SingletonInjector.INSTANCE.get(IMinecraftRenderWrapper.class);
int frameLimit = MC_RENDER.getFrameLimit();
if (frameLimit <= 1)
{
@@ -336,6 +339,7 @@ public class GLProxy
// this means we could have GL jobs building up.
// Run the queued tasks on MC's executor (hopefully this should always run,
// even if DH's render code isn't being hit).
IMinecraftClientWrapper MC = SingletonInjector.INSTANCE.get(IMinecraftClientWrapper.class);
MC.executeOnRenderThread(() -> this.runRenderThreadTasks(1_000));
}
@@ -51,6 +51,7 @@ import com.seibel.distanthorizons.core.wrapperInterfaces.minecraft.IProfilerWrap
import com.seibel.distanthorizons.core.wrapperInterfaces.misc.ILightMapWrapper;
import com.seibel.distanthorizons.core.wrapperInterfaces.modAccessor.AbstractOptifineAccessor;
import com.seibel.distanthorizons.core.wrapperInterfaces.modAccessor.IIrisAccessor;
import com.seibel.distanthorizons.core.wrapperInterfaces.render.IMcTestRenderer;
import com.seibel.distanthorizons.coreapi.DependencyInjection.ApiEventInjector;
import com.seibel.distanthorizons.coreapi.DependencyInjection.OverrideInjector;
import com.seibel.distanthorizons.core.util.math.Vec3f;
@@ -660,48 +661,52 @@ public class LodRenderer
GLMC.enableFaceCulling();
}
if (Config.Client.Advanced.Debugging.rendererMode.get() == EDhApiRendererMode.DEFAULT)
{
// Normal LOD rendering
SortedArraySet<LodBufferContainer> lodBufferContainer = lodBufferHandler.getColumnRenderBuffers();
if (lodBufferContainer != null)
{
for (int lodIndex = 0; lodIndex < lodBufferContainer.size(); lodIndex++)
{
LodBufferContainer bufferContainer = lodBufferContainer.get(lodIndex);
this.setShaderProgramMvmOffset(bufferContainer.minCornerBlockPos, shaderProgram, renderEventParam);
GLVertexBuffer[] vbos = opaquePass ? bufferContainer.vbos : bufferContainer.vbosTransparent;
for (int vboIndex = 0; vboIndex < vbos.length; vboIndex++)
{
GLVertexBuffer vbo = vbos[vboIndex];
if (vbo == null)
{
continue;
}
if (vbo.getVertexCount() == 0)
{
continue;
}
vbo.bind();
shaderProgram.bindVertexBuffer(vbo.getId());
GL32.glDrawElements(
GL32.GL_TRIANGLES,
vbo.getVertexCount(),
this.quadIBO.getType(), 0);
vbo.unbind();
}
}
}
}
else
//if (Config.Client.Advanced.Debugging.rendererMode.get() == EDhApiRendererMode.DEFAULT)
//{
// // Normal LOD rendering
//
// SortedArraySet<LodBufferContainer> lodBufferContainer = lodBufferHandler.getColumnRenderBuffers();
// if (lodBufferContainer != null)
// {
// for (int lodIndex = 0; lodIndex < lodBufferContainer.size(); lodIndex++)
// {
// LodBufferContainer bufferContainer = lodBufferContainer.get(lodIndex);
// this.setShaderProgramMvmOffset(bufferContainer.minCornerBlockPos, shaderProgram, renderEventParam);
//
// GLVertexBuffer[] vbos = opaquePass ? bufferContainer.vbos : bufferContainer.vbosTransparent;
// for (int vboIndex = 0; vboIndex < vbos.length; vboIndex++)
// {
// GLVertexBuffer vbo = vbos[vboIndex];
// if (vbo == null)
// {
// continue;
// }
//
// if (vbo.getVertexCount() == 0)
// {
// continue;
// }
//
// vbo.bind();
// shaderProgram.bindVertexBuffer(vbo.getId());
// GL32.glDrawElements(
// GL32.GL_TRIANGLES,
// vbo.getVertexCount(),
// this.quadIBO.getType(), 0);
// vbo.unbind();
// }
// }
// }
//}
//else
{
// basic quad rendering
TestRenderer.INSTANCE.render();
IMcTestRenderer testRenderer = SingletonInjector.INSTANCE.get(IMcTestRenderer.class);
testRenderer.render();
//TestRenderer.INSTANCE.render();
//McTestRenderer.INSTANCE.render();
}
@@ -0,0 +1,29 @@
/*
* This file is part of the Distant Horizons mod
* licensed under the GNU LGPL v3 License.
*
* Copyright (C) 2020 James Seibel
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation, version 3.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
package com.seibel.distanthorizons.core.wrapperInterfaces.render;
import com.seibel.distanthorizons.coreapi.interfaces.dependencyInjection.IBindable;
public interface IMcTestRenderer extends IBindable
{
void render();
}
@@ -0,0 +1,10 @@
#version 150 core
in vec4 fColor;
out vec4 fragColor;
// DH frag test
void main()
{
fragColor = fColor;
}
@@ -0,0 +1,13 @@
#version 150 core
in vec2 vPosition;
in vec4 vColor;
out vec4 fColor;
// DH vert test
void main()
{
gl_Position = vec4(vPosition, 0.0, 1.0);
fColor = vColor;
}