redo noise config loading with new tectonic object goodies

This commit is contained in:
dfsek
2021-01-30 12:02:06 -07:00
parent af248ee14a
commit b99fabcf1d
8 changed files with 101 additions and 85 deletions

View File

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

View File

@@ -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<NoiseSeeded> {
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 + "\"");

View File

@@ -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<DomainWarpedSampler> {
@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);
}
}

View File

@@ -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<FastNoiseLite> implements NoiseSeeded {
@Value("type")
@Default

View File

@@ -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<ImageSampler> {
@Value("image")

View File

@@ -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<LinearNormalizer> {
@Value("max")
private double max;
@Value("min")
private double min;
@Override
public NoiseSampler apply(Long seed) {
return new LinearNormalizer(function.apply(seed), min, max);
}
}

View File

@@ -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<NormalNormalizer> {
@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);
}
}

View File

@@ -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<T extends Normalizer> extends SamplerTemplate<T> {
@Value("function")
protected NoiseSeeded function;
}