From 36d0ef77fb78558848a72d0089fd9f1d22c7cf82 Mon Sep 17 00:00:00 2001 From: Astrash Date: Tue, 2 May 2023 12:58:37 +1000 Subject: [PATCH] Add image support addon for biome pipeline --- common/addons/pipeline-image/LICENSE | 21 ++++++ common/addons/pipeline-image/build.gradle.kts | 7 ++ .../biome/pipeline/image/ImageSource.java | 29 ++++++++ .../pipeline/image/PipelineImageAddon.java | 68 +++++++++++++++++++ .../image/config/ImageSourceTemplate.java | 25 +++++++ ...stPipelineBiomeColorConverterTemplate.java | 19 ++++++ ...ctPipelineBiomeColorConverterTemplate.java | 37 ++++++++++ ...inedPipelineBiomeColorMappingTemplate.java | 24 +++++++ .../src/main/resources/terra.addon.yml | 15 ++++ 9 files changed, 245 insertions(+) create mode 100644 common/addons/pipeline-image/LICENSE create mode 100644 common/addons/pipeline-image/build.gradle.kts create mode 100644 common/addons/pipeline-image/src/main/java/com/dfsek/terra/addons/biome/pipeline/image/ImageSource.java create mode 100644 common/addons/pipeline-image/src/main/java/com/dfsek/terra/addons/biome/pipeline/image/PipelineImageAddon.java create mode 100644 common/addons/pipeline-image/src/main/java/com/dfsek/terra/addons/biome/pipeline/image/config/ImageSourceTemplate.java create mode 100644 common/addons/pipeline-image/src/main/java/com/dfsek/terra/addons/biome/pipeline/image/config/converter/ClosestPipelineBiomeColorConverterTemplate.java create mode 100644 common/addons/pipeline-image/src/main/java/com/dfsek/terra/addons/biome/pipeline/image/config/converter/ExactPipelineBiomeColorConverterTemplate.java create mode 100644 common/addons/pipeline-image/src/main/java/com/dfsek/terra/addons/biome/pipeline/image/config/converter/mapping/DefinedPipelineBiomeColorMappingTemplate.java create mode 100644 common/addons/pipeline-image/src/main/resources/terra.addon.yml diff --git a/common/addons/pipeline-image/LICENSE b/common/addons/pipeline-image/LICENSE new file mode 100644 index 000000000..22b8e06e5 --- /dev/null +++ b/common/addons/pipeline-image/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2020-2023 Polyhedral Development + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. \ No newline at end of file diff --git a/common/addons/pipeline-image/build.gradle.kts b/common/addons/pipeline-image/build.gradle.kts new file mode 100644 index 000000000..1befb4b44 --- /dev/null +++ b/common/addons/pipeline-image/build.gradle.kts @@ -0,0 +1,7 @@ +version = version("1.0.0") + +dependencies { + compileOnlyApi(project(":common:addons:manifest-addon-loader")) + compileOnlyApi(project(":common:addons:biome-provider-pipeline-v2")) + compileOnlyApi(project(":common:addons:library-image")) +} diff --git a/common/addons/pipeline-image/src/main/java/com/dfsek/terra/addons/biome/pipeline/image/ImageSource.java b/common/addons/pipeline-image/src/main/java/com/dfsek/terra/addons/biome/pipeline/image/ImageSource.java new file mode 100644 index 000000000..857e0de34 --- /dev/null +++ b/common/addons/pipeline-image/src/main/java/com/dfsek/terra/addons/biome/pipeline/image/ImageSource.java @@ -0,0 +1,29 @@ +package com.dfsek.terra.addons.biome.pipeline.image; + +import com.dfsek.terra.addons.biome.pipeline.v2.api.Source; +import com.dfsek.terra.addons.biome.pipeline.v2.api.biome.PipelineBiome; +import com.dfsek.terra.addons.image.colorsampler.ColorSampler; +import com.dfsek.terra.addons.image.converter.ColorConverter; + + +public class ImageSource implements Source { + + private final ColorSampler colorSampler; + + private final ColorConverter colorConverter; + + public ImageSource(ColorSampler colorSampler, ColorConverter colorConverter) { + this.colorSampler = colorSampler; + this.colorConverter = colorConverter; + } + + @Override + public PipelineBiome get(long seed, int x, int z) { + return colorConverter.apply(colorSampler.apply(x, z)); + } + + @Override + public Iterable getBiomes() { + return colorConverter.getEntries(); + } +} diff --git a/common/addons/pipeline-image/src/main/java/com/dfsek/terra/addons/biome/pipeline/image/PipelineImageAddon.java b/common/addons/pipeline-image/src/main/java/com/dfsek/terra/addons/biome/pipeline/image/PipelineImageAddon.java new file mode 100644 index 000000000..eb62a79b2 --- /dev/null +++ b/common/addons/pipeline-image/src/main/java/com/dfsek/terra/addons/biome/pipeline/image/PipelineImageAddon.java @@ -0,0 +1,68 @@ +package com.dfsek.terra.addons.biome.pipeline.image; + +import com.dfsek.tectonic.api.config.template.object.ObjectTemplate; + +import java.util.function.Supplier; + +import com.dfsek.terra.addons.biome.pipeline.image.config.ImageSourceTemplate; +import com.dfsek.terra.addons.biome.pipeline.image.config.converter.ClosestPipelineBiomeColorConverterTemplate; +import com.dfsek.terra.addons.biome.pipeline.image.config.converter.ExactPipelineBiomeColorConverterTemplate; +import com.dfsek.terra.addons.biome.pipeline.image.config.converter.mapping.DefinedPipelineBiomeColorMappingTemplate; +import com.dfsek.terra.addons.biome.pipeline.v2.BiomePipelineAddon; +import com.dfsek.terra.addons.biome.pipeline.v2.api.Source; +import com.dfsek.terra.addons.biome.pipeline.v2.api.biome.DelegatedPipelineBiome; +import com.dfsek.terra.addons.biome.pipeline.v2.api.biome.PipelineBiome; +import com.dfsek.terra.addons.image.converter.ColorConverter; +import com.dfsek.terra.addons.image.converter.mapping.BiomeDefinedColorMapping; +import com.dfsek.terra.addons.image.converter.mapping.ColorMapping; +import com.dfsek.terra.addons.manifest.api.AddonInitializer; +import com.dfsek.terra.api.Platform; +import com.dfsek.terra.api.addon.BaseAddon; +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.Biome; + + +public class PipelineImageAddon implements AddonInitializer { + + public static final TypeKey>>> PIPELINE_BIOME_COLOR_CONVERTER_REGISTRY_KEY = new TypeKey<>() { + }; + + public static final TypeKey>>> PIPELINE_BIOME_COLOR_MAPPING_REGISTRY_KEY = new TypeKey<>() { + }; + + @Inject + private Platform platform; + + @Inject + private BaseAddon addon; + + @Override + public void initialize() { + + platform.getEventManager() + .getHandler(FunctionalEventHandler.class) + .register(addon, ConfigPackPreLoadEvent.class) + .priority(500) + .then(event -> { + CheckedRegistry>>> biomeColorConverterRegistry = event.getPack().getOrCreateRegistry( + PIPELINE_BIOME_COLOR_CONVERTER_REGISTRY_KEY); + biomeColorConverterRegistry.register(addon.key("EXACT"), ExactPipelineBiomeColorConverterTemplate::new); + biomeColorConverterRegistry.register(addon.key("CLOSEST"), ClosestPipelineBiomeColorConverterTemplate::new); + }) + .then(event -> { + CheckedRegistry>> sourceRegistry = event.getPack().getOrCreateRegistry(BiomePipelineAddon.SOURCE_REGISTRY_KEY); + sourceRegistry.register(addon.key("IMAGE"), ImageSourceTemplate::new); + }) + .then(event -> { + CheckedRegistry>>> biomeColorMappingRegistry = event.getPack().getOrCreateRegistry( + PIPELINE_BIOME_COLOR_MAPPING_REGISTRY_KEY); + biomeColorMappingRegistry.register(addon.key("USE_BIOME_COLORS"), () -> () -> new BiomeDefinedColorMapping<>(event.getPack().getRegistry(Biome.class), DelegatedPipelineBiome::new)); + biomeColorMappingRegistry.register(addon.key("MAP"), DefinedPipelineBiomeColorMappingTemplate::new); + }) + .failThrough(); + } +} diff --git a/common/addons/pipeline-image/src/main/java/com/dfsek/terra/addons/biome/pipeline/image/config/ImageSourceTemplate.java b/common/addons/pipeline-image/src/main/java/com/dfsek/terra/addons/biome/pipeline/image/config/ImageSourceTemplate.java new file mode 100644 index 000000000..40d2910c8 --- /dev/null +++ b/common/addons/pipeline-image/src/main/java/com/dfsek/terra/addons/biome/pipeline/image/config/ImageSourceTemplate.java @@ -0,0 +1,25 @@ +package com.dfsek.terra.addons.biome.pipeline.image.config; + +import com.dfsek.tectonic.api.config.template.annotations.Value; +import com.dfsek.tectonic.api.config.template.object.ObjectTemplate; + +import com.dfsek.terra.addons.biome.pipeline.image.ImageSource; +import com.dfsek.terra.addons.biome.pipeline.v2.api.Source; +import com.dfsek.terra.addons.biome.pipeline.v2.api.biome.PipelineBiome; +import com.dfsek.terra.addons.image.colorsampler.ColorSampler; +import com.dfsek.terra.addons.image.converter.ColorConverter; + + +public class ImageSourceTemplate implements ObjectTemplate { + + @Value("color-sampler") + private ColorSampler colorSampler; + + @Value("color-conversion") + private ColorConverter colorConverter; + + @Override + public Source get() { + return new ImageSource(colorSampler, colorConverter); + } +} diff --git a/common/addons/pipeline-image/src/main/java/com/dfsek/terra/addons/biome/pipeline/image/config/converter/ClosestPipelineBiomeColorConverterTemplate.java b/common/addons/pipeline-image/src/main/java/com/dfsek/terra/addons/biome/pipeline/image/config/converter/ClosestPipelineBiomeColorConverterTemplate.java new file mode 100644 index 000000000..a695398dc --- /dev/null +++ b/common/addons/pipeline-image/src/main/java/com/dfsek/terra/addons/biome/pipeline/image/config/converter/ClosestPipelineBiomeColorConverterTemplate.java @@ -0,0 +1,19 @@ +package com.dfsek.terra.addons.biome.pipeline.image.config.converter; + +import com.dfsek.tectonic.api.config.template.annotations.Value; + +import com.dfsek.terra.addons.biome.pipeline.v2.api.biome.PipelineBiome; +import com.dfsek.terra.addons.image.config.converter.ClosestColorConverterTemplate; +import com.dfsek.terra.addons.image.converter.mapping.ColorMapping; + + +public class ClosestPipelineBiomeColorConverterTemplate extends ClosestColorConverterTemplate { + + @Value("match") + private ColorMapping match; + + @Override + protected ColorMapping getMapping() { + return match; + } +} diff --git a/common/addons/pipeline-image/src/main/java/com/dfsek/terra/addons/biome/pipeline/image/config/converter/ExactPipelineBiomeColorConverterTemplate.java b/common/addons/pipeline-image/src/main/java/com/dfsek/terra/addons/biome/pipeline/image/config/converter/ExactPipelineBiomeColorConverterTemplate.java new file mode 100644 index 000000000..305a03e31 --- /dev/null +++ b/common/addons/pipeline-image/src/main/java/com/dfsek/terra/addons/biome/pipeline/image/config/converter/ExactPipelineBiomeColorConverterTemplate.java @@ -0,0 +1,37 @@ +package com.dfsek.terra.addons.biome.pipeline.image.config.converter; + +import com.dfsek.tectonic.api.config.template.annotations.Default; +import com.dfsek.tectonic.api.config.template.annotations.Value; + +import com.dfsek.terra.addons.biome.pipeline.v2.api.biome.PipelineBiome; +import com.dfsek.terra.addons.image.config.converter.ExactColorConverterTemplate; +import com.dfsek.terra.addons.image.converter.mapping.ColorMapping; + + +public class ExactPipelineBiomeColorConverterTemplate extends ExactColorConverterTemplate { + + @Value("match") + private ColorMapping match; + + @Value("else") + private PipelineBiome fallback; + + @Value("ignore-alpha") + @Default + private boolean ignoreAlpha = true; + + @Override + protected ColorMapping getMapping() { + return match; + } + + @Override + protected PipelineBiome getFallback() { + return fallback; + } + + @Override + protected boolean ignoreAlpha() { + return ignoreAlpha; + } +} diff --git a/common/addons/pipeline-image/src/main/java/com/dfsek/terra/addons/biome/pipeline/image/config/converter/mapping/DefinedPipelineBiomeColorMappingTemplate.java b/common/addons/pipeline-image/src/main/java/com/dfsek/terra/addons/biome/pipeline/image/config/converter/mapping/DefinedPipelineBiomeColorMappingTemplate.java new file mode 100644 index 000000000..b1d4115f2 --- /dev/null +++ b/common/addons/pipeline-image/src/main/java/com/dfsek/terra/addons/biome/pipeline/image/config/converter/mapping/DefinedPipelineBiomeColorMappingTemplate.java @@ -0,0 +1,24 @@ +package com.dfsek.terra.addons.biome.pipeline.image.config.converter.mapping; + +import com.dfsek.tectonic.api.config.template.annotations.Value; +import com.dfsek.tectonic.api.config.template.object.ObjectTemplate; + +import java.util.Map; + +import com.dfsek.terra.addons.biome.pipeline.v2.api.biome.PipelineBiome; +import com.dfsek.terra.addons.image.config.ColorLoader.ColorString; +import com.dfsek.terra.addons.image.converter.mapping.ColorMapping; +import com.dfsek.terra.addons.image.util.MapUtil; + + +public class DefinedPipelineBiomeColorMappingTemplate implements ObjectTemplate> { + + @Value("map") + Map map; + + @Override + public ColorMapping get() { + var map = MapUtil.mapKeys(this.map, ColorString::getColor); + return () -> map; + } +} diff --git a/common/addons/pipeline-image/src/main/resources/terra.addon.yml b/common/addons/pipeline-image/src/main/resources/terra.addon.yml new file mode 100644 index 000000000..09adeb933 --- /dev/null +++ b/common/addons/pipeline-image/src/main/resources/terra.addon.yml @@ -0,0 +1,15 @@ +schema-version: 1 +contributors: + - Terra contributors +id: pipeline-image +version: @VERSION@ +entrypoints: + - "com.dfsek.terra.addons.biome.pipeline.image.PipelineImageAddon" +website: + issues: https://github.com/PolyhedralDev/Terra/issues + source: https://github.com/PolyhedralDev/Terra + docs: https://terra.polydev.org +license: MIT License +depends: + library-image: "1.+" + biome-provider-pipeline-v2: "1.+"