From 550c0f1bf287736505677504e4a0fe4c8fbb36b5 Mon Sep 17 00:00:00 2001 From: Leonardo Date: Fri, 20 Aug 2021 19:02:11 +0200 Subject: [PATCH] Added getDataToRender to the bufferBuilder --- .../lod/builders/LodNodeBufferBuilder.java | 61 ++++++++++++++++++- .../AbstractLodNodeTemplate.java | 2 +- .../CubicLodNodeTemplate.java | 6 +- .../DynamicLodNodeTemplate.java | 2 +- .../TriangularLodNodeTemplate.java | 2 +- .../java/com/seibel/lod/objects/LevelPos.java | 16 ++--- .../com/seibel/lod/objects/LodDimension.java | 58 ++++++++++++++---- .../com/seibel/lod/objects/LodRegion.java | 17 +++--- 8 files changed, 128 insertions(+), 36 deletions(-) diff --git a/src/main/java/com/seibel/lod/builders/LodNodeBufferBuilder.java b/src/main/java/com/seibel/lod/builders/LodNodeBufferBuilder.java index 3cd803e12..ddc958234 100644 --- a/src/main/java/com/seibel/lod/builders/LodNodeBufferBuilder.java +++ b/src/main/java/com/seibel/lod/builders/LodNodeBufferBuilder.java @@ -17,10 +17,14 @@ */ package com.seibel.lod.builders; +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.atomic.AtomicInteger; +import kaptainwutax.mathutils.decomposition.LUDecomposition; import org.lwjgl.opengl.GL11; import com.seibel.lod.builders.worldGeneration.LodNodeGenWorker; @@ -285,7 +289,7 @@ public class LodNodeBufferBuilder continue; } // lod null or empty - + /* BufferBuilder currentBuffer = null; try { @@ -323,12 +327,65 @@ public class LodNodeBufferBuilder // add this LOD to the buffer LodConfig.CLIENT.lodTemplate.get(). template.addLodToBuffer(currentBuffer, lodDim, lodData, - posX, yOffset, posZ, renderer.debugging, detail); + posX, yOffset, posZ, renderer.debugging, (byte) detail.detailLevel); } + */ } } + int width; + List posList = new ArrayList<>(); + LodDataPoint lodData; + for (int xRegion = 0; xRegion < lodDim.regions.length; xRegion++) + { + for (int zRegion = 0; zRegion < lodDim.regions.length; zRegion++) + { + RegionPos regionPos = new RegionPos(xRegion + lodDim.getCenterX() - lodDim.getWidth()/2, zRegion + lodDim.getCenterZ() - lodDim.getWidth()/2); + BufferBuilder currentBuffer = null; + try + { + // local position in the vbo and bufferBuilder arrays + currentBuffer = buildableBuffers[regionPos.x][regionPos.z]; + } + catch(Exception e) + { + e.printStackTrace(); + continue; + } + posList.addAll(lodDim.getDataToRender(regionPos, playerBlockPosRounded.getX(), playerBlockPosRounded.getZ(), 0, 200, (byte) 0)); + posList.addAll(lodDim.getDataToRender(regionPos, playerBlockPosRounded.getX(), playerBlockPosRounded.getZ(), 200, 400, (byte) 1)); + posList.addAll(lodDim.getDataToRender(regionPos, playerBlockPosRounded.getX(), playerBlockPosRounded.getZ(), 400, 600, (byte) 2)); + posList.addAll(lodDim.getDataToRender(regionPos, playerBlockPosRounded.getX(), playerBlockPosRounded.getZ(), 600, 800, (byte) 3)); + posList.addAll(lodDim.getDataToRender(regionPos, playerBlockPosRounded.getX(), playerBlockPosRounded.getZ(), 800, 1000, (byte) 4)); + posList.addAll(lodDim.getDataToRender(regionPos, playerBlockPosRounded.getX(), playerBlockPosRounded.getZ(), 1000, 10000000, (byte) 5)); + for(LevelPos pos : posList){ + LevelPos chunkPos = pos.convert((byte) 3); + int chunkX = chunkPos.posX + startChunkPos.x; + int chunkZ = chunkPos.posZ + startChunkPos.z; + + // skip any chunks that Minecraft is going to render + if (isCoordInCenterArea(pos.convert((byte) 3).posX, pos.convert((byte) 3).posZ, (numbChunksWide / 2)) + && renderer.vanillaRenderedChunks.contains(new ChunkPos(chunkX, chunkZ))) + { + }else{ + // set where this square will be drawn in the world + double xOffset = (LodUtil.CHUNK_WIDTH * chunkPos.posX) + // offset by the number of LOD blocks + startBlockPos.getX(); // offset so the center LOD block is centered underneath the player + double yOffset = 0; + double zOffset = (LodUtil.CHUNK_WIDTH * chunkPos.posZ) + startBlockPos.getZ(); + + width = (int) Math.pow(2, pos.detailLevel); + lodData = lodDim.getData(pos); + LodConfig.CLIENT.lodTemplate.get(). + template.addLodToBuffer(currentBuffer, lodDim, lodData, + pos.posX * width, 0, pos.posZ * width, renderer.debugging, pos.detailLevel); + } + + } + posList.clear(); + } + } // issue #19 // TODO add a way for a server side mod to generate chunks requested here diff --git a/src/main/java/com/seibel/lod/builders/lodNodeTemplates/AbstractLodNodeTemplate.java b/src/main/java/com/seibel/lod/builders/lodNodeTemplates/AbstractLodNodeTemplate.java index 6afa15339..c290e1288 100644 --- a/src/main/java/com/seibel/lod/builders/lodNodeTemplates/AbstractLodNodeTemplate.java +++ b/src/main/java/com/seibel/lod/builders/lodNodeTemplates/AbstractLodNodeTemplate.java @@ -38,7 +38,7 @@ public abstract class AbstractLodNodeTemplate public abstract void addLodToBuffer(BufferBuilder buffer, LodDimension lodDim, LodDataPoint lod, double xOffset, double yOffset, double zOffset, - boolean debugging, LodDetail detail); + boolean debugging, byte detail); /** add the given position and color to the buffer */ protected void addPosAndColor(BufferBuilder buffer, diff --git a/src/main/java/com/seibel/lod/builders/lodNodeTemplates/CubicLodNodeTemplate.java b/src/main/java/com/seibel/lod/builders/lodNodeTemplates/CubicLodNodeTemplate.java index 4832e553c..6f635c869 100644 --- a/src/main/java/com/seibel/lod/builders/lodNodeTemplates/CubicLodNodeTemplate.java +++ b/src/main/java/com/seibel/lod/builders/lodNodeTemplates/CubicLodNodeTemplate.java @@ -46,7 +46,7 @@ public class CubicLodNodeTemplate extends AbstractLodNodeTemplate public void addLodToBuffer(BufferBuilder buffer, LodDimension lodDim, LodDataPoint lod, double xOffset, double yOffset, double zOffset, - boolean debugging, LodDetail detail) + boolean debugging, byte detail) { AxisAlignedBB bbox; @@ -54,7 +54,7 @@ public class CubicLodNodeTemplate extends AbstractLodNodeTemplate bbox = generateBoundingBox( lod.height, lod.depth, - detail.dataPointWidth, + (int) Math.pow(2, detail), xOffset, yOffset, zOffset); @@ -62,7 +62,7 @@ public class CubicLodNodeTemplate extends AbstractLodNodeTemplate Color color = lod.color; if (LodConfig.CLIENT.debugMode.get()) { - color = LodUtil.DEBUG_DETAIL_LEVEL_COLORS[detail.detailLevel]; + color = LodUtil.DEBUG_DETAIL_LEVEL_COLORS[detail]; } if (bbox != null) diff --git a/src/main/java/com/seibel/lod/builders/lodNodeTemplates/DynamicLodNodeTemplate.java b/src/main/java/com/seibel/lod/builders/lodNodeTemplates/DynamicLodNodeTemplate.java index e022f9e48..dd66299d3 100644 --- a/src/main/java/com/seibel/lod/builders/lodNodeTemplates/DynamicLodNodeTemplate.java +++ b/src/main/java/com/seibel/lod/builders/lodNodeTemplates/DynamicLodNodeTemplate.java @@ -38,7 +38,7 @@ public class DynamicLodNodeTemplate extends AbstractLodNodeTemplate public void addLodToBuffer(BufferBuilder buffer, LodDimension lodDim, LodDataPoint lod, double xOffset, double yOffset, double zOffset, - boolean debugging, LodDetail detail) + boolean debugging, byte detail) { System.err.println("DynamicLodTemplate not implemented!"); } diff --git a/src/main/java/com/seibel/lod/builders/lodNodeTemplates/TriangularLodNodeTemplate.java b/src/main/java/com/seibel/lod/builders/lodNodeTemplates/TriangularLodNodeTemplate.java index cd1b0cd61..4505f137c 100644 --- a/src/main/java/com/seibel/lod/builders/lodNodeTemplates/TriangularLodNodeTemplate.java +++ b/src/main/java/com/seibel/lod/builders/lodNodeTemplates/TriangularLodNodeTemplate.java @@ -36,7 +36,7 @@ public class TriangularLodNodeTemplate extends AbstractLodNodeTemplate public void addLodToBuffer(BufferBuilder buffer, LodDimension lodDim, LodDataPoint lod, double xOffset, double yOffset, double zOffset, - boolean debugging, LodDetail detail) + boolean debugging, byte detail) { System.err.println("DynamicLodTemplate not implemented!"); } diff --git a/src/main/java/com/seibel/lod/objects/LevelPos.java b/src/main/java/com/seibel/lod/objects/LevelPos.java index 556bd4d44..445227bf8 100644 --- a/src/main/java/com/seibel/lod/objects/LevelPos.java +++ b/src/main/java/com/seibel/lod/objects/LevelPos.java @@ -63,12 +63,12 @@ public class LevelPos implements Cloneable int blockPosX = regionPosX * 512 + posX * width + width / 2; int blockPosZ = regionPosZ * 512 + posZ * width + width / 2; int maxDistance = (int) Math.sqrt(Math.pow(playerPosX - blockPosX, 2) + Math.pow(playerPosZ - blockPosZ, 2)); - for (int x = 0; x <= 1; x++) + for (int x = 0; x <= 3; x++) { - for (int z = 0; z <= 1; z++) + for (int z = 0; z <= 3; z++) { - blockPosX = regionPosX * 512 + posX * width + width * x; - blockPosZ = regionPosZ * 512 + posZ * width + width * z; + blockPosX = regionPosX * 512 + posX * width + width/2 * x; + blockPosZ = regionPosZ * 512 + posZ * width + width/2 * z; maxDistance = Math.max(maxDistance, (int) Math.sqrt(Math.pow(playerPosX - blockPosX, 2) + Math.pow(playerPosZ - blockPosZ, 2))); } } @@ -85,12 +85,12 @@ public class LevelPos implements Cloneable int blockPosX = regionPosX * 512 + posX * width + width / 2; int blockPosZ = regionPosZ * 512 + posZ * width + width / 2; int minDistance = (int) Math.sqrt(Math.pow(playerPosX - blockPosX, 2) + Math.pow(playerPosZ - blockPosZ, 2)); - for (int x = 0; x <= 1; x++) + for (int x = 0; x <= 3; x++) { - for (int z = 0; z <= 1; z++) + for (int z = 0; z <= 3; z++) { - blockPosX = regionPosX * 512 + posX * width + width * x; - blockPosZ = regionPosZ * 512 + posZ * width + width * z; + blockPosX = regionPosX * 512 + posX * width + width/2 * x; + blockPosZ = regionPosZ * 512 + posZ * width + width/2 * z; minDistance = Math.min(minDistance, (int) Math.sqrt(Math.pow(playerPosX - blockPosX, 2) + Math.pow(playerPosZ - blockPosZ, 2))); } } diff --git a/src/main/java/com/seibel/lod/objects/LodDimension.java b/src/main/java/com/seibel/lod/objects/LodDimension.java index 9adb5a4a6..87cbf4b39 100644 --- a/src/main/java/com/seibel/lod/objects/LodDimension.java +++ b/src/main/java/com/seibel/lod/objects/LodDimension.java @@ -355,53 +355,65 @@ public class LodDimension /** * method to get all the quadtree level that have to be generated based on the position of the player + * * @return list of quadTrees */ - public List getDataToGenerate(int playerPosX, int playerPosZ, int start, int end, byte generation, byte detailLevel){ + public List getDataToGenerate(int playerPosX, int playerPosZ, int start, int end, byte generation, byte detailLevel, int dataNumber) + { int n = regions.length; int xIndex; int zIndex; LodRegion region; - List> listOfData = new ArrayList<>(); - for(int xRegion=0; xRegion> listOfData = new ArrayList<>(); + for (int xRegion = 0; xRegion < n; xRegion++) + { + for (int zRegion = 0; zRegion < n; zRegion++) + { xIndex = (xRegion + center.x) - halfWidth; zIndex = (zRegion + center.z) - halfWidth; RegionPos regionPos = new RegionPos(xIndex, zIndex); region = getRegion(regionPos); - if (region == null){ + if (region == null) + { region = new LodRegion((byte) 0, regionPos); addOrOverwriteRegion(region); } - listOfData.addAll(region.getDataToGenerate(playerPosX, playerPosZ, start, end, generation, detailLevel)); + listOfData.addAll(region.getDataToGenerate(playerPosX, playerPosZ, start, end, generation, detailLevel, dataNumber)); } } - Collections.sort(listOfData,Map.Entry.comparingByValue()); - return listOfData.stream().map(entry -> entry.getKey()).collect(Collectors.toList()); + Collections.sort(listOfData, Map.Entry.comparingByValue()); + dataNumber = Math.min(dataNumber, listOfData.size()); + return listOfData.stream().map(entry -> entry.getKey()).collect(Collectors.toList()).subList(0, dataNumber); } /** * method to get all the nodes that have to be rendered based on the position of the player + * * @return list of nodes */ - public List getDataToRender(int playerPosX, int playerPosZ, int start, int end, byte detailLevel){ + public List getDataToRender(int playerPosX, int playerPosZ, int start, int end, byte detailLevel) + { int n = regions.length; List listOfData = new ArrayList<>(); int xIndex; int zIndex; LodRegion region; - for(int xRegion=0; xRegion getDataToRender(RegionPos regionPos, int playerPosX, int playerPosZ, int start, int end, byte detailLevel) + { + int n = regions.length; + List listOfData = new ArrayList<>(); + LodRegion region = getRegion(regionPos); + if (region == null) + { + region = new LodRegion((byte) 0, regionPos); + addOrOverwriteRegion(region); + } else + { + listOfData.addAll(region.getDataToRender(playerPosX, playerPosZ, start, end, detailLevel)); + } + return listOfData; + } /** * Get the data point at the given X and Z coordinates diff --git a/src/main/java/com/seibel/lod/objects/LodRegion.java b/src/main/java/com/seibel/lod/objects/LodRegion.java index 4f002dfe4..01da11d62 100644 --- a/src/main/java/com/seibel/lod/objects/LodRegion.java +++ b/src/main/java/com/seibel/lod/objects/LodRegion.java @@ -8,10 +8,9 @@ import net.minecraft.util.math.ChunkPos; import java.awt.*; import java.io.Serializable; -import java.util.AbstractMap; -import java.util.ArrayList; +import java.util.*; import java.util.List; -import java.util.Map; +import java.util.stream.Collectors; /** * STANDARD TO FOLLOW @@ -208,13 +207,17 @@ public class LodRegion implements Serializable /** * @return */ - public List> getDataToGenerate(int playerPosX, int playerPosZ, int start, int end, byte generation, byte detailLevel) + public List> getDataToGenerate(int playerPosX, int playerPosZ, int start, int end, byte generation, byte detailLevel, int dataNumber) { LevelPos levelPos = new LevelPos(LodUtil.REGION_DETAIL_LEVEL, 0, 0); - return getDataToGenerate(levelPos, playerPosX, playerPosZ, start, end, generation, detailLevel); + List> listOfPos = getDataToGenerate(levelPos, playerPosX, playerPosZ, start, end, generation, detailLevel); + Collections.sort(listOfPos,Map.Entry.comparingByValue()); + dataNumber = Math.min(dataNumber, listOfPos.size()); + return listOfPos.subList(0,dataNumber); + } - public List> getDataToGenerate(LevelPos levelPos, int playerPosX, int playerPosZ, int start, int end, byte generation, byte detailLevel) + private List> getDataToGenerate(LevelPos levelPos, int playerPosX, int playerPosZ, int start, int end, byte generation, byte detailLevel) { List> levelPosList = new ArrayList<>(); @@ -317,7 +320,7 @@ public class LodRegion implements Serializable /** * @return */ - public List getDataToRender(LevelPos levelPos, int playerPosX, int playerPosZ, int start, int end, byte detailLevel) + private List getDataToRender(LevelPos levelPos, int playerPosX, int playerPosZ, int start, int end, byte detailLevel) { List levelPosList = new ArrayList<>();