biome determinism

This commit is contained in:
dfsek
2021-11-28 12:58:26 -07:00
parent a5947be122
commit 2325886adb
16 changed files with 152 additions and 8 deletions
@@ -51,6 +51,11 @@ public class ImageBiomeProvider implements BiomeProvider {
})); }));
} }
@Override
public Iterable<TerraBiome> getBiomes() {
return colorBiomeMap.values();
}
public enum Align { public enum Align {
CENTER { CENTER {
@Override @Override
@@ -8,6 +8,7 @@
package com.dfsek.terra.addons.biome.pipeline; package com.dfsek.terra.addons.biome.pipeline;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Collections;
import java.util.List; import java.util.List;
import com.dfsek.terra.addons.biome.pipeline.api.BiomeHolder; import com.dfsek.terra.addons.biome.pipeline.api.BiomeHolder;
@@ -44,6 +45,14 @@ public class BiomePipeline {
return holder; return holder;
} }
public BiomeSource getSource() {
return source;
}
public List<Stage> getStages() {
return Collections.unmodifiableList(stages);
}
public int getSize() { public int getSize() {
return size; return size;
} }
@@ -7,6 +7,8 @@
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.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;
@@ -19,6 +21,9 @@ import com.dfsek.terra.api.noise.NoiseSampler;
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 java.util.HashSet;
import java.util.Set;
public class BiomePipelineProvider implements BiomeProvider { public class BiomePipelineProvider implements BiomeProvider {
private final LoadingCache<SeededVector, BiomeHolder> holderCache; private final LoadingCache<SeededVector, BiomeHolder> holderCache;
@@ -60,6 +65,17 @@ public class BiomePipelineProvider implements BiomeProvider {
z - fdZ * pipeline.getSize()); z - fdZ * pipeline.getSize());
} }
@Override
public Iterable<TerraBiome> getBiomes() {
Set<TerraBiome> biomeSet = new HashSet<>();
pipeline.getSource().getBiomes().forEach(biomeSet::add);
Iterable<TerraBiome> 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 {
private final int x; private final int x;
private final int z; private final int z;
@@ -13,6 +13,10 @@ import com.dfsek.terra.api.world.biome.TerraBiome;
public interface BiomeMutator { public interface BiomeMutator {
TerraBiome mutate(ViewPoint viewPoint, double x, double z, long seed); TerraBiome mutate(ViewPoint viewPoint, double x, double z, long seed);
default Iterable<TerraBiome> getBiomes(Iterable<TerraBiome> biomes) {
return biomes;
}
class ViewPoint { class ViewPoint {
private final BiomeHolder biomes; private final BiomeHolder biomes;
private final int offX; private final int offX;
@@ -7,9 +7,13 @@
package com.dfsek.terra.addons.biome.pipeline.api; package com.dfsek.terra.addons.biome.pipeline.api;
import com.dfsek.terra.api.world.biome.TerraBiome;
public interface Stage { public interface Stage {
BiomeHolder apply(BiomeHolder in, long seed); BiomeHolder apply(BiomeHolder in, long seed);
boolean isExpansion(); boolean isExpansion();
Iterable<TerraBiome> getBiomes(Iterable<TerraBiome> biomes);
} }
@@ -7,7 +7,10 @@
package com.dfsek.terra.addons.biome.pipeline.mutator; package com.dfsek.terra.addons.biome.pipeline.mutator;
import java.util.HashSet;
import java.util.Map; import java.util.Map;
import java.util.Objects;
import java.util.Set;
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;
@@ -53,4 +56,13 @@ public class BorderListMutator implements BiomeMutator {
} }
return origin; return origin;
} }
@Override
public Iterable<TerraBiome> getBiomes(Iterable<TerraBiome> biomes) {
Set<TerraBiome> biomeSet = new HashSet<>();
biomes.forEach(biomeSet::add);
biomeSet.addAll(replaceDefault.getContents().stream().filter(Objects::nonNull).toList());
replace.forEach((biome, collection) -> biomeSet.addAll(collection.getContents()));
return biomeSet;
}
} }
@@ -12,6 +12,10 @@ 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.TerraBiome; import com.dfsek.terra.api.world.biome.TerraBiome;
import java.util.HashSet;
import java.util.Objects;
import java.util.Set;
public class BorderMutator implements BiomeMutator { public class BorderMutator implements BiomeMutator {
private final String border; private final String border;
@@ -44,4 +48,12 @@ public class BorderMutator implements BiomeMutator {
} }
return origin; return origin;
} }
@Override
public Iterable<TerraBiome> getBiomes(Iterable<TerraBiome> biomes) {
Set<TerraBiome> biomeSet = new HashSet<>();
biomes.forEach(biomeSet::add);
biomeSet.addAll(replace.getContents().stream().filter(Objects::nonNull).toList());
return biomeSet;
}
} }
@@ -7,7 +7,10 @@
package com.dfsek.terra.addons.biome.pipeline.mutator; package com.dfsek.terra.addons.biome.pipeline.mutator;
import java.util.HashSet;
import java.util.Map; import java.util.Map;
import java.util.Set;
import java.util.stream.Stream;
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;
@@ -42,4 +45,30 @@ public class ReplaceListMutator implements BiomeMutator {
} }
return center; return center;
} }
@Override
public Iterable<TerraBiome> getBiomes(Iterable<TerraBiome> biomes) {
Set<TerraBiome> biomeSet = new HashSet<>();
Set<TerraBiome> reject = new HashSet<>();
biomes.forEach(biome -> {
if(!biome.getTags().contains(defaultTag) && !replace.containsKey(biome)) {
biomeSet.add(biome);
} else {
reject.add(biome);
}
});
biomeSet.addAll(replaceDefault.getContents().stream().flatMap(terraBiome -> {
if(terraBiome == null) return reject.stream();
return Stream.of(terraBiome);
}).toList());
replace.forEach((biome, collection) -> {
biomeSet.addAll(collection.getContents().stream().map(terraBiome -> {
if(terraBiome == null) return biome;
return terraBiome;
}).toList());
});
return biomeSet;
}
} }
@@ -12,6 +12,10 @@ 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.TerraBiome; import com.dfsek.terra.api.world.biome.TerraBiome;
import java.util.HashSet;
import java.util.Set;
import java.util.stream.Stream;
public class ReplaceMutator implements BiomeMutator { public class ReplaceMutator implements BiomeMutator {
private final String replaceableTag; private final String replaceableTag;
@@ -32,4 +36,22 @@ public class ReplaceMutator implements BiomeMutator {
} }
return viewPoint.getBiome(0, 0); return viewPoint.getBiome(0, 0);
} }
@Override
public Iterable<TerraBiome> getBiomes(Iterable<TerraBiome> biomes) {
Set<TerraBiome> biomeSet = new HashSet<>();
Set<TerraBiome> reject = new HashSet<>();
biomes.forEach(biome -> {
if(!biome.getTags().contains(replaceableTag)) {
biomeSet.add(biome);
} else {
reject.add(biome);
}
});
biomeSet.addAll(replace.getContents().stream().flatMap(terraBiome -> {
if(terraBiome == null) return reject.stream();
return Stream.of(terraBiome);
}).toList());
return biomeSet;
}
} }
@@ -12,4 +12,6 @@ import com.dfsek.terra.api.world.biome.TerraBiome;
public interface BiomeSource { public interface BiomeSource {
TerraBiome getBiome(double x, double z, long seed); TerraBiome getBiome(double x, double z, long seed);
Iterable<TerraBiome> getBiomes();
} }
@@ -25,4 +25,9 @@ public class NoiseSource implements BiomeSource {
public TerraBiome getBiome(double x, double z, long seed) { public TerraBiome getBiome(double x, double z, long seed) {
return biomes.get(sampler, x, z, seed); return biomes.get(sampler, x, z, seed);
} }
@Override
public Iterable<TerraBiome> getBiomes() {
return biomes.getContents();
}
} }
@@ -10,6 +10,9 @@ package com.dfsek.terra.addons.biome.pipeline.stages;
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;
import com.dfsek.terra.api.world.biome.TerraBiome;
import java.util.Collections;
public class ExpanderStage implements Stage { public class ExpanderStage implements Stage {
@@ -29,7 +32,8 @@ public class ExpanderStage implements Stage {
return true; return true;
} }
public enum Type { @Override
FRACTAL public Iterable<TerraBiome> getBiomes(Iterable<TerraBiome> biomes) {
return biomes;
} }
} }
@@ -10,6 +10,7 @@ package com.dfsek.terra.addons.biome.pipeline.stages;
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;
import com.dfsek.terra.api.world.biome.TerraBiome;
public class MutatorStage implements Stage { public class MutatorStage implements Stage {
@@ -30,6 +31,11 @@ public class MutatorStage implements Stage {
return false; return false;
} }
@Override
public Iterable<TerraBiome> getBiomes(Iterable<TerraBiome> biomes) {
return mutator.getBiomes(biomes);
}
public enum Type { public enum Type {
REPLACE, REPLACE,
REPLACE_LIST, REPLACE_LIST,
@@ -10,6 +10,8 @@ package com.dfsek.terra.addons.biome.single;
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 java.util.Collections;
public class SingleBiomeProvider implements BiomeProvider { public class SingleBiomeProvider implements BiomeProvider {
private final TerraBiome biome; private final TerraBiome biome;
@@ -22,4 +24,9 @@ public class SingleBiomeProvider implements BiomeProvider {
public TerraBiome getBiome(int x, int z, long seed) { public TerraBiome getBiome(int x, int z, long seed) {
return biome; return biome;
} }
@Override
public Iterable<TerraBiome> getBiomes() {
return Collections.singleton(biome);
}
} }
@@ -22,4 +22,6 @@ public interface BiomeProvider {
default TerraBiome getBiome(Vector3 vector3, long seed) { default TerraBiome getBiome(Vector3 vector3, long seed) {
return getBiome(vector3.getBlockX(), vector3.getBlockZ(), seed); return getBiome(vector3.getBlockX(), vector3.getBlockZ(), seed);
} }
Iterable<TerraBiome> getBiomes();
} }
@@ -1,16 +1,16 @@
package com.dfsek.terra.bukkit.generator; package com.dfsek.terra.bukkit.generator;
import com.dfsek.terra.api.Handle;
import com.dfsek.terra.api.world.biome.TerraBiome;
import org.bukkit.block.Biome; import org.bukkit.block.Biome;
import org.bukkit.generator.BiomeProvider; import org.bukkit.generator.BiomeProvider;
import org.bukkit.generator.WorldInfo; import org.bukkit.generator.WorldInfo;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import java.util.Arrays;
import java.util.List; import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.StreamSupport;
import com.dfsek.terra.api.Handle;
import com.dfsek.terra.api.world.biome.TerraBiome;
public class BukkitBiomeProvider extends BiomeProvider implements Handle { public class BukkitBiomeProvider extends BiomeProvider implements Handle {
@@ -26,7 +26,12 @@ public class BukkitBiomeProvider extends BiomeProvider implements Handle {
@Override @Override
public @NotNull List<Biome> getBiomes(@NotNull WorldInfo worldInfo) { public @NotNull List<Biome> getBiomes(@NotNull WorldInfo worldInfo) {
return Arrays.stream(Biome.values()).toList(); return StreamSupport.stream(delegate.getBiomes().spliterator(), false)
.flatMap(terraBiome -> terraBiome.getVanillaBiomes()
.getContents()
.stream()
.map(biome -> (Biome) biome.getHandle()))
.collect(Collectors.toList());
} }
@Override @Override