diff --git a/core/src/main/java/com/seibel/distanthorizons/core/level/AbstractDhLevel.java b/core/src/main/java/com/seibel/distanthorizons/core/level/AbstractDhLevel.java
index 84dcbf3c0..b1b786924 100644
--- a/core/src/main/java/com/seibel/distanthorizons/core/level/AbstractDhLevel.java
+++ b/core/src/main/java/com/seibel/distanthorizons/core/level/AbstractDhLevel.java
@@ -39,6 +39,7 @@ import com.seibel.distanthorizons.core.sql.repo.ChunkHashRepo;
import com.seibel.distanthorizons.core.util.KeyedLockContainer;
import com.seibel.distanthorizons.core.util.LodUtil;
import com.seibel.distanthorizons.core.wrapperInterfaces.chunk.IChunkWrapper;
+import com.seibel.distanthorizons.core.wrapperInterfaces.render.IMcGenericRenderer;
import com.seibel.distanthorizons.coreapi.DependencyInjection.ApiEventInjector;
import com.seibel.distanthorizons.core.logging.DhLogger;
import org.jetbrains.annotations.Nullable;
@@ -118,7 +119,7 @@ public abstract class AbstractDhLevel implements IDhLevel
/** handles any setup that needs the repos to be created */
protected void runRepoReliantSetup()
{
- GenericObjectRenderer genericRenderer = this.getGenericRenderer();
+ IMcGenericRenderer genericRenderer = this.getGenericRenderer();
if (genericRenderer != null)
{
// only client levels can render clouds
diff --git a/core/src/main/java/com/seibel/distanthorizons/core/level/ClientLevelModule.java b/core/src/main/java/com/seibel/distanthorizons/core/level/ClientLevelModule.java
index 852bb3a14..1b58f5902 100644
--- a/core/src/main/java/com/seibel/distanthorizons/core/level/ClientLevelModule.java
+++ b/core/src/main/java/com/seibel/distanthorizons/core/level/ClientLevelModule.java
@@ -30,7 +30,9 @@ import com.seibel.distanthorizons.core.render.QuadTree.LodQuadTree;
import com.seibel.distanthorizons.core.render.RenderBufferHandler;
import com.seibel.distanthorizons.core.render.renderer.generic.GenericObjectRenderer;
import com.seibel.distanthorizons.core.util.LodUtil;
+import com.seibel.distanthorizons.core.wrapperInterfaces.IWrapperFactory;
import com.seibel.distanthorizons.core.wrapperInterfaces.minecraft.IMinecraftClientWrapper;
+import com.seibel.distanthorizons.core.wrapperInterfaces.render.IMcGenericRenderer;
import com.seibel.distanthorizons.core.wrapperInterfaces.world.IClientLevelWrapper;
import com.seibel.distanthorizons.core.logging.DhLogger;
@@ -43,6 +45,7 @@ public class ClientLevelModule implements Closeable, IDataSourceUpdateListenerFu
{
private static final DhLogger LOGGER = new DhLoggerBuilder().build();
private static final IMinecraftClientWrapper MC_CLIENT = SingletonInjector.INSTANCE.get(IMinecraftClientWrapper.class);
+ private static final IWrapperFactory WRAPPER_FACTORY = SingletonInjector.INSTANCE.get(IWrapperFactory.class);
private final IDhClientLevel clientLevel;
@@ -56,7 +59,7 @@ public class ClientLevelModule implements Closeable, IDataSourceUpdateListenerFu
* Destroying the {@link GenericObjectRenderer} would cause any existing bindings to be
* erroneously removed.
*/
- public final GenericObjectRenderer genericRenderer = new GenericObjectRenderer();
+ public final IMcGenericRenderer genericRenderer = WRAPPER_FACTORY.createGenericRenderer();
diff --git a/core/src/main/java/com/seibel/distanthorizons/core/level/DhClientLevel.java b/core/src/main/java/com/seibel/distanthorizons/core/level/DhClientLevel.java
index fcda9f6d0..3acc1a7b0 100644
--- a/core/src/main/java/com/seibel/distanthorizons/core/level/DhClientLevel.java
+++ b/core/src/main/java/com/seibel/distanthorizons/core/level/DhClientLevel.java
@@ -42,6 +42,7 @@ import com.seibel.distanthorizons.core.render.renderer.DebugRenderer;
import com.seibel.distanthorizons.core.sql.dto.FullDataSourceV2DTO;
import com.seibel.distanthorizons.core.util.threading.ThreadPoolUtil;
import com.seibel.distanthorizons.core.wrapperInterfaces.minecraft.IMinecraftClientWrapper;
+import com.seibel.distanthorizons.core.wrapperInterfaces.render.IMcGenericRenderer;
import com.seibel.distanthorizons.core.wrapperInterfaces.world.IClientLevelWrapper;
import com.seibel.distanthorizons.core.wrapperInterfaces.world.ILevelWrapper;
import org.jetbrains.annotations.NotNull;
@@ -298,7 +299,7 @@ public class DhClientLevel extends AbstractDhLevel implements IDhClientLevel
public ISaveStructure getSaveStructure() { return this.saveStructure; }
@Override
- public GenericObjectRenderer getGenericRenderer() { return this.clientside.genericRenderer; }
+ public IMcGenericRenderer getGenericRenderer() { return this.clientside.genericRenderer; }
@Override
public RenderBufferHandler getRenderBufferHandler()
{
diff --git a/core/src/main/java/com/seibel/distanthorizons/core/level/DhClientServerLevel.java b/core/src/main/java/com/seibel/distanthorizons/core/level/DhClientServerLevel.java
index d1ff86052..d692ffee9 100644
--- a/core/src/main/java/com/seibel/distanthorizons/core/level/DhClientServerLevel.java
+++ b/core/src/main/java/com/seibel/distanthorizons/core/level/DhClientServerLevel.java
@@ -29,6 +29,7 @@ import com.seibel.distanthorizons.core.render.renderer.DebugRenderer;
import com.seibel.distanthorizons.core.render.renderer.generic.GenericObjectRenderer;
import com.seibel.distanthorizons.core.wrapperInterfaces.minecraft.IProfilerWrapper;
import com.seibel.distanthorizons.core.wrapperInterfaces.minecraft.IMinecraftClientWrapper;
+import com.seibel.distanthorizons.core.wrapperInterfaces.render.IMcGenericRenderer;
import com.seibel.distanthorizons.core.wrapperInterfaces.world.IClientLevelWrapper;
import com.seibel.distanthorizons.core.wrapperInterfaces.world.IServerLevelWrapper;
import org.jetbrains.annotations.Nullable;
@@ -138,7 +139,7 @@ public class DhClientServerLevel extends AbstractDhServerLevel implements IDhCli
@Override
- public GenericObjectRenderer getGenericRenderer() { return this.clientside.genericRenderer; }
+ public IMcGenericRenderer getGenericRenderer() { return this.clientside.genericRenderer; }
@Override
public RenderBufferHandler getRenderBufferHandler()
{
diff --git a/core/src/main/java/com/seibel/distanthorizons/core/level/DhServerLevel.java b/core/src/main/java/com/seibel/distanthorizons/core/level/DhServerLevel.java
index 2dcef675f..a4ef3c7c1 100644
--- a/core/src/main/java/com/seibel/distanthorizons/core/level/DhServerLevel.java
+++ b/core/src/main/java/com/seibel/distanthorizons/core/level/DhServerLevel.java
@@ -24,6 +24,7 @@ import com.seibel.distanthorizons.core.multiplayer.server.ServerPlayerStateManag
import com.seibel.distanthorizons.core.pos.blockPos.DhBlockPos2D;
import com.seibel.distanthorizons.core.render.RenderBufferHandler;
import com.seibel.distanthorizons.core.render.renderer.generic.GenericObjectRenderer;
+import com.seibel.distanthorizons.core.wrapperInterfaces.render.IMcGenericRenderer;
import com.seibel.distanthorizons.core.wrapperInterfaces.world.IServerLevelWrapper;
import org.jetbrains.annotations.Nullable;
@@ -69,7 +70,7 @@ public class DhServerLevel extends AbstractDhServerLevel
//=========//
@Override
- public GenericObjectRenderer getGenericRenderer()
+ public IMcGenericRenderer getGenericRenderer()
{
// server-only levels don't support rendering
return null;
diff --git a/core/src/main/java/com/seibel/distanthorizons/core/level/IDhLevel.java b/core/src/main/java/com/seibel/distanthorizons/core/level/IDhLevel.java
index ea01a0d5b..b687537ec 100644
--- a/core/src/main/java/com/seibel/distanthorizons/core/level/IDhLevel.java
+++ b/core/src/main/java/com/seibel/distanthorizons/core/level/IDhLevel.java
@@ -31,6 +31,7 @@ import com.seibel.distanthorizons.core.render.renderer.generic.GenericObjectRend
import com.seibel.distanthorizons.core.sql.dto.BeaconBeamDTO;
import com.seibel.distanthorizons.core.sql.repo.BeaconBeamRepo;
import com.seibel.distanthorizons.core.wrapperInterfaces.chunk.IChunkWrapper;
+import com.seibel.distanthorizons.core.wrapperInterfaces.render.IMcGenericRenderer;
import com.seibel.distanthorizons.core.wrapperInterfaces.world.ILevelWrapper;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
@@ -92,7 +93,7 @@ public interface IDhLevel extends AutoCloseable, GeneratedFullDataSourceProvider
* Not supported on the server-side.
*/
@Nullable
- GenericObjectRenderer getGenericRenderer();
+ IMcGenericRenderer getGenericRenderer();
/**
* Will return null if the renderer isn't set up yet.
* Not supported on the server-side.
diff --git a/core/src/main/java/com/seibel/distanthorizons/core/logging/f3/F3Screen.java b/core/src/main/java/com/seibel/distanthorizons/core/logging/f3/F3Screen.java
index 25e1a97eb..a66f3a4d6 100644
--- a/core/src/main/java/com/seibel/distanthorizons/core/logging/f3/F3Screen.java
+++ b/core/src/main/java/com/seibel/distanthorizons/core/logging/f3/F3Screen.java
@@ -36,6 +36,7 @@ import com.seibel.distanthorizons.core.util.threading.PriorityTaskPicker;
import com.seibel.distanthorizons.core.util.threading.ThreadPoolUtil;
import com.seibel.distanthorizons.core.world.AbstractDhWorld;
import com.seibel.distanthorizons.core.wrapperInterfaces.minecraft.IMinecraftClientWrapper;
+import com.seibel.distanthorizons.core.wrapperInterfaces.render.IMcGenericRenderer;
import com.seibel.distanthorizons.coreapi.ModInfo;
import com.seibel.distanthorizons.coreapi.util.StringUtil;
import com.seibel.distanthorizons.core.logging.DhLogger;
@@ -203,7 +204,7 @@ public class F3Screen
}
// Generic rendering
- GenericObjectRenderer genericRenderer = level.getGenericRenderer();
+ IMcGenericRenderer genericRenderer = level.getGenericRenderer();
if (genericRenderer != null)
{
messageList.add(genericRenderer.getVboRenderDebugMenuString());
diff --git a/core/src/main/java/com/seibel/distanthorizons/core/render/QuadTree/LodQuadTree.java b/core/src/main/java/com/seibel/distanthorizons/core/render/QuadTree/LodQuadTree.java
index db02c5424..0e06c6c5e 100644
--- a/core/src/main/java/com/seibel/distanthorizons/core/render/QuadTree/LodQuadTree.java
+++ b/core/src/main/java/com/seibel/distanthorizons/core/render/QuadTree/LodQuadTree.java
@@ -44,6 +44,7 @@ import com.seibel.distanthorizons.core.util.objects.quadTree.QuadNode;
import com.seibel.distanthorizons.core.util.objects.quadTree.QuadTree;
import com.seibel.distanthorizons.core.util.threading.PriorityTaskPicker;
import com.seibel.distanthorizons.core.util.threading.ThreadPoolUtil;
+import com.seibel.distanthorizons.core.wrapperInterfaces.render.IMcGenericRenderer;
import com.seibel.distanthorizons.coreapi.util.MathUtil;
import it.unimi.dsi.fastutil.longs.LongArrayList;
import it.unimi.dsi.fastutil.longs.LongIterator;
@@ -141,7 +142,7 @@ public class LodQuadTree extends QuadTree implements IDebugRen
this.fullDataSourceProvider = fullDataSourceProvider;
this.blockRenderDistanceDiameter = viewDiameterInBlocks;
- GenericObjectRenderer genericObjectRenderer = this.level.getGenericRenderer();
+ IMcGenericRenderer genericObjectRenderer = this.level.getGenericRenderer();
this.beaconRenderHandler = (genericObjectRenderer != null) ? new BeaconRenderHandler(genericObjectRenderer) : null;
Config.Common.WorldGenerator.enableDistantGeneration.addListener(this);
diff --git a/core/src/main/java/com/seibel/distanthorizons/core/render/glObject/buffer/QuadElementBuffer.java b/core/src/main/java/com/seibel/distanthorizons/core/render/glObject/buffer/QuadElementBuffer.java
index 341920e01..3176c01ea 100644
--- a/core/src/main/java/com/seibel/distanthorizons/core/render/glObject/buffer/QuadElementBuffer.java
+++ b/core/src/main/java/com/seibel/distanthorizons/core/render/glObject/buffer/QuadElementBuffer.java
@@ -32,6 +32,7 @@ import java.lang.invoke.MethodHandles;
import java.nio.ByteBuffer;
import java.nio.ByteOrder;
+/** AKA Index Buffer TODO RENAME */
public class QuadElementBuffer extends GLElementBuffer
{
private static final DhLogger LOGGER = new DhLoggerBuilder().build();
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 5251e851d..c1adfda11 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
@@ -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.IMcGenericRenderer;
import com.seibel.distanthorizons.core.wrapperInterfaces.render.IMcTestRenderer;
import com.seibel.distanthorizons.coreapi.DependencyInjection.ApiEventInjector;
import com.seibel.distanthorizons.coreapi.DependencyInjection.OverrideInjector;
@@ -159,7 +160,7 @@ public class LodRenderer
}
RenderBufferHandler renderBufferHandler = renderParams.renderBufferHandler;
- GenericObjectRenderer genericRenderer = renderParams.genericRenderer;
+ IMcGenericRenderer genericRenderer = renderParams.genericRenderer;
ILightMapWrapper lightmap = renderParams.lightmap;
diff --git a/core/src/main/java/com/seibel/distanthorizons/core/render/renderer/McLodRenderer.java b/core/src/main/java/com/seibel/distanthorizons/core/render/renderer/McLodRenderer.java
index 9d4cd0cf8..9059baaa0 100644
--- a/core/src/main/java/com/seibel/distanthorizons/core/render/renderer/McLodRenderer.java
+++ b/core/src/main/java/com/seibel/distanthorizons/core/render/renderer/McLodRenderer.java
@@ -28,10 +28,12 @@ import com.seibel.distanthorizons.core.logging.DhLogger;
import com.seibel.distanthorizons.core.logging.DhLoggerBuilder;
import com.seibel.distanthorizons.core.render.DhApiRenderProxy;
import com.seibel.distanthorizons.core.render.RenderBufferHandler;
+import com.seibel.distanthorizons.core.render.renderer.generic.GenericObjectRenderer;
import com.seibel.distanthorizons.core.util.math.Vec3d;
import com.seibel.distanthorizons.core.util.objects.SortedArraySet;
import com.seibel.distanthorizons.core.wrapperInterfaces.minecraft.IMinecraftClientWrapper;
import com.seibel.distanthorizons.core.wrapperInterfaces.minecraft.IProfilerWrapper;
+import com.seibel.distanthorizons.core.wrapperInterfaces.render.IMcGenericRenderer;
import com.seibel.distanthorizons.core.wrapperInterfaces.render.IMcLodRenderer;
import com.seibel.distanthorizons.core.wrapperInterfaces.render.IMcTestRenderer;
import com.seibel.distanthorizons.core.wrapperInterfaces.render.IVertexBufferWrapper;
@@ -114,7 +116,7 @@ public class McLodRenderer
}
RenderBufferHandler renderBufferHandler = renderParams.renderBufferHandler;
- //GenericObjectRenderer genericRenderer = renderParams.genericRenderer;
+ IMcGenericRenderer genericRenderer = renderParams.genericRenderer;
@@ -174,8 +176,8 @@ public class McLodRenderer
// custom objects with SSAO
if (Config.Client.Advanced.Graphics.GenericRendering.enableGenericRendering.get())
{
- //profiler.popPush("Custom Objects");
- //genericRenderer.render(renderParams, profiler, true);
+ profiler.popPush("Custom Objects");
+ genericRenderer.render(renderParams, profiler, true);
}
// SSAO
@@ -188,8 +190,8 @@ public class McLodRenderer
// custom objects without SSAO
if (Config.Client.Advanced.Graphics.GenericRendering.enableGenericRendering.get())
{
- //profiler.popPush("Custom Objects");
- //genericRenderer.render(renderParams, profiler, false);
+ profiler.popPush("Custom Objects");
+ genericRenderer.render(renderParams, profiler, false);
}
// combined pass transparent rendering
@@ -239,6 +241,8 @@ public class McLodRenderer
//DebugRenderer.INSTANCE.render(combinedMatrix);
}
+ lodRenderer.applyToMcTexture();
+
}
else
{
@@ -328,8 +332,6 @@ public class McLodRenderer
lodRenderer.render(renderEventParam, opaquePass, modelPos, vbos, profilerWrapper);
}
}
-
- lodRenderer.applyToMcTexture();
}
else
{
diff --git a/core/src/main/java/com/seibel/distanthorizons/core/render/renderer/RenderParams.java b/core/src/main/java/com/seibel/distanthorizons/core/render/renderer/RenderParams.java
index 516592d91..d3a8d9857 100644
--- a/core/src/main/java/com/seibel/distanthorizons/core/render/renderer/RenderParams.java
+++ b/core/src/main/java/com/seibel/distanthorizons/core/render/renderer/RenderParams.java
@@ -19,6 +19,7 @@ import com.seibel.distanthorizons.core.wrapperInterfaces.minecraft.IMinecraftCli
import com.seibel.distanthorizons.core.wrapperInterfaces.minecraft.IMinecraftRenderWrapper;
import com.seibel.distanthorizons.core.wrapperInterfaces.misc.ILightMapWrapper;
import com.seibel.distanthorizons.core.wrapperInterfaces.modAccessor.AbstractOptifineAccessor;
+import com.seibel.distanthorizons.core.wrapperInterfaces.render.IMcGenericRenderer;
import com.seibel.distanthorizons.core.wrapperInterfaces.world.IClientLevelWrapper;
/**
@@ -41,7 +42,7 @@ public class RenderParams extends DhApiRenderParam
public IClientLevelWrapper clientLevelWrapper;
public ILightMapWrapper lightmap;
public RenderBufferHandler renderBufferHandler;
- public GenericObjectRenderer genericRenderer;
+ public IMcGenericRenderer genericRenderer;
public Vec3d exactCameraPosition;
/** @see DhRenderState#vanillaFogEnabled */
public boolean vanillaFogEnabled;
diff --git a/core/src/main/java/com/seibel/distanthorizons/core/render/renderer/generic/BeaconRenderHandler.java b/core/src/main/java/com/seibel/distanthorizons/core/render/renderer/generic/BeaconRenderHandler.java
index 61c325a9a..00d4a8b5e 100644
--- a/core/src/main/java/com/seibel/distanthorizons/core/render/renderer/generic/BeaconRenderHandler.java
+++ b/core/src/main/java/com/seibel/distanthorizons/core/render/renderer/generic/BeaconRenderHandler.java
@@ -36,6 +36,7 @@ import com.seibel.distanthorizons.core.util.RenderUtil;
import com.seibel.distanthorizons.core.util.math.Vec3d;
import com.seibel.distanthorizons.core.util.threading.ThreadPoolUtil;
import com.seibel.distanthorizons.core.wrapperInterfaces.minecraft.IMinecraftRenderWrapper;
+import com.seibel.distanthorizons.core.wrapperInterfaces.render.IMcGenericRenderer;
import com.seibel.distanthorizons.coreapi.ModInfo;
import com.seibel.distanthorizons.core.logging.DhLogger;
import org.jetbrains.annotations.NotNull;
@@ -77,7 +78,7 @@ public class BeaconRenderHandler
//=============//
//region
- public BeaconRenderHandler(@NotNull GenericObjectRenderer renderer)
+ public BeaconRenderHandler(@NotNull IMcGenericRenderer renderer)
{
this.activeBeaconBoxRenderGroup = GenericRenderObjectFactory.INSTANCE.createAbsolutePositionedGroup(ModInfo.NAME+":Beacons", new ArrayList<>(0));
this.activeBeaconBoxRenderGroup.setBlockLight(LodUtil.MAX_MC_LIGHT);
diff --git a/core/src/main/java/com/seibel/distanthorizons/core/render/renderer/generic/CloudRenderHandler.java b/core/src/main/java/com/seibel/distanthorizons/core/render/renderer/generic/CloudRenderHandler.java
index 5286f26e4..cef2e1ae6 100644
--- a/core/src/main/java/com/seibel/distanthorizons/core/render/renderer/generic/CloudRenderHandler.java
+++ b/core/src/main/java/com/seibel/distanthorizons/core/render/renderer/generic/CloudRenderHandler.java
@@ -33,6 +33,7 @@ import com.seibel.distanthorizons.core.util.LodUtil;
import com.seibel.distanthorizons.core.util.math.Vec3d;
import com.seibel.distanthorizons.core.util.math.Vec3f;
import com.seibel.distanthorizons.core.wrapperInterfaces.minecraft.IMinecraftRenderWrapper;
+import com.seibel.distanthorizons.core.wrapperInterfaces.render.IMcGenericRenderer;
import com.seibel.distanthorizons.core.wrapperInterfaces.world.IClientLevelWrapper;
import com.seibel.distanthorizons.coreapi.ModInfo;
import com.seibel.distanthorizons.core.logging.DhLogger;
@@ -80,7 +81,7 @@ public class CloudRenderHandler
= new IDhApiRenderableBoxGroup[(CLOUD_INSTANCE_RADIUS_COUNT * 2) + 1][(CLOUD_INSTANCE_RADIUS_COUNT * 2) + 1];
private final IDhClientLevel level;
- private final GenericObjectRenderer renderer;
+ private final IMcGenericRenderer renderer;
/** cached array so we don't need to re-create it each frame for each cloud group */
private final Vec3d[] cullingCorners = new Vec3d[]
@@ -102,7 +103,7 @@ public class CloudRenderHandler
//=============//
//region
- public CloudRenderHandler(IDhClientLevel level, GenericObjectRenderer renderer)
+ public CloudRenderHandler(IDhClientLevel level, IMcGenericRenderer renderer)
{
this.level = level;
this.renderer = renderer;
@@ -316,16 +317,16 @@ public class CloudRenderHandler
return;
}
- if (!this.renderer.getInstancedRenderingAvailable())
- {
- if (!this.disabledWarningLogged)
- {
- this.disabledWarningLogged = true;
- LOGGER.warn("Instanced rendering unavailable, cloud rendering disabled.");
- }
- boxGroup.setActive(false);
- return;
- }
+ //if (!this.renderer.getInstancedRenderingAvailable())
+ //{
+ // if (!this.disabledWarningLogged)
+ // {
+ // this.disabledWarningLogged = true;
+ // LOGGER.warn("Instanced rendering unavailable, cloud rendering disabled.");
+ // }
+ // boxGroup.setActive(false);
+ // return;
+ //}
IClientLevelWrapper clientLevelWrapper = this.level.getClientLevelWrapper();
if (clientLevelWrapper == null)
diff --git a/core/src/main/java/com/seibel/distanthorizons/core/render/renderer/generic/GenericObjectRenderer.java b/core/src/main/java/com/seibel/distanthorizons/core/render/renderer/generic/GenericObjectRenderer.java
index a3af4bbc6..8e3ea5488 100644
--- a/core/src/main/java/com/seibel/distanthorizons/core/render/renderer/generic/GenericObjectRenderer.java
+++ b/core/src/main/java/com/seibel/distanthorizons/core/render/renderer/generic/GenericObjectRenderer.java
@@ -38,12 +38,14 @@ import com.seibel.distanthorizons.core.logging.DhLoggerBuilder;
import com.seibel.distanthorizons.core.logging.f3.F3Screen;
import com.seibel.distanthorizons.core.render.glObject.GLProxy;
import com.seibel.distanthorizons.core.render.glObject.buffer.GLElementBuffer;
+import com.seibel.distanthorizons.core.render.renderer.RenderParams;
import com.seibel.distanthorizons.core.util.LodUtil;
import com.seibel.distanthorizons.core.wrapperInterfaces.minecraft.IMinecraftGLWrapper;
import com.seibel.distanthorizons.core.wrapperInterfaces.minecraft.IMinecraftRenderWrapper;
import com.seibel.distanthorizons.core.wrapperInterfaces.minecraft.IProfilerWrapper;
import com.seibel.distanthorizons.core.util.math.Vec3d;
import com.seibel.distanthorizons.core.wrapperInterfaces.modAccessor.ISodiumAccessor;
+import com.seibel.distanthorizons.core.wrapperInterfaces.render.IMcGenericRenderer;
import com.seibel.distanthorizons.coreapi.DependencyInjection.ApiEventInjector;
import com.seibel.distanthorizons.coreapi.DependencyInjection.OverrideInjector;
import com.seibel.distanthorizons.coreapi.ModInfo;
@@ -63,7 +65,7 @@ import java.util.concurrent.ConcurrentHashMap;
* @see IDhApiCustomRenderRegister
* @see DhApiRenderableBox
*/
-public class GenericObjectRenderer implements IDhApiCustomRenderRegister
+public class GenericObjectRenderer implements IMcGenericRenderer
{
private static final DhLogger LOGGER = new DhLoggerBuilder().build();
@@ -386,7 +388,8 @@ public class GenericObjectRenderer implements IDhApiCustomRenderRegister
* if true that means this render call is happening before the SSAO pass
* and any objects rendered in this pass will have SSAO applied to them.
*/
- public void render(DhApiRenderParam renderEventParam, IProfilerWrapper profiler, boolean renderingWithSsao)
+ @Override
+ public void render(RenderParams renderEventParam, IProfilerWrapper profiler, boolean renderingWithSsao)
{
// render setup //
profiler.push("setup");
@@ -472,7 +475,7 @@ public class GenericObjectRenderer implements IDhApiCustomRenderRegister
boxGroup.tryUpdateInstancedDataAsync();
// skip groups that haven't been uploaded yet
- if (boxGroup.instancedVbos.state != InstancedVboContainer.EState.RENDER)
+ if (boxGroup.instancedVbos.getState() != InstancedVboContainer.EState.RENDER)
{
continue;
}
@@ -554,27 +557,29 @@ public class GenericObjectRenderer implements IDhApiCustomRenderRegister
// Bind instance data //
profiler.popPush("binding");
- GL32.glBindBuffer(GL32.GL_ARRAY_BUFFER, boxGroup.instancedVbos.color);
+ InstancedVboContainer container = (InstancedVboContainer)(boxGroup.instancedVbos);
+
+ GL32.glBindBuffer(GL32.GL_ARRAY_BUFFER, container.color);
GL32.glEnableVertexAttribArray(1);
GL32.glVertexAttribPointer(1, 4, GL32.GL_FLOAT, false, 4 * Float.BYTES, 0);
this.vertexAttribDivisor(1, 1);
- GL32.glBindBuffer(GL32.GL_ARRAY_BUFFER, boxGroup.instancedVbos.scale);
+ GL32.glBindBuffer(GL32.GL_ARRAY_BUFFER, container.scale);
GL32.glEnableVertexAttribArray(2);
this.vertexAttribDivisor(2, 1);
GL32.glVertexAttribPointer(2, 3, GL32.GL_FLOAT, false, 3 * Float.BYTES, 0);
- GL32.glBindBuffer(GL32.GL_ARRAY_BUFFER, boxGroup.instancedVbos.chunkPos);
+ GL32.glBindBuffer(GL32.GL_ARRAY_BUFFER, container.chunkPos);
GL32.glEnableVertexAttribArray(3);
this.vertexAttribDivisor(3, 1);
GL32.glVertexAttribIPointer(3, 3, GL32.GL_INT, 3 * Integer.BYTES, 0);
- GL32.glBindBuffer(GL32.GL_ARRAY_BUFFER, boxGroup.instancedVbos.subChunkPos);
+ GL32.glBindBuffer(GL32.GL_ARRAY_BUFFER, container.subChunkPos);
GL32.glEnableVertexAttribArray(4);
this.vertexAttribDivisor(4, 1);
GL32.glVertexAttribPointer(4, 3, GL32.GL_FLOAT, false, 3 * Float.BYTES, 0);
- GL32.glBindBuffer(GL32.GL_ARRAY_BUFFER, boxGroup.instancedVbos.material);
+ GL32.glBindBuffer(GL32.GL_ARRAY_BUFFER, container.material);
GL32.glEnableVertexAttribArray(5);
this.vertexAttribDivisor(5, 1);
GL32.glVertexAttribIPointer(5, 1, GL32.GL_BYTE, Byte.BYTES, 0);
@@ -582,9 +587,9 @@ public class GenericObjectRenderer implements IDhApiCustomRenderRegister
// Draw instanced
profiler.popPush("render");
- if (boxGroup.instancedVbos.uploadedBoxCount > 0)
+ if (container.uploadedBoxCount > 0)
{
- GL32.glDrawElementsInstanced(GL32.GL_TRIANGLES, BOX_INDICES.length, GL32.GL_UNSIGNED_INT, 0, boxGroup.instancedVbos.uploadedBoxCount);
+ GL32.glDrawElementsInstanced(GL32.GL_TRIANGLES, BOX_INDICES.length, GL32.GL_UNSIGNED_INT, 0, container.uploadedBoxCount);
}
diff --git a/core/src/main/java/com/seibel/distanthorizons/core/render/renderer/generic/IInstancedVboContainer.java b/core/src/main/java/com/seibel/distanthorizons/core/render/renderer/generic/IInstancedVboContainer.java
new file mode 100644
index 000000000..7a8a45935
--- /dev/null
+++ b/core/src/main/java/com/seibel/distanthorizons/core/render/renderer/generic/IInstancedVboContainer.java
@@ -0,0 +1,38 @@
+package com.seibel.distanthorizons.core.render.renderer.generic;
+
+import com.seibel.distanthorizons.api.objects.render.DhApiRenderableBox;
+
+import java.util.List;
+
+public interface IInstancedVboContainer extends AutoCloseable
+{
+ void uploadDataToGpu();
+
+ void updateVertexData(List uploadBoxList);
+
+ EState getState();
+ void setState(EState state);
+
+ @Override
+ void close();
+
+
+
+ //================//
+ // helper classes //
+ //================//
+ //region
+
+ enum EState
+ {
+ NEW,
+ UPDATING_DATA,
+ READY_TO_UPLOAD,
+ RENDER,
+
+ ERROR,
+ }
+
+ //endregion
+
+}
diff --git a/core/src/main/java/com/seibel/distanthorizons/core/render/renderer/generic/InstancedVboContainer.java b/core/src/main/java/com/seibel/distanthorizons/core/render/renderer/generic/InstancedVboContainer.java
index 744e3d64c..ff3b1aef9 100644
--- a/core/src/main/java/com/seibel/distanthorizons/core/render/renderer/generic/InstancedVboContainer.java
+++ b/core/src/main/java/com/seibel/distanthorizons/core/render/renderer/generic/InstancedVboContainer.java
@@ -17,7 +17,7 @@ import java.util.List;
*
* @see RenderableBoxGroup
*/
-public class InstancedVboContainer implements AutoCloseable
+public class InstancedVboContainer implements IInstancedVboContainer
{
private static final DhLogger LOGGER = new DhLoggerBuilder().build();
@@ -40,7 +40,11 @@ public class InstancedVboContainer implements AutoCloseable
public int uploadedBoxCount = 0;
- public EState state = EState.NEW;
+ private EState state = EState.NEW;
+ @Override
+ public EState getState() { return this.state; }
+ @Override
+ public void setState(EState state) { this.state = state; }
@@ -171,23 +175,6 @@ public class InstancedVboContainer implements AutoCloseable
- //================//
- // helper classes //
- //================//
- //region
-
- public enum EState
- {
- NEW,
- UPDATING_DATA,
- READY_TO_UPLOAD,
- RENDER,
-
- ERROR,
- }
-
- //endregion
-
}
diff --git a/core/src/main/java/com/seibel/distanthorizons/core/render/renderer/generic/RenderableBoxGroup.java b/core/src/main/java/com/seibel/distanthorizons/core/render/renderer/generic/RenderableBoxGroup.java
index 56f7a0d17..43365da5d 100644
--- a/core/src/main/java/com/seibel/distanthorizons/core/render/renderer/generic/RenderableBoxGroup.java
+++ b/core/src/main/java/com/seibel/distanthorizons/core/render/renderer/generic/RenderableBoxGroup.java
@@ -12,6 +12,7 @@ import com.seibel.distanthorizons.core.render.glObject.GLProxy;
import com.seibel.distanthorizons.core.util.LodUtil;
import com.seibel.distanthorizons.core.util.threading.PriorityTaskPicker;
import com.seibel.distanthorizons.core.util.threading.ThreadPoolUtil;
+import com.seibel.distanthorizons.core.wrapperInterfaces.IWrapperFactory;
import com.seibel.distanthorizons.core.wrapperInterfaces.minecraft.IMinecraftGLWrapper;
import com.seibel.distanthorizons.core.wrapperInterfaces.minecraft.IMinecraftRenderWrapper;
import org.jetbrains.annotations.Nullable;
@@ -35,6 +36,7 @@ public class RenderableBoxGroup
private static final IMinecraftGLWrapper GLMC = SingletonInjector.INSTANCE.get(IMinecraftGLWrapper.class);
private static final IMinecraftRenderWrapper MC_RENDER = SingletonInjector.INSTANCE.get(IMinecraftRenderWrapper.class);
+ private static final IWrapperFactory WRAPPER_FACTORY = SingletonInjector.INSTANCE.get(IWrapperFactory.class);
public static final AtomicInteger NEXT_ID_ATOMIC_INT = new AtomicInteger(0);
@@ -67,9 +69,9 @@ public class RenderableBoxGroup
public Consumer afterRenderFunc;
// instance data
- public InstancedVboContainer instancedVbos = new InstancedVboContainer();
+ public IInstancedVboContainer instancedVbos = WRAPPER_FACTORY.createInstancedVboContainer();
/** double buffering for thread safety and to prevent locking the render thread during update */
- private InstancedVboContainer altInstancedVbos = new InstancedVboContainer();
+ private IInstancedVboContainer altInstancedVbos = WRAPPER_FACTORY.createInstancedVboContainer();
@@ -195,12 +197,12 @@ public class RenderableBoxGroup
public void tryUpdateInstancedDataAsync()
{
// if the alt container is done, swap it in
- if (this.altInstancedVbos.state == InstancedVboContainer.EState.READY_TO_UPLOAD)
+ if (this.altInstancedVbos.getState() == InstancedVboContainer.EState.READY_TO_UPLOAD)
{
this.altInstancedVbos.uploadDataToGpu();
// swap VBO references for rendering
- InstancedVboContainer temp = this.instancedVbos;
+ IInstancedVboContainer temp = this.instancedVbos;
this.instancedVbos = this.altInstancedVbos;
this.altInstancedVbos = temp;
@@ -224,15 +226,15 @@ public class RenderableBoxGroup
}
// if the alternate container is already updating, don't double-queue it
- if (this.altInstancedVbos.state == InstancedVboContainer.EState.UPDATING_DATA)
+ if (this.altInstancedVbos.getState() == InstancedVboContainer.EState.UPDATING_DATA)
{
return;
}
- this.altInstancedVbos.state = InstancedVboContainer.EState.UPDATING_DATA;
+ this.altInstancedVbos.setState(InstancedVboContainer.EState.UPDATING_DATA);
- this.altInstancedVbos.tryRunRenderThreadSetup();
+ //this.altInstancedVbos.tryRunRenderThreadSetup();
// copy over the box list so we can upload without concurrent modification issues
this.uploadBoxList.clear();
@@ -252,14 +254,14 @@ public class RenderableBoxGroup
catch (Exception e)
{
LOGGER.error("Unexpected error updating instanced VBO data for: ["+this+"], error: ["+e.getMessage()+"].", e);
- this.altInstancedVbos.state = InstancedVboContainer.EState.ERROR;
+ this.altInstancedVbos.setState(InstancedVboContainer.EState.ERROR);
}
});
}
catch (RejectedExecutionException ignore)
{
// the executor was shut down, it should be back up shortly and able to accept new jobs
- this.altInstancedVbos.state = InstancedVboContainer.EState.NEW;
+ this.altInstancedVbos.setState(InstancedVboContainer.EState.NEW);
}
}
@@ -341,7 +343,7 @@ public class RenderableBoxGroup
//region
@Override
- public String toString() { return "["+this.resourceLocationNamespace+":"+this.resourceLocationPath+"] ID:["+this.id+"], pos:["+this.originBlockPos.x+","+this.originBlockPos.y+","+this.originBlockPos.z+"], size:["+this.size()+"], active:["+this.active+"]"; }
+ public String toString() { return "["+this.resourceLocationNamespace+":"+this.resourceLocationPath+"] ID:["+this.id+"], pos:[("+this.originBlockPos.x+", "+this.originBlockPos.y+", "+this.originBlockPos.z+")], size:["+this.size()+"], active:["+this.active+"]"; }
@Override
public void close()
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 f7aefe454..200a83aa4 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
@@ -21,8 +21,10 @@ package com.seibel.distanthorizons.core.wrapperInterfaces;
import com.seibel.distanthorizons.api.interfaces.factories.IDhApiWrapperFactory;
import com.seibel.distanthorizons.core.level.IDhLevel;
+import com.seibel.distanthorizons.core.render.renderer.generic.IInstancedVboContainer;
import com.seibel.distanthorizons.core.wrapperInterfaces.block.IBlockStateWrapper;
import com.seibel.distanthorizons.core.wrapperInterfaces.chunk.IChunkWrapper;
+import com.seibel.distanthorizons.core.wrapperInterfaces.render.IMcGenericRenderer;
import com.seibel.distanthorizons.core.wrapperInterfaces.render.IVertexBufferWrapper;
import com.seibel.distanthorizons.core.wrapperInterfaces.world.IBiomeWrapper;
import com.seibel.distanthorizons.core.wrapperInterfaces.world.ILevelWrapper;
@@ -107,4 +109,8 @@ public interface IWrapperFactory extends IDhApiWrapperFactory, IBindable
IVertexBufferWrapper createVboWrapper();
+ IInstancedVboContainer createInstancedVboContainer();
+
+ IMcGenericRenderer createGenericRenderer();
+
}
diff --git a/core/src/main/java/com/seibel/distanthorizons/core/wrapperInterfaces/render/IMcGenericRenderer.java b/core/src/main/java/com/seibel/distanthorizons/core/wrapperInterfaces/render/IMcGenericRenderer.java
new file mode 100644
index 000000000..8edbe9f73
--- /dev/null
+++ b/core/src/main/java/com/seibel/distanthorizons/core/wrapperInterfaces/render/IMcGenericRenderer.java
@@ -0,0 +1,34 @@
+/*
+ * 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 .
+ */
+
+package com.seibel.distanthorizons.core.wrapperInterfaces.render;
+
+import com.seibel.distanthorizons.api.interfaces.render.IDhApiCustomRenderRegister;
+import com.seibel.distanthorizons.api.objects.math.DhApiVec3f;
+import com.seibel.distanthorizons.core.render.renderer.RenderParams;
+import com.seibel.distanthorizons.core.wrapperInterfaces.minecraft.IProfilerWrapper;
+import com.seibel.distanthorizons.coreapi.interfaces.dependencyInjection.IBindable;
+
+public interface IMcGenericRenderer extends IDhApiCustomRenderRegister, IBindable
+{
+ void render(RenderParams renderEventParam, IProfilerWrapper profiler, boolean renderingWithSsao);
+
+ String getVboRenderDebugMenuString();
+
+}
diff --git a/core/src/main/resources/assets/distanthorizons/shaders/generic/frag.fsh b/core/src/main/resources/assets/distanthorizons/shaders/generic/frag.fsh
new file mode 100644
index 000000000..c3d2ac8c4
--- /dev/null
+++ b/core/src/main/resources/assets/distanthorizons/shaders/generic/frag.fsh
@@ -0,0 +1,10 @@
+#version 150 core
+
+in vec4 fColor;
+
+out vec4 fragColor;
+
+void main()
+{
+ fragColor = fColor;
+}
\ No newline at end of file
diff --git a/core/src/main/resources/assets/distanthorizons/shaders/generic/vert.vsh b/core/src/main/resources/assets/distanthorizons/shaders/generic/vert.vsh
new file mode 100644
index 000000000..68931fe9a
--- /dev/null
+++ b/core/src/main/resources/assets/distanthorizons/shaders/generic/vert.vsh
@@ -0,0 +1,101 @@
+#version 330 core
+
+//layout (location = 1) in vec4 aColor; // RGBA_FLOAT_COLOR
+//layout (location = 2) in vec3 aScale; // VEC3_SCALE
+//layout (location = 3) in ivec3 aTranslateChunk; // IVEC3_SCALE
+//layout (location = 4) in vec3 aTranslateSubChunk; // VEC3_SCALE
+//layout (location = 5) in int aMaterial; // IRIS_MATERIAL
+
+//uniform sampler2D /*vec4*/ uColorMap;
+//uniform sampler2D /*vec3*/ uScaleMap;
+//uniform sampler2D /*int*/ uTranslateChunkXMap;
+//uniform sampler2D /*int*/ uTranslateChunkYMap;
+//uniform sampler2D /*int*/ uTranslateChunkZMap;
+//uniform sampler2D /*vec3*/ uTranslateSubChunkMap;
+//uniform sampler2D /*int*/ uMaterialMap;
+//
+//in vec3 vPosition;
+
+in vec3 vPosition;
+in vec4 aColor; // RGBA_FLOAT_COLOR
+in int aMaterial; // IRIS_MATERIAL
+
+layout (std140) uniform vertUniformBlock
+{
+ ivec3 uOffsetChunk;
+ vec3 uOffsetSubChunk;
+ ivec3 uCameraPosChunk;
+ vec3 uCameraPosSubChunk;
+
+ mat4 uProjectionMvm;
+ int uSkyLight;
+ int uBlockLight;
+
+ float uNorthShading;
+ float uSouthShading;
+ float uEastShading;
+ float uWestShading;
+ float uTopShading;
+ float uBottomShading;
+};
+
+uniform sampler2D uLightMap;
+
+out vec4 fColor;
+
+void main()
+{
+ vec3 aScale = vec3(1);
+
+ if (aMaterial == 999)
+ {
+ aScale = vec3(2);
+ }
+
+// vec4 aColor = texelFetch(uColorMap, ivec2(gl_InstanceID,0), 0);
+// vec3 aScale = texelFetch(uScaleMap, ivec2(gl_InstanceID,0), 0).xyz;
+//
+// float chunkX = int(texelFetch(uTranslateChunkXMap, ivec2(gl_InstanceID,0), 0).x);
+// float chunkY = int(texelFetch(uTranslateChunkYMap, ivec2(gl_InstanceID,0), 0).x);
+// float chunkZ = int(texelFetch(uTranslateChunkZMap, ivec2(gl_InstanceID,0), 0).x);
+// ivec3 aTranslateChunk = ivec3(chunkX, chunkY, chunkZ);
+//
+// vec3 aTranslateSubChunk = texelFetch(uTranslateSubChunkMap, ivec2(gl_InstanceID,0), 0).xyz;
+// int aMaterial = int(texelFetch(uMaterialMap, ivec2(gl_InstanceID,0), 0).x);
+
+ // aTranslate - moves the vertex to the boxGroup's relative position
+ // uOffset - moves the vertex to the boxGroup's world position
+ // uCameraPos - moves the vertex into camera space
+ vec3 trans = (uOffsetChunk - uCameraPosChunk) * 16.0f;
+ // separate float and int values are to fix percission loss at extreme distances from the origin (IE 10,000,000+)
+ // luckily large translate values minus large cameraPos generally equal values that cleanly fit in a float
+ trans += (uOffsetSubChunk - uCameraPosSubChunk);
+
+ // combination translation and scaling matrix
+ mat4 transform = mat4(
+ aScale.x, 0.0, 0.0, 0.0,
+ 0.0, aScale.y, 0.0, 0.0,
+ 0.0, 0.0, aScale.z, 0.0,
+ trans.x, trans.y, trans.z, 1.0
+ );
+
+ gl_Position = uProjectionMvm * transform * vec4(vPosition, 1.0);
+
+ float blockLight = (float(uBlockLight)+0.5) / 16.0;
+ float skyLight = (float(uSkyLight)+0.5) / 16.0;
+ vec4 lightColor = vec4(texture(uLightMap, vec2(blockLight, skyLight)).xyz, 1.0);
+
+
+ fColor = lightColor * aColor;
+
+ int vertexIndex = gl_VertexID % 24;
+
+ // apply directional shading
+ if (vertexIndex >= 0 && vertexIndex < 4) { fColor.rgb *= uNorthShading; }
+ else if (vertexIndex >= 4 && vertexIndex < 8) { fColor.rgb *= uSouthShading; }
+ else if (vertexIndex >= 8 && vertexIndex < 12) { fColor.rgb *= uWestShading; }
+ else if (vertexIndex >= 12 && vertexIndex < 16) { fColor.rgb *= uEastShading; }
+ else if (vertexIndex >= 16 && vertexIndex < 20) { fColor.rgb *= uBottomShading; }
+ else if (vertexIndex >= 20 && vertexIndex < 24) { fColor.rgb *= uTopShading; }
+
+}