From ed92a3ed6bbd65a7dad0e86e91b3771917337d01 Mon Sep 17 00:00:00 2001 From: dags- Date: Thu, 26 Mar 2020 12:09:05 +0000 Subject: [PATCH] - ensure order that river regions are visited - fix for tundra tree density - tweaks to jungle tree densities - increase gen region size --- .../main/java/com/terraforged/app/Cache.java | 2 +- .../core/region/gen/GenContext.java | 21 +++++ .../core/region/{ => gen}/RegionCache.java | 3 +- .../region/{ => gen}/RegionCacheFactory.java | 2 +- .../region/{ => gen}/RegionGenerator.java | 39 ++++++---- .../core/world/rivermap/RiverMap.java | 54 +++++-------- .../core/world/rivermap/RiverRegionList.java | 20 +++-- .../mod/chunk/TerraChunkGenerator.java | 6 +- .../mod/chunk/test/TestChunkGenerator.java | 4 +- .../mod/decorator/base/ErosionDecorator.java | 5 +- .../terraforged/mod/gui/preview/Preview.java | 2 +- .../terraforged/features/trees/jungle.json | 4 + .../features/trees/jungle_edge.json | 44 +++++++++++ .../features/trees/jungle_hills.json | 77 +++++++++++++++++++ .../data/terraforged/features/trees/pine.json | 3 +- .../terraforged/features/trees/spruce.json | 5 +- .../features/trees/spruce_tundra.json | 42 ++++++++++ 17 files changed, 255 insertions(+), 78 deletions(-) create mode 100644 TerraForgedCore/src/main/java/com/terraforged/core/region/gen/GenContext.java rename TerraForgedCore/src/main/java/com/terraforged/core/region/{ => gen}/RegionCache.java (97%) rename TerraForgedCore/src/main/java/com/terraforged/core/region/{ => gen}/RegionCacheFactory.java (96%) rename TerraForgedCore/src/main/java/com/terraforged/core/region/{ => gen}/RegionGenerator.java (80%) create mode 100644 TerraForgedMod/src/main/resources/data/terraforged/features/trees/jungle_edge.json create mode 100644 TerraForgedMod/src/main/resources/data/terraforged/features/trees/jungle_hills.json create mode 100644 TerraForgedMod/src/main/resources/data/terraforged/features/trees/spruce_tundra.json diff --git a/TerraForgedApp/src/main/java/com/terraforged/app/Cache.java b/TerraForgedApp/src/main/java/com/terraforged/app/Cache.java index 7a091c0..17aff83 100644 --- a/TerraForgedApp/src/main/java/com/terraforged/app/Cache.java +++ b/TerraForgedApp/src/main/java/com/terraforged/app/Cache.java @@ -27,7 +27,7 @@ package com.terraforged.app; import com.terraforged.core.cell.Cell; import com.terraforged.core.region.Region; -import com.terraforged.core.region.RegionGenerator; +import com.terraforged.core.region.gen.RegionGenerator; import com.terraforged.core.settings.Settings; import com.terraforged.core.util.concurrent.ThreadPool; import com.terraforged.core.world.GeneratorContext; diff --git a/TerraForgedCore/src/main/java/com/terraforged/core/region/gen/GenContext.java b/TerraForgedCore/src/main/java/com/terraforged/core/region/gen/GenContext.java new file mode 100644 index 0000000..7b60433 --- /dev/null +++ b/TerraForgedCore/src/main/java/com/terraforged/core/region/gen/GenContext.java @@ -0,0 +1,21 @@ +package com.terraforged.core.region.gen; + +import com.terraforged.core.world.WorldGenerator; +import com.terraforged.core.world.WorldGeneratorFactory; +import com.terraforged.core.world.rivermap.RiverRegionList; + +import java.util.function.Supplier; + +public class GenContext { + + public final WorldGenerator generator; + public final RiverRegionList rivers = new RiverRegionList(); + + public GenContext(WorldGenerator generator) { + this.generator = generator; + } + + public static Supplier supplier(WorldGeneratorFactory factory) { + return () -> new GenContext(factory.get()); + } +} diff --git a/TerraForgedCore/src/main/java/com/terraforged/core/region/RegionCache.java b/TerraForgedCore/src/main/java/com/terraforged/core/region/gen/RegionCache.java similarity index 97% rename from TerraForgedCore/src/main/java/com/terraforged/core/region/RegionCache.java rename to TerraForgedCore/src/main/java/com/terraforged/core/region/gen/RegionCache.java index 4a2a3e5..53b1ed8 100644 --- a/TerraForgedCore/src/main/java/com/terraforged/core/region/RegionCache.java +++ b/TerraForgedCore/src/main/java/com/terraforged/core/region/gen/RegionCache.java @@ -23,8 +23,9 @@ * SOFTWARE. */ -package com.terraforged.core.region; +package com.terraforged.core.region.gen; +import com.terraforged.core.region.Region; import com.terraforged.core.region.chunk.ChunkReader; import com.terraforged.core.util.concurrent.Disposable; import com.terraforged.core.util.concurrent.cache.Cache; diff --git a/TerraForgedCore/src/main/java/com/terraforged/core/region/RegionCacheFactory.java b/TerraForgedCore/src/main/java/com/terraforged/core/region/gen/RegionCacheFactory.java similarity index 96% rename from TerraForgedCore/src/main/java/com/terraforged/core/region/RegionCacheFactory.java rename to TerraForgedCore/src/main/java/com/terraforged/core/region/gen/RegionCacheFactory.java index 32d7326..27c2c58 100644 --- a/TerraForgedCore/src/main/java/com/terraforged/core/region/RegionCacheFactory.java +++ b/TerraForgedCore/src/main/java/com/terraforged/core/region/gen/RegionCacheFactory.java @@ -23,7 +23,7 @@ * SOFTWARE. */ -package com.terraforged.core.region; +package com.terraforged.core.region.gen; import com.terraforged.core.world.WorldGeneratorFactory; diff --git a/TerraForgedCore/src/main/java/com/terraforged/core/region/RegionGenerator.java b/TerraForgedCore/src/main/java/com/terraforged/core/region/gen/RegionGenerator.java similarity index 80% rename from TerraForgedCore/src/main/java/com/terraforged/core/region/RegionGenerator.java rename to TerraForgedCore/src/main/java/com/terraforged/core/region/gen/RegionGenerator.java index dc8407c..40e1685 100644 --- a/TerraForgedCore/src/main/java/com/terraforged/core/region/RegionGenerator.java +++ b/TerraForgedCore/src/main/java/com/terraforged/core/region/gen/RegionGenerator.java @@ -23,10 +23,13 @@ * SOFTWARE. */ -package com.terraforged.core.region; +package com.terraforged.core.region.gen; +import com.terraforged.core.region.Region; +import com.terraforged.core.region.RegionFactory; import com.terraforged.core.region.legacy.LegacyRegion; import com.terraforged.core.util.concurrent.Disposable; +import com.terraforged.core.util.concurrent.ObjectPool; import com.terraforged.core.util.concurrent.ThreadPool; import com.terraforged.core.util.concurrent.cache.CacheEntry; import com.terraforged.core.world.WorldGenerator; @@ -42,7 +45,7 @@ public class RegionGenerator implements RegionExtent { private final int border; private final RegionFactory regions; private final ThreadPool threadPool; - private final ThreadLocal genPool; + private final ObjectPool genPool; private final Disposable.Listener disposalListener; private RegionGenerator(Builder builder) { @@ -50,7 +53,7 @@ public class RegionGenerator implements RegionExtent { this.border = builder.border; this.threadPool = builder.threadPool; this.regions = builder.regionFactory; - this.genPool = ThreadLocal.withInitial(builder.factory); + this.genPool = new ObjectPool<>(6, GenContext.supplier(builder.factory)); this.disposalListener = region -> {}; } @@ -99,13 +102,17 @@ public class RegionGenerator implements RegionExtent { } public Region generateRegion(int regionX, int regionZ) { - WorldGenerator generator = genPool.get(); - Region region = regions.create(regionX, regionZ, factor, border, disposalListener); - RiverRegionList rivers = generator.getHeightmap().getRiverMap().getRivers(region); - region.generateBase(generator.getHeightmap()); - region.generateRivers(generator.getHeightmap(), rivers); - postProcess(region, generator); - return region; + try (ObjectPool.Item item = genPool.get()) { + RiverRegionList rivers = item.getValue().rivers; + WorldGenerator generator = item.getValue().generator; + Region region = regions.create(regionX, regionZ, factor, border, disposalListener); + generator.getHeightmap().getRiverMap().getRivers(region, rivers); + region.generateBase(generator.getHeightmap()); + region.generateRivers(generator.getHeightmap(), rivers); + postProcess(region, generator); + rivers.clear(); + return region; + } } private void postProcess(Region region, WorldGenerator generator) { @@ -114,11 +121,13 @@ public class RegionGenerator implements RegionExtent { } public Region generateRegion(float centerX, float centerZ, float zoom, boolean filter) { - WorldGenerator generator = genPool.get(); - Region region = regions.create(0, 0, factor, border, disposalListener); - region.generateZoom(generator.getHeightmap(), centerX, centerZ, zoom); - postProcess(region, generator, centerX, centerZ, zoom, filter); - return region; + try (ObjectPool.Item item = genPool.get()) { + WorldGenerator generator = item.getValue().generator; + Region region = regions.create(0, 0, factor, border, disposalListener); + region.generateZoom(generator.getHeightmap(), centerX, centerZ, zoom); + postProcess(region, generator, centerX, centerZ, zoom, filter); + return region; + } } private void postProcess(Region region, WorldGenerator generator, float centerX, float centerZ, float zoom, boolean filter) { diff --git a/TerraForgedCore/src/main/java/com/terraforged/core/world/rivermap/RiverMap.java b/TerraForgedCore/src/main/java/com/terraforged/core/world/rivermap/RiverMap.java index 822a6a9..c79f54a 100644 --- a/TerraForgedCore/src/main/java/com/terraforged/core/world/rivermap/RiverMap.java +++ b/TerraForgedCore/src/main/java/com/terraforged/core/world/rivermap/RiverMap.java @@ -85,10 +85,22 @@ public class RiverMap { } public RiverRegionList getRivers(Region region) { - return getRivers(region.getBlockX(), region.getBlockZ()); + RiverRegionList rivers = new RiverRegionList(); + getRivers(region.getBlockX(), region.getBlockZ(), rivers); + return rivers; } public RiverRegionList getRivers(int blockX, int blockZ) { + RiverRegionList rivers = new RiverRegionList(); + getRivers(blockX, blockZ, rivers); + return rivers; + } + + public void getRivers(Region region, RiverRegionList rivers) { + getRivers(region.getBlockX(), region.getBlockZ(), rivers); + } + + public void getRivers(int blockX, int blockZ, RiverRegionList rivers) { int rx = RiverRegion.blockToRegion(blockX); int rz = RiverRegion.blockToRegion(blockZ); @@ -102,48 +114,18 @@ public class RiverMap { int maxX = Math.max(0, qx); int maxZ = Math.max(0, qz); - RiverRegionList list = new RiverRegionList(); + rivers.reset(); for (int dz = minZ; dz <= maxZ; dz++) { for (int dx = minX; dx <= maxX; dx++) { - list.add(getRegion(rx + dx, rz + dz)); + rivers.add(getRegion(rx + dx, rz + dz)); } } - - return list; } public void apply(Cell cell, float x, float z) { - int rx = RiverRegion.blockToRegion((int) x); - int rz = RiverRegion.blockToRegion((int) z); - - // check which quarter of the region pos (x,y) is in & get the neighbouring regions' relative coords - int qx = x < RiverRegion.regionToBlock(rx) + QUAD_SIZE ? -1 : 1; - int qz = z < RiverRegion.regionToBlock(rz) + QUAD_SIZE ? -1 : 1; - - // relative positions of neighbouring regions - int minX = Math.min(0, qx); - int minZ = Math.min(0, qz); - int maxX = Math.max(0, qx); - int maxZ = Math.max(0, qz); - - // queue up the 4 nearest reiver regions - int index = 0; - CacheEntry[] entries = new CacheEntry[4]; - for (int dz = minZ; dz <= maxZ; dz++) { - for (int dx = minX; dx <= maxX; dx++) { - entries[index++] = getRegion(rx + dx, rz + dz); - } - } - - int count = 0; - while (count < index) { - for (CacheEntry entry : entries) { - if (entry.isDone()) { - count++; - entry.get().apply(cell, x, z); - } - } - } + RiverRegionList rivers = new RiverRegionList(); + getRivers((int) x, (int) z, rivers); + rivers.apply(cell, x, z); } private CacheEntry getRegion(int rx, int rz) { diff --git a/TerraForgedCore/src/main/java/com/terraforged/core/world/rivermap/RiverRegionList.java b/TerraForgedCore/src/main/java/com/terraforged/core/world/rivermap/RiverRegionList.java index ce6bb17..9cdbc1c 100644 --- a/TerraForgedCore/src/main/java/com/terraforged/core/world/rivermap/RiverRegionList.java +++ b/TerraForgedCore/src/main/java/com/terraforged/core/world/rivermap/RiverRegionList.java @@ -5,6 +5,8 @@ import com.terraforged.core.util.concurrent.cache.CacheEntry; import com.terraforged.core.world.rivermap.river.RiverRegion; import com.terraforged.core.world.terrain.Terrain; +import java.util.Arrays; + public class RiverRegionList { private int index = 0; @@ -17,15 +19,17 @@ public class RiverRegionList { } } + protected void reset() { + index = 0; + } + + public void clear() { + Arrays.fill(regions, null); + } + public void apply(Cell cell, float x, float z) { - int complete = 0; - while (complete < regions.length) { - for (CacheEntry entry : regions) { - if (entry.isDone()) { - complete++; - entry.get().apply(cell, x, z); - } - } + for (CacheEntry entry : regions) { + entry.get().apply(cell, x, z); } } } diff --git a/TerraForgedMod/src/main/java/com/terraforged/mod/chunk/TerraChunkGenerator.java b/TerraForgedMod/src/main/java/com/terraforged/mod/chunk/TerraChunkGenerator.java index 57e868b..188e0a3 100644 --- a/TerraForgedMod/src/main/java/com/terraforged/mod/chunk/TerraChunkGenerator.java +++ b/TerraForgedMod/src/main/java/com/terraforged/mod/chunk/TerraChunkGenerator.java @@ -32,10 +32,10 @@ import com.terraforged.api.chunk.surface.SurfaceContext; import com.terraforged.api.chunk.surface.SurfaceManager; import com.terraforged.api.material.layer.LayerManager; import com.terraforged.core.cell.Cell; -import com.terraforged.core.region.RegionCache; -import com.terraforged.core.region.RegionGenerator; import com.terraforged.core.region.Size; import com.terraforged.core.region.chunk.ChunkReader; +import com.terraforged.core.region.gen.RegionCache; +import com.terraforged.core.region.gen.RegionGenerator; import com.terraforged.core.util.concurrent.ThreadPool; import com.terraforged.core.world.decorator.Decorator; import com.terraforged.feature.FeatureManager; @@ -390,7 +390,7 @@ public class TerraChunkGenerator extends ObfHelperChunkGenerator