implement biome delegates in pipeline

This commit is contained in:
dfsek 2021-12-05 17:26:32 -07:00
parent 9416e2fbaa
commit e60a8a109b
19 changed files with 135 additions and 90 deletions

View File

@ -7,6 +7,7 @@
package com.dfsek.terra.addons.biome.pipeline; package com.dfsek.terra.addons.biome.pipeline;
import com.dfsek.terra.addons.biome.pipeline.api.BiomeDelegate;
import com.dfsek.terra.addons.biome.pipeline.api.BiomeExpander; import com.dfsek.terra.addons.biome.pipeline.api.BiomeExpander;
import com.dfsek.terra.addons.biome.pipeline.api.BiomeHolder; import com.dfsek.terra.addons.biome.pipeline.api.BiomeHolder;
import com.dfsek.terra.addons.biome.pipeline.api.BiomeMutator; import com.dfsek.terra.addons.biome.pipeline.api.BiomeMutator;
@ -19,17 +20,17 @@ public class BiomeHolderImpl implements BiomeHolder {
private final Vector2 origin; private final Vector2 origin;
private final int width; private final int width;
private final int offset; private final int offset;
private Biome[][] biomes; private BiomeDelegate[][] biomes;
public BiomeHolderImpl(int width, Vector2 origin) { public BiomeHolderImpl(int width, Vector2 origin) {
width += 4; width += 4;
this.width = width; this.width = width;
biomes = new Biome[width][width]; biomes = new BiomeDelegate[width][width];
this.origin = origin; this.origin = origin;
this.offset = 2; this.offset = 2;
} }
private BiomeHolderImpl(Biome[][] biomes, Vector2 origin, int width, int offset) { private BiomeHolderImpl(BiomeDelegate[][] biomes, Vector2 origin, int width, int offset) {
this.biomes = biomes; this.biomes = biomes;
this.origin = origin; this.origin = origin;
this.width = width; this.width = width;
@ -38,10 +39,10 @@ public class BiomeHolderImpl implements BiomeHolder {
@Override @Override
public BiomeHolder expand(BiomeExpander expander, long seed) { public BiomeHolder expand(BiomeExpander expander, long seed) {
Biome[][] old = biomes; BiomeDelegate[][] old = biomes;
int newWidth = width * 2 - 1; int newWidth = width * 2 - 1;
biomes = new Biome[newWidth][newWidth]; biomes = new BiomeDelegate[newWidth][newWidth];
for(int x = 0; x < width; x++) { for(int x = 0; x < width; x++) {
for(int z = 0; z < width; z++) { for(int z = 0; z < width; z++) {
@ -80,14 +81,14 @@ public class BiomeHolderImpl implements BiomeHolder {
} }
@Override @Override
public Biome getBiome(int x, int z) { public BiomeDelegate getBiome(int x, int z) {
x += offset; x += offset;
z += offset; z += offset;
return getBiomeRaw(x, z); return getBiomeRaw(x, z);
} }
@Override @Override
public Biome getBiomeRaw(int x, int z) { public BiomeDelegate getBiomeRaw(int x, int z) {
if(x >= width || z >= width || x < 0 || z < 0) return null; if(x >= width || z >= width || x < 0 || z < 0) return null;
return biomes[x][z]; return biomes[x][z];
} }

View File

@ -7,24 +7,23 @@
package com.dfsek.terra.addons.biome.pipeline; package com.dfsek.terra.addons.biome.pipeline;
import com.dfsek.terra.addons.biome.pipeline.api.Stage;
import com.dfsek.terra.api.world.biome.Biome;
import com.google.common.cache.CacheBuilder; import com.google.common.cache.CacheBuilder;
import com.google.common.cache.CacheLoader; import com.google.common.cache.CacheLoader;
import com.google.common.cache.LoadingCache; import com.google.common.cache.LoadingCache;
import net.jafama.FastMath; import net.jafama.FastMath;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import com.dfsek.terra.addons.biome.pipeline.api.BiomeHolder;
import com.dfsek.terra.api.Platform;
import com.dfsek.terra.api.noise.NoiseSampler;
import com.dfsek.terra.api.world.biome.generation.BiomeProvider;
import java.util.HashSet; import java.util.HashSet;
import java.util.Set; import java.util.Set;
import com.dfsek.terra.addons.biome.pipeline.api.BiomeDelegate;
import com.dfsek.terra.addons.biome.pipeline.api.BiomeHolder;
import com.dfsek.terra.addons.biome.pipeline.api.Stage;
import com.dfsek.terra.api.Platform;
import com.dfsek.terra.api.noise.NoiseSampler;
import com.dfsek.terra.api.world.biome.Biome;
import com.dfsek.terra.api.world.biome.generation.BiomeProvider;
public class BiomePipelineProvider implements BiomeProvider { public class BiomePipelineProvider implements BiomeProvider {
private final LoadingCache<SeededVector, BiomeHolder> holderCache; private final LoadingCache<SeededVector, BiomeHolder> holderCache;
@ -33,6 +32,8 @@ public class BiomePipelineProvider implements BiomeProvider {
private final NoiseSampler mutator; private final NoiseSampler mutator;
private final double noiseAmp; private final double noiseAmp;
private final Set<Biome> biomes;
public BiomePipelineProvider(BiomePipeline pipeline, Platform platform, int resolution, NoiseSampler mutator, double noiseAmp) { public BiomePipelineProvider(BiomePipeline pipeline, Platform platform, int resolution, NoiseSampler mutator, double noiseAmp) {
this.resolution = resolution; this.resolution = resolution;
this.mutator = mutator; this.mutator = mutator;
@ -48,6 +49,21 @@ public class BiomePipelineProvider implements BiomeProvider {
} }
); );
this.pipeline = pipeline; this.pipeline = pipeline;
Set<BiomeDelegate> biomeSet = new HashSet<>();
pipeline.getSource().getBiomes().forEach(biomeSet::add);
Iterable<BiomeDelegate> result = biomeSet;
for(Stage stage : pipeline.getStages()) {
result = stage.getBiomes(result); // pass through all stages
}
this.biomes = new HashSet<>();
result.forEach(biomeDelegate -> {
if(biomeDelegate.isEphemeral()) {
throw new IllegalArgumentException("Biome Pipeline leaks ephemeral biome \"" + biomeDelegate.getID() +
"\". Ensure there is a stage to guarantee replacement of the ephemeral biome.");
}
this.biomes.add(biomeDelegate.getBiome());
});
} }
@Override @Override
@ -63,18 +79,12 @@ public class BiomePipelineProvider implements BiomeProvider {
int fdX = FastMath.floorDiv(x, pipeline.getSize()); int fdX = FastMath.floorDiv(x, pipeline.getSize());
int fdZ = FastMath.floorDiv(z, pipeline.getSize()); int fdZ = FastMath.floorDiv(z, pipeline.getSize());
return holderCache.getUnchecked(new SeededVector(fdX, fdZ, seed)).getBiome(x - fdX * pipeline.getSize(), return holderCache.getUnchecked(new SeededVector(fdX, fdZ, seed)).getBiome(x - fdX * pipeline.getSize(),
z - fdZ * pipeline.getSize()); z - fdZ * pipeline.getSize()).getBiome();
} }
@Override @Override
public Iterable<Biome> getBiomes() { public Iterable<Biome> getBiomes() {
Set<Biome> biomeSet = new HashSet<>(); return biomes;
pipeline.getSource().getBiomes().forEach(biomeSet::add);
Iterable<Biome> result = biomeSet;
for(Stage stage : pipeline.getStages()) {
result = stage.getBiomes(result); // pass through all stages
}
return result;
} }
private static final class SeededVector { private static final class SeededVector {

View File

@ -3,21 +3,41 @@ package com.dfsek.terra.addons.biome.pipeline.api;
import com.dfsek.terra.api.util.StringIdentifiable; import com.dfsek.terra.api.util.StringIdentifiable;
import com.dfsek.terra.api.world.biome.Biome; import com.dfsek.terra.api.world.biome.Biome;
import java.util.Collections;
import java.util.Set;
public interface BiomeDelegate extends StringIdentifiable { public interface BiomeDelegate extends StringIdentifiable {
Biome getBiome(); Biome getBiome();
Set<String> getTags();
default boolean isEphemeral() {
return false;
}
static BiomeDelegate ephemeral(String id) { static BiomeDelegate ephemeral(String id) {
return new BiomeDelegate() { return new BiomeDelegate() {
private final Set<String> tags = Collections.singleton(id);
@Override @Override
public Biome getBiome() { public Biome getBiome() {
throw new UnsupportedOperationException("Cannot get biome from ephemeral delegate"); throw new UnsupportedOperationException("Cannot get biome from ephemeral delegate");
} }
@Override
public Set<String> getTags() {
return tags;
}
@Override @Override
public String getID() { public String getID() {
return id; return id;
} }
@Override
public boolean isEphemeral() {
return true;
}
}; };
} }
@ -28,6 +48,11 @@ public interface BiomeDelegate extends StringIdentifiable {
return biome; return biome;
} }
@Override
public Set<String> getTags() {
return biome.getTags();
}
@Override @Override
public String getID() { public String getID() {
return biome.getID(); return biome.getID();

View File

@ -11,5 +11,5 @@ import com.dfsek.terra.api.world.biome.Biome;
public interface BiomeExpander { public interface BiomeExpander {
Biome getBetween(double x, double z, long seed, Biome... others); BiomeDelegate getBetween(double x, double z, long seed, BiomeDelegate... others);
} }

View File

@ -18,7 +18,7 @@ public interface BiomeHolder {
void fill(BiomeSource source, long seed); void fill(BiomeSource source, long seed);
Biome getBiome(int x, int z); BiomeDelegate getBiome(int x, int z);
Biome getBiomeRaw(int x, int z); BiomeDelegate getBiomeRaw(int x, int z);
} }

View File

@ -11,9 +11,9 @@ import com.dfsek.terra.api.world.biome.Biome;
public interface BiomeMutator { public interface BiomeMutator {
Biome mutate(ViewPoint viewPoint, double x, double z, long seed); BiomeDelegate mutate(ViewPoint viewPoint, double x, double z, long seed);
default Iterable<Biome> getBiomes(Iterable<Biome> biomes) { default Iterable<BiomeDelegate> getBiomes(Iterable<BiomeDelegate> biomes) {
return biomes; return biomes;
} }
@ -29,7 +29,7 @@ public interface BiomeMutator {
} }
public Biome getBiome(int x, int z) { public BiomeDelegate getBiome(int x, int z) {
return biomes.getBiomeRaw(x + offX, z + offZ); return biomes.getBiomeRaw(x + offX, z + offZ);
} }
} }

View File

@ -15,5 +15,5 @@ public interface Stage {
boolean isExpansion(); boolean isExpansion();
Iterable<Biome> getBiomes(Iterable<Biome> biomes); Iterable<BiomeDelegate> getBiomes(Iterable<BiomeDelegate> biomes);
} }

View File

@ -11,6 +11,7 @@ import com.dfsek.tectonic.annotations.Value;
import java.util.Map; import java.util.Map;
import com.dfsek.terra.addons.biome.pipeline.api.BiomeDelegate;
import com.dfsek.terra.addons.biome.pipeline.api.Stage; import com.dfsek.terra.addons.biome.pipeline.api.Stage;
import com.dfsek.terra.addons.biome.pipeline.config.stage.StageTemplate; import com.dfsek.terra.addons.biome.pipeline.config.stage.StageTemplate;
import com.dfsek.terra.addons.biome.pipeline.mutator.BorderListMutator; import com.dfsek.terra.addons.biome.pipeline.mutator.BorderListMutator;
@ -29,10 +30,10 @@ public class BorderListMutatorTemplate extends StageTemplate {
private @Meta String defaultReplace; private @Meta String defaultReplace;
@Value("default-to") @Value("default-to")
private @Meta ProbabilityCollection<@Meta Biome> defaultTo; private @Meta ProbabilityCollection<@Meta BiomeDelegate> defaultTo;
@Value("replace") @Value("replace")
private @Meta Map<@Meta Biome, @Meta ProbabilityCollection<@Meta Biome>> replace; private @Meta Map<@Meta BiomeDelegate, @Meta ProbabilityCollection<@Meta BiomeDelegate>> replace;
@Override @Override

View File

@ -9,6 +9,7 @@ package com.dfsek.terra.addons.biome.pipeline.config.stage.mutator;
import com.dfsek.tectonic.annotations.Value; import com.dfsek.tectonic.annotations.Value;
import com.dfsek.terra.addons.biome.pipeline.api.BiomeDelegate;
import com.dfsek.terra.addons.biome.pipeline.api.Stage; import com.dfsek.terra.addons.biome.pipeline.api.Stage;
import com.dfsek.terra.addons.biome.pipeline.config.stage.StageTemplate; import com.dfsek.terra.addons.biome.pipeline.config.stage.StageTemplate;
import com.dfsek.terra.addons.biome.pipeline.mutator.BorderMutator; import com.dfsek.terra.addons.biome.pipeline.mutator.BorderMutator;
@ -27,7 +28,7 @@ public class BorderMutatorTemplate extends StageTemplate {
private @Meta String replace; private @Meta String replace;
@Value("to") @Value("to")
private @Meta ProbabilityCollection<@Meta Biome> to; private @Meta ProbabilityCollection<@Meta BiomeDelegate> to;
@Override @Override
public Stage get() { public Stage get() {

View File

@ -11,6 +11,7 @@ import com.dfsek.tectonic.annotations.Value;
import java.util.Map; import java.util.Map;
import com.dfsek.terra.addons.biome.pipeline.api.BiomeDelegate;
import com.dfsek.terra.addons.biome.pipeline.api.Stage; import com.dfsek.terra.addons.biome.pipeline.api.Stage;
import com.dfsek.terra.addons.biome.pipeline.config.stage.StageTemplate; import com.dfsek.terra.addons.biome.pipeline.config.stage.StageTemplate;
import com.dfsek.terra.addons.biome.pipeline.mutator.ReplaceListMutator; import com.dfsek.terra.addons.biome.pipeline.mutator.ReplaceListMutator;
@ -26,10 +27,10 @@ public class ReplaceListMutatorTemplate extends StageTemplate {
private @Meta String defaultFrom; private @Meta String defaultFrom;
@Value("default-to") @Value("default-to")
private @Meta ProbabilityCollection<@Meta Biome> defaultTo; private @Meta ProbabilityCollection<@Meta BiomeDelegate> defaultTo;
@Value("to") @Value("to")
private @Meta Map<@Meta Biome, @Meta ProbabilityCollection<@Meta Biome>> replace; private @Meta Map<@Meta BiomeDelegate, @Meta ProbabilityCollection<@Meta BiomeDelegate>> replace;
@Override @Override
public Stage get() { public Stage get() {

View File

@ -9,6 +9,7 @@ package com.dfsek.terra.addons.biome.pipeline.config.stage.mutator;
import com.dfsek.tectonic.annotations.Value; import com.dfsek.tectonic.annotations.Value;
import com.dfsek.terra.addons.biome.pipeline.api.BiomeDelegate;
import com.dfsek.terra.addons.biome.pipeline.api.Stage; import com.dfsek.terra.addons.biome.pipeline.api.Stage;
import com.dfsek.terra.addons.biome.pipeline.config.stage.StageTemplate; import com.dfsek.terra.addons.biome.pipeline.config.stage.StageTemplate;
import com.dfsek.terra.addons.biome.pipeline.mutator.ReplaceMutator; import com.dfsek.terra.addons.biome.pipeline.mutator.ReplaceMutator;
@ -24,7 +25,7 @@ public class ReplaceMutatorTemplate extends StageTemplate {
private @Meta String from; private @Meta String from;
@Value("to") @Value("to")
private @Meta ProbabilityCollection<@Meta Biome> to; private @Meta ProbabilityCollection<@Meta BiomeDelegate> to;
@Override @Override
public Stage get() { public Stage get() {

View File

@ -7,6 +7,7 @@
package com.dfsek.terra.addons.biome.pipeline.expand; package com.dfsek.terra.addons.biome.pipeline.expand;
import com.dfsek.terra.addons.biome.pipeline.api.BiomeDelegate;
import com.dfsek.terra.addons.biome.pipeline.api.BiomeExpander; import com.dfsek.terra.addons.biome.pipeline.api.BiomeExpander;
import com.dfsek.terra.api.noise.NoiseSampler; import com.dfsek.terra.api.noise.NoiseSampler;
import com.dfsek.terra.api.util.MathUtil; import com.dfsek.terra.api.util.MathUtil;
@ -21,7 +22,7 @@ public class FractalExpander implements BiomeExpander {
} }
@Override @Override
public Biome getBetween(double x, double z, long seed, Biome... others) { public BiomeDelegate getBetween(double x, double z, long seed, BiomeDelegate... others) {
return others[MathUtil.normalizeIndex(sampler.noise(seed, x, z), others.length)]; return others[MathUtil.normalizeIndex(sampler.noise(seed, x, z), others.length)];
} }
} }

View File

@ -12,6 +12,7 @@ import java.util.Map;
import java.util.Objects; import java.util.Objects;
import java.util.Set; import java.util.Set;
import com.dfsek.terra.addons.biome.pipeline.api.BiomeDelegate;
import com.dfsek.terra.addons.biome.pipeline.api.BiomeMutator; import com.dfsek.terra.addons.biome.pipeline.api.BiomeMutator;
import com.dfsek.terra.api.noise.NoiseSampler; import com.dfsek.terra.api.noise.NoiseSampler;
import com.dfsek.terra.api.util.collection.ProbabilityCollection; import com.dfsek.terra.api.util.collection.ProbabilityCollection;
@ -21,12 +22,12 @@ import com.dfsek.terra.api.world.biome.Biome;
public class BorderListMutator implements BiomeMutator { public class BorderListMutator implements BiomeMutator {
private final String border; private final String border;
private final NoiseSampler noiseSampler; private final NoiseSampler noiseSampler;
private final ProbabilityCollection<Biome> replaceDefault; private final ProbabilityCollection<BiomeDelegate> replaceDefault;
private final String defaultReplace; private final String defaultReplace;
private final Map<Biome, ProbabilityCollection<Biome>> replace; private final Map<BiomeDelegate, ProbabilityCollection<BiomeDelegate>> replace;
public BorderListMutator(Map<Biome, ProbabilityCollection<Biome>> replace, String border, String defaultReplace, public BorderListMutator(Map<BiomeDelegate, ProbabilityCollection<BiomeDelegate>> replace, String border, String defaultReplace,
NoiseSampler noiseSampler, ProbabilityCollection<Biome> replaceDefault) { NoiseSampler noiseSampler, ProbabilityCollection<BiomeDelegate> replaceDefault) {
this.border = border; this.border = border;
this.noiseSampler = noiseSampler; this.noiseSampler = noiseSampler;
this.replaceDefault = replaceDefault; this.replaceDefault = replaceDefault;
@ -35,20 +36,20 @@ public class BorderListMutator implements BiomeMutator {
} }
@Override @Override
public Biome mutate(ViewPoint viewPoint, double x, double z, long seed) { public BiomeDelegate mutate(ViewPoint viewPoint, double x, double z, long seed) {
Biome origin = viewPoint.getBiome(0, 0); BiomeDelegate origin = viewPoint.getBiome(0, 0);
if(origin.getTags().contains(defaultReplace)) { if(origin.getTags().contains(defaultReplace)) {
for(int xi = -1; xi <= 1; xi++) { for(int xi = -1; xi <= 1; xi++) {
for(int zi = -1; zi <= 1; zi++) { for(int zi = -1; zi <= 1; zi++) {
if(xi == 0 && zi == 0) continue; if(xi == 0 && zi == 0) continue;
Biome current = viewPoint.getBiome(xi, zi); BiomeDelegate current = viewPoint.getBiome(xi, zi);
if(current == null) continue; if(current == null) continue;
if(current.getTags().contains(border)) { if(current.getTags().contains(border)) {
if(replace.containsKey(origin)) { if(replace.containsKey(origin)) {
Biome biome = replace.get(origin).get(noiseSampler, x, z, seed); BiomeDelegate biome = replace.get(origin).get(noiseSampler, x, z, seed);
return biome == null ? origin : biome; return biome == null ? origin : biome;
} }
Biome biome = replaceDefault.get(noiseSampler, x, z, seed); BiomeDelegate biome = replaceDefault.get(noiseSampler, x, z, seed);
return biome == null ? origin : biome; return biome == null ? origin : biome;
} }
} }
@ -58,8 +59,8 @@ public class BorderListMutator implements BiomeMutator {
} }
@Override @Override
public Iterable<Biome> getBiomes(Iterable<Biome> biomes) { public Iterable<BiomeDelegate> getBiomes(Iterable<BiomeDelegate> biomes) {
Set<Biome> biomeSet = new HashSet<>(); Set<BiomeDelegate> biomeSet = new HashSet<>();
biomes.forEach(biomeSet::add); biomes.forEach(biomeSet::add);
biomeSet.addAll(replaceDefault.getContents().stream().filter(Objects::nonNull).toList()); biomeSet.addAll(replaceDefault.getContents().stream().filter(Objects::nonNull).toList());
replace.forEach((biome, collection) -> biomeSet.addAll(collection.getContents())); replace.forEach((biome, collection) -> biomeSet.addAll(collection.getContents()));

View File

@ -7,6 +7,7 @@
package com.dfsek.terra.addons.biome.pipeline.mutator; package com.dfsek.terra.addons.biome.pipeline.mutator;
import com.dfsek.terra.addons.biome.pipeline.api.BiomeDelegate;
import com.dfsek.terra.addons.biome.pipeline.api.BiomeMutator; import com.dfsek.terra.addons.biome.pipeline.api.BiomeMutator;
import com.dfsek.terra.api.noise.NoiseSampler; import com.dfsek.terra.api.noise.NoiseSampler;
import com.dfsek.terra.api.util.collection.ProbabilityCollection; import com.dfsek.terra.api.util.collection.ProbabilityCollection;
@ -20,10 +21,10 @@ import java.util.Set;
public class BorderMutator implements BiomeMutator { public class BorderMutator implements BiomeMutator {
private final String border; private final String border;
private final NoiseSampler noiseSampler; private final NoiseSampler noiseSampler;
private final ProbabilityCollection<Biome> replace; private final ProbabilityCollection<BiomeDelegate> replace;
private final String replaceTag; private final String replaceTag;
public BorderMutator(String border, String replaceTag, NoiseSampler noiseSampler, ProbabilityCollection<Biome> replace) { public BorderMutator(String border, String replaceTag, NoiseSampler noiseSampler, ProbabilityCollection<BiomeDelegate> replace) {
this.border = border; this.border = border;
this.noiseSampler = noiseSampler; this.noiseSampler = noiseSampler;
this.replace = replace; this.replace = replace;
@ -31,16 +32,16 @@ public class BorderMutator implements BiomeMutator {
} }
@Override @Override
public Biome mutate(ViewPoint viewPoint, double x, double z, long seed) { public BiomeDelegate mutate(ViewPoint viewPoint, double x, double z, long seed) {
Biome origin = viewPoint.getBiome(0, 0); BiomeDelegate origin = viewPoint.getBiome(0, 0);
if(origin.getTags().contains(replaceTag)) { if(origin.getTags().contains(replaceTag)) {
for(int xi = -1; xi <= 1; xi++) { for(int xi = -1; xi <= 1; xi++) {
for(int zi = -1; zi <= 1; zi++) { for(int zi = -1; zi <= 1; zi++) {
if(xi == 0 && zi == 0) continue; if(xi == 0 && zi == 0) continue;
Biome current = viewPoint.getBiome(xi, zi); BiomeDelegate current = viewPoint.getBiome(xi, zi);
if(current == null) continue; if(current == null) continue;
if(current.getTags().contains(border)) { if(current.getTags().contains(border)) {
Biome biome = replace.get(noiseSampler, x, z, seed); BiomeDelegate biome = replace.get(noiseSampler, x, z, seed);
return biome == null ? origin : biome; return biome == null ? origin : biome;
} }
} }
@ -50,8 +51,8 @@ public class BorderMutator implements BiomeMutator {
} }
@Override @Override
public Iterable<Biome> getBiomes(Iterable<Biome> biomes) { public Iterable<BiomeDelegate> getBiomes(Iterable<BiomeDelegate> biomes) {
Set<Biome> biomeSet = new HashSet<>(); Set<BiomeDelegate> biomeSet = new HashSet<>();
biomes.forEach(biomeSet::add); biomes.forEach(biomeSet::add);
biomeSet.addAll(replace.getContents().stream().filter(Objects::nonNull).toList()); biomeSet.addAll(replace.getContents().stream().filter(Objects::nonNull).toList());
return biomeSet; return biomeSet;

View File

@ -12,20 +12,20 @@ import java.util.Map;
import java.util.Set; import java.util.Set;
import java.util.stream.Stream; import java.util.stream.Stream;
import com.dfsek.terra.addons.biome.pipeline.api.BiomeDelegate;
import com.dfsek.terra.addons.biome.pipeline.api.BiomeMutator; import com.dfsek.terra.addons.biome.pipeline.api.BiomeMutator;
import com.dfsek.terra.api.noise.NoiseSampler; import com.dfsek.terra.api.noise.NoiseSampler;
import com.dfsek.terra.api.util.collection.ProbabilityCollection; import com.dfsek.terra.api.util.collection.ProbabilityCollection;
import com.dfsek.terra.api.world.biome.Biome;
public class ReplaceListMutator implements BiomeMutator { public class ReplaceListMutator implements BiomeMutator {
private final Map<Biome, ProbabilityCollection<Biome>> replace; private final Map<BiomeDelegate, ProbabilityCollection<BiomeDelegate>> replace;
private final NoiseSampler sampler; private final NoiseSampler sampler;
private final ProbabilityCollection<Biome> replaceDefault; private final ProbabilityCollection<BiomeDelegate> replaceDefault;
private final String defaultTag; private final String defaultTag;
public ReplaceListMutator(Map<Biome, ProbabilityCollection<Biome>> replace, String defaultTag, public ReplaceListMutator(Map<BiomeDelegate, ProbabilityCollection<BiomeDelegate>> replace, String defaultTag,
ProbabilityCollection<Biome> replaceDefault, NoiseSampler sampler) { ProbabilityCollection<BiomeDelegate> replaceDefault, NoiseSampler sampler) {
this.replace = replace; this.replace = replace;
this.sampler = sampler; this.sampler = sampler;
this.defaultTag = defaultTag; this.defaultTag = defaultTag;
@ -33,24 +33,24 @@ public class ReplaceListMutator implements BiomeMutator {
} }
@Override @Override
public Biome mutate(ViewPoint viewPoint, double x, double z, long seed) { public BiomeDelegate mutate(ViewPoint viewPoint, double x, double z, long seed) {
Biome center = viewPoint.getBiome(0, 0); BiomeDelegate center = viewPoint.getBiome(0, 0);
if(replace.containsKey(center)) { if(replace.containsKey(center)) {
Biome biome = replace.get(center).get(sampler, x, z, seed); BiomeDelegate biome = replace.get(center).get(sampler, x, z, seed);
return biome == null ? viewPoint.getBiome(0, 0) : biome; return biome == null ? viewPoint.getBiome(0, 0) : biome;
} }
if(viewPoint.getBiome(0, 0).getTags().contains(defaultTag)) { if(viewPoint.getBiome(0, 0).getTags().contains(defaultTag)) {
Biome biome = replaceDefault.get(sampler, x, z, seed); BiomeDelegate biome = replaceDefault.get(sampler, x, z, seed);
return biome == null ? viewPoint.getBiome(0, 0) : biome; return biome == null ? viewPoint.getBiome(0, 0) : biome;
} }
return center; return center;
} }
@Override @Override
public Iterable<Biome> getBiomes(Iterable<Biome> biomes) { public Iterable<BiomeDelegate> getBiomes(Iterable<BiomeDelegate> biomes) {
Set<Biome> biomeSet = new HashSet<>(); Set<BiomeDelegate> biomeSet = new HashSet<>();
Set<Biome> reject = new HashSet<>(); Set<BiomeDelegate> reject = new HashSet<>();
biomes.forEach(biome -> { biomes.forEach(biome -> {
if(!biome.getTags().contains(defaultTag) && !replace.containsKey(biome)) { if(!biome.getTags().contains(defaultTag) && !replace.containsKey(biome)) {
@ -63,12 +63,10 @@ public class ReplaceListMutator implements BiomeMutator {
if(terraBiome == null) return reject.stream(); if(terraBiome == null) return reject.stream();
return Stream.of(terraBiome); return Stream.of(terraBiome);
}).toList()); }).toList());
replace.forEach((biome, collection) -> { replace.forEach((biome, collection) -> biomeSet.addAll(collection.getContents().stream().map(terraBiome -> {
biomeSet.addAll(collection.getContents().stream().map(terraBiome -> { if(terraBiome == null) return biome;
if(terraBiome == null) return biome; return terraBiome;
return terraBiome; }).toList()));
}).toList());
});
return biomeSet; return biomeSet;
} }
} }

View File

@ -7,6 +7,7 @@
package com.dfsek.terra.addons.biome.pipeline.mutator; package com.dfsek.terra.addons.biome.pipeline.mutator;
import com.dfsek.terra.addons.biome.pipeline.api.BiomeDelegate;
import com.dfsek.terra.addons.biome.pipeline.api.BiomeMutator; import com.dfsek.terra.addons.biome.pipeline.api.BiomeMutator;
import com.dfsek.terra.api.noise.NoiseSampler; import com.dfsek.terra.api.noise.NoiseSampler;
import com.dfsek.terra.api.util.collection.ProbabilityCollection; import com.dfsek.terra.api.util.collection.ProbabilityCollection;
@ -19,28 +20,28 @@ import java.util.stream.Stream;
public class ReplaceMutator implements BiomeMutator { public class ReplaceMutator implements BiomeMutator {
private final String replaceableTag; private final String replaceableTag;
private final ProbabilityCollection<Biome> replace; private final ProbabilityCollection<BiomeDelegate> replace;
private final NoiseSampler sampler; private final NoiseSampler sampler;
public ReplaceMutator(String replaceable, ProbabilityCollection<Biome> replace, NoiseSampler sampler) { public ReplaceMutator(String replaceable, ProbabilityCollection<BiomeDelegate> replace, NoiseSampler sampler) {
this.replaceableTag = replaceable; this.replaceableTag = replaceable;
this.replace = replace; this.replace = replace;
this.sampler = sampler; this.sampler = sampler;
} }
@Override @Override
public Biome mutate(ViewPoint viewPoint, double x, double z, long seed) { public BiomeDelegate mutate(ViewPoint viewPoint, double x, double z, long seed) {
if(viewPoint.getBiome(0, 0).getTags().contains(replaceableTag)) { if(viewPoint.getBiome(0, 0).getTags().contains(replaceableTag)) {
Biome biome = replace.get(sampler, x, z, seed); BiomeDelegate biome = replace.get(sampler, x, z, seed);
return biome == null ? viewPoint.getBiome(0, 0) : biome; return biome == null ? viewPoint.getBiome(0, 0) : biome;
} }
return viewPoint.getBiome(0, 0); return viewPoint.getBiome(0, 0);
} }
@Override @Override
public Iterable<Biome> getBiomes(Iterable<Biome> biomes) { public Iterable<BiomeDelegate> getBiomes(Iterable<BiomeDelegate> biomes) {
Set<Biome> biomeSet = new HashSet<>(); Set<BiomeDelegate> biomeSet = new HashSet<>();
Set<Biome> reject = new HashSet<>(); Set<BiomeDelegate> reject = new HashSet<>();
biomes.forEach(biome -> { biomes.forEach(biome -> {
if(!biome.getTags().contains(replaceableTag)) { if(!biome.getTags().contains(replaceableTag)) {
biomeSet.add(biome); biomeSet.add(biome);

View File

@ -9,6 +9,7 @@ package com.dfsek.terra.addons.biome.pipeline.mutator;
import java.util.Objects; import java.util.Objects;
import com.dfsek.terra.addons.biome.pipeline.api.BiomeDelegate;
import com.dfsek.terra.addons.biome.pipeline.api.BiomeMutator; import com.dfsek.terra.addons.biome.pipeline.api.BiomeMutator;
import com.dfsek.terra.api.noise.NoiseSampler; import com.dfsek.terra.api.noise.NoiseSampler;
import com.dfsek.terra.api.util.MathUtil; import com.dfsek.terra.api.util.MathUtil;
@ -24,11 +25,11 @@ public class SmoothMutator implements BiomeMutator {
} }
@Override @Override
public Biome mutate(ViewPoint viewPoint, double x, double z, long seed) { public BiomeDelegate mutate(ViewPoint viewPoint, double x, double z, long seed) {
Biome top = viewPoint.getBiome(1, 0); BiomeDelegate top = viewPoint.getBiome(1, 0);
Biome bottom = viewPoint.getBiome(-1, 0); BiomeDelegate bottom = viewPoint.getBiome(-1, 0);
Biome left = viewPoint.getBiome(0, 1); BiomeDelegate left = viewPoint.getBiome(0, 1);
Biome right = viewPoint.getBiome(0, -1); BiomeDelegate right = viewPoint.getBiome(0, -1);
boolean vert = Objects.equals(top, bottom) && top != null; boolean vert = Objects.equals(top, bottom) && top != null;

View File

@ -7,6 +7,7 @@
package com.dfsek.terra.addons.biome.pipeline.stages; package com.dfsek.terra.addons.biome.pipeline.stages;
import com.dfsek.terra.addons.biome.pipeline.api.BiomeDelegate;
import com.dfsek.terra.addons.biome.pipeline.api.BiomeExpander; import com.dfsek.terra.addons.biome.pipeline.api.BiomeExpander;
import com.dfsek.terra.addons.biome.pipeline.api.BiomeHolder; import com.dfsek.terra.addons.biome.pipeline.api.BiomeHolder;
import com.dfsek.terra.addons.biome.pipeline.api.Stage; import com.dfsek.terra.addons.biome.pipeline.api.Stage;
@ -31,7 +32,7 @@ public class ExpanderStage implements Stage {
} }
@Override @Override
public Iterable<Biome> getBiomes(Iterable<Biome> biomes) { public Iterable<BiomeDelegate> getBiomes(Iterable<BiomeDelegate> biomes) {
return biomes; return biomes;
} }
} }

View File

@ -7,6 +7,7 @@
package com.dfsek.terra.addons.biome.pipeline.stages; package com.dfsek.terra.addons.biome.pipeline.stages;
import com.dfsek.terra.addons.biome.pipeline.api.BiomeDelegate;
import com.dfsek.terra.addons.biome.pipeline.api.BiomeHolder; import com.dfsek.terra.addons.biome.pipeline.api.BiomeHolder;
import com.dfsek.terra.addons.biome.pipeline.api.BiomeMutator; import com.dfsek.terra.addons.biome.pipeline.api.BiomeMutator;
import com.dfsek.terra.addons.biome.pipeline.api.Stage; import com.dfsek.terra.addons.biome.pipeline.api.Stage;
@ -32,7 +33,7 @@ public class MutatorStage implements Stage {
} }
@Override @Override
public Iterable<Biome> getBiomes(Iterable<Biome> biomes) { public Iterable<BiomeDelegate> getBiomes(Iterable<BiomeDelegate> biomes) {
return mutator.getBiomes(biomes); return mutator.getBiomes(biomes);
} }