fix minor biome issues

This commit is contained in:
dfsek
2021-01-17 04:05:30 -07:00
parent beb18c6e2c
commit af5b316326
4 changed files with 123 additions and 101 deletions

View File

@@ -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) {

View File

@@ -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<BiomeProvider.Biom
StandardBiomeProvider.StandardBiomeProviderBuilder builder = new StandardBiomeProvider.StandardBiomeProviderBuilder(seed -> {
Map<String, Object> source = (Map<String, Object>) map.get("source");
ProbabilityCollection<TerraBiome> sourceBiomes = (ProbabilityCollection<TerraBiome>) 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<Map<String, Object>> stages = (List<Map<String, Object>>) 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<String, Object> stage : stages) {
for(Map.Entry<String, Object> entry : stage.entrySet()) {
Map<String, Object> mutator = (Map<String, Object>) 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"))

View File

@@ -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<TestBiome> BIOME_REGISTRY = new TerraRegistry<TestBiome>() {
};
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<TestBiome> biomeRegistry = new TerraRegistry<TestBiome>() {
};
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;
}
}
}

View File

@@ -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);