commit 8998d46f205b89f1407844a4678676dd5acadae5 Author: dfsek Date: Sun Oct 17 14:03:11 2021 -0700 Initial commit diff --git a/common/addons/biome-provider-image/README.md b/common/addons/biome-provider-image/README.md new file mode 100644 index 000000000..49e9b8fdb --- /dev/null +++ b/common/addons/biome-provider-image/README.md @@ -0,0 +1,6 @@ +# biome-provider-image + +Implements and registers the `IMAGE` biome provider, a biome provider which +generates biomes from an image, using the `color` attribute of biomes. + +This addon registers the provider type, and all associated config options. \ No newline at end of file diff --git a/common/addons/biome-provider-image/build.gradle.kts b/common/addons/biome-provider-image/build.gradle.kts new file mode 100644 index 000000000..7d82dc72f --- /dev/null +++ b/common/addons/biome-provider-image/build.gradle.kts @@ -0,0 +1,2 @@ +dependencies { +} diff --git a/common/addons/biome-provider-image/src/main/java/com/dfsek/terra/addons/biome/image/ImageBiomeProvider.java b/common/addons/biome-provider-image/src/main/java/com/dfsek/terra/addons/biome/image/ImageBiomeProvider.java new file mode 100644 index 000000000..3ba0cb9ba --- /dev/null +++ b/common/addons/biome-provider-image/src/main/java/com/dfsek/terra/addons/biome/image/ImageBiomeProvider.java @@ -0,0 +1,64 @@ +package com.dfsek.terra.addons.biome.image; + +import net.jafama.FastMath; + +import java.awt.Color; +import java.awt.image.BufferedImage; +import java.util.HashMap; +import java.util.Map; +import java.util.Set; + +import com.dfsek.terra.api.world.biome.TerraBiome; +import com.dfsek.terra.api.world.biome.generation.BiomeProvider; + + +public class ImageBiomeProvider implements BiomeProvider { + private final Map colorBiomeMap = new HashMap<>(); + private final BufferedImage image; + private final int resolution; + private final Align align; + + public ImageBiomeProvider(Set registry, BufferedImage image, int resolution, Align align) { + this.image = image; + this.resolution = resolution; + this.align = align; + 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, long seed) { + x /= resolution; + z /= resolution; + Color color = align.getColor(image, x, z); + 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 enum Align { + CENTER { + @Override + public Color getColor(BufferedImage image, int x, int z) { + return new Color(image.getRGB(FastMath.floorMod(x - image.getWidth() / 2, image.getWidth()), + FastMath.floorMod(z - image.getHeight() / 2, image.getHeight()))); + } + }, + NONE { + @Override + public Color getColor(BufferedImage image, int x, int z) { + return new Color(image.getRGB(FastMath.floorMod(x, image.getWidth()), FastMath.floorMod(z, image.getHeight()))); + } + }; + + public abstract Color getColor(BufferedImage image, int x, int z); + } +} diff --git a/common/addons/biome-provider-image/src/main/java/com/dfsek/terra/addons/biome/image/ImageBiomeProviderAddon.java b/common/addons/biome-provider-image/src/main/java/com/dfsek/terra/addons/biome/image/ImageBiomeProviderAddon.java new file mode 100644 index 000000000..e2cf15bae --- /dev/null +++ b/common/addons/biome-provider-image/src/main/java/com/dfsek/terra/addons/biome/image/ImageBiomeProviderAddon.java @@ -0,0 +1,43 @@ +package com.dfsek.terra.addons.biome.image; + +import com.dfsek.tectonic.loading.object.ObjectTemplate; + +import java.util.function.Supplier; + +import com.dfsek.terra.api.Platform; +import com.dfsek.terra.api.addon.TerraAddon; +import com.dfsek.terra.api.addon.annotations.Addon; +import com.dfsek.terra.api.addon.annotations.Author; +import com.dfsek.terra.api.addon.annotations.Version; +import com.dfsek.terra.api.event.events.config.pack.ConfigPackPreLoadEvent; +import com.dfsek.terra.api.event.functional.FunctionalEventHandler; +import com.dfsek.terra.api.inject.annotations.Inject; +import com.dfsek.terra.api.registry.CheckedRegistry; +import com.dfsek.terra.api.util.reflection.TypeKey; +import com.dfsek.terra.api.world.biome.TerraBiome; +import com.dfsek.terra.api.world.biome.generation.BiomeProvider; + + +@Addon("biome-provider-image") +@Author("Terra") +@Version("1.0.0") +public class ImageBiomeProviderAddon extends TerraAddon { + public static final TypeKey>> PROVIDER_REGISTRY_KEY = new TypeKey<>() { + }; + + @Inject + private Platform platform; + + @Override + public void initialize() { + platform.getEventManager() + .getHandler(FunctionalEventHandler.class) + .register(this, ConfigPackPreLoadEvent.class) + .then(event -> { + CheckedRegistry>> providerRegistry = event.getPack().getOrCreateRegistry( + PROVIDER_REGISTRY_KEY); + providerRegistry.register("IMAGE", () -> new ImageProviderTemplate(event.getPack().getRegistry(TerraBiome.class))); + }) + .failThrough(); + } +} diff --git a/common/addons/biome-provider-image/src/main/java/com/dfsek/terra/addons/biome/image/ImageProviderTemplate.java b/common/addons/biome-provider-image/src/main/java/com/dfsek/terra/addons/biome/image/ImageProviderTemplate.java new file mode 100644 index 000000000..e82f4a004 --- /dev/null +++ b/common/addons/biome-provider-image/src/main/java/com/dfsek/terra/addons/biome/image/ImageProviderTemplate.java @@ -0,0 +1,33 @@ +package com.dfsek.terra.addons.biome.image; + +import com.dfsek.tectonic.annotations.Default; +import com.dfsek.tectonic.annotations.Value; +import com.dfsek.tectonic.loading.object.ObjectTemplate; + +import java.awt.image.BufferedImage; +import java.util.HashSet; + +import com.dfsek.terra.api.registry.Registry; +import com.dfsek.terra.api.world.biome.TerraBiome; +import com.dfsek.terra.api.world.biome.generation.BiomeProvider; + + +public class ImageProviderTemplate implements ObjectTemplate { + private final Registry biomes; + @Value("resolution") + @Default + private int resolution = 1; + @Value("image.name") + private BufferedImage image; + @Value("image.align") + private ImageBiomeProvider.Align align; + + public ImageProviderTemplate(Registry set) { + this.biomes = set; + } + + @Override + public BiomeProvider get() { + return new ImageBiomeProvider(new HashSet<>(biomes.entries()), image, resolution, align); + } +}