Implement multiple slant thresholds

This commit is contained in:
Astrashh 2021-04-29 10:03:04 +10:00
parent 5397df57b8
commit 5542dee7b7
8 changed files with 78 additions and 28 deletions

View File

@ -2,16 +2,19 @@ package com.dfsek.terra.api.util.world;
import com.dfsek.terra.api.math.MathUtil; import com.dfsek.terra.api.math.MathUtil;
import com.dfsek.terra.api.world.palette.Palette; import com.dfsek.terra.api.world.palette.Palette;
import com.dfsek.terra.api.world.palette.holder.PaletteHolder; import com.dfsek.terra.api.world.palette.slant.SlantHolder;
import com.dfsek.terra.config.templates.BiomeTemplate; import com.dfsek.terra.config.templates.BiomeTemplate;
import com.dfsek.terra.world.generation.math.samplers.Sampler; import com.dfsek.terra.world.generation.math.samplers.Sampler;
public final class PaletteUtil { public final class PaletteUtil {
public static Palette getPalette(int x, int y, int z, BiomeTemplate c, Sampler sampler) { public static Palette getPalette(int x, int y, int z, BiomeTemplate c, Sampler sampler) {
PaletteHolder slant = c.getSlantPalette();
if(slant != null && MathUtil.derivative(sampler, x, y, z) > c.getSlantThreshold()) { SlantHolder slant = c.getSlant();
return slant.getPalette(y); double slope = MathUtil.derivative(sampler, x, y, z);
if (slant != null && slope > slant.getMinSlope()) {
return slant.getPalette(slope).getPalette(y);
} }
return c.getPalette().getPalette(y); return c.getPalette().getPalette(y);
} }
} }

View File

@ -0,0 +1,24 @@
package com.dfsek.terra.api.world.palette.slant;
import com.dfsek.terra.api.world.palette.Palette;
import com.dfsek.terra.api.world.palette.holder.PaletteHolder;
import java.util.TreeMap;
public class SlantHolder {
private final TreeMap<Double, PaletteHolder> layers;
private final double minSlope;
public SlantHolder(TreeMap<Double, PaletteHolder> layers, double minSlope) {
this.layers = layers;
this.minSlope = minSlope;
}
public PaletteHolder getPalette(double slope) {
return layers.floorEntry(slope).getValue();
}
public double getMinSlope() {
return minSlope;
}
}

View File

