From ae9144a6c436d388071a2f3d6423b99fdf8a5f8e Mon Sep 17 00:00:00 2001 From: James Seibel Date: Sat, 8 May 2021 14:58:41 -0500 Subject: [PATCH] Add the basis for different LOD drawing modes (aka templates) --- .../lod/builders/LodBufferBuilder.java | 261 +++--------------- .../lodTemplates/AbstractLodTemplate.java | 42 +++ .../lodTemplates/CubicLodTemplate.java | 149 ++++++++++ .../lodTemplates/DynamicLodTemplate.java | 27 ++ .../lodTemplates/TriangularLodTemplate.java | 25 ++ .../com/backsun/lod/enums/LodDrawMode.java | 26 -- .../backsun/lod/enums/LodTemplateMode.java | 38 +++ .../java/com/backsun/lod/util/LodConfig.java | 14 +- 8 files changed, 329 insertions(+), 253 deletions(-) create mode 100644 src/main/java/com/backsun/lod/builders/lodTemplates/AbstractLodTemplate.java create mode 100644 src/main/java/com/backsun/lod/builders/lodTemplates/CubicLodTemplate.java create mode 100644 src/main/java/com/backsun/lod/builders/lodTemplates/DynamicLodTemplate.java create mode 100644 src/main/java/com/backsun/lod/builders/lodTemplates/TriangularLodTemplate.java delete mode 100644 src/main/java/com/backsun/lod/enums/LodDrawMode.java create mode 100644 src/main/java/com/backsun/lod/enums/LodTemplateMode.java diff --git a/src/main/java/com/backsun/lod/builders/LodBufferBuilder.java b/src/main/java/com/backsun/lod/builders/LodBufferBuilder.java index 7944a0f9b..1be197961 100644 --- a/src/main/java/com/backsun/lod/builders/LodBufferBuilder.java +++ b/src/main/java/com/backsun/lod/builders/LodBufferBuilder.java @@ -1,16 +1,14 @@ package com.backsun.lod.builders; -import java.awt.Color; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import org.lwjgl.opengl.GL11; -import com.backsun.lod.enums.ColorDirection; -import com.backsun.lod.enums.LodCorner; import com.backsun.lod.objects.LodChunk; import com.backsun.lod.objects.LodDimension; import com.backsun.lod.objects.NearFarBuffer; import com.backsun.lod.renderer.LodRenderer; +import com.backsun.lod.util.LodConfig; import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.BufferBuilder; @@ -22,7 +20,7 @@ import net.minecraftforge.common.WorldWorkerManager; * This object is used to create NearFarBuffer objects. * * @author James Seibel - * @version 03-25-2021 + * @version 05-06-2021 */ public class LodBufferBuilder { @@ -92,13 +90,8 @@ public class LodBufferBuilder // this is where we store the points for each LOD object AxisAlignedBB lodArray[][] = new AxisAlignedBB[numbChunksWide][numbChunksWide]; - // this is where we store the color for each LOD object - Color colorArray[][] = new Color[numbChunksWide][numbChunksWide]; - int alpha = 255; // 0 - 255 - Color red = new Color(255, 0, 0, alpha); - Color black = new Color(0, 0, 0, alpha); - Color white = new Color(255, 255, 255, alpha); + // this seemingly useless math is required, // just using (int) playerX/Z doesn't work @@ -122,6 +115,9 @@ public class LodBufferBuilder ChunkPos playerChunkPos = new ChunkPos((int)playerX / LodChunk.WIDTH, (int)playerZ / LodChunk.WIDTH); + // generate our new buildable buffers + buildableNearBuffer.begin(GL11.GL_QUADS, LodRenderer.LOD_VERTEX_FORMAT); + buildableFarBuffer.begin(GL11.GL_QUADS, LodRenderer.LOD_VERTEX_FORMAT); // x axis for (int i = 0; i < numbChunksWide; i++) @@ -150,17 +146,12 @@ public class LodBufferBuilder int chunkZ = j + (startZ / LodChunk.WIDTH); LodChunk lod = lodDim.getLodFromCoordinates(chunkX, chunkZ); + if (lod == null || lod.isLodEmpty()) { - // note: for some reason if any color or lod objects are set here - // it causes the game to use 100% gpu; - // undefined in the debug menu - // and drop to ~6 fps. - colorArray[i][j] = null; lodArray[i][j] = null; - - // only generate a new chunk if no chunk currently exists + // generate a new chunk if no chunk currently exists // and we aren't waiting on any other chunks to generate if (lod == null && numChunksWaitingToGen == 0) { @@ -170,78 +161,51 @@ public class LodBufferBuilder // than the previous int newDistance = playerChunkPos.getChessboardDistance(pos); - // TODO add a way for a server side mod to generate chunks requested here - if (mc.isIntegratedServerRunning()) + if (newDistance < minChunkDist) { - if (newDistance < minChunkDist) + // this chunk is closer, clear any previous + // positions and update the new minimum distance + minChunkDist = newDistance; + + chunkGenIndex = 0; + chunksToGen = new ChunkPos[maxChunkGenRequests]; + chunksToGen[chunkGenIndex] = pos; + chunkGenIndex++; + } + else if (newDistance <= minChunkDist) + { + // this chunk position is as close or closers than the + // minimum distance + if(chunkGenIndex < maxChunkGenRequests) { - // this chunk is closer, clear any previous - // positions and update the new minimum distance - minChunkDist = newDistance; - - chunkGenIndex = 0; - chunksToGen = new ChunkPos[maxChunkGenRequests]; + // we are still under the number of chunks to generate + // add this position to the list chunksToGen[chunkGenIndex] = pos; chunkGenIndex++; } - else if (newDistance <= minChunkDist) - { - // this chunk position is as close or closers than the - // minimum distance - if(chunkGenIndex < maxChunkGenRequests) - { - // we are still under the number of chunks to generate - // add this pos to the list - chunksToGen[chunkGenIndex] = pos; - chunkGenIndex++; - } - } } } - + // don't render this null chunk continue; } - Color c = new Color( - (lod.colors[ColorDirection.TOP.value].getRed()), - (lod.colors[ColorDirection.TOP.value].getGreen()), - (lod.colors[ColorDirection.TOP.value].getBlue()), - lod.colors[ColorDirection.TOP.value].getAlpha()); - - if (!renderer.debugging) - { - // add the color to the array - colorArray[i][j] = c; - } + BufferBuilder currentBuffer = null; + if (isCoordinateInNearFogArea(i, j, numbChunksWide / 2)) + currentBuffer = buildableNearBuffer; else - { - // if debugging draw the squares as a black and white checker board - if ((chunkX + chunkZ) % 2 == 0) - c = white; - else - c = black; - // draw the first square as red - if (i == 0 && j == 0) - c = red; - - colorArray[i][j] = c; - } + currentBuffer = buildableFarBuffer; - - // add the new box to the array - int topPoint = getValidHeightPoint(lod.top); - int bottomPoint = getValidHeightPoint(lod.bottom); - - // don't draw an LOD if it is empty - if (topPoint == -1 && bottomPoint == -1) - continue; - - lodArray[i][j] = new AxisAlignedBB(0, bottomPoint, 0, LodChunk.WIDTH, topPoint, LodChunk.WIDTH).offset(xOffset, yOffset, zOffset); + // get the desired LodTemplate and + // add this LOD to the buffer + LodConfig.CLIENT.lodTemplateMode.get().template. + addLodToBuffer(currentBuffer, lodDim, lod, + xOffset, yOffset, zOffset, renderer.debugging); } } + // TODO add a way for a server side mod to generate chunks requested here if(mc.isIntegratedServerRunning()) { // start chunk generation @@ -264,11 +228,9 @@ public class LodBufferBuilder } } - - - - // generate our new buildable buffers - buildBuffersFromAABB(lodArray, colorArray); + // finish the buffer building + buildableNearBuffer.finishDrawing(); + buildableFarBuffer.finishDrawing(); // mark that the buildable buffers as ready to swap generatingBuffers = false; @@ -281,135 +243,9 @@ public class LodBufferBuilder } - /** - * Build the buildable near and far buffers. - * - * @param lods - * @param colors - */ - private void buildBuffersFromAABB(AxisAlignedBB[][] lods, Color[][] colors) - { - buildableNearBuffer.begin(GL11.GL_QUADS, LodRenderer.LOD_VERTEX_FORMAT); - buildableFarBuffer.begin(GL11.GL_QUADS, LodRenderer.LOD_VERTEX_FORMAT); - - int numbChunksWide = lods.length; - - BufferBuilder currentBuffer; - AxisAlignedBB bb; - int red; - int green; - int blue; - int alpha; - - - // x axis - for (int i = 0; i < numbChunksWide; i++) - { - // z axis - for (int j = 0; j < numbChunksWide; j++) - { - if (lods[i][j] == null || colors[i][j] == null) - continue; - - bb = lods[i][j]; - - // get the color of this LOD object - red = colors[i][j].getRed(); - green = colors[i][j].getGreen(); - blue = colors[i][j].getBlue(); - alpha = colors[i][j].getAlpha(); - - - if (isCoordinateInNearFogArea(i, j, numbChunksWide / 2)) - currentBuffer = buildableNearBuffer; - else - currentBuffer = buildableFarBuffer; - - - if (bb.minY != bb.maxY) - { - // top (facing up) - addPosAndColor(currentBuffer, bb.minX, bb.maxY, bb.minZ, red, green, blue, alpha); - addPosAndColor(currentBuffer, bb.minX, bb.maxY, bb.maxZ, red, green, blue, alpha); - addPosAndColor(currentBuffer, bb.maxX, bb.maxY, bb.maxZ, red, green, blue, alpha); - addPosAndColor(currentBuffer, bb.maxX, bb.maxY, bb.minZ, red, green, blue, alpha); - // bottom (facing down) - addPosAndColor(currentBuffer, bb.maxX, bb.minY, bb.minZ, red, green, blue, alpha); - addPosAndColor(currentBuffer, bb.maxX, bb.minY, bb.maxZ, red, green, blue, alpha); - addPosAndColor(currentBuffer, bb.minX, bb.minY, bb.maxZ, red, green, blue, alpha); - addPosAndColor(currentBuffer, bb.minX, bb.minY, bb.minZ, red, green, blue, alpha); - - // south (facing -Z) - addPosAndColor(currentBuffer, bb.maxX, bb.minY, bb.maxZ, red, green, blue, alpha); - addPosAndColor(currentBuffer, bb.maxX, bb.maxY, bb.maxZ, red, green, blue, alpha); - addPosAndColor(currentBuffer, bb.minX, bb.maxY, bb.maxZ, red, green, blue, alpha); - addPosAndColor(currentBuffer, bb.minX, bb.minY, bb.maxZ, red, green, blue, alpha); - // north (facing +Z) - addPosAndColor(currentBuffer, bb.minX, bb.minY, bb.minZ, red, green, blue, alpha); - addPosAndColor(currentBuffer, bb.minX, bb.maxY, bb.minZ, red, green, blue, alpha); - addPosAndColor(currentBuffer, bb.maxX, bb.maxY, bb.minZ, red, green, blue, alpha); - addPosAndColor(currentBuffer, bb.maxX, bb.minY, bb.minZ, red, green, blue, alpha); - - // west (facing -X) - addPosAndColor(currentBuffer, bb.minX, bb.minY, bb.minZ, red, green, blue, alpha); - addPosAndColor(currentBuffer, bb.minX, bb.minY, bb.maxZ, red, green, blue, alpha); - addPosAndColor(currentBuffer, bb.minX, bb.maxY, bb.maxZ, red, green, blue, alpha); - addPosAndColor(currentBuffer, bb.minX, bb.maxY, bb.minZ, red, green, blue, alpha); - // east (facing +X) - addPosAndColor(currentBuffer, bb.maxX, bb.maxY, bb.minZ, red, green, blue, alpha); - addPosAndColor(currentBuffer, bb.maxX, bb.maxY, bb.maxZ, red, green, blue, alpha); - addPosAndColor(currentBuffer, bb.maxX, bb.minY, bb.maxZ, red, green, blue, alpha); - addPosAndColor(currentBuffer, bb.maxX, bb.minY, bb.minZ, red, green, blue, alpha); - } - else - { - // render this LOD as one block thick - - // top (facing up) - addPosAndColor(currentBuffer, bb.minX, bb.minY+1, bb.minZ, red, green, blue, alpha); - addPosAndColor(currentBuffer, bb.minX, bb.minY+1, bb.maxZ, red, green, blue, alpha); - addPosAndColor(currentBuffer, bb.maxX, bb.minY+1, bb.maxZ, red, green, blue, alpha); - addPosAndColor(currentBuffer, bb.maxX, bb.minY+1, bb.minZ, red, green, blue, alpha); - // bottom (facing down) - addPosAndColor(currentBuffer, bb.maxX, bb.minY, bb.minZ, red, green, blue, alpha); - addPosAndColor(currentBuffer, bb.maxX, bb.minY, bb.maxZ, red, green, blue, alpha); - addPosAndColor(currentBuffer, bb.minX, bb.minY, bb.maxZ, red, green, blue, alpha); - addPosAndColor(currentBuffer, bb.minX, bb.minY, bb.minZ, red, green, blue, alpha); - - // south (facing -Z) - addPosAndColor(currentBuffer, bb.maxX, bb.minY, bb.maxZ, red, green, blue, alpha); - addPosAndColor(currentBuffer, bb.maxX, bb.minY+1, bb.maxZ, red, green, blue, alpha); - addPosAndColor(currentBuffer, bb.minX, bb.minY+1, bb.maxZ, red, green, blue, alpha); - addPosAndColor(currentBuffer, bb.minX, bb.minY, bb.maxZ, red, green, blue, alpha); - // north (facing +Z) - addPosAndColor(currentBuffer, bb.minX, bb.minY, bb.minZ, red, green, blue, alpha); - addPosAndColor(currentBuffer, bb.minX, bb.minY+1, bb.minZ, red, green, blue, alpha); - addPosAndColor(currentBuffer, bb.maxX, bb.minY+1, bb.minZ, red, green, blue, alpha); - addPosAndColor(currentBuffer, bb.maxX, bb.minY, bb.minZ, red, green, blue, alpha); - - // west (facing -X) - addPosAndColor(currentBuffer, bb.minX, bb.minY, bb.minZ, red, green, blue, alpha); - addPosAndColor(currentBuffer, bb.minX, bb.minY, bb.maxZ, red, green, blue, alpha); - addPosAndColor(currentBuffer, bb.minX, bb.minY+1, bb.maxZ, red, green, blue, alpha); - addPosAndColor(currentBuffer, bb.minX, bb.minY+1, bb.minZ, red, green, blue, alpha); - // east (facing +X) - addPosAndColor(currentBuffer, bb.maxX, bb.minY+1, bb.minZ, red, green, blue, alpha); - addPosAndColor(currentBuffer, bb.maxX, bb.minY+1, bb.maxZ, red, green, blue, alpha); - addPosAndColor(currentBuffer, bb.maxX, bb.minY, bb.maxZ, red, green, blue, alpha); - addPosAndColor(currentBuffer, bb.maxX, bb.minY, bb.minZ, red, green, blue, alpha); - } - - } // z axis - } // x axis - - buildableNearBuffer.finishDrawing(); - buildableFarBuffer.finishDrawing(); - } - private void addPosAndColor(BufferBuilder buffer, double x, double y, double z, int red, int green, int blue, int alpha) - { - buffer.pos(x, y, z).color(red, green, blue, alpha).endVertex(); - } + + @@ -433,21 +269,6 @@ public class LodBufferBuilder && j <= centerCoordinate + mc.gameSettings.renderDistanceChunks); } - - /** - * @Returns -1 if there are no valid points - */ - private int getValidHeightPoint(short[] heightPoints) - { - if (heightPoints[LodCorner.NE.value] != -1) - return heightPoints[LodCorner.NE.value]; - if (heightPoints[LodCorner.NW.value] != -1) - return heightPoints[LodCorner.NW.value]; - if (heightPoints[LodCorner.SE.value] != -1) - return heightPoints[LodCorner.NE.value]; - return heightPoints[LodCorner.NE.value]; - } - /** * Find the coordinates that are in the center half of the given diff --git a/src/main/java/com/backsun/lod/builders/lodTemplates/AbstractLodTemplate.java b/src/main/java/com/backsun/lod/builders/lodTemplates/AbstractLodTemplate.java new file mode 100644 index 000000000..922c47733 --- /dev/null +++ b/src/main/java/com/backsun/lod/builders/lodTemplates/AbstractLodTemplate.java @@ -0,0 +1,42 @@ +package com.backsun.lod.builders.lodTemplates; + +import java.awt.Color; + +import com.backsun.lod.objects.LodChunk; +import com.backsun.lod.objects.LodDimension; + +import net.minecraft.client.renderer.BufferBuilder; + +/** + * This is the abstract class used to create different + * BufferBuilders. + * + * @author James Seibel + * @version 05-07-2021 + */ +public abstract class AbstractLodTemplate +{ + /** alpha used when drawing chunks in debug mode */ + protected int debugAlpha = 255; // 0 - 255 + protected Color debugBlack = new Color(0, 0, 0, debugAlpha); + protected Color debugWhite = new Color(255, 255, 255, debugAlpha); + + + public abstract void addLodToBuffer(BufferBuilder buffer, + LodDimension lodDim, LodChunk lod, + double xOffset, double yOffset, double zOffset, + boolean debugging); + + /** add the given position and color to the buffer */ + protected void addPosAndColor(BufferBuilder buffer, + double x, double y, double z, + int red, int green, int blue, int alpha) + { + buffer.pos(x, y, z).color(red, green, blue, alpha).endVertex(); + } + + + + + +} diff --git a/src/main/java/com/backsun/lod/builders/lodTemplates/CubicLodTemplate.java b/src/main/java/com/backsun/lod/builders/lodTemplates/CubicLodTemplate.java new file mode 100644 index 000000000..d049fcd03 --- /dev/null +++ b/src/main/java/com/backsun/lod/builders/lodTemplates/CubicLodTemplate.java @@ -0,0 +1,149 @@ +package com.backsun.lod.builders.lodTemplates; + +import java.awt.Color; + +import com.backsun.lod.enums.ColorDirection; +import com.backsun.lod.enums.LodCorner; +import com.backsun.lod.objects.LodChunk; +import com.backsun.lod.objects.LodDimension; + +import net.minecraft.client.renderer.BufferBuilder; +import net.minecraft.util.math.AxisAlignedBB; + +/** + * Builds each LOD chunk as a singular rectangular prism. + * + * @author James Seibel + * @version 05-07-2021 + */ +public class CubicLodTemplate extends AbstractLodTemplate +{ + + public CubicLodTemplate() + { + + } + + + @Override + public void addLodToBuffer(BufferBuilder buffer, + LodDimension lodDim, LodChunk lod, + double xOffset, double yOffset, double zOffset, + boolean debugging) + { + // add the new box to the array + int topPoint = getValidHeightPoint(lod.top); + int bottomPoint = getValidHeightPoint(lod.bottom); + + // don't draw an LOD if it is empty + if (topPoint == -1 && bottomPoint == -1) + return; + + + Color c = null; + + if (!debugging) + { + // add the color to the array + c = lod.colors[ColorDirection.TOP.value]; + } + else + { + // if debugging draw the squares as a black and white checker board + if ((lod.x + lod.z) % 2 == 0) + c = debugWhite; + else + c = debugBlack; + } + + AxisAlignedBB bb = new AxisAlignedBB(0, bottomPoint, 0, LodChunk.WIDTH, topPoint, LodChunk.WIDTH).offset(xOffset, yOffset, zOffset); + + if (bb.minY != bb.maxY) + { + // top (facing up) + addPosAndColor(buffer, bb.minX, bb.maxY, bb.minZ, c.getRed(), c.getGreen(), c.getBlue(), c.getAlpha()); + addPosAndColor(buffer, bb.minX, bb.maxY, bb.maxZ, c.getRed(), c.getGreen(), c.getBlue(), c.getAlpha()); + addPosAndColor(buffer, bb.maxX, bb.maxY, bb.maxZ, c.getRed(), c.getGreen(), c.getBlue(), c.getAlpha()); + addPosAndColor(buffer, bb.maxX, bb.maxY, bb.minZ, c.getRed(), c.getGreen(), c.getBlue(), c.getAlpha()); + // bottom (facing down) + addPosAndColor(buffer, bb.maxX, bb.minY, bb.minZ, c.getRed(), c.getGreen(), c.getBlue(), c.getAlpha()); + addPosAndColor(buffer, bb.maxX, bb.minY, bb.maxZ, c.getRed(), c.getGreen(), c.getBlue(), c.getAlpha()); + addPosAndColor(buffer, bb.minX, bb.minY, bb.maxZ, c.getRed(), c.getGreen(), c.getBlue(), c.getAlpha()); + addPosAndColor(buffer, bb.minX, bb.minY, bb.minZ, c.getRed(), c.getGreen(), c.getBlue(), c.getAlpha()); + + // south (facing -Z) + addPosAndColor(buffer, bb.maxX, bb.minY, bb.maxZ, c.getRed(), c.getGreen(), c.getBlue(), c.getAlpha()); + addPosAndColor(buffer, bb.maxX, bb.maxY, bb.maxZ, c.getRed(), c.getGreen(), c.getBlue(), c.getAlpha()); + addPosAndColor(buffer, bb.minX, bb.maxY, bb.maxZ, c.getRed(), c.getGreen(), c.getBlue(), c.getAlpha()); + addPosAndColor(buffer, bb.minX, bb.minY, bb.maxZ, c.getRed(), c.getGreen(), c.getBlue(), c.getAlpha()); + // north (facing +Z) + addPosAndColor(buffer, bb.minX, bb.minY, bb.minZ, c.getRed(), c.getGreen(), c.getBlue(), c.getAlpha()); + addPosAndColor(buffer, bb.minX, bb.maxY, bb.minZ, c.getRed(), c.getGreen(), c.getBlue(), c.getAlpha()); + addPosAndColor(buffer, bb.maxX, bb.maxY, bb.minZ, c.getRed(), c.getGreen(), c.getBlue(), c.getAlpha()); + addPosAndColor(buffer, bb.maxX, bb.minY, bb.minZ, c.getRed(), c.getGreen(), c.getBlue(), c.getAlpha()); + + // west (facing -X) + addPosAndColor(buffer, bb.minX, bb.minY, bb.minZ, c.getRed(), c.getGreen(), c.getBlue(), c.getAlpha()); + addPosAndColor(buffer, bb.minX, bb.minY, bb.maxZ, c.getRed(), c.getGreen(), c.getBlue(), c.getAlpha()); + addPosAndColor(buffer, bb.minX, bb.maxY, bb.maxZ, c.getRed(), c.getGreen(), c.getBlue(), c.getAlpha()); + addPosAndColor(buffer, bb.minX, bb.maxY, bb.minZ, c.getRed(), c.getGreen(), c.getBlue(), c.getAlpha()); + // east (facing +X) + addPosAndColor(buffer, bb.maxX, bb.maxY, bb.minZ, c.getRed(), c.getGreen(), c.getBlue(), c.getAlpha()); + addPosAndColor(buffer, bb.maxX, bb.maxY, bb.maxZ, c.getRed(), c.getGreen(), c.getBlue(), c.getAlpha()); + addPosAndColor(buffer, bb.maxX, bb.minY, bb.maxZ, c.getRed(), c.getGreen(), c.getBlue(), c.getAlpha()); + addPosAndColor(buffer, bb.maxX, bb.minY, bb.minZ, c.getRed(), c.getGreen(), c.getBlue(), c.getAlpha()); + } + else + { + // render this LOD as one block thick + + // top (facing up) + addPosAndColor(buffer, bb.minX, bb.minY+1, bb.minZ, c.getRed(), c.getGreen(), c.getBlue(), c.getAlpha()); + addPosAndColor(buffer, bb.minX, bb.minY+1, bb.maxZ, c.getRed(), c.getGreen(), c.getBlue(), c.getAlpha()); + addPosAndColor(buffer, bb.maxX, bb.minY+1, bb.maxZ, c.getRed(), c.getGreen(), c.getBlue(), c.getAlpha()); + addPosAndColor(buffer, bb.maxX, bb.minY+1, bb.minZ, c.getRed(), c.getGreen(), c.getBlue(), c.getAlpha()); + // bottom (facing down) + addPosAndColor(buffer, bb.maxX, bb.minY, bb.minZ, c.getRed(), c.getGreen(), c.getBlue(), c.getAlpha()); + addPosAndColor(buffer, bb.maxX, bb.minY, bb.maxZ, c.getRed(), c.getGreen(), c.getBlue(), c.getAlpha()); + addPosAndColor(buffer, bb.minX, bb.minY, bb.maxZ, c.getRed(), c.getGreen(), c.getBlue(), c.getAlpha()); + addPosAndColor(buffer, bb.minX, bb.minY, bb.minZ, c.getRed(), c.getGreen(), c.getBlue(), c.getAlpha()); + + // south (facing -Z) + addPosAndColor(buffer, bb.maxX, bb.minY, bb.maxZ, c.getRed(), c.getGreen(), c.getBlue(), c.getAlpha()); + addPosAndColor(buffer, bb.maxX, bb.minY+1, bb.maxZ, c.getRed(), c.getGreen(), c.getBlue(), c.getAlpha()); + addPosAndColor(buffer, bb.minX, bb.minY+1, bb.maxZ, c.getRed(), c.getGreen(), c.getBlue(), c.getAlpha()); + addPosAndColor(buffer, bb.minX, bb.minY, bb.maxZ, c.getRed(), c.getGreen(), c.getBlue(), c.getAlpha()); + // north (facing +Z) + addPosAndColor(buffer, bb.minX, bb.minY, bb.minZ, c.getRed(), c.getGreen(), c.getBlue(), c.getAlpha()); + addPosAndColor(buffer, bb.minX, bb.minY+1, bb.minZ, c.getRed(), c.getGreen(), c.getBlue(), c.getAlpha()); + addPosAndColor(buffer, bb.maxX, bb.minY+1, bb.minZ, c.getRed(), c.getGreen(), c.getBlue(), c.getAlpha()); + addPosAndColor(buffer, bb.maxX, bb.minY, bb.minZ, c.getRed(), c.getGreen(), c.getBlue(), c.getAlpha()); + + // west (facing -X) + addPosAndColor(buffer, bb.minX, bb.minY, bb.minZ, c.getRed(), c.getGreen(), c.getBlue(), c.getAlpha()); + addPosAndColor(buffer, bb.minX, bb.minY, bb.maxZ, c.getRed(), c.getGreen(), c.getBlue(), c.getAlpha()); + addPosAndColor(buffer, bb.minX, bb.minY+1, bb.maxZ, c.getRed(), c.getGreen(), c.getBlue(), c.getAlpha()); + addPosAndColor(buffer, bb.minX, bb.minY+1, bb.minZ, c.getRed(), c.getGreen(), c.getBlue(), c.getAlpha()); + // east (facing +X) + addPosAndColor(buffer, bb.maxX, bb.minY+1, bb.minZ, c.getRed(), c.getGreen(), c.getBlue(), c.getAlpha()); + addPosAndColor(buffer, bb.maxX, bb.minY+1, bb.maxZ, c.getRed(), c.getGreen(), c.getBlue(), c.getAlpha()); + addPosAndColor(buffer, bb.maxX, bb.minY, bb.maxZ, c.getRed(), c.getGreen(), c.getBlue(), c.getAlpha()); + addPosAndColor(buffer, bb.maxX, bb.minY, bb.minZ, c.getRed(), c.getGreen(), c.getBlue(), c.getAlpha()); + } + } + + + /** + * @Returns -1 if there are no valid points + */ + private int getValidHeightPoint(short[] heightPoints) + { + if (heightPoints[LodCorner.NE.value] != -1) + return heightPoints[LodCorner.NE.value]; + if (heightPoints[LodCorner.NW.value] != -1) + return heightPoints[LodCorner.NW.value]; + if (heightPoints[LodCorner.SE.value] != -1) + return heightPoints[LodCorner.NE.value]; + return heightPoints[LodCorner.NE.value]; + } +} diff --git a/src/main/java/com/backsun/lod/builders/lodTemplates/DynamicLodTemplate.java b/src/main/java/com/backsun/lod/builders/lodTemplates/DynamicLodTemplate.java new file mode 100644 index 000000000..7cdc89fd7 --- /dev/null +++ b/src/main/java/com/backsun/lod/builders/lodTemplates/DynamicLodTemplate.java @@ -0,0 +1,27 @@ +package com.backsun.lod.builders.lodTemplates; + +import com.backsun.lod.objects.LodChunk; +import com.backsun.lod.objects.LodDimension; + +import net.minecraft.client.renderer.BufferBuilder; + +/** + * TODO + * Chunks smoothly transition between + * each other, unless a neighboring chunk + * is at a significantly different height. + * + * @author James Seibel + * @version 05-07-2021 + */ +public class DynamicLodTemplate extends AbstractLodTemplate +{ + @Override + public void addLodToBuffer(BufferBuilder buffer, + LodDimension lodDim, LodChunk lod, + double xOffset, double yOffset, double zOffset, + boolean debugging) + { + System.err.println("DynamicLodTemplate not implemented!"); + } +} diff --git a/src/main/java/com/backsun/lod/builders/lodTemplates/TriangularLodTemplate.java b/src/main/java/com/backsun/lod/builders/lodTemplates/TriangularLodTemplate.java new file mode 100644 index 000000000..2cb1ede2e --- /dev/null +++ b/src/main/java/com/backsun/lod/builders/lodTemplates/TriangularLodTemplate.java @@ -0,0 +1,25 @@ +package com.backsun.lod.builders.lodTemplates; + +import com.backsun.lod.objects.LodChunk; +import com.backsun.lod.objects.LodDimension; + +import net.minecraft.client.renderer.BufferBuilder; + +/** + * TODO + * Builds each LOD chunk as a singular rectangular prism. + * + * @author James Seibel + * @version 05-07-2021 + */ +public class TriangularLodTemplate extends AbstractLodTemplate +{ + @Override + public void addLodToBuffer(BufferBuilder buffer, + LodDimension lodDim, LodChunk lod, + double xOffset, double yOffset, double zOffset, + boolean debugging) + { + System.err.println("DynamicLodTemplate not implemented!"); + } +} diff --git a/src/main/java/com/backsun/lod/enums/LodDrawMode.java b/src/main/java/com/backsun/lod/enums/LodDrawMode.java deleted file mode 100644 index d2e4824ec..000000000 --- a/src/main/java/com/backsun/lod/enums/LodDrawMode.java +++ /dev/null @@ -1,26 +0,0 @@ -package com.backsun.lod.enums; - -/** - * - * - * @author James Seibel - * @version 05-05-2021 - */ -public enum LodDrawMode -{ - // used for position - - /** Chunks are rendered as - * rectangular prisms. */ - CUBIC, - - /** Chunks smoothly transition between - * each other. */ - TRIANGULAR, - - /** Chunks smoothly transition between - * each other, unless a neighboring chunk - * is at a significantly different height. */ - DYNAMIC; - -} diff --git a/src/main/java/com/backsun/lod/enums/LodTemplateMode.java b/src/main/java/com/backsun/lod/enums/LodTemplateMode.java new file mode 100644 index 000000000..8cc562ae5 --- /dev/null +++ b/src/main/java/com/backsun/lod/enums/LodTemplateMode.java @@ -0,0 +1,38 @@ +package com.backsun.lod.enums; + +import com.backsun.lod.builders.lodTemplates.AbstractLodTemplate; +import com.backsun.lod.builders.lodTemplates.CubicLodTemplate; +import com.backsun.lod.builders.lodTemplates.DynamicLodTemplate; +import com.backsun.lod.builders.lodTemplates.TriangularLodTemplate; + +/** + * Cubic, Triangular, Dynamic + * + * @author James Seibel + * @version 05-07-2021 + */ +public enum LodTemplateMode +{ + // used for position + + /** Chunks are rendered as + * rectangular prisms. */ + CUBIC(new CubicLodTemplate()), + + /** Chunks smoothly transition between + * each other. */ + TRIANGULAR(new TriangularLodTemplate()), + + /** Chunks smoothly transition between + * each other, unless a neighboring chunk + * is at a significantly different height. */ + DYNAMIC(new DynamicLodTemplate()); + + + public final AbstractLodTemplate template; + + private LodTemplateMode(AbstractLodTemplate newTemplate) + { + template = newTemplate; + } +} diff --git a/src/main/java/com/backsun/lod/util/LodConfig.java b/src/main/java/com/backsun/lod/util/LodConfig.java index e066d1049..91d570fe5 100644 --- a/src/main/java/com/backsun/lod/util/LodConfig.java +++ b/src/main/java/com/backsun/lod/util/LodConfig.java @@ -8,7 +8,7 @@ import org.apache.logging.log4j.LogManager; import com.backsun.lod.ModInfo; import com.backsun.lod.enums.FogDistance; -import com.backsun.lod.enums.LodDrawMode; +import com.backsun.lod.enums.LodTemplateMode; import com.electronwill.nightconfig.core.file.CommentedFileConfig; import com.electronwill.nightconfig.core.io.WritingMode; @@ -33,7 +33,7 @@ public class LodConfig public ForgeConfigSpec.BooleanValue drawCheckerBoard; - public ForgeConfigSpec.EnumValue lodDrawMode; + public ForgeConfigSpec.EnumValue lodTemplateMode; Client(ForgeConfigSpec.Builder builder) @@ -61,13 +61,13 @@ public class LodConfig + " giant game of chess ;)") .define("drawCheckerBoard", false); - lodDrawMode = builder + lodTemplateMode = builder .comment("\n" + " How should the LODs be drawn? \n" - + " " + LodDrawMode.CUBIC.toString() + ": LOD Chunks are drawn as rectangular prisms (boxes). \n" - + " " + LodDrawMode.TRIANGULAR.toString() + ": LOD Chunks smoothly transition between other. \n" - + " " + LodDrawMode.DYNAMIC.toString() + ": LOD Chunks smoothly transition between other, unless a neighboring chunk is at a significantly different height. ") - .defineEnum("lodDrawMode", LodDrawMode.CUBIC); + + " " + LodTemplateMode.CUBIC.toString() + ": LOD Chunks are drawn as rectangular prisms (boxes). \n" + + " " + LodTemplateMode.TRIANGULAR.toString() + ": LOD Chunks smoothly transition between other. \n" + + " " + LodTemplateMode.DYNAMIC.toString() + ": LOD Chunks smoothly transition between other, unless a neighboring chunk is at a significantly different height. ") + .defineEnum("lodDrawMode", LodTemplateMode.CUBIC); builder.pop(); }