From ae9eba0608b973c2bed3f9dc14b936bcad0cea57 Mon Sep 17 00:00:00 2001 From: James Seibel Date: Sat, 14 Aug 2021 19:56:16 -0500 Subject: [PATCH] Add distanceGenerationMode when generating nodes --- .../seibel/lod/builders/LodBuilderConfig.java | 39 ++++++++++++++++++- .../seibel/lod/builders/LodNodeBuilder.java | 21 ++++++---- .../com/seibel/lod/objects/LodQuadTree.java | 2 +- .../seibel/lod/objects/LodQuadTreeNode.java | 9 ++--- .../com/seibel/lod/proxy/ClientProxy.java | 8 ++-- 5 files changed, 59 insertions(+), 20 deletions(-) diff --git a/src/main/java/com/seibel/lod/builders/LodBuilderConfig.java b/src/main/java/com/seibel/lod/builders/LodBuilderConfig.java index 24adcd7ad..cf332d261 100644 --- a/src/main/java/com/seibel/lod/builders/LodBuilderConfig.java +++ b/src/main/java/com/seibel/lod/builders/LodBuilderConfig.java @@ -17,6 +17,8 @@ */ package com.seibel.lod.builders; +import com.seibel.lod.enums.DistanceGenerationMode; + /** * This is used to easily configure how LodChunks are generated. * Generally this will only be used if we want to generate a @@ -24,7 +26,7 @@ package com.seibel.lod.builders; * work best for a fully generated chunk (IE has correct surface blocks). * * @author James Seibel - * @version 6-27-2021 + * @version 8-14-2021 */ public class LodBuilderConfig { @@ -34,28 +36,61 @@ public class LodBuilderConfig 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) + 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; } } \ No newline at end of file diff --git a/src/main/java/com/seibel/lod/builders/LodNodeBuilder.java b/src/main/java/com/seibel/lod/builders/LodNodeBuilder.java index 73c839435..590d85a42 100644 --- a/src/main/java/com/seibel/lod/builders/LodNodeBuilder.java +++ b/src/main/java/com/seibel/lod/builders/LodNodeBuilder.java @@ -51,8 +51,9 @@ import net.minecraft.world.gen.Heightmap; * This object is in charge of creating Lod related objects. (specifically: Lod * World, Dimension, Region, and Chunk objects) * + * @author Leonardo Amato * @author James Seibel - * @version 8-10-2021 + * @version 8-14-2021 */ public class LodNodeBuilder { @@ -73,6 +74,11 @@ public class LodNodeBuilder } public void generateLodNodeAsync(IChunk chunk, LodQuadTreeWorld lodWorld, IWorld world) + { + generateLodNodeAsync(chunk, lodWorld, world, DistanceGenerationMode.SERVER); + } + + public void generateLodNodeAsync(IChunk chunk, LodQuadTreeWorld lodWorld, IWorld world, DistanceGenerationMode generationMode) { if (lodWorld == null || !lodWorld.getIsWorldLoaded()) return; @@ -89,7 +95,7 @@ public class LodNodeBuilder { DimensionType dim = world.dimensionType(); - List nodeList = generateLodNodeFromChunk(chunk); + List nodeList = generateLodNodeFromChunk(chunk, new LodBuilderConfig(generationMode)); LodQuadTreeDimension lodDim; @@ -102,6 +108,7 @@ public class LodNodeBuilder { lodDim = lodWorld.getLodDimension(dim); } + for (LodQuadTreeNode node : nodeList) { lodDim.addNode(node); @@ -134,7 +141,6 @@ public class LodNodeBuilder /** * Creates a LodChunk for a chunk in the given world. * - * @return * @throws IllegalArgumentException thrown if either the chunk or world is null. */ public List generateLodNodeFromChunk(IChunk chunk, LodBuilderConfig config) @@ -142,8 +148,11 @@ public class LodNodeBuilder { LodDetail detail = LodConfig.CLIENT.maxGenerationDetail.get(); List lodNodeList = new ArrayList<>(); + if (chunk == null) throw new IllegalArgumentException("generateLodFromChunk given a null chunk"); + + for (int i = 0; i < detail.dataPointLengthCount * detail.dataPointLengthCount; i++) { int startX = detail.startX[i]; @@ -151,9 +160,6 @@ public class LodNodeBuilder int endX = detail.endX[i]; int endZ = detail.endZ[i]; - // TODO startX/Z and endX/Z are relative coordinates - // getMin/Max appear to return world block coordinates - Color color = generateLodColorForArea(chunk, config, startX, startZ, endX, endZ); short height; @@ -170,10 +176,11 @@ public class LodNodeBuilder startZ, endX, endZ); depth = 0; } + lodNodeList.add(new LodQuadTreeNode((byte) detail.detailLevel, LodUtil.convertLevelPos(chunk.getPos().getMinBlockX() + startX, 0, detail.detailLevel), LodUtil.convertLevelPos(chunk.getPos().getMinBlockZ() + startZ, 0, detail.detailLevel), - new LodDataPoint(height, depth, color), DistanceGenerationMode.SERVER)); + new LodDataPoint(height, depth, color), config.distanceGenerationMode)); } diff --git a/src/main/java/com/seibel/lod/objects/LodQuadTree.java b/src/main/java/com/seibel/lod/objects/LodQuadTree.java index 79f155843..b2307c1ac 100644 --- a/src/main/java/com/seibel/lod/objects/LodQuadTree.java +++ b/src/main/java/com/seibel/lod/objects/LodQuadTree.java @@ -568,7 +568,7 @@ public class LodQuadTree * setter for lodNodeData, to maintain a correct relationship between worlds * this method forces an update on all parent nodes. * - * @param newLodQuadTreeNode data to set + * @param newLodQuadTreeNode data to set */ public void setLodNodeData(LodQuadTreeNode newLodQuadTreeNode) { diff --git a/src/main/java/com/seibel/lod/objects/LodQuadTreeNode.java b/src/main/java/com/seibel/lod/objects/LodQuadTreeNode.java index 22f4f15a9..aa22bb842 100644 --- a/src/main/java/com/seibel/lod/objects/LodQuadTreeNode.java +++ b/src/main/java/com/seibel/lod/objects/LodQuadTreeNode.java @@ -283,13 +283,10 @@ public class LodQuadTreeNode } else { - // TODO use the average height/depth, otherwise some areas look flat - // when they shouldn't. - // get the lowest height from the all the given LodQuadTreeNodes - short height = (short) dataList.stream().mapToInt(x -> (int) x.getLodDataPoint().height).min().getAsInt(); + short height = (short) (dataList.stream().mapToInt(x -> (int) x.getLodDataPoint().height).sum() / dataList.size()); // get the highest depth - short depth = (short) dataList.stream().mapToInt(x -> (int) x.getLodDataPoint().depth).max().getAsInt(); + short depth = (short) (dataList.stream().mapToInt(x -> (int) x.getLodDataPoint().depth).sum() / dataList.size()); // get the average color int red = dataList.stream().mapToInt(x -> x.getLodDataPoint().color.getRed()).sum() / dataList.size(); @@ -297,7 +294,7 @@ public class LodQuadTreeNode int blue = dataList.stream().mapToInt(x -> x.getLodDataPoint().color.getBlue()).sum() / dataList.size(); Color color = new Color(red,green,blue); - lodDataPoint = new LodDataPoint(height,depth,color); + lodDataPoint = new LodDataPoint(height, depth, color); // the new complexity is equal to the lowest complexity of the list diff --git a/src/main/java/com/seibel/lod/proxy/ClientProxy.java b/src/main/java/com/seibel/lod/proxy/ClientProxy.java index 1dbaa16bb..660ec12e4 100644 --- a/src/main/java/com/seibel/lod/proxy/ClientProxy.java +++ b/src/main/java/com/seibel/lod/proxy/ClientProxy.java @@ -160,10 +160,10 @@ public class ClientProxy // LodConfig.CLIENT.drawLODs.set(true); // LodConfig.CLIENT.debugMode.set(false); - LodConfig.CLIENT.maxDrawDetail.set(LodDetail.SINGLE); - LodConfig.CLIENT.maxGenerationDetail.set(LodDetail.SINGLE); + LodConfig.CLIENT.maxDrawDetail.set(LodDetail.FULL); + LodConfig.CLIENT.maxGenerationDetail.set(LodDetail.FULL); - LodConfig.CLIENT.lodChunkRadiusMultiplier.set(16); + LodConfig.CLIENT.lodChunkRadiusMultiplier.set(12); LodConfig.CLIENT.fogDistance.set(FogDistance.FAR); LodConfig.CLIENT.fogDrawOverride.set(FogDrawOverride.NEVER_DRAW_FOG); LodConfig.CLIENT.shadingMode.set(ShadingMode.DARKEN_SIDES); @@ -184,7 +184,7 @@ public class ClientProxy @SubscribeEvent public void chunkLoadEvent(ChunkEvent.Load event) { - lodNodeBuilder.generateLodNodeAsync(event.getChunk(), lodWorld, event.getWorld()); + lodNodeBuilder.generateLodNodeAsync(event.getChunk(), lodWorld, event.getWorld(), DistanceGenerationMode.SERVER); } @SubscribeEvent