Generator -> GenerationSettings

This commit is contained in:
dfsek
2021-07-22 18:35:10 -07:00
parent 2f9387fbf0
commit be9e817c88
11 changed files with 41 additions and 43 deletions
@@ -3,12 +3,12 @@ package com.dfsek.terra.addons.chunkgenerator;
import com.dfsek.terra.addons.chunkgenerator.palette.PaletteInfo; import com.dfsek.terra.addons.chunkgenerator.palette.PaletteInfo;
import com.dfsek.terra.addons.chunkgenerator.palette.SlantHolder; import com.dfsek.terra.addons.chunkgenerator.palette.SlantHolder;
import com.dfsek.terra.api.util.MathUtil; import com.dfsek.terra.api.util.MathUtil;
import com.dfsek.terra.api.world.biome.Generator; import com.dfsek.terra.api.world.biome.GenerationSettings;
import com.dfsek.terra.api.world.generator.Palette; import com.dfsek.terra.api.world.generator.Palette;
import com.dfsek.terra.api.world.generator.Sampler; import com.dfsek.terra.api.world.generator.Sampler;
public final class PaletteUtil { public final class PaletteUtil {
public static Palette getPalette(int x, int y, int z, Generator c, Sampler sampler, PaletteInfo paletteInfo) { public static Palette getPalette(int x, int y, int z, GenerationSettings c, Sampler sampler, PaletteInfo paletteInfo) {
SlantHolder slant = paletteInfo.getSlantHolder(); SlantHolder slant = paletteInfo.getSlantHolder();
if(slant != null) { if(slant != null) {
double slope = MathUtil.derivative(sampler, x, y, z); double slope = MathUtil.derivative(sampler, x, y, z);
@@ -12,7 +12,7 @@ import com.dfsek.terra.api.profiler.ProfileFrame;
import com.dfsek.terra.api.vector.Vector3; import com.dfsek.terra.api.vector.Vector3;
import com.dfsek.terra.api.world.BiomeGrid; import com.dfsek.terra.api.world.BiomeGrid;
import com.dfsek.terra.api.world.World; import com.dfsek.terra.api.world.World;
import com.dfsek.terra.api.world.biome.Generator; import com.dfsek.terra.api.world.biome.GenerationSettings;
import com.dfsek.terra.api.world.biome.TerraBiome; import com.dfsek.terra.api.world.biome.TerraBiome;
import com.dfsek.terra.api.world.biome.generation.BiomeProvider; import com.dfsek.terra.api.world.biome.generation.BiomeProvider;
import com.dfsek.terra.api.world.generator.ChunkData; import com.dfsek.terra.api.world.generator.ChunkData;
@@ -98,7 +98,7 @@ public class NoiseChunkGenerator3D implements ChunkGenerator {
main.logger().info("null palette: " + biome.getID()); main.logger().info("null palette: " + biome.getID());
} }
Generator generator = biome.getGenerator(world); GenerationSettings generationSettings = biome.getGenerator(world);
int sea = paletteInfo.getSeaLevel(); int sea = paletteInfo.getSeaLevel();
Palette seaPalette = paletteInfo.getOcean(); Palette seaPalette = paletteInfo.getOcean();
@@ -109,7 +109,7 @@ public class NoiseChunkGenerator3D implements ChunkGenerator {
if(sampler.sample(x, y, z) > 0) { if(sampler.sample(x, y, z) > 0) {
justSet = true; justSet = true;
data = PaletteUtil.getPalette(x, y, z, generator, sampler, paletteInfo).get(paletteLevel, cx, y, cz, seed); data = PaletteUtil.getPalette(x, y, z, generationSettings, sampler, paletteInfo).get(paletteLevel, cx, y, cz, seed);
chunk.setBlock(x, y, z, data); chunk.setBlock(x, y, z, data);
paletteLevel++; paletteLevel++;
@@ -3,7 +3,7 @@ package com.dfsek.terra.addons.chunkgenerator.generation.math.interpolation;
import com.dfsek.terra.api.util.mutable.MutableInteger; import com.dfsek.terra.api.util.mutable.MutableInteger;
import com.dfsek.terra.api.vector.Vector3; import com.dfsek.terra.api.vector.Vector3;
import com.dfsek.terra.api.world.World; import com.dfsek.terra.api.world.World;
import com.dfsek.terra.api.world.biome.Generator; import com.dfsek.terra.api.world.biome.GenerationSettings;
import com.dfsek.terra.api.world.biome.generation.BiomeProvider; import com.dfsek.terra.api.world.biome.generation.BiomeProvider;
import com.dfsek.terra.api.world.generator.ChunkInterpolator; import com.dfsek.terra.api.world.generator.ChunkInterpolator;
import net.jafama.FastMath; import net.jafama.FastMath;
@@ -18,7 +18,7 @@ import java.util.function.BiFunction;
*/ */
public class ChunkInterpolator2D implements ChunkInterpolator { public class ChunkInterpolator2D implements ChunkInterpolator {
private final Interpolator[][] interpGrid = new Interpolator[4][4]; private final Interpolator[][] interpGrid = new Interpolator[4][4];
private final BiFunction<Generator, Vector3, Double> noiseGetter; private final BiFunction<GenerationSettings, Vector3, Double> noiseGetter;
/** /**
* Instantiates a 3D ChunkInterpolator3D at a pair of chunk coordinates. * Instantiates a 3D ChunkInterpolator3D at a pair of chunk coordinates.
@@ -27,7 +27,7 @@ public class ChunkInterpolator2D implements ChunkInterpolator {
* @param chunkZ Z coordinate of the chunk. * @param chunkZ Z coordinate of the chunk.
* @param provider Biome Provider to use for biome fetching. * @param provider Biome Provider to use for biome fetching.
*/ */
public ChunkInterpolator2D(World w, int chunkX, int chunkZ, BiomeProvider provider, BiFunction<Generator, Vector3, Double> noiseGetter) { public ChunkInterpolator2D(World w, int chunkX, int chunkZ, BiomeProvider provider, BiFunction<GenerationSettings, Vector3, Double> noiseGetter) {
this.noiseGetter = noiseGetter; this.noiseGetter = noiseGetter;
int xOrigin = chunkX << 4; int xOrigin = chunkX << 4;
int zOrigin = chunkZ << 4; int zOrigin = chunkZ << 4;
@@ -38,11 +38,11 @@ public class ChunkInterpolator2D implements ChunkInterpolator {
for(int x = 0; x < 5; x++) { for(int x = 0; x < 5; x++) {
for(int z = 0; z < 5; z++) { for(int z = 0; z < 5; z++) {
Generator generator = provider.getBiome(xOrigin + (x << 2), zOrigin + (z << 2), seed).getGenerator(w); GenerationSettings generationSettings = provider.getBiome(xOrigin + (x << 2), zOrigin + (z << 2), seed).getGenerator(w);
Map<Generator, MutableInteger> genMap = new HashMap<>(); Map<GenerationSettings, MutableInteger> genMap = new HashMap<>();
int step = generator.getBlendStep(); int step = generationSettings.getBlendStep();
int blend = generator.getBlendDistance(); int blend = generationSettings.getBlendDistance();
for(int xi = -blend; xi <= blend; xi++) { for(int xi = -blend; xi <= blend; xi++) {
for(int zi = -blend; zi <= blend; zi++) { for(int zi = -blend; zi <= blend; zi++) {
@@ -69,8 +69,8 @@ public class ChunkInterpolator2D implements ChunkInterpolator {
return FastMath.max(FastMath.min(value, high), 0); return FastMath.max(FastMath.min(value, high), 0);
} }
public double computeNoise(Generator generator, double x, double y, double z) { public double computeNoise(GenerationSettings generationSettings, double x, double y, double z) {
return noiseGetter.apply(generator, new Vector3(x, y, z)); return noiseGetter.apply(generationSettings, new Vector3(x, y, z));
} }
/** /**
@@ -3,7 +3,7 @@ package com.dfsek.terra.addons.chunkgenerator.generation.math.interpolation;
import com.dfsek.terra.api.util.mutable.MutableInteger; import com.dfsek.terra.api.util.mutable.MutableInteger;
import com.dfsek.terra.api.vector.Vector3; import com.dfsek.terra.api.vector.Vector3;
import com.dfsek.terra.api.world.World; import com.dfsek.terra.api.world.World;
import com.dfsek.terra.api.world.biome.Generator; import com.dfsek.terra.api.world.biome.GenerationSettings;
import com.dfsek.terra.api.world.biome.generation.BiomeProvider; import com.dfsek.terra.api.world.biome.generation.BiomeProvider;
import com.dfsek.terra.api.world.generator.ChunkInterpolator; import com.dfsek.terra.api.world.generator.ChunkInterpolator;
import net.jafama.FastMath; import net.jafama.FastMath;
@@ -18,7 +18,7 @@ import java.util.function.BiFunction;
*/ */
public class ChunkInterpolator3D implements ChunkInterpolator { public class ChunkInterpolator3D implements ChunkInterpolator {
private final Interpolator3[][][] interpGrid; private final Interpolator3[][][] interpGrid;
private final BiFunction<Generator, Vector3, Double> noiseGetter; private final BiFunction<GenerationSettings, Vector3, Double> noiseGetter;
private final int min; private final int min;
private final int max; private final int max;
@@ -30,7 +30,7 @@ public class ChunkInterpolator3D implements ChunkInterpolator {
* @param chunkZ Z coordinate of the chunk. * @param chunkZ Z coordinate of the chunk.
* @param provider Biome Provider to use for biome fetching. * @param provider Biome Provider to use for biome fetching.
*/ */
public ChunkInterpolator3D(World w, int chunkX, int chunkZ, BiomeProvider provider, BiFunction<Generator, Vector3, Double> noiseGetter) { public ChunkInterpolator3D(World w, int chunkX, int chunkZ, BiomeProvider provider, BiFunction<GenerationSettings, Vector3, Double> noiseGetter) {
this.noiseGetter = noiseGetter; this.noiseGetter = noiseGetter;
int xOrigin = chunkX << 4; int xOrigin = chunkX << 4;
int zOrigin = chunkZ << 4; int zOrigin = chunkZ << 4;
@@ -49,11 +49,11 @@ public class ChunkInterpolator3D implements ChunkInterpolator {
for(int x = 0; x < 5; x++) { for(int x = 0; x < 5; x++) {
for(int z = 0; z < 5; z++) { for(int z = 0; z < 5; z++) {
Generator generator = provider.getBiome(xOrigin + (x << 2), zOrigin + (z << 2), seed).getGenerator(w); GenerationSettings generationSettings = provider.getBiome(xOrigin + (x << 2), zOrigin + (z << 2), seed).getGenerator(w);
Map<Generator, MutableInteger> genMap = new HashMap<>(); Map<GenerationSettings, MutableInteger> genMap = new HashMap<>();
int step = generator.getBlendStep(); int step = generationSettings.getBlendStep();
int blend = generator.getBlendDistance(); int blend = generationSettings.getBlendDistance();
for(int xi = -blend; xi <= blend; xi++) { for(int xi = -blend; xi <= blend; xi++) {
for(int zi = -blend; zi <= blend; zi++) { for(int zi = -blend; zi <= blend; zi++) {
@@ -88,8 +88,8 @@ public class ChunkInterpolator3D implements ChunkInterpolator {
return FastMath.max(FastMath.min(value, high), 0); return FastMath.max(FastMath.min(value, high), 0);
} }
public double computeNoise(Generator generator, double x, double y, double z) { public double computeNoise(GenerationSettings generationSettings, double x, double y, double z) {
return noiseGetter.apply(generator, new Vector3(x, y, z)); return noiseGetter.apply(generationSettings, new Vector3(x, y, z));
} }
/** /**
@@ -1,7 +1,7 @@
package com.dfsek.terra.addons.chunkgenerator.generation.math.interpolation; package com.dfsek.terra.addons.chunkgenerator.generation.math.interpolation;
import com.dfsek.terra.api.world.World; import com.dfsek.terra.api.world.World;
import com.dfsek.terra.api.world.biome.Generator; import com.dfsek.terra.api.world.biome.GenerationSettings;
import com.dfsek.terra.api.world.biome.generation.BiomeProvider; import com.dfsek.terra.api.world.biome.generation.BiomeProvider;
public class ElevationInterpolator { public class ElevationInterpolator {
@@ -13,7 +13,7 @@ public class ElevationInterpolator {
long seed = world.getSeed(); long seed = world.getSeed();
Generator[][] gens = new Generator[18 + 2 * smooth][18 + 2 * smooth]; GenerationSettings[][] gens = new GenerationSettings[18 + 2 * smooth][18 + 2 * smooth];
// Precompute generators. // Precompute generators.
for(int x = -1 - smooth; x <= 16 + smooth; x++) { for(int x = -1 - smooth; x <= 16 + smooth; x++) {
@@ -28,7 +28,7 @@ public class ElevationInterpolator {
double div = 0; double div = 0;
for(int xi = -smooth; xi <= smooth; xi++) { for(int xi = -smooth; xi <= smooth; xi++) {
for(int zi = -smooth; zi <= smooth; zi++) { for(int zi = -smooth; zi <= smooth; zi++) {
Generator gen = gens[x + 1 + smooth + xi][z + 1 + smooth + zi]; GenerationSettings gen = gens[x + 1 + smooth + xi][z + 1 + smooth + zi];
noise += gen.getElevationSampler().getNoiseSeeded(seed, xOrigin + x, zOrigin + z) * gen.getElevationWeight(); noise += gen.getElevationSampler().getNoiseSeeded(seed, xOrigin + x, zOrigin + z) * gen.getElevationWeight();
div += gen.getElevationWeight(); div += gen.getElevationWeight();
} }
@@ -14,7 +14,7 @@ public class BiomeFactory implements ConfigFactory<BiomeTemplate, TerraBiome> {
@Override @Override
public TerraBiome build(BiomeTemplate template, TerraPlugin main) { public TerraBiome build(BiomeTemplate template, TerraPlugin main) {
UserDefinedGenerator generator = new UserDefinedGenerator(template.getNoiseEquation(), template.getElevationEquation(), template.getCarvingEquation(), template.getBiomeNoise(), template.getElevationWeight(), UserDefinedGenerationSettings generator = new UserDefinedGenerationSettings(template.getNoiseEquation(), template.getElevationEquation(), template.getCarvingEquation(), template.getBiomeNoise(), 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);
} }
@@ -4,7 +4,7 @@ import com.dfsek.terra.api.properties.Context;
import com.dfsek.terra.api.util.collection.ProbabilityCollection; import com.dfsek.terra.api.util.collection.ProbabilityCollection;
import com.dfsek.terra.api.world.World; import com.dfsek.terra.api.world.World;
import com.dfsek.terra.api.world.biome.Biome; import com.dfsek.terra.api.world.biome.Biome;
import com.dfsek.terra.api.world.biome.Generator; import com.dfsek.terra.api.world.biome.GenerationSettings;
import com.dfsek.terra.api.world.biome.TerraBiome; import com.dfsek.terra.api.world.biome.TerraBiome;
import java.util.Set; import java.util.Set;
@@ -13,7 +13,7 @@ import java.util.Set;
* Class representing a config-defined biome * Class representing a config-defined biome
*/ */
public class UserDefinedBiome implements TerraBiome { public class UserDefinedBiome implements TerraBiome {
private final UserDefinedGenerator gen; private final UserDefinedGenerationSettings gen;
private final ProbabilityCollection<Biome> vanilla; private final ProbabilityCollection<Biome> vanilla;
private final String id; private final String id;
private final BiomeTemplate config; private final BiomeTemplate config;
@@ -22,7 +22,7 @@ public class UserDefinedBiome implements TerraBiome {
private final Context context = new Context(); private final Context context = new Context();
public UserDefinedBiome(ProbabilityCollection<Biome> vanilla, UserDefinedGenerator gen, BiomeTemplate config) { public UserDefinedBiome(ProbabilityCollection<Biome> vanilla, UserDefinedGenerationSettings gen, BiomeTemplate config) {
this.vanilla = vanilla; this.vanilla = vanilla;
this.gen = gen; this.gen = gen;
this.id = config.getID(); this.id = config.getID();
@@ -52,7 +52,7 @@ public class UserDefinedBiome implements TerraBiome {
} }
@Override @Override
public Generator getGenerator(World w) { public GenerationSettings getGenerator(World w) {
return gen; return gen;
} }
@@ -1,11 +1,9 @@
package com.dfsek.terra.addons.biome; package com.dfsek.terra.addons.biome;
import com.dfsek.terra.addons.biome.holder.PaletteHolder;
import com.dfsek.terra.api.noise.NoiseSampler; import com.dfsek.terra.api.noise.NoiseSampler;
import com.dfsek.terra.api.world.biome.Generator; import com.dfsek.terra.api.world.biome.GenerationSettings;
import com.dfsek.terra.api.world.biome.PaletteSettings;
public class UserDefinedGenerator implements Generator { public class UserDefinedGenerationSettings implements GenerationSettings {
private final NoiseSampler noise; private final NoiseSampler noise;
private final NoiseSampler elevation; private final NoiseSampler elevation;
@@ -17,7 +15,7 @@ public class UserDefinedGenerator implements Generator {
private final int blendStep; private final int blendStep;
private final double blendWeight; private final double blendWeight;
public UserDefinedGenerator(NoiseSampler noise, NoiseSampler elevation, NoiseSampler carving, NoiseSampler biomeNoise, double elevationWeight, int blendDistance, int blendStep, double blendWeight) { public UserDefinedGenerationSettings(NoiseSampler noise, NoiseSampler elevation, NoiseSampler carving, NoiseSampler biomeNoise, double elevationWeight, int blendDistance, int blendStep, double blendWeight) {
this.noise = noise; this.noise = noise;
this.elevation = elevation; this.elevation = elevation;
this.carving = carving; this.carving = carving;
@@ -2,7 +2,7 @@ package com.dfsek.terra.api.world.biome;
import com.dfsek.terra.api.noise.NoiseSampler; import com.dfsek.terra.api.noise.NoiseSampler;
public interface Generator { public interface GenerationSettings {
/** /**
* Gets the noise sampler instance to use for base terrain. * Gets the noise sampler instance to use for base terrain.
* *
@@ -24,7 +24,7 @@ public interface TerraBiome extends PropertyHolder {
* *
* @return BiomeTerrain - The terrain generation instance. * @return BiomeTerrain - The terrain generation instance.
*/ */
Generator getGenerator(World w); GenerationSettings getGenerator(World w);
int getColor(); int getColor();
@@ -1,7 +1,7 @@
package com.dfsek.terra.api.world.generator; package com.dfsek.terra.api.world.generator;
import com.dfsek.terra.api.util.mutable.MutableInteger; import com.dfsek.terra.api.util.mutable.MutableInteger;
import com.dfsek.terra.api.world.biome.Generator; import com.dfsek.terra.api.world.biome.GenerationSettings;
import java.util.Map; import java.util.Map;
@@ -20,11 +20,11 @@ public interface ChunkInterpolator {
} }
default double computeNoise(Map<Generator, MutableInteger> gens, double x, double y, double z) { default double computeNoise(Map<GenerationSettings, MutableInteger> gens, double x, double y, double z) {
double n = 0; double n = 0;
double div = 0; double div = 0;
for(Map.Entry<Generator, MutableInteger> entry : gens.entrySet()) { for(Map.Entry<GenerationSettings, MutableInteger> entry : gens.entrySet()) {
Generator gen = entry.getKey(); GenerationSettings gen = entry.getKey();
int weight = entry.getValue().get(); int weight = entry.getValue().get();
double noise = computeNoise(gen, x, y, z); double noise = computeNoise(gen, x, y, z);
@@ -34,5 +34,5 @@ public interface ChunkInterpolator {
return n / div; return n / div;
} }
double computeNoise(Generator generator, double x, double y, double z); double computeNoise(GenerationSettings generationSettings, double x, double y, double z);
} }