From b99fabcf1d2df6d4db159da3ef8067f6272bfdea Mon Sep 17 00:00:00 2001 From: dfsek Date: Sat, 30 Jan 2021 12:02:06 -0700 Subject: [PATCH] redo noise config loading with new tectonic object goodies --- .../dfsek/terra/config/GenericLoaders.java | 7 ++ .../sampler/NoiseSamplerBuilderLoader.java | 93 ++----------------- .../sampler/templates/DomainWarpTemplate.java | 29 ++++++ .../sampler/templates/FastNoiseTemplate.java | 2 +- .../templates/ImageSamplerTemplate.java | 1 + .../normalizer/LinearNormalizerTemplate.java | 19 ++++ .../normalizer/NormalNormalizerTemplate.java | 24 +++++ .../normalizer/NormalizerTemplate.java | 11 +++ 8 files changed, 101 insertions(+), 85 deletions(-) create mode 100644 common/src/main/java/com/dfsek/terra/config/loaders/config/sampler/templates/DomainWarpTemplate.java create mode 100644 common/src/main/java/com/dfsek/terra/config/loaders/config/sampler/templates/normalizer/LinearNormalizerTemplate.java create mode 100644 common/src/main/java/com/dfsek/terra/config/loaders/config/sampler/templates/normalizer/NormalNormalizerTemplate.java create mode 100644 common/src/main/java/com/dfsek/terra/config/loaders/config/sampler/templates/normalizer/NormalizerTemplate.java diff --git a/common/src/main/java/com/dfsek/terra/config/GenericLoaders.java b/common/src/main/java/com/dfsek/terra/config/GenericLoaders.java index 3bb8610fd..7203efa5e 100644 --- a/common/src/main/java/com/dfsek/terra/config/GenericLoaders.java +++ b/common/src/main/java/com/dfsek/terra/config/GenericLoaders.java @@ -21,8 +21,11 @@ import com.dfsek.terra.config.loaders.config.OreConfigLoader; import com.dfsek.terra.config.loaders.config.OreHolderLoader; import com.dfsek.terra.config.loaders.config.TreeLayerLoader; import com.dfsek.terra.config.loaders.config.sampler.NoiseSamplerBuilderLoader; +import com.dfsek.terra.config.loaders.config.sampler.templates.DomainWarpTemplate; import com.dfsek.terra.config.loaders.config.sampler.templates.FastNoiseTemplate; import com.dfsek.terra.config.loaders.config.sampler.templates.ImageSamplerTemplate; +import com.dfsek.terra.config.loaders.config.sampler.templates.normalizer.LinearNormalizerTemplate; +import com.dfsek.terra.config.loaders.config.sampler.templates.normalizer.NormalNormalizerTemplate; import com.dfsek.terra.config.loaders.palette.PaletteHolderLoader; import com.dfsek.terra.config.loaders.palette.PaletteLayerLoader; import com.dfsek.terra.util.MaterialSet; @@ -55,6 +58,10 @@ public class GenericLoaders implements LoaderRegistrar { .registerLoader(OreHolder.class, new OreHolderLoader()) .registerLoader(FastNoiseTemplate.class, FastNoiseTemplate::new) .registerLoader(ImageSamplerTemplate.class, ImageSamplerTemplate::new) + .registerLoader(DomainWarpTemplate.class, DomainWarpTemplate::new) + .registerLoader(LinearNormalizerTemplate.class, LinearNormalizerTemplate::new) + .registerLoader(NormalNormalizerTemplate.class, NormalNormalizerTemplate::new) + .registerLoader(FastNoiseTemplate.class, FastNoiseTemplate::new) .registerLoader(NoiseSeeded.class, new NoiseSamplerBuilderLoader()) .registerLoader(ImageSampler.Channel.class, (t, object, cf) -> ImageSampler.Channel.valueOf((String) object)) .registerLoader(FastNoiseLite.NoiseType.class, (t, object, cf) -> FastNoiseLite.NoiseType.valueOf((String) object)) diff --git a/common/src/main/java/com/dfsek/terra/config/loaders/config/sampler/NoiseSamplerBuilderLoader.java b/common/src/main/java/com/dfsek/terra/config/loaders/config/sampler/NoiseSamplerBuilderLoader.java index bb78827e6..20a01061d 100644 --- a/common/src/main/java/com/dfsek/terra/config/loaders/config/sampler/NoiseSamplerBuilderLoader.java +++ b/common/src/main/java/com/dfsek/terra/config/loaders/config/sampler/NoiseSamplerBuilderLoader.java @@ -1,18 +1,15 @@ package com.dfsek.terra.config.loaders.config.sampler; -import com.dfsek.tectonic.config.Configuration; -import com.dfsek.tectonic.exception.ConfigException; import com.dfsek.tectonic.exception.LoadException; import com.dfsek.tectonic.loading.ConfigLoader; import com.dfsek.tectonic.loading.TypeLoader; -import com.dfsek.terra.api.math.noise.NoiseSampler; -import com.dfsek.terra.api.math.noise.normalizer.LinearNormalizer; -import com.dfsek.terra.api.math.noise.normalizer.NormalNormalizer; import com.dfsek.terra.api.math.noise.normalizer.Normalizer; -import com.dfsek.terra.api.math.noise.samplers.DomainWarpedSampler; import com.dfsek.terra.api.util.seeded.NoiseSeeded; +import com.dfsek.terra.config.loaders.config.sampler.templates.DomainWarpTemplate; import com.dfsek.terra.config.loaders.config.sampler.templates.FastNoiseTemplate; import com.dfsek.terra.config.loaders.config.sampler.templates.ImageSamplerTemplate; +import com.dfsek.terra.config.loaders.config.sampler.templates.normalizer.LinearNormalizerTemplate; +import com.dfsek.terra.config.loaders.config.sampler.templates.normalizer.NormalNormalizerTemplate; import java.lang.reflect.Type; import java.util.Map; @@ -26,98 +23,26 @@ public class NoiseSamplerBuilderLoader implements TypeLoader { String samplerType = "NOISE"; - int dimensions = map.containsKey("dimensions") - ? Integer.parseInt(map.get("dimensions").toString()) - : 2; - if(map.containsKey("sampler-type")) { samplerType = map.get("sampler-type").toString(); } switch(samplerType) { case "NOISE": - FastNoiseTemplate builder = new FastNoiseTemplate(); - try { - loader.load(builder, new Configuration(map)); - } catch(ConfigException e) { - throw new LoadException("Failed to load noise function", e); - } - return new NoiseSeeded() { - @Override - public NoiseSampler apply(Long seed) { - return builder.apply(seed); - } - - @Override - public int getDimensions() { - return dimensions; - } - }; + return loader.loadClass(FastNoiseTemplate.class, map).get(); case "NORMALIZER": Normalizer.NormalType normalType = loader.loadClass(Normalizer.NormalType.class, map.get("type")); - - NoiseSeeded noise = loader.loadClass(NoiseSeeded.class, map.get("function")); - switch(normalType) { - case LINEAR: { - if(!map.containsKey("max")) throw new LoadException("Max unspecified."); - if(!map.containsKey("min")) throw new LoadException("Min unspecified."); - - - int min = Integer.parseInt(map.get("min").toString()); - int max = Integer.parseInt(map.get("max").toString()); - return new NoiseSeeded() { - @Override - public NoiseSampler apply(Long seed) { - return new LinearNormalizer(noise.apply(seed), min, max); - } - - @Override - public int getDimensions() { - return dimensions; - } - }; - } - case NORMAL: { - if(!map.containsKey("mean")) throw new LoadException("Mean unspecified."); - if(!map.containsKey("standard-deviation")) throw new LoadException("Standard Deviation unspecified."); - if(!map.containsKey("groups")) throw new LoadException("Groups unspecified."); - - double mean = Double.parseDouble(map.get("mean").toString()); - double stdDev = Double.parseDouble(map.get("standard-deviation").toString()); - int groups = Integer.parseInt(map.get("groups").toString()); - return new NoiseSeeded() { - @Override - public NoiseSampler apply(Long seed) { - return new NormalNormalizer(noise.apply(seed), groups, mean, stdDev); - } - - @Override - public int getDimensions() { - return dimensions; - } - }; - } + case LINEAR: + return loader.loadClass(LinearNormalizerTemplate.class, map).get(); + case NORMAL: + return loader.loadClass(NormalNormalizerTemplate.class, map).get(); } case "IMAGE": { return loader.loadClass(ImageSamplerTemplate.class, map).get(); } case "DOMAIN_WARP": - NoiseSeeded warp = loader.loadClass(NoiseSeeded.class, map.get("warp")); - NoiseSeeded target = loader.loadClass(NoiseSeeded.class, map.get("function")); - double amplitude = ((Number) map.getOrDefault("amplitude", 1)).doubleValue(); - int salt = (Integer) map.getOrDefault("salt", 0); - return new NoiseSeeded() { - @Override - public NoiseSampler apply(Long seed) { - return new DomainWarpedSampler(target.apply(seed), warp.apply(seed), (int) (seed + salt), amplitude); - } - - @Override - public int getDimensions() { - return dimensions; - } - }; + return loader.loadClass(DomainWarpTemplate.class, map).get(); } throw new LoadException("No such noise sampler type \"" + samplerType + "\""); diff --git a/common/src/main/java/com/dfsek/terra/config/loaders/config/sampler/templates/DomainWarpTemplate.java b/common/src/main/java/com/dfsek/terra/config/loaders/config/sampler/templates/DomainWarpTemplate.java new file mode 100644 index 000000000..3607c17e9 --- /dev/null +++ b/common/src/main/java/com/dfsek/terra/config/loaders/config/sampler/templates/DomainWarpTemplate.java @@ -0,0 +1,29 @@ +package com.dfsek.terra.config.loaders.config.sampler.templates; + +import com.dfsek.tectonic.annotations.Default; +import com.dfsek.tectonic.annotations.Value; +import com.dfsek.terra.api.math.noise.NoiseSampler; +import com.dfsek.terra.api.math.noise.samplers.DomainWarpedSampler; +import com.dfsek.terra.api.util.seeded.NoiseSeeded; + +@SuppressWarnings({"unused", "FieldMayBeFinal"}) +public class DomainWarpTemplate extends SamplerTemplate { + @Value("warp") + private NoiseSeeded warp; + + @Value("function") + private NoiseSeeded function; + + @Value("salt") + @Default + private int salt = 0; + + @Value("amplitude") + @Default + private double amplitude = 1; + + @Override + public NoiseSampler apply(Long seed) { + return new DomainWarpedSampler(function.apply(seed), warp.apply(seed), (int) (seed + salt), amplitude); + } +} diff --git a/common/src/main/java/com/dfsek/terra/config/loaders/config/sampler/templates/FastNoiseTemplate.java b/common/src/main/java/com/dfsek/terra/config/loaders/config/sampler/templates/FastNoiseTemplate.java index 9da5a2f0e..3c9277eee 100644 --- a/common/src/main/java/com/dfsek/terra/config/loaders/config/sampler/templates/FastNoiseTemplate.java +++ b/common/src/main/java/com/dfsek/terra/config/loaders/config/sampler/templates/FastNoiseTemplate.java @@ -6,7 +6,7 @@ import com.dfsek.terra.api.math.noise.NoiseSampler; import com.dfsek.terra.api.math.noise.samplers.FastNoiseLite; import com.dfsek.terra.api.util.seeded.NoiseSeeded; -@SuppressWarnings("FieldMayBeFinal") +@SuppressWarnings({"unused", "FieldMayBeFinal"}) public class FastNoiseTemplate extends SamplerTemplate implements NoiseSeeded { @Value("type") @Default diff --git a/common/src/main/java/com/dfsek/terra/config/loaders/config/sampler/templates/ImageSamplerTemplate.java b/common/src/main/java/com/dfsek/terra/config/loaders/config/sampler/templates/ImageSamplerTemplate.java index 98dd43504..db2ced46e 100644 --- a/common/src/main/java/com/dfsek/terra/config/loaders/config/sampler/templates/ImageSamplerTemplate.java +++ b/common/src/main/java/com/dfsek/terra/config/loaders/config/sampler/templates/ImageSamplerTemplate.java @@ -6,6 +6,7 @@ import com.dfsek.terra.api.math.noise.samplers.ImageSampler; import java.awt.image.BufferedImage; +@SuppressWarnings({"unused", "FieldMayBeFinal"}) public class ImageSamplerTemplate extends SamplerTemplate { @Value("image") diff --git a/common/src/main/java/com/dfsek/terra/config/loaders/config/sampler/templates/normalizer/LinearNormalizerTemplate.java b/common/src/main/java/com/dfsek/terra/config/loaders/config/sampler/templates/normalizer/LinearNormalizerTemplate.java new file mode 100644 index 000000000..42b7cb2f8 --- /dev/null +++ b/common/src/main/java/com/dfsek/terra/config/loaders/config/sampler/templates/normalizer/LinearNormalizerTemplate.java @@ -0,0 +1,19 @@ +package com.dfsek.terra.config.loaders.config.sampler.templates.normalizer; + +import com.dfsek.tectonic.annotations.Value; +import com.dfsek.terra.api.math.noise.NoiseSampler; +import com.dfsek.terra.api.math.noise.normalizer.LinearNormalizer; + +@SuppressWarnings({"unused", "FieldMayBeFinal"}) +public class LinearNormalizerTemplate extends NormalizerTemplate { + @Value("max") + private double max; + + @Value("min") + private double min; + + @Override + public NoiseSampler apply(Long seed) { + return new LinearNormalizer(function.apply(seed), min, max); + } +} diff --git a/common/src/main/java/com/dfsek/terra/config/loaders/config/sampler/templates/normalizer/NormalNormalizerTemplate.java b/common/src/main/java/com/dfsek/terra/config/loaders/config/sampler/templates/normalizer/NormalNormalizerTemplate.java new file mode 100644 index 000000000..cdc9cc48f --- /dev/null +++ b/common/src/main/java/com/dfsek/terra/config/loaders/config/sampler/templates/normalizer/NormalNormalizerTemplate.java @@ -0,0 +1,24 @@ +package com.dfsek.terra.config.loaders.config.sampler.templates.normalizer; + +import com.dfsek.tectonic.annotations.Default; +import com.dfsek.tectonic.annotations.Value; +import com.dfsek.terra.api.math.noise.NoiseSampler; +import com.dfsek.terra.api.math.noise.normalizer.NormalNormalizer; + +@SuppressWarnings({"unused", "FieldMayBeFinal"}) +public class NormalNormalizerTemplate extends NormalizerTemplate { + @Value("mean") + private double mean; + + @Value("standard-deviation") + private double stdDev; + + @Value("groups") + @Default + private int groups = 16384; + + @Override + public NoiseSampler apply(Long seed) { + return new NormalNormalizer(function.apply(seed), groups, mean, stdDev); + } +} diff --git a/common/src/main/java/com/dfsek/terra/config/loaders/config/sampler/templates/normalizer/NormalizerTemplate.java b/common/src/main/java/com/dfsek/terra/config/loaders/config/sampler/templates/normalizer/NormalizerTemplate.java new file mode 100644 index 000000000..35ad8c7fe --- /dev/null +++ b/common/src/main/java/com/dfsek/terra/config/loaders/config/sampler/templates/normalizer/NormalizerTemplate.java @@ -0,0 +1,11 @@ +package com.dfsek.terra.config.loaders.config.sampler.templates.normalizer; + +import com.dfsek.tectonic.annotations.Value; +import com.dfsek.terra.api.math.noise.normalizer.Normalizer; +import com.dfsek.terra.api.util.seeded.NoiseSeeded; +import com.dfsek.terra.config.loaders.config.sampler.templates.SamplerTemplate; + +public abstract class NormalizerTemplate extends SamplerTemplate { + @Value("function") + protected NoiseSeeded function; +}