From af5b31632639fec0ada689f89ac20daf23dbacbc Mon Sep 17 00:00:00 2001 From: dfsek Date: Sun, 17 Jan 2021 04:05:30 -0700 Subject: [PATCH] fix minor biome issues --- .../biome/pipeline/TerraBiomeHolder.java | 4 +- .../biome/BiomeProviderBuilderLoader.java | 12 +- .../src/test/java/biome/DistributionTest.java | 206 ++++++++++-------- .../terra/bukkit/listeners/PaperListener.java | 2 +- 4 files changed, 123 insertions(+), 101 deletions(-) diff --git a/common/src/main/java/com/dfsek/terra/biome/pipeline/TerraBiomeHolder.java b/common/src/main/java/com/dfsek/terra/biome/pipeline/TerraBiomeHolder.java index 619f3cd2d..5f471cbea 100644 --- a/common/src/main/java/com/dfsek/terra/biome/pipeline/TerraBiomeHolder.java +++ b/common/src/main/java/com/dfsek/terra/biome/pipeline/TerraBiomeHolder.java @@ -13,11 +13,11 @@ public class TerraBiomeHolder implements BiomeHolder { private final int offset; public TerraBiomeHolder(int width, Vector2 origin) { - width += 2; + width += 4; this.width = width; biomes = new TerraBiome[width][width]; this.origin = origin; - this.offset = 1; + this.offset = 2; } private TerraBiomeHolder(TerraBiome[][] biomes, Vector2 origin, int width, int offset) { diff --git a/common/src/main/java/com/dfsek/terra/config/loaders/config/biome/BiomeProviderBuilderLoader.java b/common/src/main/java/com/dfsek/terra/config/loaders/config/biome/BiomeProviderBuilderLoader.java index 56abb90d6..6f414b6b1 100644 --- a/common/src/main/java/com/dfsek/terra/config/loaders/config/biome/BiomeProviderBuilderLoader.java +++ b/common/src/main/java/com/dfsek/terra/config/loaders/config/biome/BiomeProviderBuilderLoader.java @@ -21,7 +21,6 @@ import com.dfsek.terra.config.loaders.Types; import com.dfsek.terra.config.loaders.config.NoiseBuilderLoader; import com.dfsek.terra.debug.Debug; import com.dfsek.terra.generation.config.NoiseBuilder; -import net.jafama.FastMath; import java.lang.reflect.Type; import java.util.List; @@ -42,15 +41,20 @@ public class BiomeProviderBuilderLoader implements TypeLoader { 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(FastMath.toInt(seed)); + NoiseSampler sourceNoise = new NoiseBuilderLoader().load(NoiseBuilder.class, source.get("noise"), loader).build((int) seed.longValue()); List> stages = (List>) map.get("pipeline"); - BiomePipeline.BiomePipelineBuilder pipelineBuilder = new BiomePipeline.BiomePipelineBuilder(2); + + int init; + if(map.containsKey("initial-size")) init = Integer.parseInt(map.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(FastMath.toInt(seed)); + 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")) diff --git a/common/src/test/java/biome/DistributionTest.java b/common/src/test/java/biome/DistributionTest.java index cc8cf7830..8239c7ebc 100644 --- a/common/src/test/java/biome/DistributionTest.java +++ b/common/src/test/java/biome/DistributionTest.java @@ -8,148 +8,166 @@ import com.dfsek.tectonic.config.ConfigTemplate; import com.dfsek.tectonic.config.ValidatedConfigTemplate; import com.dfsek.tectonic.exception.ConfigException; import com.dfsek.tectonic.loading.ConfigLoader; -import com.dfsek.tectonic.loading.TypeRegistry; -import com.dfsek.terra.TerraWorld; import com.dfsek.terra.api.GenericLoaders; -import com.dfsek.terra.api.language.Language; import com.dfsek.terra.api.math.ProbabilityCollection; -import com.dfsek.terra.api.platform.TerraPlugin; -import com.dfsek.terra.api.platform.handle.ItemHandle; -import com.dfsek.terra.api.platform.handle.WorldHandle; 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.config.base.ConfigPack; -import com.dfsek.terra.config.base.PluginConfig; import com.dfsek.terra.config.files.FolderLoader; 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.registry.ConfigRegistry; +import com.dfsek.terra.debug.Debug; import com.dfsek.terra.registry.TerraRegistry; import org.junit.jupiter.api.Test; 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 DistributionTest { - private static final TerraRegistry BIOME_REGISTRY = new TerraRegistry() { - }; - private static final TerraPlugin DUMMY = new TerraPlugin() { - @Override - public WorldHandle getWorldHandle() { - return null; - } - - @Override - public boolean isEnabled() { - return false; - } - - @Override - public TerraWorld getWorld(World world) { - return null; - } - - @Override - public Logger getLogger() { - return null; - } - - @Override - public PluginConfig getTerraConfig() { - return null; - } - - @Override - public File getDataFolder() { - return null; - } - - @Override - public boolean isDebug() { - return false; - } - - @Override - public Language getLanguage() { - return null; - } - - @Override - public ConfigRegistry getRegistry() { - return null; - } - - @Override - public void reload() { - - } - - @Override - public ItemHandle getItemHandle() { - return null; - } - - @Override - public void saveDefaultConfig() { - - } - - @Override - public String platformName() { - return null; - } - - @Override - public void register(TypeRegistry registry) { - registry.registerLoader(TerraBiome.class, BIOME_REGISTRY); - } - }; - - @Test - public static void main(String... args) throws ConfigException, IOException { - JFrame testFrame = new JFrame("Biome Viewer"); - + private static BiomeProvider 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(); - folderLoader.open("biomes", ".yml").then(inputStreams -> ConfigPack.buildAll((template, main) -> template, BIOME_REGISTRY, loader.load(inputStreams, TestBiome::new), null)); + TerraRegistry biomeRegistry = new TerraRegistry() { + }; + folderLoader.open("biomes", ".yml").then(inputStreams -> ConfigPack.buildAll((template, main) -> template, biomeRegistry, loader.load(inputStreams, TestBiome::new), null)); - BIOME_REGISTRY.forEach(System.out::println); BiomeProviderTemplate template = new BiomeProviderTemplate(); ConfigLoader pipeLoader = new ConfigLoader() .registerLoader(BiomeProvider.BiomeProviderBuilder.class, new BiomeProviderBuilderLoader(null)) .registerLoader(ProbabilityCollection.class, new ProbabilityCollectionLoader()) - .registerLoader(TerraBiome.class, BIOME_REGISTRY); + .registerLoader(TerraBiome.class, biomeRegistry); new GenericLoaders(null).register(pipeLoader); pipeLoader.load(template, folderLoader.get("pack.yml")); - BiomeProvider provider = template.getBiomeProviderBuilder().build(12); + return template.getBiomeProviderBuilder().build(seed); + } + + @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; - BufferedImage image = new BufferedImage(size, size, BufferedImage.TYPE_INT_ARGB); + 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.setRGB(x, z, provider.getBiome(x, z).getColor()); + image[0].setRGB(x, z, provider[0].getBiome(x, z).getColor()); } } - testFrame.add(new JLabel(new ImageIcon(image))); + + 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; @@ -208,7 +226,7 @@ public class DistributionTest { @Override public String toString() { - return id + ":" + color; + return id; } } } diff --git a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/listeners/PaperListener.java b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/listeners/PaperListener.java index 39f7d218a..b06de01b3 100644 --- a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/listeners/PaperListener.java +++ b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/listeners/PaperListener.java @@ -29,7 +29,7 @@ public class PaperListener implements Listener { TerraWorld tw = main.getWorld(BukkitAdapter.adapt(e.getWorld())); TerraStructure config = tw.getConfig().getStructure(tw.getConfig().getTemplate().getLocatable().get(name)); if(config != null) { - AsyncStructureFinder finder = new AsyncStructureFinder(tw.getGrid(), config, BukkitAdapter.adapt(e.getOrigin()), 0, 500, location -> { + AsyncStructureFinder finder = new AsyncStructureFinder(tw.getBiomeProvider(), config, BukkitAdapter.adapt(e.getOrigin()), 0, 500, location -> { if(location != null) e.setResult(BukkitAdapter.adapt(location.toLocation(BukkitAdapter.adapt(e.getWorld())))); Debug.info("Location: " + location);