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

View File

@@ -51,6 +51,11 @@ public class ImageBiomeProvider implements BiomeProvider {
}));
}
@Override
public Iterable<TerraBiome> getBiomes() {
return colorBiomeMap.values();
}
public enum Align {
CENTER {
@Override

View File

@@ -8,6 +8,7 @@
package com.dfsek.terra.addons.biome.pipeline;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import com.dfsek.terra.addons.biome.pipeline.api.BiomeHolder;
@@ -44,6 +45,14 @@ public class BiomePipeline {
return holder;
}
public BiomeSource getSource() {
return source;
}
public List<Stage> getStages() {
return Collections.unmodifiableList(stages);
}
public int getSize() {
return size;
}

View File

@@ -7,6 +7,8 @@
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.CacheLoader;
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.generation.BiomeProvider;
import java.util.HashSet;
import java.util.Set;
public class BiomePipelineProvider implements BiomeProvider {
private final LoadingCache<SeededVector, BiomeHolder> holderCache;
@@ -60,6 +65,17 @@ public class BiomePipelineProvider implements BiomeProvider {
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 final int x;
private final int z;

View File

@@ -13,6 +13,10 @@ import com.dfsek.terra.api.world.biome.TerraBiome;
public interface BiomeMutator {
TerraBiome mutate(ViewPoint viewPoint, double x, double z, long seed);
default Iterable<TerraBiome> getBiomes(Iterable<TerraBiome> biomes) {
return biomes;
}
class ViewPoint {
private final BiomeHolder biomes;
private final int offX;

View File

@@ -7,9 +7,13 @@
package com.dfsek.terra.addons.biome.pipeline.api;
import com.dfsek.terra.api.world.biome.TerraBiome;
public interface Stage {
BiomeHolder apply(BiomeHolder in, long seed);
boolean isExpansion();
Iterable<TerraBiome> getBiomes(Iterable<TerraBiome> biomes);
}

View File

@@ -7,7 +7,10 @@
package com.dfsek.terra.addons.biome.pipeline.mutator;
import java.util.HashSet;
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.api.noise.NoiseSampler;
@@ -53,4 +56,13 @@ public class BorderListMutator implements BiomeMutator {
}
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;
}
}

View File

@@ -12,6 +12,10 @@ import com.dfsek.terra.api.noise.NoiseSampler;
import com.dfsek.terra.api.util.collection.ProbabilityCollection;
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 {
private final String border;
@@ -44,4 +48,12 @@ public class BorderMutator implements BiomeMutator {
}
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;
}
}

View File

@@ -7,7 +7,10 @@
package com.dfsek.terra.addons.biome.pipeline.mutator;
import java.util.HashSet;
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.api.noise.NoiseSampler;
@@ -42,4 +45,30 @@ public class ReplaceListMutator implements BiomeMutator {
}
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;
}
}

View File

@@ -12,6 +12,10 @@ import com.dfsek.terra.api.noise.NoiseSampler;
import com.dfsek.terra.api.util.collection.ProbabilityCollection;
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 {
private final String replaceableTag;
@@ -32,4 +36,22 @@ public class ReplaceMutator implements BiomeMutator {
}
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;
}
}

View File

@@ -12,4 +12,6 @@ import com.dfsek.terra.api.world.biome.TerraBiome;
public interface BiomeSource {
TerraBiome getBiome(double x, double z, long seed);
Iterable<TerraBiome> getBiomes();
}

View File

@@ -25,4 +25,9 @@ public class NoiseSource implements BiomeSource {
public TerraBiome getBiome(double x, double z, long seed) {
return biomes.get(sampler, x, z, seed);
}
@Override
public Iterable<TerraBiome> getBiomes() {
return biomes.getContents();
}
}

View File

@@ -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.BiomeHolder;
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 {
@@ -29,7 +32,8 @@ public class ExpanderStage implements Stage {
return true;
}
public enum Type {
FRACTAL
@Override
public Iterable<TerraBiome> getBiomes(Iterable<TerraBiome> biomes) {
return biomes;
}
}

View File

@@ -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.BiomeMutator;
import com.dfsek.terra.addons.biome.pipeline.api.Stage;
import com.dfsek.terra.api.world.biome.TerraBiome;
public class MutatorStage implements Stage {
@@ -30,6 +31,11 @@ public class MutatorStage implements Stage {
return false;
}
@Override
public Iterable<TerraBiome> getBiomes(Iterable<TerraBiome> biomes) {
return mutator.getBiomes(biomes);
}
public enum Type {
REPLACE,
REPLACE_LIST,

View File

@@ -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.generation.BiomeProvider;
import java.util.Collections;
public class SingleBiomeProvider implements BiomeProvider {
private final TerraBiome biome;
@@ -22,4 +24,9 @@ public class SingleBiomeProvider implements BiomeProvider {
public TerraBiome getBiome(int x, int z, long seed) {
return biome;
}
@Override
public Iterable<TerraBiome> getBiomes() {
return Collections.singleton(biome);
}
}

View File

@@ -22,4 +22,6 @@ public interface BiomeProvider {
default TerraBiome getBiome(Vector3 vector3, long seed) {
return getBiome(vector3.getBlockX(), vector3.getBlockZ(), seed);
}
Iterable<TerraBiome> getBiomes();
}

View File

@@ -1,16 +1,16 @@
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.generator.BiomeProvider;
import org.bukkit.generator.WorldInfo;
import org.jetbrains.annotations.NotNull;
import java.util.Arrays;
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 {
@@ -26,7 +26,12 @@ public class BukkitBiomeProvider extends BiomeProvider implements Handle {
@Override
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