From 94780baf98d09c58091132ed6afd82a95f4ec37a Mon Sep 17 00:00:00 2001 From: dags- Date: Fri, 5 Jun 2020 17:12:18 +0100 Subject: [PATCH] - more refactors - tweak how biome container is generated - block carvers from acting on chunks containing surface structures - added spawn type option --- Engine | 2 +- FeatureManager | 2 +- .../assets/terraforged/lang/en_us.json | 30 +++-- .../api/chunk/surface/builder/Delegate.java | 4 +- .../biome/modifier/BiomeModifierManager.java | 1 - .../biome/modifier/SandBiomeModifier.java | 2 +- .../biome/provider/BiomeAccess.java | 1 - .../biome/provider/BiomeProvider.java | 31 ----- .../terraforged/biome/spawn/SpawnHandler.java | 29 +++- .../chunk/TerraChunkGenerator.java | 25 +++- .../chunk/generator/BiomeGenerator.java | 12 +- .../chunk/generator/FeatureGenerator.java | 64 +++++++++ .../chunk/generator/SurfaceGenerator.java | 3 +- .../chunk/generator/TerrainCarver.java | 21 ++- .../chunk/generator/TerrainGenerator.java | 53 +------- .../chunk/util/TerraContainer.java | 126 +++++++----------- .../com/terraforged/data/LangGenerator.java | 2 +- .../terraforged/feature/TerrainHelper.java | 6 +- .../feature/context/ChanceContext.java | 2 +- .../com/terraforged/gui/SettingsScreen.java | 7 +- .../com/terraforged/gui/page/WorldPage.java | 6 +- .../com/terraforged/gui/preview/Preview.java | 6 +- .../terraforged/gui/preview/PreviewPage.java | 1 - .../gui/preview/again/PreviewSettings.java | 14 -- .../again => preview2}/MCRenderAPI.java | 2 +- .../again => preview2}/MCRenderBuffer.java | 2 +- .../Preview2.java => preview2/Preview.java} | 24 ++-- .../PreviewPage.java} | 21 ++- .../gui/preview2/PreviewSettings.java | 19 +++ .../terraforged/util/DummyBlockReader.java | 2 +- 30 files changed, 264 insertions(+), 256 deletions(-) create mode 100644 src/main/java/com/terraforged/chunk/generator/FeatureGenerator.java delete mode 100644 src/main/java/com/terraforged/gui/preview/again/PreviewSettings.java rename src/main/java/com/terraforged/gui/{preview/again => preview2}/MCRenderAPI.java (95%) rename src/main/java/com/terraforged/gui/{preview/again => preview2}/MCRenderBuffer.java (97%) rename src/main/java/com/terraforged/gui/{preview/again/Preview2.java => preview2/Preview.java} (81%) rename src/main/java/com/terraforged/gui/{preview/again/PreviewPage2.java => preview2/PreviewPage.java} (77%) create mode 100644 src/main/java/com/terraforged/gui/preview2/PreviewSettings.java diff --git a/Engine b/Engine index 5c77c56..a109829 160000 --- a/Engine +++ b/Engine @@ -1 +1 @@ -Subproject commit 5c77c566a5e5fd035d3421c1a3b58d7d3fc7bb9d +Subproject commit a109829d3734ddf3787c48854507f388d403471f diff --git a/FeatureManager b/FeatureManager index 8810eb5..5e99228 160000 --- a/FeatureManager +++ b/FeatureManager @@ -1 +1 @@ -Subproject commit 8810eb585979a995ae37351cb9339ff805053a99 +Subproject commit 5e99228c7d6eabffaf4f186b83069490f67e4512 diff --git a/generated/resources/assets/terraforged/lang/en_us.json b/generated/resources/assets/terraforged/lang/en_us.json index 6c00caf..09a36fc 100644 --- a/generated/resources/assets/terraforged/lang/en_us.json +++ b/generated/resources/assets/terraforged/lang/en_us.json @@ -1,5 +1,7 @@ { + "biome.terraforged.brice": "Brice", "biome.terraforged.cold_steppe": "Cold Steppe", + "biome.terraforged.dunes": "Dunes", "biome.terraforged.fir_forest": "Fir Forest", "biome.terraforged.flower_plains": "Flower Plains", "biome.terraforged.frozen_lake": "Frozen Lake", @@ -54,6 +56,9 @@ "display.terraforged.filters": "Filters", "display.terraforged.filters.erosion": "Erosion", "display.terraforged.filters.erosion.deposite_rate": "Deposite Rate", + "display.terraforged.filters.erosion.droplet_lifetime": "Droplet Lifetime", + "display.terraforged.filters.erosion.droplet_velocity": "Droplet Velocity", + "display.terraforged.filters.erosion.droplet_volume": "Droplet Volume", "display.terraforged.filters.erosion.erosion_rate": "Erosion Rate", "display.terraforged.filters.erosion.iterations": "Iterations", "display.terraforged.filters.smoothing": "Smoothing", @@ -61,7 +66,7 @@ "display.terraforged.filters.smoothing.smoothing_radius": "Smoothing Radius", "display.terraforged.filters.smoothing.smoothing_rate": "Smoothing Rate", "display.terraforged.preview": "Preview", - "display.terraforged.preview.mode": "Mode", + "display.terraforged.preview.display": "Display", "display.terraforged.preview.zoom": "Zoom", "display.terraforged.rivers": "Rivers", "display.terraforged.rivers.primary_rivers": "Primary Rivers", @@ -160,13 +165,14 @@ "display.terraforged.terrain.volcano.weight": "Weight", "display.terraforged.world": "World", "display.terraforged.world.continent": "Continent", + "display.terraforged.world.continent.continent_mode": "Continent Mode", "display.terraforged.world.continent.continent_scale": "Continent Scale", "display.terraforged.world.continent.continent_shape": "Continent Shape", "display.terraforged.world.continent.ocean_scale": "Ocean Scale", - "display.terraforged.world.levels": "Levels", - "display.terraforged.world.levels.sea_level": "Sea Level", - "display.terraforged.world.levels.world_height": "World Height", - "display.terraforged.world.world_type": "World Type", + "display.terraforged.world.properties": "Properties", + "display.terraforged.world.properties.sea_level": "Sea Level", + "display.terraforged.world.properties.spawn_type": "Spawn Type", + "display.terraforged.world.properties.world_height": "World Height", "generator.terraforged": "TerraForged", "generator.terratest": "TerraTest", "tooltip.terraforged.climate.biome_edge_shape.gain": "Controls the gain subsequent noise octaves", @@ -200,13 +206,14 @@ "tooltip.terraforged.features.strata_decorator": "Generates strata (rock layers) instead of just stone", "tooltip.terraforged.features.vanilla_water_features": "Controls whether vanilla lakes & springs should generate", "tooltip.terraforged.filters.erosion.deposite_rate": "Controls how quickly material is deposited (during erosion)", + "tooltip.terraforged.filters.erosion.droplet_lifetime": "Controls the number of iterations that a single water droplet is simulated for", + "tooltip.terraforged.filters.erosion.droplet_velocity": "Controls the starting velocity of the simulated water droplet", + "tooltip.terraforged.filters.erosion.droplet_volume": "Controls the starting volume of water that a simulated water droplet carries", "tooltip.terraforged.filters.erosion.erosion_rate": "Controls how quickly material dissolves (during erosion)", "tooltip.terraforged.filters.erosion.iterations": "Controls the number of erosion iterations", "tooltip.terraforged.filters.smoothing.iterations": "Controls the number of smoothing iterations", "tooltip.terraforged.filters.smoothing.smoothing_radius": "Controls the smoothing radius", "tooltip.terraforged.filters.smoothing.smoothing_rate": "Controls how strongly smoothing is applied", - "tooltip.terraforged.preview.mode": "Controls the rendering mode on the preview map", - "tooltip.terraforged.preview.zoom": "Controls the zoom level of the preview map", "tooltip.terraforged.rivers.primary_rivers.bank_width": "Controls the river-banks width", "tooltip.terraforged.rivers.primary_rivers.bed_depth": "Controls the depth of the river", "tooltip.terraforged.rivers.primary_rivers.bed_width": "Controls the river-bed width", @@ -279,10 +286,11 @@ "tooltip.terraforged.terrain.volcano.horizontal_scale": "Stretches or compresses the terrain horizontally", "tooltip.terraforged.terrain.volcano.vertical_scale": "Stretches or compresses the terrain vertically", "tooltip.terraforged.terrain.volcano.weight": "Controls how common this terrain type is", + "tooltip.terraforged.world.continent.continent_mode": "Controls the continent generator type", "tooltip.terraforged.world.continent.continent_scale": "Controls the size of continents", - "tooltip.terraforged.world.continent.continent_shape": "Controls how continent shapes calculated", + "tooltip.terraforged.world.continent.continent_shape": "Controls how continent shapes are calculated", "tooltip.terraforged.world.continent.ocean_scale": "Controls the amount of ocean between continents", - "tooltip.terraforged.world.levels.sea_level": "Controls the sea level", - "tooltip.terraforged.world.levels.world_height": "Controls the world height", - "tooltip.terraforged.world.world_type": "Controls the continent generator type" + "tooltip.terraforged.world.properties.sea_level": "Controls the sea level", + "tooltip.terraforged.world.properties.spawn_type": "Set whether spawn should be close to x=0,z=0 or the centre of the nearest continent", + "tooltip.terraforged.world.properties.world_height": "Controls the world height" } \ No newline at end of file diff --git a/src/main/java/com/terraforged/api/chunk/surface/builder/Delegate.java b/src/main/java/com/terraforged/api/chunk/surface/builder/Delegate.java index 47d8814..bfea46a 100644 --- a/src/main/java/com/terraforged/api/chunk/surface/builder/Delegate.java +++ b/src/main/java/com/terraforged/api/chunk/surface/builder/Delegate.java @@ -38,11 +38,11 @@ public class Delegate implements Surface { private final ConfiguredSurfaceBuilder surfaceBuilder; - private Delegate(Biome biome) { + public Delegate(Biome biome) { this(biome.getSurfaceBuilder()); } - private Delegate(ConfiguredSurfaceBuilder surfaceBuilder) { + public Delegate(ConfiguredSurfaceBuilder surfaceBuilder) { this.surfaceBuilder = surfaceBuilder; } diff --git a/src/main/java/com/terraforged/biome/modifier/BiomeModifierManager.java b/src/main/java/com/terraforged/biome/modifier/BiomeModifierManager.java index 084815b..bec1784 100644 --- a/src/main/java/com/terraforged/biome/modifier/BiomeModifierManager.java +++ b/src/main/java/com/terraforged/biome/modifier/BiomeModifierManager.java @@ -33,7 +33,6 @@ import com.terraforged.chunk.TerraContext; import com.terraforged.core.cell.Cell; import com.terraforged.world.biome.BiomeType; import com.terraforged.world.terrain.ITerrain; -import com.terraforged.world.terrain.TerrainType; import net.minecraft.world.biome.Biome; import java.util.ArrayList; diff --git a/src/main/java/com/terraforged/biome/modifier/SandBiomeModifier.java b/src/main/java/com/terraforged/biome/modifier/SandBiomeModifier.java index 8e43b28..98ace32 100644 --- a/src/main/java/com/terraforged/biome/modifier/SandBiomeModifier.java +++ b/src/main/java/com/terraforged/biome/modifier/SandBiomeModifier.java @@ -40,7 +40,7 @@ public class SandBiomeModifier extends AbstractMaxHeightModifier { private final Set biomes; public SandBiomeModifier(TerraContext context) { - super(context.seed, context.factory.getClimate(), 50, 2, context.levels.scale(16), context.levels.ground(10), context.levels.ground(25)); + super(context.seed, context.factory.getClimate(), 10, 1, context.levels.scale(8), context.levels.ground(10), context.levels.ground(25)); this.biomes = ForgeRegistries.BIOMES.getValues().stream() .filter(biome -> context.materials.isSand(biome.getSurfaceBuilderConfig().getTop().getBlock())) .collect(Collectors.toSet()); diff --git a/src/main/java/com/terraforged/biome/provider/BiomeAccess.java b/src/main/java/com/terraforged/biome/provider/BiomeAccess.java index a3b0ba8..ab31fb8 100644 --- a/src/main/java/com/terraforged/biome/provider/BiomeAccess.java +++ b/src/main/java/com/terraforged/biome/provider/BiomeAccess.java @@ -3,7 +3,6 @@ package com.terraforged.biome.provider; import com.terraforged.core.cell.Cell; import com.terraforged.world.heightmap.Levels; import com.terraforged.world.terrain.TerrainType; -import net.minecraft.util.math.BlockPos; import net.minecraft.world.biome.Biome; public class BiomeAccess { diff --git a/src/main/java/com/terraforged/biome/provider/BiomeProvider.java b/src/main/java/com/terraforged/biome/provider/BiomeProvider.java index 059057b..f5726d3 100644 --- a/src/main/java/com/terraforged/biome/provider/BiomeProvider.java +++ b/src/main/java/com/terraforged/biome/provider/BiomeProvider.java @@ -28,20 +28,14 @@ package com.terraforged.biome.provider; import com.google.common.collect.Sets; import com.terraforged.biome.map.BiomeMap; import com.terraforged.biome.modifier.BiomeModifierManager; -import com.terraforged.chunk.TerraChunkGenerator; import com.terraforged.chunk.TerraContext; -import com.terraforged.chunk.util.FastChunk; -import com.terraforged.chunk.util.TerraContainer; import com.terraforged.core.cell.Cell; import com.terraforged.core.concurrent.Resource; -import com.terraforged.core.region.chunk.ChunkReader; import com.terraforged.util.setup.SetupHooks; import com.terraforged.world.heightmap.WorldLookup; import com.terraforged.world.terrain.decorator.Decorator; import net.minecraft.util.math.BlockPos; import net.minecraft.world.biome.Biome; -import net.minecraft.world.chunk.ChunkPrimer; -import net.minecraft.world.chunk.IChunk; import java.util.Collections; import java.util.HashMap; @@ -148,15 +142,6 @@ public class BiomeProvider extends AbstractBiomeProvider { return decorators.getOrDefault(biome, Collections.emptyList()); } - public TerraContainer createBiomeContainer(ChunkReader chunkReader) { - TerraContainer.Builder builder = TerraContainer.builder(); - chunkReader.iterate((cell, dx, dz) -> { - Biome biome = getBiome(cell, chunkReader.getBlockX() + dx, chunkReader.getBlockZ() + dz); - builder.set(dx, dz, biome); - }); - return builder.build(chunkReader); - } - public Biome getBiome(Cell cell, int x, int z) { BiomeAccessor accessor = biomeAccess.getAccessor(cell); Biome biome = accessor.getBiome(biomeMap, cell); @@ -169,20 +154,4 @@ public class BiomeProvider extends AbstractBiomeProvider { public boolean canSpawnAt(Cell cell) { return cell.terrain != context.terrain.ocean && cell.terrain != context.terrain.deepOcean; } - - public static TerraContainer getBiomeContainer(TerraChunkGenerator generator, IChunk chunk) { - if (chunk.getBiomes() instanceof TerraContainer) { - return (TerraContainer) chunk.getBiomes(); - } - - ChunkReader view = generator.getChunkReader(chunk.getPos().x, chunk.getPos().z); - TerraContainer container = generator.getBiomeProvider().createBiomeContainer(view); - if (chunk instanceof ChunkPrimer) { - ((ChunkPrimer) chunk).func_225548_a_(container); - } else if (chunk instanceof FastChunk) { - ((FastChunk) chunk).setBiomes(container); - } - - return container; - } } diff --git a/src/main/java/com/terraforged/biome/spawn/SpawnHandler.java b/src/main/java/com/terraforged/biome/spawn/SpawnHandler.java index aee3084..188455a 100644 --- a/src/main/java/com/terraforged/biome/spawn/SpawnHandler.java +++ b/src/main/java/com/terraforged/biome/spawn/SpawnHandler.java @@ -3,7 +3,10 @@ package com.terraforged.biome.spawn; import com.terraforged.Log; import com.terraforged.biome.provider.BiomeProvider; import com.terraforged.world.continent.MutableVeci; +import com.terraforged.world.continent.SpawnType; import net.minecraft.util.math.BlockPos; +import net.minecraft.world.gen.ChunkGenerator; +import net.minecraft.world.gen.Heightmap; import net.minecraft.world.gen.feature.ConfiguredFeature; import net.minecraft.world.gen.feature.Feature; import net.minecraft.world.gen.feature.IFeatureConfig; @@ -19,12 +22,17 @@ public class SpawnHandler { public static void createSpawn(WorldEvent.CreateSpawnPosition event) { if (event.getWorld() instanceof ServerWorld) { ServerWorld world =(ServerWorld) event.getWorld(); - if (world.getChunkProvider().getChunkGenerator().getBiomeProvider() instanceof BiomeProvider) { + ChunkGenerator generator = world.getChunkProvider().getChunkGenerator(); + if (generator.getBiomeProvider() instanceof BiomeProvider) { Log.info("Searching for world spawn position"); - BiomeProvider provider = (BiomeProvider) world.getChunkProvider().getChunkGenerator().getBiomeProvider(); - BlockPos center = getSearchCenter(provider, true); + BiomeProvider provider = (BiomeProvider) generator.getBiomeProvider(); + BlockPos center = getSearchCenter(provider); SpawnSearch search = new SpawnSearch(center, provider); - BlockPos spawn = search.get(); + + // SpawnSearch uses a rough look-up that does not account for the effects of erosion which + // can add or remove from the heightmap depending on location. Use the chunk generator's + // surface lookup function to obtain the actual height + BlockPos spawn = getSurface(generator, search.get()); Log.info("Setting world spawn: {}", spawn); event.setCanceled(true); @@ -38,13 +46,20 @@ public class SpawnHandler { } } - private static BlockPos getSearchCenter(BiomeProvider provider, boolean continent) { - if (continent) { + private static BlockPos getSearchCenter(BiomeProvider provider) { + SpawnType spawnType = provider.getContext().terraSettings.world.properties.spawnType; + if (spawnType == SpawnType.WORLD_ORIGIN) { + return BlockPos.ZERO; + } else { MutableVeci pos = new MutableVeci(); provider.getContext().heightmap.getContinent().getNearestCenter(0, 0, pos); return new BlockPos(pos.x, 0, pos.z); } - return BlockPos.ZERO; + } + + private static BlockPos getSurface(ChunkGenerator generator, BlockPos pos) { + int surface = generator.func_222529_a(pos.getX(), pos.getZ(), Heightmap.Type.WORLD_SURFACE_WG); + return new BlockPos(pos.getX(), surface, pos.getZ()); } private static void createBonusChest(ServerWorld world, BlockPos pos) { diff --git a/src/main/java/com/terraforged/chunk/TerraChunkGenerator.java b/src/main/java/com/terraforged/chunk/TerraChunkGenerator.java index 0bf4a88..b3947e1 100644 --- a/src/main/java/com/terraforged/chunk/TerraChunkGenerator.java +++ b/src/main/java/com/terraforged/chunk/TerraChunkGenerator.java @@ -29,8 +29,15 @@ import com.terraforged.api.chunk.column.ColumnDecorator; import com.terraforged.api.chunk.surface.SurfaceManager; import com.terraforged.api.material.layer.LayerManager; import com.terraforged.biome.provider.BiomeProvider; -import com.terraforged.chunk.generator.*; +import com.terraforged.chunk.generator.BiomeGenerator; +import com.terraforged.chunk.generator.FeatureGenerator; +import com.terraforged.chunk.generator.MobGenerator; +import com.terraforged.chunk.generator.StructureGenerator; +import com.terraforged.chunk.generator.SurfaceGenerator; +import com.terraforged.chunk.generator.TerrainCarver; +import com.terraforged.chunk.generator.TerrainGenerator; import com.terraforged.core.cell.Cell; +import com.terraforged.core.region.Region; import com.terraforged.core.region.Size; import com.terraforged.core.region.chunk.ChunkReader; import com.terraforged.core.region.gen.RegionCache; @@ -47,7 +54,11 @@ import net.minecraft.world.IWorld; import net.minecraft.world.biome.Biome; import net.minecraft.world.biome.BiomeManager; import net.minecraft.world.chunk.IChunk; -import net.minecraft.world.gen.*; +import net.minecraft.world.gen.ChunkGenerator; +import net.minecraft.world.gen.GenerationSettings; +import net.minecraft.world.gen.GenerationStage; +import net.minecraft.world.gen.Heightmap; +import net.minecraft.world.gen.WorldGenRegion; import net.minecraft.world.gen.feature.template.TemplateManager; import net.minecraft.world.server.ServerWorld; @@ -63,6 +74,7 @@ public class TerraChunkGenerator extends ChunkGenerator { private final TerrainCarver terrainCarver; private final TerrainGenerator terrainGenerator; private final SurfaceGenerator surfaceGenerator; + private final FeatureGenerator featureGenerator; private final StructureGenerator structureGenerator; private final GeoManager geologyManager; @@ -84,6 +96,7 @@ public class TerraChunkGenerator extends ChunkGenerator { this.terrainCarver = new TerrainCarver(this); this.terrainGenerator = new TerrainGenerator(this); this.surfaceGenerator = new SurfaceGenerator(this); + this.featureGenerator = new FeatureGenerator(this); this.structureGenerator = new StructureGenerator(this); this.surfaceManager = TerraSetupFactory.createSurfaceManager(context); @@ -131,7 +144,7 @@ public class TerraChunkGenerator extends ChunkGenerator { @Override public final void decorate(WorldGenRegion region) { - terrainGenerator.generateFeatures(region); + featureGenerator.generateFeatures(region); } @Override @@ -238,6 +251,12 @@ public class TerraChunkGenerator extends ChunkGenerator { regionCache.queueRegion(rx, rz); } + public final Region getRegion(int chunkX, int chunkZ) { + int rx = regionCache.chunkToRegion(chunkX); + int rz = regionCache.chunkToRegion(chunkZ); + return regionCache.getRegion(rx, rz); + } + public final ChunkReader getChunkReader(int chunkX, int chunkZ) { return regionCache.getChunk(chunkX, chunkZ); } diff --git a/src/main/java/com/terraforged/chunk/generator/BiomeGenerator.java b/src/main/java/com/terraforged/chunk/generator/BiomeGenerator.java index 00a7f7f..208632c 100644 --- a/src/main/java/com/terraforged/chunk/generator/BiomeGenerator.java +++ b/src/main/java/com/terraforged/chunk/generator/BiomeGenerator.java @@ -2,11 +2,9 @@ package com.terraforged.chunk.generator; import com.terraforged.chunk.TerraChunkGenerator; import com.terraforged.chunk.util.TerraContainer; -import com.terraforged.core.region.chunk.ChunkReader; import com.terraforged.world.terrain.decorator.Decorator; import net.minecraft.util.math.ChunkPos; import net.minecraft.world.biome.Biome; -import net.minecraft.world.chunk.ChunkPrimer; import net.minecraft.world.chunk.IChunk; public class BiomeGenerator { @@ -19,15 +17,13 @@ public class BiomeGenerator { public void generateBiomes(IChunk chunk) { ChunkPos pos = chunk.getPos(); - ChunkReader reader = generator.getChunkReader(pos.x, pos.z); - TerraContainer container = generator.getBiomeProvider().createBiomeContainer(reader); - ((ChunkPrimer) chunk).func_225548_a_(container); + TerraContainer container = TerraContainer.getOrCreate(chunk, generator); // apply chunk-local heightmap modifications - preProcess(pos, reader, container); + preProcess(pos, container); } - private void preProcess(ChunkPos pos, ChunkReader chunk, TerraContainer container) { - chunk.iterate((cell, dx, dz) -> { + private void preProcess(ChunkPos pos, TerraContainer container) { + container.getChunkReader().iterate((cell, dx, dz) -> { Biome biome = container.getBiome(dx, dz); for (Decorator decorator : generator.getBiomeProvider().getDecorators(biome)) { if (decorator.apply(cell, pos.getXStart() + dx, pos.getZStart() + dz)) { diff --git a/src/main/java/com/terraforged/chunk/generator/FeatureGenerator.java b/src/main/java/com/terraforged/chunk/generator/FeatureGenerator.java new file mode 100644 index 0000000..fdcee66 --- /dev/null +++ b/src/main/java/com/terraforged/chunk/generator/FeatureGenerator.java @@ -0,0 +1,64 @@ +package com.terraforged.chunk.generator; + +import com.terraforged.api.chunk.column.ColumnDecorator; +import com.terraforged.api.chunk.column.DecoratorContext; +import com.terraforged.chunk.TerraChunkGenerator; +import com.terraforged.chunk.fix.RegionFix; +import com.terraforged.chunk.util.TerraContainer; +import com.terraforged.core.region.chunk.ChunkReader; +import com.terraforged.util.Environment; +import net.minecraft.util.math.BlockPos; +import net.minecraft.world.IWorld; +import net.minecraft.world.biome.Biome; +import net.minecraft.world.chunk.ChunkPrimer; +import net.minecraft.world.chunk.IChunk; +import net.minecraft.world.gen.Heightmap; +import net.minecraft.world.gen.WorldGenRegion; + +import java.util.List; + +public class FeatureGenerator { + + private final TerraChunkGenerator generator; + + public FeatureGenerator(TerraChunkGenerator generator) { + this.generator = generator; + } + + public final void generateFeatures(WorldGenRegion region) { + int chunkX = region.getMainChunkX(); + int chunkZ = region.getMainChunkZ(); + IChunk chunk = region.getChunk(chunkX, chunkZ); + TerraContainer container = TerraContainer.getOrCreate(chunk, generator); + + ChunkReader chunkReader = generator.getChunkReader(chunkX, chunkZ); + Biome biome = container.getFeatureBiome(chunkReader); + DecoratorContext context = generator.getContext().decorator(chunk); + + IWorld regionFix = new RegionFix(region, generator); + BlockPos pos = new BlockPos(context.blockX, 0, context.blockZ); + + // place biome features + generator.getFeatureManager().decorate(generator, regionFix, chunk, biome, pos); + + // run post processes on chunk + postProcess(chunkReader, container, context); + + // bake biome array & discard gen data + ((ChunkPrimer) chunk).func_225548_a_(container.bakeBiomes(Environment.isVanillaBiomes())); + } + + private void postProcess(ChunkReader chunk, TerraContainer container, DecoratorContext context) { + List decorators = generator.getPostProcessors(); + container.getChunkReader().iterate(context, (cell, dx, dz, ctx) -> { + int px = ctx.blockX + dx; + int pz = ctx.blockZ + dz; + int py = ctx.chunk.getTopBlockY(Heightmap.Type.WORLD_SURFACE_WG, dx, dz); + ctx.cell = cell; + ctx.biome = container.getBiome(dx, dz); + for (ColumnDecorator decorator : decorators) { + decorator.decorate(ctx.chunk, ctx, px, py, pz); + } + }); + } +} diff --git a/src/main/java/com/terraforged/chunk/generator/SurfaceGenerator.java b/src/main/java/com/terraforged/chunk/generator/SurfaceGenerator.java index 306b918..07ffa09 100644 --- a/src/main/java/com/terraforged/chunk/generator/SurfaceGenerator.java +++ b/src/main/java/com/terraforged/chunk/generator/SurfaceGenerator.java @@ -3,7 +3,6 @@ package com.terraforged.chunk.generator; import com.terraforged.api.chunk.column.ColumnDecorator; import com.terraforged.api.chunk.surface.ChunkSurfaceBuffer; import com.terraforged.api.chunk.surface.SurfaceContext; -import com.terraforged.biome.provider.BiomeProvider; import com.terraforged.chunk.TerraChunkGenerator; import com.terraforged.chunk.util.FastChunk; import com.terraforged.chunk.util.TerraContainer; @@ -25,7 +24,7 @@ public class SurfaceGenerator { } public final void generateSurface(WorldGenRegion world, IChunk chunk) { - TerraContainer container = BiomeProvider.getBiomeContainer(generator, chunk); + TerraContainer container = TerraContainer.getOrCreate(chunk, generator); ChunkSurfaceBuffer buffer = new ChunkSurfaceBuffer(FastChunk.wrap(chunk)); try (SurfaceContext context = generator.getContext().surface(buffer, generator.getSettings())) { diff --git a/src/main/java/com/terraforged/chunk/generator/TerrainCarver.java b/src/main/java/com/terraforged/chunk/generator/TerrainCarver.java index 8460d0f..92d5fd1 100644 --- a/src/main/java/com/terraforged/chunk/generator/TerrainCarver.java +++ b/src/main/java/com/terraforged/chunk/generator/TerrainCarver.java @@ -2,6 +2,7 @@ package com.terraforged.chunk.generator; import com.terraforged.chunk.TerraChunkGenerator; import com.terraforged.chunk.fix.ChunkCarverFix; +import com.terraforged.fm.template.StructureUtils; import net.minecraft.util.SharedSeedRandom; import net.minecraft.util.math.ChunkPos; import net.minecraft.world.biome.Biome; @@ -11,7 +12,6 @@ import net.minecraft.world.gen.GenerationStage; import net.minecraft.world.gen.carver.ConfiguredCarver; import java.util.BitSet; -import java.util.List; import java.util.ListIterator; public class TerrainCarver { @@ -23,26 +23,23 @@ public class TerrainCarver { } public void carveTerrain(BiomeManager biomes, IChunk chunk, GenerationStage.Carving type) { - // World carvers have hardcoded 'carvable' blocks which can be problematic with modded blocks - // AirCarverFix shims the actual blockstates to an equivalent carvable type + if (StructureUtils.hasOvergroundStructure(chunk)) { + return; + } + chunk = new ChunkCarverFix(chunk, generator.getContext().materials); SharedSeedRandom random = new SharedSeedRandom(); - ChunkPos chunkpos = chunk.getPos(); int chunkX = chunkpos.x; int chunkZ = chunkpos.z; - BitSet mask = chunk.getCarvingMask(type); Biome biome = generator.getBiome(biomes, chunkpos.asBlockPos()); - List> carvers = biome.getCarvers(type); - ListIterator> iterator = carvers.listIterator(); - - for(int cx = chunkX - 8; cx <= chunkX + 8; ++cx) { - for(int cz = chunkZ - 8; cz <= chunkZ + 8; ++cz) { - - while(iterator.hasNext()) { + for (int cx = chunkX - 8; cx <= chunkX + 8; ++cx) { + for (int cz = chunkZ - 8; cz <= chunkZ + 8; ++cz) { + ListIterator> iterator = biome.getCarvers(type).listIterator(); + while (iterator.hasNext()) { int index = iterator.nextIndex(); ConfiguredCarver carver = iterator.next(); random.setLargeFeatureSeed(generator.getSeed() + index, cx, cz); diff --git a/src/main/java/com/terraforged/chunk/generator/TerrainGenerator.java b/src/main/java/com/terraforged/chunk/generator/TerrainGenerator.java index db25857..1377526 100644 --- a/src/main/java/com/terraforged/chunk/generator/TerrainGenerator.java +++ b/src/main/java/com/terraforged/chunk/generator/TerrainGenerator.java @@ -1,28 +1,16 @@ package com.terraforged.chunk.generator; -import com.terraforged.api.chunk.column.ColumnDecorator; import com.terraforged.api.chunk.column.DecoratorContext; -import com.terraforged.biome.provider.BiomeProvider; import com.terraforged.chunk.TerraChunkGenerator; import com.terraforged.chunk.column.ChunkPopulator; -import com.terraforged.chunk.fix.RegionFix; import com.terraforged.chunk.util.FastChunk; import com.terraforged.chunk.util.TerraContainer; -import com.terraforged.core.region.chunk.ChunkReader; import com.terraforged.feature.TerrainHelper; -import com.terraforged.util.Environment; import com.terraforged.world.climate.Climate; import com.terraforged.world.heightmap.Levels; import com.terraforged.world.terrain.Terrains; -import net.minecraft.util.math.BlockPos; import net.minecraft.world.IWorld; -import net.minecraft.world.biome.Biome; -import net.minecraft.world.chunk.ChunkPrimer; import net.minecraft.world.chunk.IChunk; -import net.minecraft.world.gen.Heightmap; -import net.minecraft.world.gen.WorldGenRegion; - -import java.util.List; public class TerrainGenerator { @@ -41,54 +29,17 @@ public class TerrainGenerator { } public final void generateTerrain(IWorld world, IChunk chunk) { - TerraContainer container = BiomeProvider.getBiomeContainer(generator, chunk); + TerraContainer container = TerraContainer.getOrCreate(chunk, generator); try (DecoratorContext context = new DecoratorContext(FastChunk.wrap(chunk), levels, terrain, climate)) { container.getChunkReader().iterate(context, (cell, dx, dz, ctx) -> { int px = ctx.blockX + dx; int pz = ctx.blockZ + dz; int py = ctx.levels.scale(cell.value); ctx.cell = cell; - ctx.biome = container.getBiome(dx, dz); + ctx.biome = container.getNoiseBiome(dx, world.getSeaLevel(), dz); ChunkPopulator.INSTANCE.decorate(ctx.chunk, ctx, px, py, pz); }); terrainHelper.flatten(world, chunk); } } - - public final void generateFeatures(WorldGenRegion region) { - int chunkX = region.getMainChunkX(); - int chunkZ = region.getMainChunkZ(); - IChunk chunk = region.getChunk(chunkX, chunkZ); - TerraContainer container = BiomeProvider.getBiomeContainer(generator, chunk); - Biome biome = container.getFeatureBiome(); - DecoratorContext context = generator.getContext().decorator(chunk); - - IWorld regionFix = new RegionFix(region, generator); - BlockPos pos = new BlockPos(context.blockX, 0, context.blockZ); - - // place biome features - generator.getFeatureManager().decorate(generator, regionFix, chunk, biome, pos); - - // run post processes on chunk - postProcess(container.getChunkReader(), container, context); - - // bake biome array & discard gen data - ((ChunkPrimer) chunk).func_225548_a_(container.bakeBiomes(Environment.isVanillaBiomes())); - - container.getChunkReader().dispose(); - } - - private void postProcess(ChunkReader chunk, TerraContainer container, DecoratorContext context) { - List decorators = generator.getPostProcessors(); - chunk.iterate(context, (cell, dx, dz, ctx) -> { - int px = ctx.blockX + dx; - int pz = ctx.blockZ + dz; - int py = ctx.chunk.getTopBlockY(Heightmap.Type.WORLD_SURFACE_WG, dx, dz); - ctx.cell = cell; - ctx.biome = container.getBiome(dx, dz); - for (ColumnDecorator decorator : decorators) { - decorator.decorate(ctx.chunk, ctx, px, py, pz); - } - }); - } } diff --git a/src/main/java/com/terraforged/chunk/util/TerraContainer.java b/src/main/java/com/terraforged/chunk/util/TerraContainer.java index 850b344..b271f20 100644 --- a/src/main/java/com/terraforged/chunk/util/TerraContainer.java +++ b/src/main/java/com/terraforged/chunk/util/TerraContainer.java @@ -1,45 +1,23 @@ -/* - * - * MIT License - * - * Copyright (c) 2020 TerraForged - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - package com.terraforged.chunk.util; import com.terraforged.api.biome.BiomeVariant; +import com.terraforged.chunk.TerraChunkGenerator; import com.terraforged.core.cell.Cell; import com.terraforged.core.region.chunk.ChunkReader; import com.terraforged.core.util.PosIterator; +import net.minecraft.util.math.ChunkPos; import net.minecraft.util.math.MathHelper; import net.minecraft.world.biome.Biome; import net.minecraft.world.biome.BiomeContainer; +import net.minecraft.world.chunk.ChunkPrimer; +import net.minecraft.world.chunk.IChunk; -// holds a 1:1 map of biomes in the chunk -// also holds the chunk's view on the heightmap for convenience public class TerraContainer extends BiomeContainer { private static final int BITS_WIDTH = (int) Math.round(Math.log(16.0D) / Math.log(2.0D)) - 2; private static final int ZOOM_VERT = (int) Math.round(Math.log(256.0D) / Math.log(2.0D)) - 2; - public static final int SIZE = 1 << BITS_WIDTH + BITS_WIDTH + ZOOM_VERT; + public static final int BIOMES_3D_SIZE = 1 << BITS_WIDTH + BITS_WIDTH + ZOOM_VERT; + public static final int BIOMES_2D_SIZE = 16 * 16; public static final int MASK_HORIZ = (1 << BITS_WIDTH) - 1; public static final int MASK_VERT = (1 << ZOOM_VERT) - 1; @@ -47,23 +25,24 @@ public class TerraContainer extends BiomeContainer { private final Biome[] surface; private final ChunkReader chunkReader; - public TerraContainer(Builder builder, ChunkReader chunkReader) { - super(builder.biomes); + public TerraContainer(Biome[] biomes, Biome[] surface, ChunkReader chunkReader) { + super(biomes); + this.biomes = biomes; + this.surface = surface; this.chunkReader = chunkReader; - this.biomes = builder.biomes; - this.surface = builder.surfaceBiomeCache; + } + + public ChunkReader getChunkReader() { + return chunkReader; } public Biome getBiome(int x, int z) { - return surface[indexOf(x, z)]; + x &= 15; + z &= 15; + return surface[z * 16 + x]; } - @Override - public Biome getNoiseBiome(int x, int y, int z) { - return super.getNoiseBiome(x, y, z); - } - - public Biome getFeatureBiome() { + public Biome getFeatureBiome(ChunkReader chunkReader) { PosIterator iterator = PosIterator.area(0, 0, 16, 16); while (iterator.next()) { Cell cell = chunkReader.getCell(iterator.x(), iterator.z()); @@ -89,50 +68,47 @@ public class TerraContainer extends BiomeContainer { return new BiomeContainer(biomes); } - public ChunkReader getChunkReader() { - return chunkReader; + public static TerraContainer getOrCreate(IChunk chunk, TerraChunkGenerator generator) { + if (chunk.getBiomes() instanceof TerraContainer) { + return (TerraContainer) chunk.getBiomes(); + } else { + TerraContainer container = TerraContainer.create(generator, chunk.getPos()); + ((ChunkPrimer) chunk).func_225548_a_(container); + return container; + } + } + + public static TerraContainer create(TerraChunkGenerator generator, ChunkPos pos) { + ChunkReader reader = generator.getChunkReader(pos.x, pos.z); + + Biome[] biomes2D = new Biome[BIOMES_2D_SIZE]; + Biome[] biomes3D = new Biome[BIOMES_3D_SIZE]; + PosIterator iterator = PosIterator.area(0, 0, 16, 16); + while (iterator.next()) { + int dx = iterator.x(); + int dz = iterator.z(); + int x = pos.getXStart() + dx; + int z = pos.getZStart() + dz; + Biome biome = generator.getBiomeProvider().getBiome(reader.getCell(dx, dz), x, z); + biomes2D[indexOf(dx, dz)] = biome; + if ((dx & 3) == 0 && (dz & 3) == 0) { + for (int dy = 0; dy < 64; dy++) { + biomes3D[indexOf(dx >> 2, dy, dz >> 2)] = biome; + } + } + } + + return new TerraContainer(biomes3D, biomes2D, reader); } private static int indexOf(int x, int z) { - x &= 15; - z &= 15; return (z << 4) + x; } - private static int indexOf(int x, int y, int z) { + public static int indexOf(int x, int y, int z) { x &= MASK_HORIZ; y = MathHelper.clamp(y, 0, MASK_VERT); z &= MASK_HORIZ; return y << BITS_WIDTH + BITS_WIDTH | z << BITS_WIDTH | x; } - - public static Builder builder() { - return new Builder(); - } - - public static class Builder { - - private final Biome[] biomes = new Biome[SIZE]; - private final Biome[] surfaceBiomeCache = new Biome[256]; - - public void set(int x, int z, Biome biome) { - surfaceBiomeCache[indexOf(x, z)] = biome; - } - - public TerraContainer build(ChunkReader chunkReader) { - // biome storage format is 1 biome pos == 4x4x4 blocks, stored in an 4x64x4 (xyz) array - // sample the 1:1 surfaceBiomeCache every 4 blocks with a 2 block offset (roughly center of the 4x4 area) - for (int dy = 0; dy < 64; dy++) { - for (int dz = 0; dz < 4; dz++) { - for (int dx = 0; dx < 4; dx++) { - int x = dx * 4; - int z = dz * 4; - int index = indexOf(dx, dy, dz); - biomes[index] = surfaceBiomeCache[indexOf(x, z)]; - } - } - } - return new TerraContainer(this, chunkReader); - } - } -} +} \ No newline at end of file diff --git a/src/main/java/com/terraforged/data/LangGenerator.java b/src/main/java/com/terraforged/data/LangGenerator.java index 74bf5be..6e922e8 100644 --- a/src/main/java/com/terraforged/data/LangGenerator.java +++ b/src/main/java/com/terraforged/data/LangGenerator.java @@ -1,7 +1,7 @@ package com.terraforged.data; import com.terraforged.core.util.NameUtil; -import com.terraforged.gui.preview.PreviewSettings; +import com.terraforged.gui.preview2.PreviewSettings; import com.terraforged.settings.TerraSettings; import com.terraforged.util.nbt.NBTHelper; import net.minecraft.nbt.CompoundNBT; diff --git a/src/main/java/com/terraforged/feature/TerrainHelper.java b/src/main/java/com/terraforged/feature/TerrainHelper.java index fec1126..02143b3 100644 --- a/src/main/java/com/terraforged/feature/TerrainHelper.java +++ b/src/main/java/com/terraforged/feature/TerrainHelper.java @@ -39,7 +39,11 @@ import net.minecraft.world.IWorld; import net.minecraft.world.chunk.IChunk; import net.minecraft.world.gen.Heightmap; import net.minecraft.world.gen.feature.jigsaw.JigsawPattern; -import net.minecraft.world.gen.feature.structure.*; +import net.minecraft.world.gen.feature.structure.AbstractVillagePiece; +import net.minecraft.world.gen.feature.structure.IStructurePieceType; +import net.minecraft.world.gen.feature.structure.Structure; +import net.minecraft.world.gen.feature.structure.StructurePiece; +import net.minecraft.world.gen.feature.structure.StructureStart; import java.util.List; import java.util.Set; diff --git a/src/main/java/com/terraforged/feature/context/ChanceContext.java b/src/main/java/com/terraforged/feature/context/ChanceContext.java index 1cb1397..8bce18e 100644 --- a/src/main/java/com/terraforged/feature/context/ChanceContext.java +++ b/src/main/java/com/terraforged/feature/context/ChanceContext.java @@ -3,8 +3,8 @@ package com.terraforged.feature.context; import com.terraforged.chunk.fix.RegionDelegate; import com.terraforged.chunk.util.TerraContainer; import com.terraforged.core.cell.Cell; -import com.terraforged.core.concurrent.pool.ObjectPool; import com.terraforged.core.concurrent.Resource; +import com.terraforged.core.concurrent.pool.ObjectPool; import com.terraforged.core.region.chunk.ChunkReader; import com.terraforged.world.heightmap.Levels; import net.minecraft.util.math.BlockPos; diff --git a/src/main/java/com/terraforged/gui/SettingsScreen.java b/src/main/java/com/terraforged/gui/SettingsScreen.java index ac9a237..ce0bfa9 100644 --- a/src/main/java/com/terraforged/gui/SettingsScreen.java +++ b/src/main/java/com/terraforged/gui/SettingsScreen.java @@ -31,8 +31,7 @@ import com.terraforged.gui.page.PresetsPage; import com.terraforged.gui.page.SimplePage; import com.terraforged.gui.page.SimplePreviewPage; import com.terraforged.gui.page.WorldPage; -import com.terraforged.gui.preview.PreviewPage; -import com.terraforged.gui.preview.again.PreviewPage2; +import com.terraforged.gui.preview2.PreviewPage; import com.terraforged.settings.SettingsHelper; import com.terraforged.settings.TerraSettings; import com.terraforged.util.nbt.NBTHelper; @@ -49,7 +48,7 @@ public class SettingsScreen extends OverlayScreen { private static final Button.IPressable NO_ACTION = b -> {}; private final Page[] pages; - private final PreviewPage2 preview; + private final PreviewPage preview; private final CreateWorldScreen parent; private final TerraSettings settings = new TerraSettings(); @@ -58,7 +57,7 @@ public class SettingsScreen extends OverlayScreen { public SettingsScreen(CreateWorldScreen parent) { SettingsHelper.applyDefaults(parent.chunkProviderSettingsJson, settings); this.parent = parent; - this.preview = new PreviewPage2(settings, getSeed(parent)); + this.preview = new PreviewPage(settings, getSeed(parent)); this.pages = new Page[]{ new PresetsPage(), new WorldPage(settings, preview), diff --git a/src/main/java/com/terraforged/gui/page/WorldPage.java b/src/main/java/com/terraforged/gui/page/WorldPage.java index eb71908..05ef40d 100644 --- a/src/main/java/com/terraforged/gui/page/WorldPage.java +++ b/src/main/java/com/terraforged/gui/page/WorldPage.java @@ -28,7 +28,6 @@ package com.terraforged.gui.page; import com.terraforged.TerraWorld; import com.terraforged.gui.OverlayScreen; import com.terraforged.gui.element.TerraTextInput; -import com.terraforged.gui.preview.PreviewPage; import com.terraforged.settings.TerraSettings; import com.terraforged.util.nbt.NBTHelper; import net.minecraft.client.gui.widget.Widget; @@ -87,7 +86,10 @@ public class WorldPage extends BasePage { protected void update() { super.update(); - preview.apply(settings -> NBTHelper.deserialize(worldSettings, settings.world)); + preview.apply(settings -> { + NBTHelper.deserialize(worldSettings, settings.world); + NBTHelper.deserialize(dimSettings, settings.dimensions); + }); } private static ListNBT getWorldTypes() { diff --git a/src/main/java/com/terraforged/gui/preview/Preview.java b/src/main/java/com/terraforged/gui/preview/Preview.java index cc0e33f..143bb07 100644 --- a/src/main/java/com/terraforged/gui/preview/Preview.java +++ b/src/main/java/com/terraforged/gui/preview/Preview.java @@ -56,7 +56,7 @@ public class Preview extends Button { private static final int FACTOR = 4; public static final int WIDTH = Size.chunkToBlock(1 << FACTOR); private static final int SLICE_HEIGHT = 64; - public static final int HEIGHT = WIDTH + SLICE_HEIGHT;//Size.chunkToBlock(1 << FACTOR); + public static final int HEIGHT = WIDTH + SLICE_HEIGHT; private static final float[] LEGEND_SCALES = {1, 0.9F, 0.75F, 0.6F}; private final int offsetX; @@ -159,8 +159,8 @@ public class Preview extends Button { float zoomUnit = 1F - (zoom / 100F); float zoomStrength = 0.5F; float unit = (1 - zoomStrength) + (zoomStrength * zoomUnit); - float heightModifier = settings.world.levels.worldHeight / 256F; - float waterLevelModifier = settings.world.levels.seaLevel / (float) settings.world.levels.worldHeight; + float heightModifier = settings.world.properties.worldHeight / 256F; + float waterLevelModifier = settings.world.properties.seaLevel / (float) settings.world.properties.worldHeight; float imageWaterLevelY = image.getHeight() - 1 - (waterLevelModifier * SLICE_HEIGHT * unit); region.iterate((cell, x, z) -> { diff --git a/src/main/java/com/terraforged/gui/preview/PreviewPage.java b/src/main/java/com/terraforged/gui/preview/PreviewPage.java index f22cc6e..da69680 100644 --- a/src/main/java/com/terraforged/gui/preview/PreviewPage.java +++ b/src/main/java/com/terraforged/gui/preview/PreviewPage.java @@ -27,7 +27,6 @@ package com.terraforged.gui.preview; import com.terraforged.gui.OverlayScreen; import com.terraforged.gui.element.TerraButton; -import com.terraforged.gui.page.BasePage; import com.terraforged.gui.page.UpdatablePage; import com.terraforged.settings.TerraSettings; import com.terraforged.util.nbt.NBTHelper; diff --git a/src/main/java/com/terraforged/gui/preview/again/PreviewSettings.java b/src/main/java/com/terraforged/gui/preview/again/PreviewSettings.java deleted file mode 100644 index b6668a6..0000000 --- a/src/main/java/com/terraforged/gui/preview/again/PreviewSettings.java +++ /dev/null @@ -1,14 +0,0 @@ -package com.terraforged.gui.preview.again; - -import com.terraforged.core.render.RenderMode; -import com.terraforged.core.serialization.annotation.Range; -import com.terraforged.core.serialization.annotation.Serializable; - -@Serializable -public class PreviewSettings { - - @Range(min = 1, max = 200) - public float zoom = 10F; - - public RenderMode renderMode = RenderMode.BIOME_TYPE; -} diff --git a/src/main/java/com/terraforged/gui/preview/again/MCRenderAPI.java b/src/main/java/com/terraforged/gui/preview2/MCRenderAPI.java similarity index 95% rename from src/main/java/com/terraforged/gui/preview/again/MCRenderAPI.java rename to src/main/java/com/terraforged/gui/preview2/MCRenderAPI.java index 6192831..656decd 100644 --- a/src/main/java/com/terraforged/gui/preview/again/MCRenderAPI.java +++ b/src/main/java/com/terraforged/gui/preview2/MCRenderAPI.java @@ -1,4 +1,4 @@ -package com.terraforged.gui.preview.again; +package com.terraforged.gui.preview2; import com.mojang.blaze3d.systems.RenderSystem; import com.terraforged.core.render.RenderAPI; diff --git a/src/main/java/com/terraforged/gui/preview/again/MCRenderBuffer.java b/src/main/java/com/terraforged/gui/preview2/MCRenderBuffer.java similarity index 97% rename from src/main/java/com/terraforged/gui/preview/again/MCRenderBuffer.java rename to src/main/java/com/terraforged/gui/preview2/MCRenderBuffer.java index ec25af4..9750d7e 100644 --- a/src/main/java/com/terraforged/gui/preview/again/MCRenderBuffer.java +++ b/src/main/java/com/terraforged/gui/preview2/MCRenderBuffer.java @@ -1,4 +1,4 @@ -package com.terraforged.gui.preview.again; +package com.terraforged.gui.preview2; import com.terraforged.core.render.RenderBuffer; import net.minecraft.client.renderer.BufferBuilder; diff --git a/src/main/java/com/terraforged/gui/preview/again/Preview2.java b/src/main/java/com/terraforged/gui/preview2/Preview.java similarity index 81% rename from src/main/java/com/terraforged/gui/preview/again/Preview2.java rename to src/main/java/com/terraforged/gui/preview2/Preview.java index 38c8784..adef333 100644 --- a/src/main/java/com/terraforged/gui/preview/again/Preview2.java +++ b/src/main/java/com/terraforged/gui/preview2/Preview.java @@ -1,4 +1,4 @@ -package com.terraforged.gui.preview.again; +package com.terraforged.gui.preview2; import com.mojang.blaze3d.systems.RenderSystem; import com.terraforged.core.concurrent.thread.ThreadPool; @@ -10,11 +10,14 @@ import com.terraforged.core.render.RenderWorld; import com.terraforged.settings.TerraSettings; import com.terraforged.world.GeneratorContext; import com.terraforged.world.continent.MutableVeci; +import com.terraforged.world.continent.SpawnType; import com.terraforged.world.terrain.Terrains; import net.minecraft.client.gui.widget.Widget; import net.minecraft.client.renderer.RenderHelper; -public class Preview2 extends Widget { +public class Preview extends Widget { + + private static final float ZOOM_SCALE = 200F; private final ThreadPool threadPool = ThreadPools.getPool(); @@ -28,7 +31,7 @@ public class Preview2 extends Widget { private RenderWorld world; private PreviewSettings previewSettings = new PreviewSettings(); - public Preview2(TerraSettings settings, int seed) { + public Preview(TerraSettings settings, int seed) { super(0, 0, "preview"); this.seed = seed; this.settings = settings; @@ -79,8 +82,8 @@ public class Preview2 extends Widget { public void update(PreviewSettings settings, TerraSettings genSettings) { this.previewSettings = settings; -// this.world = createWorld(genSettings); - world.update(offsetX, offsetZ, previewSettings.zoom, true); + this.world = createWorld(genSettings); + world.update(offsetX, offsetZ, previewSettings.getZoom(ZOOM_SCALE), true); } private RenderWorld createWorld(TerraSettings settings) { @@ -90,7 +93,12 @@ public class Preview2 extends Widget { GeneratorContext context = GeneratorContext.createNoCache(Terrains.create(settings), settings); MutableVeci center = new MutableVeci(); - context.factory.getHeightmap().getContinent().getNearestCenter(0, 0, center); + if (settings.world.properties.spawnType == SpawnType.CONTINENT_CENTER) { + context.factory.getHeightmap().getContinent().getNearestCenter(0, 0, center); + } + + offsetX = center.x; + offsetZ = center.z; RegionGenerator generator = RegionGenerator.builder() .pool(threadPool) @@ -103,8 +111,8 @@ public class Preview2 extends Widget { RenderSettings renderSettings = new RenderSettings(context); renderSettings.width = width; renderSettings.height = height; - renderSettings.zoom = previewSettings.zoom; - renderSettings.renderMode = previewSettings.renderMode; + renderSettings.zoom = previewSettings.getZoom(ZOOM_SCALE); + renderSettings.renderMode = previewSettings.display; return new RenderWorld(generator, renderAPI, renderSettings, regions, size); } diff --git a/src/main/java/com/terraforged/gui/preview/again/PreviewPage2.java b/src/main/java/com/terraforged/gui/preview2/PreviewPage.java similarity index 77% rename from src/main/java/com/terraforged/gui/preview/again/PreviewPage2.java rename to src/main/java/com/terraforged/gui/preview2/PreviewPage.java index 28413ff..a195f3a 100644 --- a/src/main/java/com/terraforged/gui/preview/again/PreviewPage2.java +++ b/src/main/java/com/terraforged/gui/preview2/PreviewPage.java @@ -1,24 +1,23 @@ -package com.terraforged.gui.preview.again; +package com.terraforged.gui.preview2; import com.terraforged.gui.OverlayScreen; import com.terraforged.gui.element.TerraButton; import com.terraforged.gui.page.UpdatablePage; -import com.terraforged.gui.preview.Preview; import com.terraforged.settings.TerraSettings; import com.terraforged.util.nbt.NBTHelper; import net.minecraft.nbt.CompoundNBT; import java.util.function.Consumer; -public class PreviewPage2 extends UpdatablePage { +public class PreviewPage extends UpdatablePage { - private final Preview2 preview; + private final Preview preview; private final CompoundNBT settings; private final TerraSettings genSettings = new TerraSettings(); - public PreviewPage2(TerraSettings settings, int seed) { - this.preview = new Preview2(settings, seed); - this.settings = NBTHelper.serialize(new PreviewSettings()); + public PreviewPage(TerraSettings settings, int seed) { + this.preview = new Preview(settings, seed); + this.settings = NBTHelper.serialize("preview", new PreviewSettings()); } public int getSeed() { @@ -27,7 +26,7 @@ public class PreviewPage2 extends UpdatablePage { @Override public void apply(Consumer consumer) { -// consumer.accept(genSettings); + consumer.accept(genSettings); update(); } @@ -36,8 +35,8 @@ public class PreviewPage2 extends UpdatablePage { Column right = getColumn(1); preview.x = 0; preview.y = 0; - preview.setWidth(Preview.WIDTH); - preview.setHeight(Preview.HEIGHT); + preview.setWidth(com.terraforged.gui.preview.Preview.WIDTH); + preview.setHeight(com.terraforged.gui.preview.Preview.HEIGHT); addElements(right.left, right.top, right, settings, right.scrollPane::addButton, this::update); @@ -57,7 +56,7 @@ public class PreviewPage2 extends UpdatablePage { right.scrollPane.addButton(spacer); } - update(); +// update(); } @Override diff --git a/src/main/java/com/terraforged/gui/preview2/PreviewSettings.java b/src/main/java/com/terraforged/gui/preview2/PreviewSettings.java new file mode 100644 index 0000000..5d5575f --- /dev/null +++ b/src/main/java/com/terraforged/gui/preview2/PreviewSettings.java @@ -0,0 +1,19 @@ +package com.terraforged.gui.preview2; + +import com.terraforged.core.render.RenderMode; +import com.terraforged.core.serialization.annotation.Range; +import com.terraforged.core.serialization.annotation.Serializable; + +@Serializable +public class PreviewSettings { + + @Range(min = 1, max = 100) + public float zoom = 90F; + + public RenderMode display = RenderMode.BIOME_TYPE; + + public float getZoom(float scale) { + float perc = (101F - zoom) / 100F; + return perc * scale; + } +} diff --git a/src/main/java/com/terraforged/util/DummyBlockReader.java b/src/main/java/com/terraforged/util/DummyBlockReader.java index 4f40fd1..298ed66 100644 --- a/src/main/java/com/terraforged/util/DummyBlockReader.java +++ b/src/main/java/com/terraforged/util/DummyBlockReader.java @@ -25,8 +25,8 @@ package com.terraforged.util; -import com.terraforged.core.concurrent.pool.ObjectPool; import com.terraforged.core.concurrent.Resource; +import com.terraforged.core.concurrent.pool.ObjectPool; import net.minecraft.block.BlockState; import net.minecraft.block.Blocks; import net.minecraft.fluid.FluidState;