image to biome stuff

This commit is contained in:
dfsek
2021-01-18 23:56:46 -07:00
parent 4b21fcd80a
commit 9e830abb90
16 changed files with 392 additions and 100 deletions
@@ -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<Color, TerraBiome> colorBiomeMap = new HashMap<>();
private final BufferedImage image;
private final int resolution;
public ImageBiomeProvider(TerraRegistry<TerraBiome> 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<TerraBiome> registry;
public ImageBiomeProviderBuilder(BufferedImage image, int resolution, TerraRegistry<TerraBiome> registry) {
this.image = image;
this.resolution = resolution;
this.registry = registry;
}
@Override
public BiomeProvider build(long seed) {
return new ImageBiomeProvider(registry, image, resolution);
}
}
}
@@ -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<Biome> vanilla;
private final String id;
private final BiomeTemplate config;
private final ConfigPack pack;
private UserDefinedBiome erode;
private final int color;
private final Set<String> tags;
public UserDefinedBiome(ProbabilityCollection<Biome> vanilla, GeneratorBuilder gen, BiomeTemplate config, ConfigPack pack) {
public UserDefinedBiome(ProbabilityCollection<Biome> 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;
}
@@ -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);