diff --git a/src/main/java/com/seibel/lod/core/builders/bufferBuilding/LodBufferBuilderFactory.java b/src/main/java/com/seibel/lod/core/builders/bufferBuilding/LodBufferBuilderFactory.java index f8836c0dd..7dee0d0b6 100644 --- a/src/main/java/com/seibel/lod/core/builders/bufferBuilding/LodBufferBuilderFactory.java +++ b/src/main/java/com/seibel/lod/core/builders/bufferBuilding/LodBufferBuilderFactory.java @@ -30,6 +30,7 @@ import java.util.concurrent.Executors; import java.util.concurrent.Future; import java.util.concurrent.locks.ReentrantLock; +import com.seibel.lod.core.objects.VertexOptimizer; import org.lwjgl.opengl.GL11; import org.lwjgl.opengl.GL15; import org.lwjgl.opengl.GL30; @@ -41,7 +42,6 @@ import com.seibel.lod.core.enums.LodDirection; import com.seibel.lod.core.enums.config.GpuUploadMethod; import com.seibel.lod.core.enums.config.VanillaOverdraw; import com.seibel.lod.core.enums.rendering.GLProxyContext; -import com.seibel.lod.core.objects.Box; import com.seibel.lod.core.objects.PosToRenderContainer; import com.seibel.lod.core.objects.lod.LodDimension; import com.seibel.lod.core.objects.lod.LodRegion; @@ -142,7 +142,7 @@ public class LodBufferBuilderFactory /** this is used to prevent multiple threads creating, destroying, or using the buffers at the same time */ private final ReentrantLock bufferLock = new ReentrantLock(); - private volatile Box[][] boxCache; + private volatile VertexOptimizer[][] vertexOptimizerCache; private volatile PosToRenderContainer[][] setsToRender; private volatile RegionPos center; @@ -224,11 +224,11 @@ public class LodBufferBuilderFactory if (setsToRender.length != lodDim.getWidth()) setsToRender = new PosToRenderContainer[lodDim.getWidth()][lodDim.getWidth()]; - if (boxCache == null) - boxCache = new Box[lodDim.getWidth()][lodDim.getWidth()]; + if (vertexOptimizerCache == null) + vertexOptimizerCache = new VertexOptimizer[lodDim.getWidth()][lodDim.getWidth()]; - if (boxCache.length != lodDim.getWidth()) - boxCache = new Box[lodDim.getWidth()][lodDim.getWidth()]; + if (vertexOptimizerCache.length != lodDim.getWidth()) + vertexOptimizerCache = new VertexOptimizer[lodDim.getWidth()][lodDim.getWidth()]; // this will be the center of the VBOs once they have been built buildableCenterChunkPos = playerChunkPos; @@ -280,7 +280,7 @@ public class LodBufferBuilderFactory int bufferIndex; boolean posNotInPlayerChunk; boolean adjPosInPlayerChunk; - Box box = ThreadMapUtil.getBox(); + VertexOptimizer vertexOptimizer = ThreadMapUtil.getBox(); boolean[] adjShadeDisabled = ThreadMapUtil.getAdjShadeDisabledArray(); // determine how many LODs we can stack vertically @@ -342,11 +342,11 @@ public class LodBufferBuilderFactory Arrays.fill(adjShadeDisabled, false); //We check every adj block in each direction - for (LodDirection lodDirection : Box.ADJ_DIRECTIONS) + for (LodDirection lodDirection : VertexOptimizer.ADJ_DIRECTIONS) { - xAdj = posX + Box.DIRECTION_NORMAL_MAP.get(lodDirection).x; - zAdj = posZ + Box.DIRECTION_NORMAL_MAP.get(lodDirection).z; + xAdj = posX + VertexOptimizer.DIRECTION_NORMAL_MAP.get(lodDirection).x; + zAdj = posZ + VertexOptimizer.DIRECTION_NORMAL_MAP.get(lodDirection).z; long data; chunkXdist = LevelPosUtil.getChunkPos(detailLevel, xAdj) - playerChunkPos.getX(); chunkZdist = LevelPosUtil.getChunkPos(detailLevel, zAdj) - playerChunkPos.getZ(); @@ -364,7 +364,7 @@ public class LodBufferBuilderFactory for (int verticalIndex = 0; verticalIndex < lodDim.getMaxVerticalData(detailLevel, xAdj, zAdj); verticalIndex++) { data = lodDim.getData(detailLevel, xAdj, zAdj, verticalIndex); - adjShadeDisabled[Box.DIRECTION_INDEX.get(lodDirection)] = false; + adjShadeDisabled[VertexOptimizer.DIRECTION_INDEX.get(lodDirection)] = false; adjData.get(lodDirection)[verticalIndex] = data; } } @@ -378,7 +378,7 @@ public class LodBufferBuilderFactory if ((isThisPositionGoingToBeRendered(detailLevel, xAdj, zAdj, playerChunkPos, vanillaRenderedChunks, gameChunkRenderDistance) || (posNotInPlayerChunk && adjPosInPlayerChunk)) && !DataPointUtil.isVoid(data)) { - adjShadeDisabled[Box.DIRECTION_INDEX.get(lodDirection)] = DataPointUtil.getAlpha(data) < 255; + adjShadeDisabled[VertexOptimizer.DIRECTION_INDEX.get(lodDirection)] = DataPointUtil.getAlpha(data) < 255; } } } @@ -412,7 +412,7 @@ public class LodBufferBuilderFactory //We send the call to create the vertices CONFIG.client().graphics().advancedGraphics().getLodTemplate().template.addLodToBuffer(currentBuffers[bufferIndex], playerBlockPosRounded, data, adjData, - detailLevel, posX, posZ, box, renderer.previousDebugMode, adjShadeDisabled); + detailLevel, posX, posZ, vertexOptimizer, renderer.previousDebugMode, adjShadeDisabled); } } // for pos to in list to render diff --git a/src/main/java/com/seibel/lod/core/builders/bufferBuilding/lodTemplates/AbstractLodTemplate.java b/src/main/java/com/seibel/lod/core/builders/bufferBuilding/lodTemplates/AbstractLodTemplate.java index 41239212e..69bb57b10 100644 --- a/src/main/java/com/seibel/lod/core/builders/bufferBuilding/lodTemplates/AbstractLodTemplate.java +++ b/src/main/java/com/seibel/lod/core/builders/bufferBuilding/lodTemplates/AbstractLodTemplate.java @@ -23,7 +23,7 @@ import java.util.Map; import com.seibel.lod.core.enums.LodDirection; import com.seibel.lod.core.enums.rendering.DebugMode; -import com.seibel.lod.core.objects.Box; +import com.seibel.lod.core.objects.VertexOptimizer; import com.seibel.lod.core.objects.opengl.LodBufferBuilder; import com.seibel.lod.core.util.ColorUtil; import com.seibel.lod.core.wrapperInterfaces.block.AbstractBlockPosWrapper; @@ -38,7 +38,7 @@ public abstract class AbstractLodTemplate { /** Uploads the given LOD to the buffer. */ public abstract void addLodToBuffer(LodBufferBuilder buffer, AbstractBlockPosWrapper bufferCenterBlockPos, long data, Map adjData, - byte detailLevel, int posX, int posZ, Box box, DebugMode debugging, boolean[] adjShadeDisabled); + byte detailLevel, int posX, int posZ, VertexOptimizer vertexOptimizer, DebugMode debugging, boolean[] adjShadeDisabled); /** add the given position and color to the buffer */ protected void addPosAndColor(LodBufferBuilder buffer, diff --git a/src/main/java/com/seibel/lod/core/builders/bufferBuilding/lodTemplates/CubicLodTemplate.java b/src/main/java/com/seibel/lod/core/builders/bufferBuilding/lodTemplates/CubicLodTemplate.java index 6d48c38e0..aaf016b05 100644 --- a/src/main/java/com/seibel/lod/core/builders/bufferBuilding/lodTemplates/CubicLodTemplate.java +++ b/src/main/java/com/seibel/lod/core/builders/bufferBuilding/lodTemplates/CubicLodTemplate.java @@ -23,7 +23,7 @@ import java.util.Map; import com.seibel.lod.core.enums.LodDirection; import com.seibel.lod.core.enums.rendering.DebugMode; -import com.seibel.lod.core.objects.Box; +import com.seibel.lod.core.objects.VertexOptimizer; import com.seibel.lod.core.objects.opengl.LodBufferBuilder; import com.seibel.lod.core.util.ColorUtil; import com.seibel.lod.core.util.DataPointUtil; @@ -45,9 +45,9 @@ public class CubicLodTemplate extends AbstractLodTemplate @Override public void addLodToBuffer(LodBufferBuilder buffer, AbstractBlockPosWrapper bufferCenterBlockPos, long data, Map adjData, - byte detailLevel, int posX, int posZ, Box box, DebugMode debugging, boolean[] adjShadeDisabled) + byte detailLevel, int posX, int posZ, VertexOptimizer vertexOptimizer, DebugMode debugging, boolean[] adjShadeDisabled) { - if (box == null) + if (vertexOptimizer == null) return; // equivalent to 2^detailLevel @@ -61,7 +61,7 @@ public class CubicLodTemplate extends AbstractLodTemplate generateBoundingBox( - box, + vertexOptimizer, DataPointUtil.getHeight(data), DataPointUtil.getDepth(data), blockWidth, @@ -73,10 +73,10 @@ public class CubicLodTemplate extends AbstractLodTemplate DataPointUtil.getLightBlock(data), adjShadeDisabled); - addBoundingBoxToBuffer(buffer, box); + addBoundingBoxToBuffer(buffer, vertexOptimizer); } - private void generateBoundingBox(Box box, + private void generateBoundingBox(VertexOptimizer vertexOptimizer, int height, int depth, int width, double xOffset, double yOffset, double zOffset, AbstractBlockPosWrapper bufferCenterBlockPos, @@ -100,38 +100,38 @@ public class CubicLodTemplate extends AbstractLodTemplate // which only uses floats double x = -bufferCenterBlockPos.getX(); double z = -bufferCenterBlockPos.getZ(); - box.reset(); - box.setColor(color, adjShadeDisabled); - box.setLights(skyLight, blockLight); - box.setWidth(width, height - depth, width); - box.setOffset((int) (xOffset + x), (int) (depth + yOffset), (int) (zOffset + z)); - box.setUpCulling(32, bufferCenterBlockPos); - box.setAdjData(adjData); + vertexOptimizer.reset(); + vertexOptimizer.setColor(color, adjShadeDisabled); + vertexOptimizer.setLights(skyLight, blockLight); + vertexOptimizer.setWidth(width, height - depth, width); + vertexOptimizer.setOffset((int) (xOffset + x), (int) (depth + yOffset), (int) (zOffset + z)); + vertexOptimizer.setUpCulling(32, bufferCenterBlockPos); + vertexOptimizer.setAdjData(adjData); } - private void addBoundingBoxToBuffer(LodBufferBuilder buffer, Box box) + private void addBoundingBoxToBuffer(LodBufferBuilder buffer, VertexOptimizer vertexOptimizer) { int color; int skyLight; int blockLight; - for (LodDirection lodDirection : Box.DIRECTIONS) + for (LodDirection lodDirection : VertexOptimizer.DIRECTIONS) { - if(box.isCulled(lodDirection)) + if(vertexOptimizer.isCulled(lodDirection)) continue; int verticalFaceIndex = 0; - while (box.shouldRenderFace(lodDirection, verticalFaceIndex)) + while (vertexOptimizer.shouldRenderFace(lodDirection, verticalFaceIndex)) { for (int vertexIndex = 0; vertexIndex < 6; vertexIndex++) { - color = box.getColor(lodDirection); - skyLight = box.getSkyLight(lodDirection, verticalFaceIndex); - blockLight = box.getBlockLight(); + color = vertexOptimizer.getColor(lodDirection); + skyLight = vertexOptimizer.getSkyLight(lodDirection, verticalFaceIndex); + blockLight = vertexOptimizer.getBlockLight(); color = ColorUtil.applyLightValue(color, skyLight, blockLight); addPosAndColor(buffer, - box.getX(lodDirection, vertexIndex), - box.getY(lodDirection, vertexIndex, verticalFaceIndex) + DataPointUtil.VERTICAL_OFFSET, - box.getZ(lodDirection, vertexIndex), + vertexOptimizer.getX(lodDirection, vertexIndex), + vertexOptimizer.getY(lodDirection, vertexIndex, verticalFaceIndex) + DataPointUtil.VERTICAL_OFFSET, + vertexOptimizer.getZ(lodDirection, vertexIndex), color); } verticalFaceIndex++; diff --git a/src/main/java/com/seibel/lod/core/builders/bufferBuilding/lodTemplates/DynamicLodTemplate.java b/src/main/java/com/seibel/lod/core/builders/bufferBuilding/lodTemplates/DynamicLodTemplate.java index e53fd85d2..a1c302b00 100644 --- a/src/main/java/com/seibel/lod/core/builders/bufferBuilding/lodTemplates/DynamicLodTemplate.java +++ b/src/main/java/com/seibel/lod/core/builders/bufferBuilding/lodTemplates/DynamicLodTemplate.java @@ -24,7 +24,7 @@ import java.util.Map; import com.seibel.lod.core.api.ClientApi; import com.seibel.lod.core.enums.LodDirection; import com.seibel.lod.core.enums.rendering.DebugMode; -import com.seibel.lod.core.objects.Box; +import com.seibel.lod.core.objects.VertexOptimizer; import com.seibel.lod.core.objects.opengl.LodBufferBuilder; import com.seibel.lod.core.wrapperInterfaces.block.AbstractBlockPosWrapper; @@ -40,7 +40,7 @@ public class DynamicLodTemplate extends AbstractLodTemplate { @Override public void addLodToBuffer(LodBufferBuilder buffer, AbstractBlockPosWrapper bufferCenterBlockPos, long data, Map adjData, - byte detailLevel, int posX, int posZ, Box box, DebugMode debugging, boolean[] adjShadeDisabled) + byte detailLevel, int posX, int posZ, VertexOptimizer vertexOptimizer, DebugMode debugging, boolean[] adjShadeDisabled) { ClientApi.LOGGER.error(DynamicLodTemplate.class.getSimpleName() + " is not implemented!"); } diff --git a/src/main/java/com/seibel/lod/core/builders/bufferBuilding/lodTemplates/TriangularLodTemplate.java b/src/main/java/com/seibel/lod/core/builders/bufferBuilding/lodTemplates/TriangularLodTemplate.java index ffe8c2679..489869645 100644 --- a/src/main/java/com/seibel/lod/core/builders/bufferBuilding/lodTemplates/TriangularLodTemplate.java +++ b/src/main/java/com/seibel/lod/core/builders/bufferBuilding/lodTemplates/TriangularLodTemplate.java @@ -24,7 +24,7 @@ import java.util.Map; import com.seibel.lod.core.api.ClientApi; import com.seibel.lod.core.enums.LodDirection; import com.seibel.lod.core.enums.rendering.DebugMode; -import com.seibel.lod.core.objects.Box; +import com.seibel.lod.core.objects.VertexOptimizer; import com.seibel.lod.core.objects.opengl.LodBufferBuilder; import com.seibel.lod.core.wrapperInterfaces.block.AbstractBlockPosWrapper; @@ -38,7 +38,7 @@ public class TriangularLodTemplate extends AbstractLodTemplate { @Override public void addLodToBuffer(LodBufferBuilder buffer, AbstractBlockPosWrapper bufferCenterBlockPos, long data, Map adjData, - byte detailLevel, int posX, int posZ, Box box, DebugMode debugging, boolean[] adjShadeDisabled) + byte detailLevel, int posX, int posZ, VertexOptimizer vertexOptimizer, DebugMode debugging, boolean[] adjShadeDisabled) { ClientApi.LOGGER.error(DynamicLodTemplate.class.getSimpleName() + " is not implemented!"); } diff --git a/src/main/java/com/seibel/lod/core/dataFormat/BlockDataFormat.java b/src/main/java/com/seibel/lod/core/dataFormat/BlockDataFormat.java new file mode 100644 index 000000000..d8becb6f5 --- /dev/null +++ b/src/main/java/com/seibel/lod/core/dataFormat/BlockDataFormat.java @@ -0,0 +1,5 @@ +package com.seibel.lod.core.dataFormat; + +public class BlockDataFormat +{ +} diff --git a/src/main/java/com/seibel/lod/core/dataFormat/ColorFormat.java b/src/main/java/com/seibel/lod/core/dataFormat/ColorFormat.java new file mode 100644 index 000000000..750fcde64 --- /dev/null +++ b/src/main/java/com/seibel/lod/core/dataFormat/ColorFormat.java @@ -0,0 +1,5 @@ +package com.seibel.lod.core.dataFormat; + +public class ColorFormat +{ +} diff --git a/src/main/java/com/seibel/lod/core/dataFormat/DepthHeightFormat.java b/src/main/java/com/seibel/lod/core/dataFormat/DepthHeightFormat.java new file mode 100644 index 000000000..3573abec2 --- /dev/null +++ b/src/main/java/com/seibel/lod/core/dataFormat/DepthHeightFormat.java @@ -0,0 +1,5 @@ +package com.seibel.lod.core.dataFormat; + +public class DepthHeightFormat +{ +} diff --git a/src/main/java/com/seibel/lod/core/dataFormat/LightFormat.java b/src/main/java/com/seibel/lod/core/dataFormat/LightFormat.java new file mode 100644 index 000000000..188a76cdb --- /dev/null +++ b/src/main/java/com/seibel/lod/core/dataFormat/LightFormat.java @@ -0,0 +1,5 @@ +package com.seibel.lod.core.dataFormat; + +public class LightFormat +{ +} diff --git a/src/main/java/com/seibel/lod/core/dataFormat/PositionDataFormat.java b/src/main/java/com/seibel/lod/core/dataFormat/PositionDataFormat.java new file mode 100644 index 000000000..8f8940ebe --- /dev/null +++ b/src/main/java/com/seibel/lod/core/dataFormat/PositionDataFormat.java @@ -0,0 +1,5 @@ +package com.seibel.lod.core.dataFormat; + +public class PositionDataFormat +{ +} diff --git a/src/main/java/com/seibel/lod/core/objects/Box.java b/src/main/java/com/seibel/lod/core/objects/VertexOptimizer.java similarity index 99% rename from src/main/java/com/seibel/lod/core/objects/Box.java rename to src/main/java/com/seibel/lod/core/objects/VertexOptimizer.java index 5fa31e795..4c13f247b 100644 --- a/src/main/java/com/seibel/lod/core/objects/Box.java +++ b/src/main/java/com/seibel/lod/core/objects/VertexOptimizer.java @@ -35,12 +35,11 @@ import com.seibel.lod.core.wrapperInterfaces.config.ILodConfigWrapperSingleton; import com.seibel.lod.core.wrapperInterfaces.minecraft.IMinecraftWrapper; /** - * Similar to Minecraft's AxisAlignedBoundingBox. - * + * This class handles all the vertex optimization that's needed for a column of lods. W * @author Leonardo Amato * @version 10-2-2021 */ -public class Box +public class VertexOptimizer { private static final IMinecraftWrapper MC = SingletonHandler.get(IMinecraftWrapper.class); private static final ILodConfigWrapperSingleton CONFIG = SingletonHandler.get(ILodConfigWrapperSingleton.class); @@ -207,7 +206,7 @@ public class Box /** creates an empty box */ @SuppressWarnings("serial") - public Box() + public VertexOptimizer() { boxOffset = new int[3]; boxWidth = new int[3]; diff --git a/src/main/java/com/seibel/lod/core/util/LodUtil.java b/src/main/java/com/seibel/lod/core/util/LodUtil.java index 84e745b92..f87c85f0a 100644 --- a/src/main/java/com/seibel/lod/core/util/LodUtil.java +++ b/src/main/java/com/seibel/lod/core/util/LodUtil.java @@ -26,7 +26,7 @@ import java.util.HashSet; import com.seibel.lod.core.enums.LodDirection; import com.seibel.lod.core.enums.config.HorizontalResolution; import com.seibel.lod.core.enums.config.VanillaOverdraw; -import com.seibel.lod.core.objects.Box; +import com.seibel.lod.core.objects.VertexOptimizer; import com.seibel.lod.core.objects.lod.LodDimension; import com.seibel.lod.core.objects.lod.RegionPos; import com.seibel.lod.core.objects.opengl.DefaultLodVertexFormats; @@ -403,10 +403,10 @@ public class LodUtil return false; int tempX; int tempZ; - for (LodDirection lodDirection : Box.ADJ_DIRECTIONS) + for (LodDirection lodDirection : VertexOptimizer.ADJ_DIRECTIONS) { - tempX = x + Box.DIRECTION_NORMAL_MAP.get(lodDirection).x; - tempZ = z + Box.DIRECTION_NORMAL_MAP.get(lodDirection).z; + tempX = x + VertexOptimizer.DIRECTION_NORMAL_MAP.get(lodDirection).x; + tempZ = z + VertexOptimizer.DIRECTION_NORMAL_MAP.get(lodDirection).z; if (vanillaRenderedChunks[x][z] || (!(tempX < 0 || tempZ < 0 || tempX >= vanillaRenderedChunks.length || tempZ >= vanillaRenderedChunks[0].length) && !vanillaRenderedChunks[tempX][tempZ])) return true; diff --git a/src/main/java/com/seibel/lod/core/util/ThreadMapUtil.java b/src/main/java/com/seibel/lod/core/util/ThreadMapUtil.java index cc179dffb..7cf8405b3 100644 --- a/src/main/java/com/seibel/lod/core/util/ThreadMapUtil.java +++ b/src/main/java/com/seibel/lod/core/util/ThreadMapUtil.java @@ -26,7 +26,7 @@ import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentMap; import com.seibel.lod.core.enums.LodDirection; -import com.seibel.lod.core.objects.Box; +import com.seibel.lod.core.objects.VertexOptimizer; /** * Holds data used by specific threads so @@ -55,7 +55,7 @@ public class ThreadMapUtil public static final ConcurrentMap adjShadeDisabled = new ConcurrentHashMap<>(); public static final ConcurrentMap> adjDataMap = new ConcurrentHashMap<>(); - public static final ConcurrentMap boxMap = new ConcurrentHashMap<>(); + public static final ConcurrentMap boxMap = new ConcurrentHashMap<>(); @@ -65,7 +65,7 @@ public class ThreadMapUtil if (!adjShadeDisabled.containsKey(Thread.currentThread().getName()) || (adjShadeDisabled.get(Thread.currentThread().getName()) == null)) { - adjShadeDisabled.put(Thread.currentThread().getName(), new boolean[Box.DIRECTIONS.length]); + adjShadeDisabled.put(Thread.currentThread().getName(), new boolean[VertexOptimizer.DIRECTIONS.length]); } Arrays.fill(adjShadeDisabled.get(Thread.currentThread().getName()), false); return adjShadeDisabled.get(Thread.currentThread().getName()); @@ -82,24 +82,24 @@ public class ThreadMapUtil adjDataMap.put(Thread.currentThread().getName(), new HashMap<>()); adjDataMap.get(Thread.currentThread().getName()).put(LodDirection.UP, new long[1]); adjDataMap.get(Thread.currentThread().getName()).put(LodDirection.DOWN, new long[1]); - for (LodDirection lodDirection : Box.ADJ_DIRECTIONS) + for (LodDirection lodDirection : VertexOptimizer.ADJ_DIRECTIONS) adjDataMap.get(Thread.currentThread().getName()).put(lodDirection, new long[verticalData]); } else { - for (LodDirection lodDirection : Box.ADJ_DIRECTIONS) + for (LodDirection lodDirection : VertexOptimizer.ADJ_DIRECTIONS) Arrays.fill(adjDataMap.get(Thread.currentThread().getName()).get(lodDirection), DataPointUtil.EMPTY_DATA); } return adjDataMap.get(Thread.currentThread().getName()); } - public static Box getBox() + public static VertexOptimizer getBox() { if (!boxMap.containsKey(Thread.currentThread().getName()) || (boxMap.get(Thread.currentThread().getName()) == null)) { - boxMap.put(Thread.currentThread().getName(), new Box()); + boxMap.put(Thread.currentThread().getName(), new VertexOptimizer()); } boxMap.get(Thread.currentThread().getName()).reset(); return boxMap.get(Thread.currentThread().getName());