mirror of
https://github.com/PolyhedralDev/Terra.git
synced 2026-02-16 10:30:42 +00:00
redo noise config loading with new tectonic object goodies
This commit is contained in:
@@ -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))
|
||||
|
||||
@@ -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 + "\"");
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
@@ -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
|
||||
|
||||
@@ -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")
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
Reference in New Issue
Block a user