diff --git a/core/src/main/java/com/seibel/distanthorizons/core/dataObjects/render/bufferBuilding/ColumnBox.java b/core/src/main/java/com/seibel/distanthorizons/core/dataObjects/render/bufferBuilding/ColumnBox.java
index 700baa3d8..ee61960e6 100644
--- a/core/src/main/java/com/seibel/distanthorizons/core/dataObjects/render/bufferBuilding/ColumnBox.java
+++ b/core/src/main/java/com/seibel/distanthorizons/core/dataObjects/render/bufferBuilding/ColumnBox.java
@@ -35,6 +35,8 @@ public class ColumnBox
{
private static final IMinecraftClientWrapper MC = SingletonInjector.INSTANCE.get(IMinecraftClientWrapper.class);
+
+
public static void addBoxQuadsToBuilder(
LodQuadBuilder builder,
short xSize, short ySize, short zSize,
@@ -42,6 +44,10 @@ public class ColumnBox
int color, byte irisBlockMaterialId, byte skyLight, byte blockLight,
long topData, long bottomData, ColumnArrayView[] adjData)
{
+ //================//
+ // variable setup //
+ //================//
+
short maxX = (short) (x + xSize);
short maxY = (short) (minY + ySize);
short maxZ = (short) (z + zSize);
@@ -53,33 +59,15 @@ public class ColumnBox
boolean isTopTransparent = RenderDataPointUtil.getAlpha(topData) < 255 && LodRenderer.transparencyEnabled;
boolean isBottomTransparent = RenderDataPointUtil.getAlpha(bottomData) < 255 && LodRenderer.transparencyEnabled;
+
// if there isn't any data below this LOD, make this LOD's color opaque to prevent seeing void through transparent blocks
// Note: this LOD should still be considered transparent for this method's checks, otherwise rendering bugs may occur
- // FIXME this transparency change should be applied before this point since this could affect other areas
- // This may also be better than handling the LOD as transparent, but that is TBD
if (!RenderDataPointUtil.doesDataPointExist(bottomData))
{
color = ColorUtil.setAlpha(color, 255);
}
- // cave culling prevention
- // prevents certain faces from being culled underground that should be allowed
- if (builder.skipQuadsWithZeroSkylight
- && 0 == skyLight
- && builder.skyLightCullingBelow > maxY
- && (
- (RenderDataPointUtil.getAlpha(topData) < 255 && RenderDataPointUtil.getYMax(topData) >= builder.skyLightCullingBelow)
- || (RenderDataPointUtil.getYMin(topData) >= builder.skyLightCullingBelow)
- || !RenderDataPointUtil.doesDataPointExist(topData)
- )
- )
- {
- maxY = builder.skyLightCullingBelow;
- }
-
-
-
// fake ocean transparency
if (LodRenderer.transparencyEnabled && LodRenderer.fakeOceanFloor)
{
@@ -99,7 +87,9 @@ public class ColumnBox
- // add top and bottom faces if requested //
+ //==========================//
+ // add top and bottom faces //
+ //==========================//
boolean skipTop = RenderDataPointUtil.doesDataPointExist(topData) && (RenderDataPointUtil.getYMin(topData) == maxY) && !isTopTransparent;
if (!skipTop)
@@ -114,14 +104,16 @@ public class ColumnBox
}
- // add North, south, east, and west faces if requested //
- // TODO merge duplicate code
- //NORTH face vertex creation
+ //========================================//
+ // add North, south, east, and west faces //
+ //========================================//
+
+ // NORTH face
{
- ColumnArrayView adjDataNorth = adjData[EDhDirection.NORTH.ordinal() - 2]; // TODO can we use something other than ordinal-2?
- int adjOverlapNorth = ColorUtil.INVISIBLE;
- if (adjDataNorth == null)
+ ColumnArrayView adjCol = adjData[EDhDirection.NORTH.ordinal() - 2]; // TODO can we use something other than ordinal-2?
+ int adjOverlapNorth = ColorUtil.INVISIBLE; // can be set to a non-invisible color for debugging overlapping quads for a specific face
+ if (adjCol == null)
{
// add an adjacent face if this is opaque face or transparent over the void
if (!isTransparent || overVoid)
@@ -131,49 +123,49 @@ public class ColumnBox
}
else
{
- makeAdjVerticalQuad(builder, adjDataNorth, EDhDirection.NORTH, x, minY, z, xSize, ySize,
+ makeAdjVerticalQuad(builder, adjCol, EDhDirection.NORTH, x, minY, z, xSize, ySize,
color, adjOverlapNorth, irisBlockMaterialId, skyLightTop, blockLight,
topData, bottomData);
}
}
- //SOUTH face vertex creation
+ // SOUTH face
{
- ColumnArrayView adjDataSouth = adjData[EDhDirection.SOUTH.ordinal() - 2];
+ ColumnArrayView adjCol = adjData[EDhDirection.SOUTH.ordinal() - 2];
int adjOverlapSouth = ColorUtil.INVISIBLE;
- if (adjDataSouth == null)
+ if (adjCol == null)
{
if (!isTransparent || overVoid)
builder.addQuadAdj(EDhDirection.SOUTH, x, minY, maxZ, xSize, ySize, color, irisBlockMaterialId, LodUtil.MAX_MC_LIGHT, blockLight);
}
else
{
- makeAdjVerticalQuad(builder, adjDataSouth, EDhDirection.SOUTH, x, minY, maxZ, xSize, ySize,
+ makeAdjVerticalQuad(builder, adjCol, EDhDirection.SOUTH, x, minY, maxZ, xSize, ySize,
color, adjOverlapSouth, irisBlockMaterialId, skyLightTop, blockLight,
topData, bottomData);
}
}
- //WEST face vertex creation
+ // WEST face
{
- ColumnArrayView adjDataWest = adjData[EDhDirection.WEST.ordinal() - 2];
+ ColumnArrayView adjCol = adjData[EDhDirection.WEST.ordinal() - 2];
int adjOverlapWest = ColorUtil.INVISIBLE;
- if (adjDataWest == null)
+ if (adjCol == null)
{
if (!isTransparent || overVoid)
builder.addQuadAdj(EDhDirection.WEST, x, minY, z, zSize, ySize, color, irisBlockMaterialId, LodUtil.MAX_MC_LIGHT, blockLight);
}
else
{
- makeAdjVerticalQuad(builder, adjDataWest, EDhDirection.WEST, x, minY, z, zSize, ySize,
+ makeAdjVerticalQuad(builder, adjCol, EDhDirection.WEST, x, minY, z, zSize, ySize,
color, adjOverlapWest, irisBlockMaterialId, skyLightTop, blockLight,
topData, bottomData);
}
}
- //EAST face vertex creation
+ // EAST face
{
- ColumnArrayView adjDataEast = adjData[EDhDirection.EAST.ordinal() - 2];
+ ColumnArrayView adjCol = adjData[EDhDirection.EAST.ordinal() - 2];
int adjOverlapEast = ColorUtil.INVISIBLE;
if (adjData[EDhDirection.EAST.ordinal() - 2] == null)
{
@@ -182,7 +174,7 @@ public class ColumnBox
}
else
{
- makeAdjVerticalQuad(builder, adjDataEast, EDhDirection.EAST, maxX, minY, z, zSize, ySize,
+ makeAdjVerticalQuad(builder, adjCol, EDhDirection.EAST, maxX, minY, z, zSize, ySize,
color, adjOverlapEast, irisBlockMaterialId, skyLightTop, blockLight,
topData, bottomData);
}
@@ -356,7 +348,7 @@ public class ColumnBox
if (yMax <= adjYMax)
{
// The input face is completely inside the adj's face, don't render it
- if (debugOverlapColor != 0)
+ if (debugOverlapColor != ColorUtil.INVISIBLE)
{
builder.addQuadAdj(direction, x, yMin, z, horizontalWidth, ySize, debugOverlapColor, irisBlockMaterialId, LodUtil.MAX_MC_LIGHT, LodUtil.MAX_MC_LIGHT);
}
@@ -365,7 +357,7 @@ public class ColumnBox
{
// the adj data intersects the lower part of the input data, don't render below the intersection
- if (adjYMax > yMin && debugOverlapColor != 0)
+ if (adjYMax > yMin && debugOverlapColor != ColorUtil.INVISIBLE)
{
builder.addQuadAdj(direction, x, yMin, z, horizontalWidth, (short) (adjYMax - yMin), debugOverlapColor, irisBlockMaterialId, LodUtil.MAX_MC_LIGHT, LodUtil.MAX_MC_LIGHT);
}
@@ -374,6 +366,9 @@ public class ColumnBox
// if there was another face finish the last one and then break
if (firstFace)
{
+ // TODO sections next to transparent (water) need to be split up
+ // everything works correctly with opaque water
+
builder.addQuadAdj(direction, x, adjYMax, z, horizontalWidth, (short) (yMax - adjYMax), color, irisBlockMaterialId,
RenderDataPointUtil.getLightSky(adjPoint), blockLight);
}
@@ -411,7 +406,7 @@ public class ColumnBox
// Basically: y _______ < yMax <= height
// _______&&: y < depth < yMax
// the adj data intersects the higher part of the current data
- if (debugOverlapColor != 0)
+ if (debugOverlapColor != ColorUtil.INVISIBLE)
{
builder.addQuadAdj(direction, x, adjYMin, z, horizontalWidth, (short) (yMax - adjYMin), debugOverlapColor, irisBlockMaterialId, LodUtil.MAX_MC_LIGHT, LodUtil.MAX_MC_LIGHT);
}
@@ -422,7 +417,7 @@ public class ColumnBox
{
// Otherwise: y < _____ height < yMax
// _______&&: y < depth ______ < yMax
- if (debugOverlapColor != 0)
+ if (debugOverlapColor != ColorUtil.INVISIBLE)
{
builder.addQuadAdj(direction, x, adjYMin, z, horizontalWidth, (short) (adjYMax - adjYMin), debugOverlapColor, irisBlockMaterialId, LodUtil.MAX_MC_LIGHT, LodUtil.MAX_MC_LIGHT);
}
diff --git a/core/src/main/java/com/seibel/distanthorizons/core/dataObjects/render/bufferBuilding/LodQuadBuilder.java b/core/src/main/java/com/seibel/distanthorizons/core/dataObjects/render/bufferBuilding/LodQuadBuilder.java
index ab3605bdd..b9db5c836 100644
--- a/core/src/main/java/com/seibel/distanthorizons/core/dataObjects/render/bufferBuilding/LodQuadBuilder.java
+++ b/core/src/main/java/com/seibel/distanthorizons/core/dataObjects/render/bufferBuilding/LodQuadBuilder.java
@@ -39,8 +39,6 @@ import com.seibel.distanthorizons.core.wrapperInterfaces.world.IClientLevelWrapp
import com.seibel.distanthorizons.coreapi.util.MathUtil;
import org.apache.logging.log4j.Logger;
-//TODO: Recheck this class for refactoring
-
/**
* Used to create the quads before they are converted to render-able buffers.
*
@@ -51,11 +49,6 @@ public class LodQuadBuilder
private static final Logger LOGGER = DhLoggerBuilder.getLogger();
private static final IMinecraftClientWrapper MC = SingletonInjector.INSTANCE.get(IMinecraftClientWrapper.class);
- @Deprecated
- public final boolean skipQuadsWithZeroSkylight;
- @Deprecated
- public final short skyLightCullingBelow;
-
@SuppressWarnings("unchecked")
private final ArrayList[] opaqueQuads = (ArrayList[]) new ArrayList[6];
@SuppressWarnings("unchecked")
@@ -134,8 +127,6 @@ public class LodQuadBuilder
this.transparentQuads[i] = new ArrayList<>();
}
- this.skipQuadsWithZeroSkylight = false;
- this.skyLightCullingBelow = 0;
this.clientLevelWrapper = clientLevelWrapper;
this.debugRenderingMode = Config.Client.Advanced.Debugging.debugRendering.get();
@@ -159,11 +150,6 @@ public class LodQuadBuilder
throw new IllegalArgumentException("addQuadAdj() is only for adj direction! Not UP or Down!");
}
- if (this.skipQuadsWithZeroSkylight && skyLight == 0 && y + widthNorthSouthOrUpDown < this.skyLightCullingBelow)
- {
- return;
- }
-
BufferQuad quad = new BufferQuad(x, y, z, widthEastWest, widthNorthSouthOrUpDown, color, irisBlockMaterialId, skyLight, blockLight, dir);
ArrayList quadList = (this.doTransparency && ColorUtil.getAlpha(color) < 255) ? this.transparentQuads[dir.ordinal()] : this.opaqueQuads[dir.ordinal()];
if (!quadList.isEmpty() &&
@@ -182,12 +168,6 @@ public class LodQuadBuilder
// XZ
public void addQuadUp(short x, short maxY, short z, short widthEastWest, short widthNorthSouthOrUpDown, int color, byte irisBlockMaterialId, byte skylight, byte blocklight) // TODO argument names are wrong
{
- // cave culling
- if (this.skipQuadsWithZeroSkylight && skylight == 0 && maxY < this.skyLightCullingBelow)
- {
- return;
- }
-
BufferQuad quad = new BufferQuad(x, maxY, z, widthEastWest, widthNorthSouthOrUpDown, color, irisBlockMaterialId, skylight, blocklight, EDhDirection.UP);
boolean isTransparent = (this.doTransparency && ColorUtil.getAlpha(color) < 255);
ArrayList quadList = isTransparent ? this.transparentQuads[EDhDirection.UP.ordinal()] : this.opaqueQuads[EDhDirection.UP.ordinal()];
@@ -209,15 +189,13 @@ public class LodQuadBuilder
public void addQuadDown(short x, short y, short z, short width, short wz, int color, byte irisBlockMaterialId, byte skylight, byte blocklight)
{
- if (skipQuadsWithZeroSkylight && skylight == 0 && y < skyLightCullingBelow)
- return;
BufferQuad quad = new BufferQuad(x, y, z, width, wz, color, irisBlockMaterialId, skylight, blocklight, EDhDirection.DOWN);
ArrayList qs = (doTransparency && ColorUtil.getAlpha(color) < 255)
? transparentQuads[EDhDirection.DOWN.ordinal()] : opaqueQuads[EDhDirection.DOWN.ordinal()];
- if (!qs.isEmpty() &&
- (qs.get(qs.size() - 1).tryMerge(quad, BufferMergeDirectionEnum.EastWest)
+ if (!qs.isEmpty()
+ && (qs.get(qs.size() - 1).tryMerge(quad, BufferMergeDirectionEnum.EastWest)
|| qs.get(qs.size() - 1).tryMerge(quad, BufferMergeDirectionEnum.NorthSouthOrUpDown))
- )
+ )
{
premergeCount++;
return;