@ -20,6 +20,7 @@ import com.dfsek.terra.api.world.biome.provider.BiomeProvider;
import com.dfsek.terra.api.world.biome.provider.ImageBiomeProvider; import com.dfsek.terra.api.world.biome.provider.ImageBiomeProvider;
import com.dfsek.terra.api.world.palette.holder.PaletteHolder; import com.dfsek.terra.api.world.palette.holder.PaletteHolder;
import com.dfsek.terra.api.world.palette.holder.PaletteLayerHolder; import com.dfsek.terra.api.world.palette.holder.PaletteLayerHolder;
import com.dfsek.terra.api.world.palette.slant.SlantHolder;
import com.dfsek.terra.carving.CarverPalette; import com.dfsek.terra.carving.CarverPalette;
import com.dfsek.terra.config.loaders.LinkedHashMapLoader; import com.dfsek.terra.config.loaders.LinkedHashMapLoader;
import com.dfsek.terra.config.loaders.MaterialSetLoader; import com.dfsek.terra.config.loaders.MaterialSetLoader;
@ -49,6 +50,7 @@ import com.dfsek.terra.config.loaders.config.sampler.templates.normalizer.Normal
import com.dfsek.terra.config.loaders.palette.CarverPaletteLoader; import com.dfsek.terra.config.loaders.palette.CarverPaletteLoader;
import com.dfsek.terra.config.loaders.palette.PaletteHolderLoader; import com.dfsek.terra.config.loaders.palette.PaletteHolderLoader;
import com.dfsek.terra.config.loaders.palette.PaletteLayerLoader; import com.dfsek.terra.config.loaders.palette.PaletteLayerLoader;
import com.dfsek.terra.config.loaders.palette.slant.SlantHolderLoader;
import com.dfsek.terra.world.population.items.flora.FloraLayer; import com.dfsek.terra.world.population.items.flora.FloraLayer;
import com.dfsek.terra.world.population.items.flora.TerraFlora; import com.dfsek.terra.world.population.items.flora.TerraFlora;
import com.dfsek.terra.world.population.items.ores.Ore; import com.dfsek.terra.world.population.items.ores.Ore;
@ -72,6 +74,7 @@ public class GenericLoaders implements LoaderRegistrar {
.registerLoader(GridSpawn.class, new GridSpawnLoader()) .registerLoader(GridSpawn.class, new GridSpawnLoader())
.registerLoader(PaletteHolder.class, new PaletteHolderLoader()) .registerLoader(PaletteHolder.class, new PaletteHolderLoader())
.registerLoader(PaletteLayerHolder.class, new PaletteLayerLoader()) .registerLoader(PaletteLayerHolder.class, new PaletteLayerLoader())
.registerLoader(SlantHolder.class, new SlantHolderLoader())
.registerLoader(FloraLayer.class, new FloraLayerLoader()) .registerLoader(FloraLayer.class, new FloraLayerLoader())
.registerLoader(Ore.Type.class, (t, o, l) -> Ore.Type.valueOf(o.toString())) .registerLoader(Ore.Type.class, (t, o, l) -> Ore.Type.valueOf(o.toString()))
.registerLoader(OreConfig.class, new OreConfigLoader()) .registerLoader(OreConfig.class, new OreConfigLoader())

View File

@ -7,6 +7,7 @@ import com.dfsek.terra.api.math.noise.samplers.ExpressionSampler;
import com.dfsek.terra.api.math.noise.samplers.noise.ConstantSampler; import com.dfsek.terra.api.math.noise.samplers.noise.ConstantSampler;
import com.dfsek.terra.api.util.seeded.NoiseSeeded; import com.dfsek.terra.api.util.seeded.NoiseSeeded;
import com.dfsek.terra.api.world.palette.holder.PaletteHolder; import com.dfsek.terra.api.world.palette.holder.PaletteHolder;
import com.dfsek.terra.api.world.palette.slant.SlantHolder;
import com.dfsek.terra.config.loaders.config.function.FunctionTemplate; import com.dfsek.terra.config.loaders.config.function.FunctionTemplate;
import com.dfsek.terra.world.generation.WorldGenerator; import com.dfsek.terra.world.generation.WorldGenerator;
@ -31,7 +32,7 @@ public class GeneratorBuilder {
private PaletteHolder palettes; private PaletteHolder palettes;
private PaletteHolder slantPalettes; private SlantHolder slantPalettes;
private boolean preventInterpolation; private boolean preventInterpolation;
@ -121,11 +122,11 @@ public class GeneratorBuilder {
this.palettes = palettes; this.palettes = palettes;
} }
public PaletteHolder getSlantPalettes() { public SlantHolder getSlantPalettes() {
return slantPalettes; return slantPalettes;
} }
public void setSlantPalettes(PaletteHolder slantPalettes) { public void setSlantPalettes(SlantHolder slantPalettes) {
this.slantPalettes = slantPalettes; this.slantPalettes = slantPalettes;
} }

View File

@ -54,7 +54,7 @@ public class UserDefinedBiomeBuilder implements BiomeBuilder {
throw new RuntimeException(e); throw new RuntimeException(e);
} }
WorldGenerator generator = new WorldGenerator(template.getPalette(), template.getSlantPalette(), noise, elevation, carving, template.getBiomeNoise().apply(seed), template.getElevationWeight(), WorldGenerator generator = new WorldGenerator(template.getPalette(), template.getSlant(), noise, elevation, carving, template.getBiomeNoise().apply(seed), template.getElevationWeight(),
template.getBlendDistance(), template.getBlendStep(), template.getBlendWeight()); template.getBlendDistance(), template.getBlendStep(), template.getBlendWeight());
return new UserDefinedBiome(template.getVanilla(), generator, template); return new UserDefinedBiome(template.getVanilla(), generator, template);
} }

View File

@ -0,0 +1,30 @@
package com.dfsek.terra.config.loaders.palette.slant;
import com.dfsek.tectonic.exception.LoadException;
import com.dfsek.tectonic.loading.ConfigLoader;
import com.dfsek.tectonic.loading.TypeLoader;
import com.dfsek.terra.api.world.palette.holder.PaletteHolder;
import com.dfsek.terra.api.world.palette.slant.SlantHolder;
import java.lang.reflect.Type;
import java.util.List;
import java.util.Map;
import java.util.TreeMap;
@SuppressWarnings("unchecked")
public class SlantHolderLoader implements TypeLoader<SlantHolder> {
@Override
public SlantHolder load(Type type, Object o, ConfigLoader configLoader) throws LoadException {
List<Map<Object, Object>> layers = (List<Map<Object, Object>>) o;
TreeMap<Double, PaletteHolder> slantLayers = new TreeMap<>();
double minThreshold = Double.MAX_VALUE;
for(Map<Object, Object> layer : layers) {
double threshold = ((Number) layer.get("threshold")).doubleValue();
if (threshold < minThreshold) minThreshold = threshold;
slantLayers.put(threshold, (PaletteHolder) configLoader.loadType(PaletteHolder.class, layer.get("palette")));
}
return new SlantHolder(slantLayers, minThreshold);
}
}

View File

