From 9e830abb90e82f294d517f274fb83b519cabdce5 Mon Sep 17 00:00:00 2001 From: dfsek Date: Mon, 18 Jan 2021 23:56:46 -0700 Subject: [PATCH] image to biome stuff --- .../com/dfsek/terra/api/GenericLoaders.java | 5 +- .../terra/api/world/biome/TerraBiome.java | 2 + .../dfsek/terra/biome/ImageBiomeProvider.java | 54 +++++ .../dfsek/terra/biome/UserDefinedBiome.java | 16 +- .../terra/biome/pipeline/BiomePipeline.java | 7 + .../dfsek/terra/config/base/ConfigPack.java | 42 ++-- .../terra/config/base/ConfigPackTemplate.java | 2 +- .../terra/config/factories/BiomeFactory.java | 5 +- .../biome/BiomeProviderBuilderLoader.java | 115 +++++---- .../dfsek/terra/registry/BiomeRegistry.java | 4 +- .../src/test/java/biome/DistributionTest.java | 7 +- common/src/test/java/biome/ImageTest.java | 222 ++++++++++++++++++ common/src/test/resources/map.jpg | Bin 0 -> 88125 bytes .../command/biome/BiomeInfoCommand.java | 4 +- .../command/biome/BiomeLocateCommand.java | 4 +- .../BukkitChunkGeneratorWrapper.java | 3 +- 16 files changed, 392 insertions(+), 100 deletions(-) create mode 100644 common/src/main/java/com/dfsek/terra/biome/ImageBiomeProvider.java create mode 100644 common/src/test/java/biome/ImageTest.java create mode 100644 common/src/test/resources/map.jpg diff --git a/common/src/main/java/com/dfsek/terra/api/GenericLoaders.java b/common/src/main/java/com/dfsek/terra/api/GenericLoaders.java index 21f34a35a..8ad9c2fd7 100644 --- a/common/src/main/java/com/dfsek/terra/api/GenericLoaders.java +++ b/common/src/main/java/com/dfsek/terra/api/GenericLoaders.java @@ -6,7 +6,6 @@ import com.dfsek.terra.api.math.ProbabilityCollection; import com.dfsek.terra.api.math.Range; import com.dfsek.terra.api.math.noise.samplers.Normalizer; import com.dfsek.terra.api.platform.TerraPlugin; -import com.dfsek.terra.biome.BiomeProvider; import com.dfsek.terra.biome.palette.PaletteHolder; import com.dfsek.terra.biome.palette.PaletteLayer; import com.dfsek.terra.carving.CarverPalette; @@ -19,7 +18,6 @@ import com.dfsek.terra.config.loaders.config.NoiseBuilderLoader; import com.dfsek.terra.config.loaders.config.OreConfigLoader; import com.dfsek.terra.config.loaders.config.OreHolderLoader; import com.dfsek.terra.config.loaders.config.TreeLayerLoader; -import com.dfsek.terra.config.loaders.config.biome.BiomeProviderBuilderLoader; import com.dfsek.terra.config.loaders.palette.CarverPaletteLoader; import com.dfsek.terra.config.loaders.palette.PaletteHolderLoader; import com.dfsek.terra.config.loaders.palette.PaletteLayerLoader; @@ -55,7 +53,6 @@ public class GenericLoaders implements LoaderRegistrar { .registerLoader(MaterialSet.class, new MaterialSetLoader()) .registerLoader(OreHolder.class, new OreHolderLoader()) .registerLoader(TerraFlora.Search.class, (t, o, l) -> TerraFlora.Search.valueOf(o.toString())) - .registerLoader(Normalizer.NormalType.class, (t, o, l) -> Normalizer.NormalType.valueOf(o.toString().toUpperCase())) - .registerLoader(BiomeProvider.BiomeProviderBuilder.class, new BiomeProviderBuilderLoader(main)); + .registerLoader(Normalizer.NormalType.class, (t, o, l) -> Normalizer.NormalType.valueOf(o.toString().toUpperCase())); } } diff --git a/common/src/main/java/com/dfsek/terra/api/world/biome/TerraBiome.java b/common/src/main/java/com/dfsek/terra/api/world/biome/TerraBiome.java index 82cb27815..605672887 100644 --- a/common/src/main/java/com/dfsek/terra/api/world/biome/TerraBiome.java +++ b/common/src/main/java/com/dfsek/terra/api/world/biome/TerraBiome.java @@ -30,4 +30,6 @@ public interface TerraBiome { int getColor(); Set getTags(); + + String getID(); } diff --git a/common/src/main/java/com/dfsek/terra/biome/ImageBiomeProvider.java b/common/src/main/java/com/dfsek/terra/biome/ImageBiomeProvider.java new file mode 100644 index 000000000..f0924f1e8 --- /dev/null +++ b/common/src/main/java/com/dfsek/terra/biome/ImageBiomeProvider.java @@ -0,0 +1,54 @@ +package com.dfsek.terra.biome; + +import com.dfsek.terra.api.world.biome.TerraBiome; +import com.dfsek.terra.registry.TerraRegistry; +import net.jafama.FastMath; + +import java.awt.*; +import java.awt.image.BufferedImage; +import java.util.HashMap; +import java.util.Map; + +public class ImageBiomeProvider implements BiomeProvider { + private final Map colorBiomeMap = new HashMap<>(); + private final BufferedImage image; + private final int resolution; + + public ImageBiomeProvider(TerraRegistry registry, BufferedImage image, int resolution) { + this.image = image; + this.resolution = resolution; + registry.forEach(biome -> colorBiomeMap.put(new Color(biome.getColor()), biome)); + } + + private static int distance(Color a, Color b) { + return FastMath.abs(a.getRed() - b.getRed()) + FastMath.abs(a.getGreen() - b.getGreen()) + FastMath.abs(a.getBlue() - b.getBlue()); + } + + @Override + public TerraBiome getBiome(int x, int z) { + Color color = new Color(image.getRGB(FastMath.floorMod(x / resolution, image.getWidth()), FastMath.floorMod(z / resolution, image.getHeight()))); + + return colorBiomeMap.get(colorBiomeMap.keySet().stream().reduce(colorBiomeMap.keySet().stream().findAny().orElseThrow(IllegalStateException::new), (running, element) -> { + int d1 = distance(color, running); + int d2 = distance(color, element); + return d1 < d2 ? running : element; + })); + } + + public static class ImageBiomeProviderBuilder implements BiomeProviderBuilder { + private final BufferedImage image; + private final int resolution; + private final TerraRegistry registry; + + public ImageBiomeProviderBuilder(BufferedImage image, int resolution, TerraRegistry registry) { + this.image = image; + this.resolution = resolution; + this.registry = registry; + } + + @Override + public BiomeProvider build(long seed) { + return new ImageBiomeProvider(registry, image, resolution); + } + } +} diff --git a/common/src/main/java/com/dfsek/terra/biome/UserDefinedBiome.java b/common/src/main/java/com/dfsek/terra/biome/UserDefinedBiome.java index c0f57197b..153878883 100644 --- a/common/src/main/java/com/dfsek/terra/biome/UserDefinedBiome.java +++ b/common/src/main/java/com/dfsek/terra/biome/UserDefinedBiome.java @@ -5,7 +5,6 @@ import com.dfsek.terra.api.platform.world.Biome; import com.dfsek.terra.api.platform.world.World; import com.dfsek.terra.api.world.biome.Generator; import com.dfsek.terra.api.world.biome.TerraBiome; -import com.dfsek.terra.config.base.ConfigPack; import com.dfsek.terra.config.builder.GeneratorBuilder; import com.dfsek.terra.config.templates.BiomeTemplate; @@ -20,18 +19,15 @@ public class UserDefinedBiome implements TerraBiome { private final ProbabilityCollection vanilla; private final String id; private final BiomeTemplate config; - private final ConfigPack pack; - private UserDefinedBiome erode; private final int color; private final Set tags; - public UserDefinedBiome(ProbabilityCollection vanilla, GeneratorBuilder gen, BiomeTemplate config, ConfigPack pack) { + public UserDefinedBiome(ProbabilityCollection vanilla, GeneratorBuilder gen, BiomeTemplate config) { this.vanilla = vanilla; this.gen = gen; this.id = config.getID(); this.config = config; - this.pack = pack; this.color = config.getColor(); this.tags = config.getTags() == null ? new HashSet<>() : config.getTags(); tags.add("BIOME:" + id); @@ -47,19 +43,11 @@ public class UserDefinedBiome implements TerraBiome { return vanilla; } - + @Override public String getID() { return id; } - public UserDefinedBiome getErode() { - if(erode == null) { - erode = (config.getErode() == null) ? this : pack.getBiome(config.getErode()); - } - return erode; - } - - public BiomeTemplate getConfig() { return config; } diff --git a/common/src/main/java/com/dfsek/terra/biome/pipeline/BiomePipeline.java b/common/src/main/java/com/dfsek/terra/biome/pipeline/BiomePipeline.java index fa16ddced..d3838e030 100644 --- a/common/src/main/java/com/dfsek/terra/biome/pipeline/BiomePipeline.java +++ b/common/src/main/java/com/dfsek/terra/biome/pipeline/BiomePipeline.java @@ -20,6 +20,13 @@ public class BiomePipeline { this.init = init; } + /** + * Get biomes in a chunk + * + * @param x Chunk X coord + * @param z Chunk Z coord + * @return BiomeHolder containing biomes. + */ public BiomeHolder getBiomes(int x, int z) { BiomeHolder holder = new TerraBiomeHolder(init, new Vector2(x * (init - 1), z * (init - 1))); holder.fill(source); diff --git a/common/src/main/java/com/dfsek/terra/config/base/ConfigPack.java b/common/src/main/java/com/dfsek/terra/config/base/ConfigPack.java index 4e656f1a4..14b393f4d 100644 --- a/common/src/main/java/com/dfsek/terra/config/base/ConfigPack.java +++ b/common/src/main/java/com/dfsek/terra/config/base/ConfigPack.java @@ -13,7 +13,7 @@ import com.dfsek.terra.api.world.biome.TerraBiome; import com.dfsek.terra.api.world.flora.Flora; import com.dfsek.terra.api.world.palette.Palette; import com.dfsek.terra.api.world.tree.Tree; -import com.dfsek.terra.biome.UserDefinedBiome; +import com.dfsek.terra.biome.BiomeProvider; import com.dfsek.terra.carving.UserDefinedCarver; import com.dfsek.terra.config.exception.FileMissingException; import com.dfsek.terra.config.factories.BiomeFactory; @@ -28,6 +28,7 @@ import com.dfsek.terra.config.files.FolderLoader; import com.dfsek.terra.config.files.Loader; import com.dfsek.terra.config.files.ZIPLoader; import com.dfsek.terra.config.lang.LangUtil; +import com.dfsek.terra.config.loaders.config.biome.BiomeProviderBuilderLoader; import com.dfsek.terra.config.templates.AbstractableTemplate; import com.dfsek.terra.config.templates.BiomeTemplate; import com.dfsek.terra.config.templates.CarverTemplate; @@ -59,14 +60,13 @@ import java.io.FileNotFoundException; import java.io.IOException; import java.io.InputStream; import java.nio.charset.StandardCharsets; -import java.util.ArrayList; import java.util.Collection; import java.util.Enumeration; import java.util.List; import java.util.Map; -import java.util.Objects; import java.util.Set; import java.util.logging.Level; +import java.util.stream.Collectors; import java.util.zip.ZipEntry; import java.util.zip.ZipFile; @@ -92,8 +92,13 @@ public class ConfigPack implements LoaderRegistrar { private final SamplerCache samplerCache; + private final TerraPlugin main; + private final Loader loader; + public ConfigPack(File folder, TerraPlugin main) throws ConfigException { + this.loader = new FolderLoader(folder.toPath()); + this.main = main; long l = System.nanoTime(); this.samplerCache = new SamplerCache(main); floraRegistry = new FloraRegistry(main); @@ -112,11 +117,12 @@ public class ConfigPack implements LoaderRegistrar { } catch(FileNotFoundException e) { throw new FileMissingException("No pack.yml file found in " + folder.getAbsolutePath(), e); } - - load(new FolderLoader(folder.toPath()), l, main); + load(l, main); } public ConfigPack(ZipFile file, TerraPlugin main) throws ConfigException { + this.loader = new ZIPLoader(file); + this.main = main; long l = System.nanoTime(); this.samplerCache = new SamplerCache(main); floraRegistry = new FloraRegistry(main); @@ -143,12 +149,13 @@ public class ConfigPack implements LoaderRegistrar { selfLoader.load(template, stream); - load(new ZIPLoader(file), l, main); + + load(l, main); template.getProviderBuilder().build(0); // Build dummy provider to catch errors at load time. } - private void load(Loader loader, long start, TerraPlugin main) throws ConfigException { + private void load(long start, TerraPlugin main) throws ConfigException { for(Map.Entry var : template.getVariables().entrySet()) { varScope.create(var.getKey()).setValue(var.getValue()); } @@ -185,14 +192,6 @@ public class ConfigPack implements LoaderRegistrar { .open("biomes", ".yml").then(streams -> buildAll(new BiomeFactory(this), biomeRegistry, abstractConfigLoader.load(streams, () -> new BiomeTemplate(this, main)), main)).close(); - for(UserDefinedBiome b : biomeRegistry.entries()) { - try { - Objects.requireNonNull(b.getErode()); // Throws NPE if it cannot load erosion biomes. - } catch(NullPointerException e) { - throw new LoadException("Invalid erosion biome defined in biome \"" + b.getID() + "\"", e); - } - } - LangUtil.log("config-pack.loaded", Level.INFO, template.getID(), String.valueOf((System.nanoTime() - start) / 1000000D), template.getAuthor(), template.getVersion()); } @@ -200,14 +199,12 @@ public class ConfigPack implements LoaderRegistrar { for(C template : configTemplates) registry.add(template.getID(), factory.build(template, main)); } - public UserDefinedBiome getBiome(String id) { + public TerraBiome getBiome(String id) { return biomeRegistry.get(id); } public List getBiomeIDs() { - List biomeIDs = new ArrayList<>(); - biomeRegistry.forEach(biome -> biomeIDs.add(biome.getID())); - return biomeIDs; + return biomeRegistry.entries().stream().map(TerraBiome::getID).collect(Collectors.toList()); } public TerraStructure getStructure(String id) { @@ -227,9 +224,7 @@ public class ConfigPack implements LoaderRegistrar { } public List getStructureIDs() { - List ids = new ArrayList<>(); - structureRegistry.forEach(structure -> ids.add(structure.getTemplate().getID())); - return ids; + return structureRegistry.entries().stream().map(terraStructure -> terraStructure.getTemplate().getID()).collect(Collectors.toList()); } public TreeRegistry getTreeRegistry() { @@ -256,7 +251,8 @@ public class ConfigPack implements LoaderRegistrar { .registerLoader(Tree.class, treeRegistry) .registerLoader(StructureScript.class, scriptRegistry) .registerLoader(TerraStructure.class, structureRegistry) - .registerLoader(LootTable.class, lootRegistry); + .registerLoader(LootTable.class, lootRegistry) + .registerLoader(BiomeProvider.BiomeProviderBuilder.class, new BiomeProviderBuilderLoader(main, biomeRegistry, loader)); } public ScriptRegistry getScriptRegistry() { diff --git a/common/src/main/java/com/dfsek/terra/config/base/ConfigPackTemplate.java b/common/src/main/java/com/dfsek/terra/config/base/ConfigPackTemplate.java index 16095467f..f71c79d56 100644 --- a/common/src/main/java/com/dfsek/terra/config/base/ConfigPackTemplate.java +++ b/common/src/main/java/com/dfsek/terra/config/base/ConfigPackTemplate.java @@ -92,7 +92,7 @@ public class ConfigPackTemplate implements ValidatedConfigTemplate { @Default private String version = "0.1.0"; - @Value("biome-pipeline") + @Value("biomes") private BiomeProvider.BiomeProviderBuilder providerBuilder; public BiomeProvider.BiomeProviderBuilder getProviderBuilder() { diff --git a/common/src/main/java/com/dfsek/terra/config/factories/BiomeFactory.java b/common/src/main/java/com/dfsek/terra/config/factories/BiomeFactory.java index a0bd7aa2d..82ba62bb9 100644 --- a/common/src/main/java/com/dfsek/terra/config/factories/BiomeFactory.java +++ b/common/src/main/java/com/dfsek/terra/config/factories/BiomeFactory.java @@ -1,12 +1,13 @@ package com.dfsek.terra.config.factories; import com.dfsek.terra.api.platform.TerraPlugin; +import com.dfsek.terra.api.world.biome.TerraBiome; import com.dfsek.terra.biome.UserDefinedBiome; import com.dfsek.terra.config.base.ConfigPack; import com.dfsek.terra.config.builder.GeneratorBuilder; import com.dfsek.terra.config.templates.BiomeTemplate; -public class BiomeFactory implements TerraFactory { +public class BiomeFactory implements TerraFactory { private final ConfigPack pack; public BiomeFactory(ConfigPack pack) { @@ -29,6 +30,6 @@ public class BiomeFactory implements TerraFactory { private final TerraPlugin main; + private final TerraRegistry biomeRegistry; + private final Loader fileLoader; - public BiomeProviderBuilderLoader(TerraPlugin main) { + public BiomeProviderBuilderLoader(TerraPlugin main, TerraRegistry biomeRegistry, Loader fileLoader) { this.main = main; + this.biomeRegistry = biomeRegistry; + this.fileLoader = fileLoader; } @Override public BiomeProvider.BiomeProviderBuilder load(Type t, Object c, ConfigLoader loader) throws LoadException { Map map = (Map) c; - StandardBiomeProvider.StandardBiomeProviderBuilder builder = new StandardBiomeProvider.StandardBiomeProviderBuilder(seed -> { - Map source = (Map) map.get("source"); - ProbabilityCollection sourceBiomes = (ProbabilityCollection) loader.loadType(Types.TERRA_BIOME_PROBABILITY_COLLECTION_TYPE, source.get("biomes")); - NoiseSampler sourceNoise = new NoiseBuilderLoader().load(NoiseBuilder.class, source.get("noise"), loader).build((int) seed.longValue()); + int resolution = 1; + if(map.containsKey("resolution")) resolution = Integer.parseInt(map.get("resolution").toString()); - List> stages = (List>) map.get("pipeline"); - int init; - if(map.containsKey("initial-size")) init = Integer.parseInt(map.get("initial-size").toString()); - else init = 3; + if(map.get("type").equals("PIPELINE")) { + Map pipeline = (Map) map.get("pipeline"); + StandardBiomeProvider.StandardBiomeProviderBuilder builder = new StandardBiomeProvider.StandardBiomeProviderBuilder(seed -> { - BiomePipeline.BiomePipelineBuilder pipelineBuilder = new BiomePipeline.BiomePipelineBuilder(init); + Map source = (Map) pipeline.get("source"); + ProbabilityCollection sourceBiomes = (ProbabilityCollection) loader.loadType(Types.TERRA_BIOME_PROBABILITY_COLLECTION_TYPE, source.get("biomes")); + NoiseSampler sourceNoise = new NoiseBuilderLoader().load(NoiseBuilder.class, source.get("noise"), loader).build((int) seed.longValue()); - for(Map stage : stages) { - for(Map.Entry entry : stage.entrySet()) { - Map mutator = (Map) entry.getValue(); - NoiseSampler mutatorNoise = new NoiseBuilderLoader().load(NoiseBuilder.class, mutator.get("noise"), loader).build((int) seed.longValue()); + List> stages = (List>) pipeline.get("stages"); - if(entry.getKey().equals("expand")) { - if(mutator.get("type").equals("FRACTAL")) - pipelineBuilder.addStage(new ExpanderStage(new FractalExpander(mutatorNoise))); - else throw new LoadException("No such expander \"" + mutator.get("type")); - } else if(entry.getKey().equals("mutate")) { - if(mutator.get("type").equals("SMOOTH")) - pipelineBuilder.addStage(new MutatorStage(new SmoothMutator(mutatorNoise))); - else if(mutator.get("type").equals("REPLACE")) { - String fromTag = mutator.get("from").toString(); - ProbabilityCollection replaceBiomes = new SelfProbabilityCollectionLoader().load(Types.TERRA_BIOME_PROBABILITY_COLLECTION_TYPE, mutator.get("to"), loader); - pipelineBuilder.addStage(new MutatorStage(new ReplaceMutator(fromTag, replaceBiomes, mutatorNoise))); - } else if(mutator.get("type").equals("BORDER")) { - String fromTag = mutator.get("from").toString(); - String replaceTag = mutator.get("replace").toString(); - ProbabilityCollection replaceBiomes = (ProbabilityCollection) loader.loadType(Types.TERRA_BIOME_PROBABILITY_COLLECTION_TYPE, mutator.get("to")); - pipelineBuilder.addStage(new MutatorStage(new BorderMutator(fromTag, replaceTag, mutatorNoise, replaceBiomes))); - } else throw new LoadException("No such mutator type \"" + mutator.get("type")); - } else throw new LoadException("No such mutator \"" + entry.getKey() + "\""); + int init; + if(pipeline.containsKey("initial-size")) init = Integer.parseInt(pipeline.get("initial-size").toString()); + else init = 3; + + BiomePipeline.BiomePipelineBuilder pipelineBuilder = new BiomePipeline.BiomePipelineBuilder(init); + + for(Map stage : stages) { + for(Map.Entry entry : stage.entrySet()) { + Map mutator = (Map) entry.getValue(); + NoiseSampler mutatorNoise = new NoiseBuilderLoader().load(NoiseBuilder.class, mutator.get("noise"), loader).build((int) seed.longValue()); + + if(entry.getKey().equals("expand")) { + if(mutator.get("type").equals("FRACTAL")) + pipelineBuilder.addStage(new ExpanderStage(new FractalExpander(mutatorNoise))); + else throw new LoadException("No such expander \"" + mutator.get("type")); + } else if(entry.getKey().equals("mutate")) { + if(mutator.get("type").equals("SMOOTH")) + pipelineBuilder.addStage(new MutatorStage(new SmoothMutator(mutatorNoise))); + else if(mutator.get("type").equals("REPLACE")) { + String fromTag = mutator.get("from").toString(); + ProbabilityCollection replaceBiomes = new SelfProbabilityCollectionLoader().load(Types.TERRA_BIOME_PROBABILITY_COLLECTION_TYPE, mutator.get("to"), loader); + pipelineBuilder.addStage(new MutatorStage(new ReplaceMutator(fromTag, replaceBiomes, mutatorNoise))); + } else if(mutator.get("type").equals("BORDER")) { + String fromTag = mutator.get("from").toString(); + String replaceTag = mutator.get("replace").toString(); + ProbabilityCollection replaceBiomes = (ProbabilityCollection) loader.loadType(Types.TERRA_BIOME_PROBABILITY_COLLECTION_TYPE, mutator.get("to")); + pipelineBuilder.addStage(new MutatorStage(new BorderMutator(fromTag, replaceTag, mutatorNoise, replaceBiomes))); + } else throw new LoadException("No such mutator type \"" + mutator.get("type")); + } else throw new LoadException("No such mutator \"" + entry.getKey() + "\""); + } } + BiomePipeline biomePipeline = pipelineBuilder.build(new RandomSource(sourceBiomes, sourceNoise)); + Debug.info("Biome Pipeline scale factor: " + biomePipeline.getSize()); + return biomePipeline; + }, main); + builder.setResolution(resolution); + if(map.containsKey("blend")) { + Map blend = (Map) map.get("blend"); + if(blend.containsKey("amplitude")) builder.setNoiseAmp(Integer.parseInt(blend.get("amplitude").toString())); + if(blend.containsKey("noise")) + builder.setBuilder(new NoiseBuilderLoader().load(NoiseBuilder.class, blend.get("noise"), loader)); } - BiomePipeline pipeline = pipelineBuilder.build(new RandomSource(sourceBiomes, sourceNoise)); - Debug.info("Biome Pipeline scale factor: " + pipeline.getSize()); - return pipeline; - }, main); - if(map.containsKey("resolution")) builder.setResolution(Integer.parseInt(map.get("resolution").toString())); - if(map.containsKey("blend")) { - Map blend = (Map) map.get("blend"); - if(blend.containsKey("amplitude")) builder.setNoiseAmp(Integer.parseInt(blend.get("amplitude").toString())); - if(blend.containsKey("noise")) - builder.setBuilder(new NoiseBuilderLoader().load(NoiseBuilder.class, blend.get("noise"), loader)); - } - return builder; + return builder; + } else if(map.get("type").equals("IMAGE")) { + Map imageMap = (Map) map.get("image"); + try { + main.getLogger().info("Using image " + imageMap.get("name") + " for biome distribution."); + BufferedImage image = ImageIO.read(fileLoader.get(imageMap.get("name").toString())); + return new ImageBiomeProvider.ImageBiomeProviderBuilder(image, resolution, biomeRegistry); + } catch(IOException e) { + throw new LoadException("Failed to load image", e); + } + } else throw new LoadException("No such biome provider type: " + map.get("type")); } } diff --git a/common/src/main/java/com/dfsek/terra/registry/BiomeRegistry.java b/common/src/main/java/com/dfsek/terra/registry/BiomeRegistry.java index 66c59dc3c..2781b59f1 100644 --- a/common/src/main/java/com/dfsek/terra/registry/BiomeRegistry.java +++ b/common/src/main/java/com/dfsek/terra/registry/BiomeRegistry.java @@ -1,6 +1,6 @@ package com.dfsek.terra.registry; -import com.dfsek.terra.biome.UserDefinedBiome; +import com.dfsek.terra.api.world.biome.TerraBiome; -public class BiomeRegistry extends TerraRegistry { +public class BiomeRegistry extends TerraRegistry { } diff --git a/common/src/test/java/biome/DistributionTest.java b/common/src/test/java/biome/DistributionTest.java index 8239c7ebc..4305b5cd0 100644 --- a/common/src/test/java/biome/DistributionTest.java +++ b/common/src/test/java/biome/DistributionTest.java @@ -21,7 +21,7 @@ import com.dfsek.terra.config.loaders.ProbabilityCollectionLoader; import com.dfsek.terra.config.loaders.config.biome.BiomeProviderBuilderLoader; import com.dfsek.terra.config.templates.AbstractableTemplate; import com.dfsek.terra.debug.Debug; -import com.dfsek.terra.registry.TerraRegistry; +import com.dfsek.terra.registry.BiomeRegistry; import org.junit.jupiter.api.Test; import javax.swing.*; @@ -48,13 +48,12 @@ public class DistributionTest { AbstractConfigLoader loader = new AbstractConfigLoader(); - TerraRegistry biomeRegistry = new TerraRegistry() { - }; + BiomeRegistry biomeRegistry = new BiomeRegistry(); folderLoader.open("biomes", ".yml").then(inputStreams -> ConfigPack.buildAll((template, main) -> template, biomeRegistry, loader.load(inputStreams, TestBiome::new), null)); BiomeProviderTemplate template = new BiomeProviderTemplate(); ConfigLoader pipeLoader = new ConfigLoader() - .registerLoader(BiomeProvider.BiomeProviderBuilder.class, new BiomeProviderBuilderLoader(null)) + .registerLoader(BiomeProvider.BiomeProviderBuilder.class, new BiomeProviderBuilderLoader(null, biomeRegistry, folderLoader)) .registerLoader(ProbabilityCollection.class, new ProbabilityCollectionLoader()) .registerLoader(TerraBiome.class, biomeRegistry); new GenericLoaders(null).register(pipeLoader); diff --git a/common/src/test/java/biome/ImageTest.java b/common/src/test/java/biome/ImageTest.java new file mode 100644 index 000000000..82b69c7d0 --- /dev/null +++ b/common/src/test/java/biome/ImageTest.java @@ -0,0 +1,222 @@ +package biome; + +import com.dfsek.tectonic.abstraction.AbstractConfigLoader; +import com.dfsek.tectonic.annotations.Abstractable; +import com.dfsek.tectonic.annotations.Default; +import com.dfsek.tectonic.annotations.Value; +import com.dfsek.tectonic.config.ConfigTemplate; +import com.dfsek.tectonic.config.ValidatedConfigTemplate; +import com.dfsek.tectonic.exception.ConfigException; +import com.dfsek.terra.api.math.ProbabilityCollection; +import com.dfsek.terra.api.platform.world.Biome; +import com.dfsek.terra.api.platform.world.World; +import com.dfsek.terra.api.world.biome.Generator; +import com.dfsek.terra.api.world.biome.TerraBiome; +import com.dfsek.terra.biome.BiomeProvider; +import com.dfsek.terra.biome.ImageBiomeProvider; +import com.dfsek.terra.config.base.ConfigPack; +import com.dfsek.terra.config.files.FolderLoader; +import com.dfsek.terra.config.templates.AbstractableTemplate; +import com.dfsek.terra.debug.Debug; +import com.dfsek.terra.registry.TerraRegistry; +import org.junit.jupiter.api.Test; + +import javax.imageio.ImageIO; +import javax.swing.*; +import java.awt.*; +import java.awt.event.KeyEvent; +import java.awt.event.KeyListener; +import java.awt.event.MouseEvent; +import java.awt.event.MouseListener; +import java.awt.image.BufferedImage; +import java.awt.image.ColorModel; +import java.awt.image.WritableRaster; +import java.io.File; +import java.io.IOException; +import java.util.HashSet; +import java.util.Set; +import java.util.concurrent.ThreadLocalRandom; +import java.util.logging.Logger; + +public class ImageTest { + private static ImageBiomeProvider getProvider(long seed) throws ConfigException, IOException { + System.out.println(seed); + File pack = new File("/home/dfsek/Documents/Terra/platforms/bukkit/target/server/plugins/Terra/packs/default/"); + FolderLoader folderLoader = new FolderLoader(pack.toPath()); + + AbstractConfigLoader loader = new AbstractConfigLoader(); + + TerraRegistry biomeRegistry = new TerraRegistry() { + }; + folderLoader.open("biomes", ".yml").then(inputStreams -> ConfigPack.buildAll((template, main) -> template, biomeRegistry, loader.load(inputStreams, TestBiome::new), null)); + + return new ImageBiomeProvider(biomeRegistry, ImageIO.read(ImageTest.class.getResourceAsStream("/map.jpg")), 1); + } + + @Test + public static void main(String... args) throws ConfigException, IOException { + Debug.setLogger(Logger.getLogger("Terra")); + Debug.setDebug(true); + JFrame testFrame = new JFrame("Biome Viewer"); + + + final BiomeProvider[] provider = {getProvider(2403)}; + + + int size = 1024; + final BufferedImage[] image = {new BufferedImage(size, size, BufferedImage.TYPE_INT_ARGB)}; + for(int x = 0; x < size; x++) { + for(int z = 0; z < size; z++) { + image[0].setRGB(x, z, provider[0].getBiome(x, z).getColor()); + } + } + + JLabel img = new JLabel(new ImageIcon(image[0])); + + testFrame.add(img); + testFrame.pack(); + img.addMouseListener(new MouseListener() { + @Override + public void mouseClicked(MouseEvent e) { + BufferedImage newImage = deepCopy(image[0]); + Graphics graphics = newImage.getGraphics(); + graphics.setColor(Color.WHITE); + graphics.fillRect(0, 0, 512, 24); + graphics.setColor(Color.BLACK); + graphics.setFont(new Font("Monospace", Font.BOLD, 20)); + graphics.drawString(provider[0].getBiome(e.getX(), e.getY()).toString(), 0, 20); + + graphics.setColor(Color.WHITE); + graphics.fillOval(e.getX() - 2, e.getY() - 2, 12, 12); + graphics.setColor(Color.BLACK); + graphics.fillOval(e.getX(), e.getY(), 8, 8); + + img.setIcon(new ImageIcon(newImage)); + } + + @Override + public void mousePressed(MouseEvent e) { + + } + + @Override + public void mouseReleased(MouseEvent e) { + + } + + @Override + public void mouseEntered(MouseEvent e) { + + } + + @Override + public void mouseExited(MouseEvent e) { + + } + }); + + testFrame.addKeyListener(new KeyListener() { + @Override + public void keyTyped(KeyEvent e) { + if(e.getKeyChar() == 's') { + try { + provider[0] = getProvider(ThreadLocalRandom.current().nextLong()); + } catch(ConfigException | IOException configException) { + configException.printStackTrace(); + } + image[0] = new BufferedImage(size, size, BufferedImage.TYPE_INT_ARGB); + for(int x = 0; x < size; x++) { + for(int z = 0; z < size; z++) { + image[0].setRGB(x, z, provider[0].getBiome(x, z).getColor()); + } + } + img.setIcon(new ImageIcon(image[0])); + } + } + + @Override + public void keyPressed(KeyEvent e) { + + } + + @Override + public void keyReleased(KeyEvent e) { + + } + }); + + testFrame.setResizable(false); + testFrame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); + testFrame.setVisible(true); + + } + + private static BufferedImage deepCopy(BufferedImage bi) { + ColorModel cm = bi.getColorModel(); + boolean isAlphaPremultiplied = cm.isAlphaPremultiplied(); + WritableRaster raster = bi.copyData(null); + return new BufferedImage(cm, raster, isAlphaPremultiplied, null); + } + + private static final class BiomeProviderTemplate implements ConfigTemplate { + @Value("biome-pipeline") + BiomeProvider.BiomeProviderBuilder biomeProviderBuilder; + + public BiomeProvider.BiomeProviderBuilder getBiomeProviderBuilder() { + return biomeProviderBuilder; + } + } + + private static final class TestBiome extends AbstractableTemplate implements TerraBiome, ValidatedConfigTemplate { + + @Value("color") + @Default + @Abstractable + private int color; + + @Value("tags") + @Abstractable + @Default + private Set tags = new HashSet<>(); + + @Value("id") + private String id; + + @Override + public ProbabilityCollection getVanillaBiomes() { + return null; + } + + @Override + public Generator getGenerator(World w) { + return null; + } + + @Override + public int getColor() { + return color; + } + + @Override + public Set getTags() { + return tags; + } + + @Override + public boolean validate() { + color += (255 << 24); // Alpha adjustment + tags.add("BIOME:" + id); + return true; + } + + @Override + public String getID() { + return id; + } + + @Override + public String toString() { + return id; + } + } +} diff --git a/common/src/test/resources/map.jpg b/common/src/test/resources/map.jpg new file mode 100644 index 0000000000000000000000000000000000000000..8179d9d7064043edaf87256d27f999cb719ee32f GIT binary patch literal 88125 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 OQf7S(5dQ$6fB)GoFH{%+ literal 0 HcmV?d00001 diff --git a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/biome/BiomeInfoCommand.java b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/biome/BiomeInfoCommand.java index 7ac34d132..ea5a0aab9 100644 --- a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/biome/BiomeInfoCommand.java +++ b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/biome/BiomeInfoCommand.java @@ -32,15 +32,13 @@ public class BiomeInfoCommand extends WorldCommand { ConfigPack cfg = getMain().getWorld(BukkitAdapter.adapt(world)).getConfig(); UserDefinedBiome b; try { - b = cfg.getBiome(id); + b = (UserDefinedBiome) cfg.getBiome(id); } catch(IllegalArgumentException | NullPointerException e) { LangUtil.send("command.biome.invalid", new BukkitCommandSender(sender), id); return true; } sender.sendMessage("TerraBiome info for \"" + b.getID() + "\"."); sender.sendMessage("Vanilla biome: " + b.getVanillaBiomes()); - sender.sendMessage("Eroded by: " + b.getErode().getConfig().getID()); - BiomeTemplate bio = b.getConfig(); diff --git a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/biome/BiomeLocateCommand.java b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/biome/BiomeLocateCommand.java index 2f1ebf43f..55333edcd 100644 --- a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/biome/BiomeLocateCommand.java +++ b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/biome/BiomeLocateCommand.java @@ -2,8 +2,8 @@ package com.dfsek.terra.bukkit.command.command.biome; import com.dfsek.terra.TerraWorld; import com.dfsek.terra.api.math.vector.Vector3; +import com.dfsek.terra.api.world.biome.TerraBiome; import com.dfsek.terra.async.AsyncBiomeFinder; -import com.dfsek.terra.biome.UserDefinedBiome; import com.dfsek.terra.bukkit.TerraBukkitPlugin; import com.dfsek.terra.bukkit.command.WorldCommand; import com.dfsek.terra.bukkit.world.BukkitAdapter; @@ -41,7 +41,7 @@ public class BiomeLocateCommand extends WorldCommand { LangUtil.send("command.biome.invalid-radius", BukkitAdapter.adapt(sender), args[1]); return true; } - UserDefinedBiome b; + TerraBiome b; try { b = getMain().getWorld(BukkitAdapter.adapt(world)).getConfig().getBiome(id); } catch(IllegalArgumentException | NullPointerException e) { diff --git a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/generator/BukkitChunkGeneratorWrapper.java b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/generator/BukkitChunkGeneratorWrapper.java index 909466ac4..673ad3ed2 100644 --- a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/generator/BukkitChunkGeneratorWrapper.java +++ b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/generator/BukkitChunkGeneratorWrapper.java @@ -10,6 +10,7 @@ import com.dfsek.terra.bukkit.world.BukkitAdapter; import com.dfsek.terra.bukkit.world.BukkitBiomeGrid; import com.dfsek.terra.config.lang.LangUtil; import com.dfsek.terra.debug.Debug; +import com.dfsek.terra.population.CavePopulator; import com.dfsek.terra.population.FloraPopulator; import com.dfsek.terra.population.OrePopulator; import com.dfsek.terra.population.StructurePopulator; @@ -89,7 +90,7 @@ public class BukkitChunkGeneratorWrapper extends ChunkGenerator implements Gener @Override public @NotNull List getDefaultPopulators(@NotNull World world) { - return Stream.of(new StructurePopulator(main), popMan).map(BukkitPopulatorWrapper::new).collect(Collectors.toList()); + return Stream.of(new CavePopulator(main), new StructurePopulator(main), popMan).map(BukkitPopulatorWrapper::new).collect(Collectors.toList()); } @Override