From 953c2b2e922f8a73b8a4d7b6c8fa8a2a38d4c394 Mon Sep 17 00:00:00 2001 From: James Seibel Date: Mon, 9 Aug 2021 22:25:49 -0500 Subject: [PATCH] Improve color generation and fix Biome Only generation --- .../seibel/lod/builders/LodBuilderConfig.java | 8 +- .../seibel/lod/builders/LodChunkBuilder.java | 10 +- .../lod/builders/LodNodeBufferBuilder.java | 4 +- .../seibel/lod/builders/LodNodeBuilder.java | 221 ++++++++++++------ .../worldGeneration/LodNodeGenWorker.java | 4 +- 5 files changed, 170 insertions(+), 77 deletions(-) diff --git a/src/main/java/com/seibel/lod/builders/LodBuilderConfig.java b/src/main/java/com/seibel/lod/builders/LodBuilderConfig.java index 0c2907d6e..24adcd7ad 100644 --- a/src/main/java/com/seibel/lod/builders/LodBuilderConfig.java +++ b/src/main/java/com/seibel/lod/builders/LodBuilderConfig.java @@ -35,10 +35,10 @@ public class LodBuilderConfig /** default true */ public boolean useSolidBlocksInColorGen; - /** default settings for a normal chunk - * useHeightmap = false - * useBiomeColors = false - * useSolidBlocksInColorGen = true + /** default settings for a normal chunk
+ * useHeightmap = false
+ * useBiomeColors = false
+ * useSolidBlocksInColorGen = true
*/ public LodBuilderConfig() { diff --git a/src/main/java/com/seibel/lod/builders/LodChunkBuilder.java b/src/main/java/com/seibel/lod/builders/LodChunkBuilder.java index 462929c55..ff876a5fb 100644 --- a/src/main/java/com/seibel/lod/builders/LodChunkBuilder.java +++ b/src/main/java/com/seibel/lod/builders/LodChunkBuilder.java @@ -50,7 +50,7 @@ import net.minecraft.world.gen.Heightmap; * (specifically: Lod World, Dimension, Region, and Chunk objects) * * @author James Seibel - * @version 7-26-2021 + * @version 8-9-2021 */ public class LodChunkBuilder { @@ -417,7 +417,9 @@ public class LodChunkBuilder } else { - colorInt = biome.getGrassColor(x, z); + Color tmp = LodUtil.intToColor(biome.getGrassColor(x, z)); + tmp = tmp.darker(); + colorInt = LodUtil.colorToInt(tmp); } } else @@ -469,7 +471,9 @@ public class LodChunkBuilder // block special cases if (blockState == Blocks.AIR.defaultBlockState()) { - colorInt = biome.getGrassColor(x, z); + Color tmp = LodUtil.intToColor(biome.getGrassColor(x, z)); + tmp = tmp.darker(); + colorInt = LodUtil.colorToInt(tmp); } else if (blockState == Blocks.MYCELIUM.defaultBlockState()) { diff --git a/src/main/java/com/seibel/lod/builders/LodNodeBufferBuilder.java b/src/main/java/com/seibel/lod/builders/LodNodeBufferBuilder.java index 170eff377..c030a51d8 100644 --- a/src/main/java/com/seibel/lod/builders/LodNodeBufferBuilder.java +++ b/src/main/java/com/seibel/lod/builders/LodNodeBufferBuilder.java @@ -44,7 +44,7 @@ import net.minecraftforge.common.WorldWorkerManager; * This object is used to create NearFarBuffer objects. * * @author James Seibel - * @version 8-7-2021 + * @version 8-9-2021 */ public class LodNodeBufferBuilder { @@ -176,7 +176,7 @@ public class LodNodeBufferBuilder startX + // offset so the center LOD block is centered underneath the player 8; // I'm not sure what this is correcting exactly but with it the chunks line up. // 8 works for LODs the size of chunks - double yOffset = 1; // TODO this offset should be done in the LOD generation + double yOffset = 0; double zOffset = (LodQuadTreeNode.CHUNK_WIDTH * j) + startZ + 8; LodQuadTreeNode lod = lodDim.getLodFromCoordinates(new ChunkPos(chunkX, chunkZ), LodQuadTreeNode.CHUNK_LEVEL); diff --git a/src/main/java/com/seibel/lod/builders/LodNodeBuilder.java b/src/main/java/com/seibel/lod/builders/LodNodeBuilder.java index a13d29fa0..3373df446 100644 --- a/src/main/java/com/seibel/lod/builders/LodNodeBuilder.java +++ b/src/main/java/com/seibel/lod/builders/LodNodeBuilder.java @@ -22,17 +22,21 @@ import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import com.seibel.lod.enums.DistanceGenerationMode; +import com.seibel.lod.objects.LodChunk; import com.seibel.lod.objects.LodDataPoint; import com.seibel.lod.objects.LodQuadTreeDimension; import com.seibel.lod.objects.LodQuadTreeNode; import com.seibel.lod.objects.LodQuadTreeWorld; import com.seibel.lod.util.LodUtil; +import net.minecraft.block.AbstractPlantBlock; import net.minecraft.block.BlockState; import net.minecraft.block.Blocks; -import net.minecraft.block.FlowingFluidBlock; +import net.minecraft.block.BushBlock; import net.minecraft.block.GrassBlock; +import net.minecraft.block.IGrowable; import net.minecraft.block.LeavesBlock; +import net.minecraft.block.material.MaterialColor; import net.minecraft.world.DimensionType; import net.minecraft.world.IWorld; import net.minecraft.world.biome.Biome; @@ -40,6 +44,14 @@ import net.minecraft.world.chunk.ChunkSection; import net.minecraft.world.chunk.IChunk; 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 James Seibel + * @version 8-9-2021 + */ public class LodNodeBuilder { private ExecutorService lodGenThreadPool = Executors.newSingleThreadExecutor(); @@ -137,9 +149,16 @@ public class LodNodeBuilder { short height; short depth; - /**TODO I HAVE TO RE-ADD THE HEIGHTMAP**/ - height = determineHeightPointForArea(chunk.getSections(), startX, startZ, endX, endZ); - depth = determineBottomPointForArea(chunk.getSections(), startX, startZ, endX, endZ); + if (!config.useHeightmap) + { + height = determineHeightPointForArea(chunk.getSections(), startX, startZ, endX, endZ); + depth = determineBottomPointForArea(chunk.getSections(), startX, startZ, endX, endZ); + } + else + { + height = determineHeightPoint(chunk.getOrCreateHeightmapUnprimed(LodChunk.DEFAULT_HEIGHTMAP), startX, startZ, endX, endZ); + depth = 0; + } return new LodQuadTreeNode(LodQuadTreeNode.CHUNK_LEVEL, chunk.getPos().x, chunk.getPos().z, new LodDataPoint(height, depth, color), DistanceGenerationMode.SERVER); } @@ -228,7 +247,7 @@ public class LodNodeBuilder { // enough blocks in this // layer to count as an // LOD point - return (short) (y + (section * CHUNK_SECTION_HEIGHT)); + return (short) (y + 1 + (section * CHUNK_SECTION_HEIGHT)); } } } @@ -243,7 +262,6 @@ public class LodNodeBuilder { /** * Find the highest point from the Top */ - @SuppressWarnings("unused") private short determineHeightPoint(Heightmap heightmap, int startX, int startZ, int endX, int endZ) { @@ -312,49 +330,15 @@ public class LodNodeBuilder { if (config.useBiomeColors) { - // the bit shift is equivalent to dividing by 4 - Biome biome = chunk.getBiomes().getNoiseBiome(x >> 2, y + i * chunkSections.length >> 2, z >> 2); - - if (biome.getBiomeCategory() == Biome.Category.OCEAN || - biome.getBiomeCategory() == Biome.Category.RIVER) - { - if (config.useSolidBlocksInColorGen && - blockState != Blocks.WATER.defaultBlockState()) - { - // non-water block - colorInt = getColorForBlock(x, z, blockState, biome); - } - else - { - // water block - colorInt = biome.getWaterColor(); - } - } - else if (biome.getBiomeCategory() == Biome.Category.EXTREME_HILLS) - { - colorInt = Blocks.STONE.defaultMaterialColor().col; - } - else if (biome.getBiomeCategory() == Biome.Category.ICY) - { - colorInt = LodUtil.colorToInt(Color.WHITE); - } - else if (biome.getBiomeCategory() == Biome.Category.THEEND) - { - colorInt = Blocks.END_STONE.defaultBlockState().materialColor.col; - } - else if (config.useSolidBlocksInColorGen) - { - colorInt = getColorForBlock(x, z, blockState, biome); - } - else - { - colorInt = biome.getGrassColor(x, z); - } + // I have no idea why I need to bit shift to the right, but + // if I don't the biomes don't show up correctly. + Biome biome = chunk.getBiomes().getNoiseBiome(x >> 2, y + 1 * chunkSections.length >> 2, z >> 2); + colorInt = getColorForBiome(x,z, biome); } else { - // I have no idea why I need to bit shift to the right, but - // if I don't the biomes don't show up correctly. + + // the bit shift is equivalent to dividing by 4 Biome biome = chunk.getBiomes().getNoiseBiome(x >> 2, y + i * chunkSections.length >> 2, z >> 2); colorInt = getColorForBlock(x,z, blockState, biome); } @@ -389,30 +373,126 @@ public class LodNodeBuilder { } - /** + + + /** * Returns a color int for a given block. */ private int getColorForBlock(int x, int z, BlockState blockState, Biome biome) + { + int colorInt = 0; + + // block special cases + if (blockState == Blocks.AIR.defaultBlockState()) + { + Color tmp = LodUtil.intToColor(biome.getGrassColor(x, z)); + tmp = tmp.darker(); + colorInt = LodUtil.colorToInt(tmp); + } + else if (blockState == Blocks.MYCELIUM.defaultBlockState()) + { + colorInt = MaterialColor.COLOR_LIGHT_GRAY.col; + } + + // plant life + else if (blockState.getBlock() instanceof LeavesBlock) + { + Color leafColor = LodUtil.intToColor(biome.getFoliageColor()).darker(); + colorInt = LodUtil.colorToInt(leafColor); + } + else if (blockState.getBlock() instanceof GrassBlock || + blockState.getBlock() instanceof AbstractPlantBlock || + blockState.getBlock() instanceof BushBlock || + blockState.getBlock() instanceof IGrowable) + { + Color tmp = LodUtil.intToColor(biome.getGrassColor(x, z)); + tmp = tmp.darker(); + colorInt = LodUtil.colorToInt(tmp); + } + + // water + else if (blockState.getBlock() == Blocks.WATER) + { + colorInt = biome.getWaterColor(); + } + + // everything else + else + { + colorInt = blockState.materialColor.col; + } + + return colorInt; + } + + /** + * Returns a color int for the given biome. + */ + private int getColorForBiome(int x, int z, Biome biome) { - int colorInt = 0; - - if (blockState == Blocks.AIR.defaultBlockState()) { - colorInt = biome.getGrassColor(x, z); - } else if (blockState.getBlock() instanceof LeavesBlock) { - Color leafColor = LodUtil.intToColor(biome.getFoliageColor()).darker(); - colorInt = LodUtil.colorToInt(leafColor); - } else if (blockState.getBlock() instanceof GrassBlock) { - colorInt = biome.getGrassColor(x, z); - } else if (blockState.getBlock() instanceof FlowingFluidBlock) { - colorInt = biome.getWaterColor(); - } else { - colorInt = blockState.materialColor.col; - } - - return colorInt; - } - - + int colorInt = 0; + + switch(biome.getBiomeCategory()) + { + + case NETHER: + colorInt = Blocks.BEDROCK.defaultBlockState().materialColor.col; + break; + + case THEEND: + colorInt = Blocks.END_STONE.defaultBlockState().materialColor.col; + break; + + + + case BEACH: + case DESERT: + colorInt = Blocks.SAND.defaultBlockState().materialColor.col; + break; + + case EXTREME_HILLS: + colorInt = Blocks.STONE.defaultMaterialColor().col; + break; + + case MUSHROOM: + colorInt = MaterialColor.COLOR_LIGHT_GRAY.col; + break; + + case ICY: + colorInt = Blocks.SNOW.defaultMaterialColor().col; + break; + + case MESA: + colorInt = Blocks.RED_SAND.defaultMaterialColor().col; + break; + + case OCEAN: + case RIVER: + colorInt = biome.getWaterColor(); + break; + + + case NONE: + case FOREST: + case TAIGA: + case JUNGLE: + case PLAINS: + case SAVANNA: + case SWAMP: + default: + Color tmp = LodUtil.intToColor(biome.getGrassColor(x, z)); + tmp = tmp.darker(); + colorInt = LodUtil.colorToInt(tmp); + break; + + } + + + return colorInt; + } + + + /** * Is the layer between the given X, Z, and dataIndex * values a valid LOD point? @@ -439,4 +519,13 @@ public class LodNodeBuilder { return false; } + + + + + + + + + } 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 6f7e4ceee..7626308a0 100644 --- a/src/main/java/com/seibel/lod/builders/worldGeneration/LodNodeGenWorker.java +++ b/src/main/java/com/seibel/lod/builders/worldGeneration/LodNodeGenWorker.java @@ -378,7 +378,7 @@ public class LodNodeGenWorker implements IWorker IceAndSnowFeature snowFeature = new IceAndSnowFeature(NoFeatureConfig.CODEC); snowFeature.place(lodServerWorld, chunkGen, serverWorld.random, chunk.getPos().getWorldPosition(), null); - LodQuadTreeNode lod = lodNodeBuilder.generateLodNodeFromChunk(chunk, new LodBuilderConfig(true, true, false)); + LodQuadTreeNode lod = lodNodeBuilder.generateLodNodeFromChunk(chunk, new LodBuilderConfig()); lodDim.addNode(lod); } @@ -505,7 +505,7 @@ public class LodNodeGenWorker implements IWorker // generate a Lod like normal - LodQuadTreeNode lod = lodNodeBuilder.generateLodNodeFromChunk(chunk, new LodBuilderConfig(true, true, false)); + LodQuadTreeNode lod = lodNodeBuilder.generateLodNodeFromChunk(chunk, new LodBuilderConfig()); lodDim.addNode(lod); }