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
@@ -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;
}
@@ -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;
@@ -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;
@@ -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);
}
@@ -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;
}
}
@@ -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;
}
}
@@ -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;
}
}
@@ -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;
}
}
@@ -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();
}
@@ -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();
}
}
@@ -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;
}
}
@@ -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,