@ -21,6 +21,7 @@ import com.dfsek.terra.api.util.seeded.NoiseSeeded;
import com.dfsek.terra.api.world.palette.Palette; import com.dfsek.terra.api.world.palette.Palette;
import com.dfsek.terra.api.world.palette.SinglePalette; import com.dfsek.terra.api.world.palette.SinglePalette;
import com.dfsek.terra.api.world.palette.holder.PaletteHolder; import com.dfsek.terra.api.world.palette.holder.PaletteHolder;
import com.dfsek.terra.api.world.palette.slant.SlantHolder;
import com.dfsek.terra.carving.UserDefinedCarver; import com.dfsek.terra.carving.UserDefinedCarver;
import com.dfsek.terra.config.loaders.config.function.FunctionTemplate; import com.dfsek.terra.config.loaders.config.function.FunctionTemplate;
import com.dfsek.terra.config.pack.ConfigPack; import com.dfsek.terra.config.pack.ConfigPack;
@ -67,10 +68,10 @@ public class BiomeTemplate extends AbstractableTemplate implements ValidatedConf
@Abstractable @Abstractable
private PaletteHolder palette; private PaletteHolder palette;
@Value("slant.palette") @Value("slant")
@Abstractable @Abstractable
@Default @Default
private PaletteHolder slantPalette = null; private SlantHolder slant = null;
@Value("vanilla") @Value("vanilla")
@Abstractable @Abstractable
@ -165,11 +166,6 @@ public class BiomeTemplate extends AbstractableTemplate implements ValidatedConf
@Default @Default
private Map<BlockType, Palette> stairPalettes; private Map<BlockType, Palette> stairPalettes;
@Value("slant.threshold")
@Abstractable
@Default
private double slantThreshold = 0.1;
@Value("interpolate-elevation") @Value("interpolate-elevation")
@Abstractable @Abstractable
@Default @Default
@ -230,8 +226,8 @@ public class BiomeTemplate extends AbstractableTemplate implements ValidatedConf
return extend; return extend;
} }
public double getSlantThreshold() { public SlantHolder getSlant() {
return slantThreshold; return slant;
} }
public double getSlabThreshold() { public double getSlabThreshold() {
@ -306,10 +302,6 @@ public class BiomeTemplate extends AbstractableTemplate implements ValidatedConf
return trees; return trees;
} }
public PaletteHolder getSlantPalette() {
return slantPalette;
}
public ProbabilityCollection<Biome> getVanilla() { public ProbabilityCollection<Biome> getVanilla() {
return vanilla; return vanilla;
} }

View File

@ -4,12 +4,13 @@ import com.dfsek.terra.api.math.noise.NoiseSampler;
import com.dfsek.terra.api.world.biome.Generator; import com.dfsek.terra.api.world.biome.Generator;
import com.dfsek.terra.api.world.palette.Palette; import com.dfsek.terra.api.world.palette.Palette;
import com.dfsek.terra.api.world.palette.holder.PaletteHolder; import com.dfsek.terra.api.world.palette.holder.PaletteHolder;
import com.dfsek.terra.api.world.palette.slant.SlantHolder;
public class WorldGenerator implements Generator { public class WorldGenerator implements Generator {
@SuppressWarnings({"unchecked", "rawtypes", "RedundantSuppression"}) @SuppressWarnings({"unchecked", "rawtypes", "RedundantSuppression"})
private final PaletteHolder palettes; private final PaletteHolder palettes;
@SuppressWarnings({"unchecked", "rawtypes", "RedundantSuppression"}) @SuppressWarnings({"unchecked", "rawtypes", "RedundantSuppression"})
private final PaletteHolder slantPalettes; private final SlantHolder slantPalettes;
private final NoiseSampler noise; private final NoiseSampler noise;
private final NoiseSampler elevation; private final NoiseSampler elevation;
@ -21,7 +22,7 @@ public class WorldGenerator implements Generator {
private final int blendStep; private final int blendStep;
private final double blendWeight; private final double blendWeight;
public WorldGenerator(PaletteHolder palettes, PaletteHolder slantPalettes, NoiseSampler noise, NoiseSampler elevation, NoiseSampler carving, NoiseSampler biomeNoise, double elevationWeight, int blendDistance, int blendStep, double blendWeight) { public WorldGenerator(PaletteHolder palettes, SlantHolder slantPalettes, NoiseSampler noise, NoiseSampler elevation, NoiseSampler carving, NoiseSampler biomeNoise, double elevationWeight, int blendDistance, int blendStep, double blendWeight) {
this.palettes = palettes; this.palettes = palettes;
this.slantPalettes = slantPalettes; this.slantPalettes = slantPalettes;
this.noise = noise; this.noise = noise;
@ -84,8 +85,4 @@ public class WorldGenerator implements Generator {
public int getBlendStep() { public int getBlendStep() {
return blendStep; return blendStep;
} }
public Palette getSlantPalette(int y) {
return slantPalettes.getPalette(y);
}
} }