From 7654cac01d53531b1dbf623241425ec1757efe14 Mon Sep 17 00:00:00 2001 From: Leonardo Date: Sat, 21 Aug 2021 14:32:27 +0200 Subject: [PATCH] minor fixes --- .../seibel/lod/builders/LodBufferBuilder.java | 28 +++- .../com/seibel/lod/builders/LodBuilder.java | 2 +- .../seibel/lod/builders/LodBuilderConfig.java | 144 ++++++++++-------- .../worldGeneration/LodNodeGenWorker.java | 7 +- .../java/com/seibel/lod/objects/LevelPos.java | 16 ++ .../com/seibel/lod/objects/LodDimension.java | 2 +- .../com/seibel/lod/objects/LodRegion.java | 2 +- .../com/seibel/lod/proxy/ClientProxy.java | 2 +- 8 files changed, 124 insertions(+), 79 deletions(-) diff --git a/src/main/java/com/seibel/lod/builders/LodBufferBuilder.java b/src/main/java/com/seibel/lod/builders/LodBufferBuilder.java index a1a802f42..b8829858f 100644 --- a/src/main/java/com/seibel/lod/builders/LodBufferBuilder.java +++ b/src/main/java/com/seibel/lod/builders/LodBufferBuilder.java @@ -18,11 +18,15 @@ package com.seibel.lod.builders; import java.util.ArrayList; +import java.util.HashSet; import java.util.List; +import java.util.Set; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.atomic.AtomicInteger; +import com.sun.glass.ui.Window; +import net.minecraft.world.chunk.Chunk; import org.lwjgl.opengl.GL11; import com.seibel.lod.builders.worldGeneration.LodNodeGenWorker; @@ -75,7 +79,11 @@ public class LodBufferBuilder /** if this is true the LOD buffers are currently being * regenerated. */ public boolean generatingBuffers = false; - + + /** if this is true the LOD buffers are currently being + * regenerated. */ + public Set positionWaitingToBeGenerated = new HashSet<>(); + /** if this is true new LOD buffers have been generated * and are waiting to be swapped with the drawable buffers*/ private boolean switchVbos = false; @@ -230,28 +238,28 @@ public class LodBufferBuilder } + /**TODO make this automatic and config dependant*/ List posListToGenerate = new ArrayList<>(); - posListToGenerate.addAll(lodDim.getDataToGenerate( playerBlockPosRounded.getX(), playerBlockPosRounded.getZ(), 0, 10000000, (byte) DistanceGenerationMode.SURFACE.complexity, (byte) 9, 2)); - if(posListToGenerate.isEmpty()) - { - posListToGenerate.addAll(lodDim.getDataToGenerate(playerBlockPosRounded.getX(), playerBlockPosRounded.getZ(), 0, 400, (byte) DistanceGenerationMode.SURFACE.complexity, (byte) 0, 2)); - } + //posListToGenerate.addAll(lodDim.getDataToGenerate( playerBlockPosRounded.getX(), playerBlockPosRounded.getZ(), 0, 1500, (byte) DistanceGenerationMode.SURFACE.complexity, (byte) 9, 16)); if(posListToGenerate.isEmpty()){ - posListToGenerate.addAll(lodDim.getDataToGenerate( playerBlockPosRounded.getX(), playerBlockPosRounded.getZ(), 0, 10000000, (byte) DistanceGenerationMode.SURFACE.complexity, (byte) 0, 2)); + posListToGenerate.addAll(lodDim.getDataToGenerate( playerBlockPosRounded.getX(), playerBlockPosRounded.getZ(), 0, 1000, (byte) DistanceGenerationMode.SURFACE.complexity, (byte) 0, 16)); } for(LevelPos levelPos : posListToGenerate){ LevelPos chunkLevelPos = levelPos.convert((byte) 3); int chunkX = chunkLevelPos.posX / 2; int chunkZ = chunkLevelPos.posZ / 2; - // generate a new chunk if no chunk currently exists // and we aren't waiting on any other chunks to generate if (numberOfChunksWaitingToGenerate.get() < maxChunkGenRequests) { ChunkPos pos = new ChunkPos(chunkX, chunkZ); + if(positionWaitingToBeGenerated.contains(pos)){ + System.out.println(pos + " asked again"); + continue; + } // alternate determining logic that // can be used for debugging @@ -306,6 +314,7 @@ public class LodBufferBuilder chunkGenIndex = 0; chunksToGen = new ChunkPos[maxChunkGenRequests]; chunksToGen[chunkGenIndex] = pos; + positionWaitingToBeGenerated.add(pos); chunkGenIndex++; } else if (newDistance <= minChunkDist) @@ -317,6 +326,7 @@ public class LodBufferBuilder // we are still under the number of chunks to generate // add this position to the list chunksToGen[chunkGenIndex] = pos; + positionWaitingToBeGenerated.add(pos); chunkGenIndex++; } } @@ -355,6 +365,8 @@ public class LodBufferBuilder numberOfChunksWaitingToGenerate.addAndGet(1); LodNodeGenWorker genWorker = new LodNodeGenWorker(chunkPos, DistanceGenerationMode.SURFACE, LodDetail.FULL, renderer, LodQuadTreeNodeBuilder, this, lodDim, serverWorld); WorldWorkerManager.addWorker(genWorker); + /**TODO optimize the use of positionWaitingToBeGenerated*/ + positionWaitingToBeGenerated.remove(chunkPos); } } diff --git a/src/main/java/com/seibel/lod/builders/LodBuilder.java b/src/main/java/com/seibel/lod/builders/LodBuilder.java index 19d904155..9ab5732ab 100644 --- a/src/main/java/com/seibel/lod/builders/LodBuilder.java +++ b/src/main/java/com/seibel/lod/builders/LodBuilder.java @@ -179,7 +179,7 @@ public class LodBuilder chunk.getPos().x * 16 + startX, chunk.getPos().z * 16 + startZ); data = new LodDataPoint(height, depth, color); - check = lodDim.addData(levelPos.convert((byte) detail.detailLevel), + lodDim.addData(levelPos.convert((byte) detail.detailLevel), data, config.distanceGenerationMode, true, diff --git a/src/main/java/com/seibel/lod/builders/LodBuilderConfig.java b/src/main/java/com/seibel/lod/builders/LodBuilderConfig.java index cf332d261..2fd48ee31 100644 --- a/src/main/java/com/seibel/lod/builders/LodBuilderConfig.java +++ b/src/main/java/com/seibel/lod/builders/LodBuilderConfig.java @@ -24,73 +24,89 @@ import com.seibel.lod.enums.DistanceGenerationMode; * Generally this will only be used if we want to generate a * LodChunk using a incomplete Chunk, otherwise the defaults * work best for a fully generated chunk (IE has correct surface blocks). - * + * * @author James Seibel * @version 8-14-2021 */ public class LodBuilderConfig { - /** default false */ - public boolean useHeightmap; - /** default false */ - public boolean useBiomeColors; - /** default true */ - public boolean useSolidBlocksInColorGen; - /** default server */ - public DistanceGenerationMode distanceGenerationMode; - - /** default settings for a normal chunk
- * useHeightmap = false
- * useBiomeColors = false
- * useSolidBlocksInColorGen = true
- * generationMode = Server
- */ - public LodBuilderConfig() - { - useHeightmap = false; - useBiomeColors = false; - useSolidBlocksInColorGen = true; - distanceGenerationMode = DistanceGenerationMode.SERVER; - } - - /** - * @param newUseHeightmap default = false - * @param newUseBiomeColors default = false - * @param newUseSolidBlocksInBiomeColor default = true - * @param newDistanceGenerationMode default = Server - */ - public LodBuilderConfig(boolean newUseHeightmap, boolean newUseBiomeColors, - boolean newUseSolidBlocksInBiomeColor, DistanceGenerationMode newDistanceGenerationMode) - { - useHeightmap = newUseHeightmap; - useBiomeColors = newUseBiomeColors; - useSolidBlocksInColorGen = newUseSolidBlocksInBiomeColor; - distanceGenerationMode = newDistanceGenerationMode; - } - - /** - * @param newUseHeightmap default = false - * @param newUseBiomeColors default = false - * @param newUseSolidBlocksInBiomeColor default = true - * @param newDistanceGenerationMode default = Server - */ - public LodBuilderConfig(boolean newUseHeightmap, boolean newUseBiomeColors, boolean newUseSolidBlocksInBiomeColor) - { - this(); - useHeightmap = newUseHeightmap; - useBiomeColors = newUseBiomeColors; - useSolidBlocksInColorGen = newUseSolidBlocksInBiomeColor; - } - - /** - * @param newUseHeightmap default = false - * @param newUseBiomeColors default = false - * @param newUseSolidBlocksInBiomeColor default = true - * @param newDistanceGenerationMode default = Server - */ - public LodBuilderConfig(DistanceGenerationMode newDistanceGenerationMode) - { - this(); - distanceGenerationMode = newDistanceGenerationMode; - } + /** + * default false + */ + public boolean useHeightmap; + /** + * default false + */ + public boolean useBiomeColors; + /** + * default true + */ + public boolean useSolidBlocksInColorGen; + /** + * default server + */ + public DistanceGenerationMode distanceGenerationMode; + + /** + * default settings for a normal chunk
+ * useHeightmap = false
+ * useBiomeColors = false
+ * useSolidBlocksInColorGen = true
+ * generationMode = Server
+ */ + public LodBuilderConfig() + { + useHeightmap = false; + useBiomeColors = false; + useSolidBlocksInColorGen = true; + distanceGenerationMode = DistanceGenerationMode.SERVER; + } + + /** + * @param newUseHeightmap default = false + * @param newUseBiomeColors default = false + * @param newUseSolidBlocksInBiomeColor default = true + * @param newDistanceGenerationMode default = Server + */ + public LodBuilderConfig(boolean newUseHeightmap, boolean newUseBiomeColors, + boolean newUseSolidBlocksInBiomeColor, DistanceGenerationMode newDistanceGenerationMode) + { + useHeightmap = newUseHeightmap; + useBiomeColors = newUseBiomeColors; + useSolidBlocksInColorGen = newUseSolidBlocksInBiomeColor; + distanceGenerationMode = newDistanceGenerationMode; + } + + /** + * @param newUseHeightmap default = false + * @param newUseBiomeColors default = false + * @param newUseSolidBlocksInBiomeColor default = true + * @param newDistanceGenerationMode default = Server + */ + public LodBuilderConfig(boolean newUseHeightmap, boolean newUseBiomeColors, boolean newUseSolidBlocksInBiomeColor) + { + this(); + useHeightmap = newUseHeightmap; + useBiomeColors = newUseBiomeColors; + useSolidBlocksInColorGen = newUseSolidBlocksInBiomeColor; + if (newUseHeightmap) + { + distanceGenerationMode = DistanceGenerationMode.BIOME_ONLY_SIMULATE_HEIGHT; + } else + { + distanceGenerationMode = DistanceGenerationMode.BIOME_ONLY; + } + } + + /** + * @param newUseHeightmap default = false + * @param newUseBiomeColors default = false + * @param newUseSolidBlocksInBiomeColor default = true + * @param newDistanceGenerationMode default = Server + */ + public LodBuilderConfig(DistanceGenerationMode newDistanceGenerationMode) + { + this(); + distanceGenerationMode = newDistanceGenerationMode; + } } \ No newline at end of file diff --git a/src/main/java/com/seibel/lod/builders/worldGeneration/LodNodeGenWorker.java b/src/main/java/com/seibel/lod/builders/worldGeneration/LodNodeGenWorker.java index 29c3e4a12..a5871478e 100644 --- a/src/main/java/com/seibel/lod/builders/worldGeneration/LodNodeGenWorker.java +++ b/src/main/java/com/seibel/lod/builders/worldGeneration/LodNodeGenWorker.java @@ -193,8 +193,9 @@ public class LodNodeGenWorker implements IWorker // only generate LodChunks if they can // be added to the current LodDimension - if (lodDim.regionIsInRange(pos.x / LodUtil.REGION_WIDTH_IN_CHUNKS, pos.z / LodUtil.REGION_WIDTH_IN_CHUNKS)) - { + /**TODO i must disable this if, i will find a way to replace it*/ + //if (lodDim.regionIsInRange(pos.x / LodUtil.REGION_WIDTH_IN_CHUNKS, pos.z / LodUtil.REGION_WIDTH_IN_CHUNKS)) + //{ // long startTime = System.currentTimeMillis(); switch(generationMode) @@ -236,7 +237,7 @@ public class LodNodeGenWorker implements IWorker // long endTime = System.currentTimeMillis(); // System.out.println(endTime - startTime); - }// if in range + //}// if in range } catch (Exception e) diff --git a/src/main/java/com/seibel/lod/objects/LevelPos.java b/src/main/java/com/seibel/lod/objects/LevelPos.java index b0cdb109d..ad83db703 100644 --- a/src/main/java/com/seibel/lod/objects/LevelPos.java +++ b/src/main/java/com/seibel/lod/objects/LevelPos.java @@ -200,6 +200,22 @@ public class LevelPos implements Cloneable } } + public int hashCode() + { + int hash = 7; + hash = 31 * hash + (int) detailLevel; + hash = 31 * hash + posX; + hash = 31 * hash + posZ; + return hash; + } + + public boolean equals(LevelPos other) + { + return (this.detailLevel == other.detailLevel && + this.posX == other.posX && + this.posZ == other.posZ); + } + @Override public String toString() { diff --git a/src/main/java/com/seibel/lod/objects/LodDimension.java b/src/main/java/com/seibel/lod/objects/LodDimension.java index 0a9812196..62169fc54 100644 --- a/src/main/java/com/seibel/lod/objects/LodDimension.java +++ b/src/main/java/com/seibel/lod/objects/LodDimension.java @@ -383,7 +383,7 @@ public class LodDimension listOfData.addAll(region.getDataToGenerate(playerPosX, playerPosZ, start, end, generation, detailLevel, dataNumber)); } } - Collections.sort(listOfData, LevelPos.getPosAndDetailComparator()); + Collections.sort(listOfData, LevelPos.getPosComparator()); dataNumber = Math.min(dataNumber, listOfData.size()); return listOfData.stream().map(entry -> entry.getKey()).collect(Collectors.toList()).subList(0, dataNumber); } diff --git a/src/main/java/com/seibel/lod/objects/LodRegion.java b/src/main/java/com/seibel/lod/objects/LodRegion.java index e3c72077d..c35748637 100644 --- a/src/main/java/com/seibel/lod/objects/LodRegion.java +++ b/src/main/java/com/seibel/lod/objects/LodRegion.java @@ -211,7 +211,7 @@ public class LodRegion implements Serializable { LevelPos levelPos = new LevelPos(LodUtil.REGION_DETAIL_LEVEL, 0, 0); List> listOfPos = getDataToGenerate(levelPos, playerPosX, playerPosZ, start, end, generation, detailLevel); - Collections.sort(listOfPos, LevelPos.getPosAndDetailComparator()); + Collections.sort(listOfPos, LevelPos.getPosComparator()); dataNumber = Math.min(dataNumber, listOfPos.size()); return listOfPos.subList(0,dataNumber); diff --git a/src/main/java/com/seibel/lod/proxy/ClientProxy.java b/src/main/java/com/seibel/lod/proxy/ClientProxy.java index 6845eb1bb..c46f3acfc 100644 --- a/src/main/java/com/seibel/lod/proxy/ClientProxy.java +++ b/src/main/java/com/seibel/lod/proxy/ClientProxy.java @@ -152,7 +152,7 @@ public class ClientProxy LodConfig.CLIENT.distanceGenerationMode.set(DistanceGenerationMode.FEATURES); LodConfig.CLIENT.allowUnstableFeatureGeneration.set(false); - LodConfig.CLIENT.numberOfWorldGenerationThreads.set(2); + LodConfig.CLIENT.numberOfWorldGenerationThreads.set(16); }