BiomeGrid no longer needs World object.

This commit is contained in:
dfsek
2020-12-13 15:21:55 -07:00
parent 70abf69dc7
commit a058f1c58b
15 changed files with 103 additions and 47 deletions
@@ -35,7 +35,7 @@ public class TerraWorld {
String partName = template.getGrids().get(i); String partName = template.getGrids().get(i);
try { try {
BiomeGridBuilder g = config.getBiomeGrid(partName); BiomeGridBuilder g = config.getBiomeGrid(partName);
BiomeGrid b = g.build(w, c); BiomeGrid b = g.build(w.getSeed(), c);
definedGrids[i] = b; definedGrids[i] = b;
} catch(NullPointerException e) { } catch(NullPointerException e) {
safe = false; safe = false;
@@ -46,12 +46,12 @@ public class TerraWorld {
main.getLogger().severe("Terrain will NOT generate properly at this point. Correct your config before using your server!"); main.getLogger().severe("Terrain will NOT generate properly at this point. Correct your config before using your server!");
} }
} }
zone = new BiomeZone(w, c, definedGrids); zone = new BiomeZone(w.getSeed(), c, definedGrids);
if(template.getGridType().equals(TerraBiomeGrid.Type.RADIAL)) { if(template.getGridType().equals(TerraBiomeGrid.Type.RADIAL)) {
BiomeGrid internal = config.getBiomeGrid(template.getRadialInternalGrid()).build(w, c); BiomeGrid internal = config.getBiomeGrid(template.getRadialInternalGrid()).build(w.getSeed(), c);
grid = new TerraRadialBiomeGrid(w, template.getGridFreqX(), template.getGridFreqZ(), zone, config, template.getRadialGridRadius(), internal); grid = new TerraRadialBiomeGrid(w.getSeed(), template.getGridFreqX(), template.getGridFreqZ(), zone, config, template.getRadialGridRadius(), internal);
} else grid = new TerraStandardBiomeGrid(w, template.getGridFreqX(), template.getGridFreqZ(), zone, config); } else grid = new TerraStandardBiomeGrid(w.getSeed(), template.getGridFreqX(), template.getGridFreqZ(), zone, config);
} }
public static boolean isTerraWorld(World w) { public static boolean isTerraWorld(World w) {
@@ -2,24 +2,21 @@ package com.dfsek.terra.api.gaea.biome;
import com.dfsek.terra.api.gaea.generation.GenerationPhase; import com.dfsek.terra.api.gaea.generation.GenerationPhase;
import com.dfsek.terra.api.gaea.math.FastNoiseLite; import com.dfsek.terra.api.gaea.math.FastNoiseLite;
import com.dfsek.terra.api.generic.world.World;
import com.dfsek.terra.api.generic.world.vector.Location; import com.dfsek.terra.api.generic.world.vector.Location;
public abstract class BiomeGrid { public abstract class BiomeGrid {
private final FastNoiseLite noiseX; private final FastNoiseLite noiseX;
private final FastNoiseLite noiseZ; private final FastNoiseLite noiseZ;
private final World world;
private final int sizeX; private final int sizeX;
private final int sizeZ; private final int sizeZ;
private Biome[][] grid; private Biome[][] grid;
public BiomeGrid(World w, double freq1, double freq2, int sizeX, int sizeZ) { public BiomeGrid(long seed, double freq1, double freq2, int sizeX, int sizeZ) {
this.sizeX = sizeX; this.sizeX = sizeX;
this.sizeZ = sizeZ; this.sizeZ = sizeZ;
this.world = w; this.noiseX = new FastNoiseLite((int) seed);
this.noiseX = new FastNoiseLite((int) w.getSeed()); this.noiseZ = new FastNoiseLite((int) seed + 1);
this.noiseZ = new FastNoiseLite((int) w.getSeed() + 1);
this.noiseX.setNoiseType(FastNoiseLite.NoiseType.OpenSimplex2); this.noiseX.setNoiseType(FastNoiseLite.NoiseType.OpenSimplex2);
this.noiseX.setFractalType(FastNoiseLite.FractalType.FBm); this.noiseX.setFractalType(FastNoiseLite.FractalType.FBm);
this.noiseX.setFractalOctaves(4); this.noiseX.setFractalOctaves(4);
@@ -96,10 +93,6 @@ public abstract class BiomeGrid {
return grid[normalize(biomeNoise, sizeX)][normalize(climateNoise, sizeZ)]; return grid[normalize(biomeNoise, sizeX)][normalize(climateNoise, sizeZ)];
} }
public World getWorld() {
return world;
}
public int getSizeX() { public int getSizeX() {
return sizeX; return sizeX;
} }
@@ -3,7 +3,6 @@ package com.dfsek.terra.biome;
import com.dfsek.terra.api.gaea.biome.BiomeGrid; import com.dfsek.terra.api.gaea.biome.BiomeGrid;
import com.dfsek.terra.api.gaea.biome.NormalizationUtil; import com.dfsek.terra.api.gaea.biome.NormalizationUtil;
import com.dfsek.terra.api.gaea.math.FastNoiseLite; import com.dfsek.terra.api.gaea.math.FastNoiseLite;
import com.dfsek.terra.api.generic.world.World;
import com.dfsek.terra.config.base.ConfigPack; import com.dfsek.terra.config.base.ConfigPack;
import com.dfsek.terra.config.base.ConfigPackTemplate; import com.dfsek.terra.config.base.ConfigPackTemplate;
import com.dfsek.terra.image.ImageLoader; import com.dfsek.terra.image.ImageLoader;
@@ -22,8 +21,8 @@ public class BiomeZone {
private final boolean useImage; private final boolean useImage;
private final ImageLoader.Channel channel; private final ImageLoader.Channel channel;
public BiomeZone(World w, ConfigPack wc, BiomeGrid[] grids) { public BiomeZone(long seed, ConfigPack wc, BiomeGrid[] grids) {
this.noise = new FastNoiseLite((int) w.getSeed() + 2); this.noise = new FastNoiseLite((int) seed + 2);
this.noise.setNoiseType(FastNoiseLite.NoiseType.OpenSimplex2); this.noise.setNoiseType(FastNoiseLite.NoiseType.OpenSimplex2);
this.noise.setFractalType(FastNoiseLite.FractalType.FBm); this.noise.setFractalType(FastNoiseLite.FractalType.FBm);
this.noise.setFractalOctaves(4); this.noise.setFractalOctaves(4);
@@ -3,7 +3,6 @@ package com.dfsek.terra.biome.grid;
import com.dfsek.terra.api.gaea.biome.Biome; import com.dfsek.terra.api.gaea.biome.Biome;
import com.dfsek.terra.api.gaea.biome.BiomeGrid; import com.dfsek.terra.api.gaea.biome.BiomeGrid;
import com.dfsek.terra.api.gaea.generation.GenerationPhase; import com.dfsek.terra.api.gaea.generation.GenerationPhase;
import com.dfsek.terra.api.generic.world.World;
import com.dfsek.terra.api.generic.world.vector.Location; import com.dfsek.terra.api.generic.world.vector.Location;
/** /**
@@ -12,8 +11,8 @@ import com.dfsek.terra.api.generic.world.vector.Location;
public class SingleBiomeGrid extends BiomeGrid { public class SingleBiomeGrid extends BiomeGrid {
private final Biome biome; private final Biome biome;
public SingleBiomeGrid(World w, Biome biome) { public SingleBiomeGrid(long seed, Biome biome) {
super(w, 0, 0, 1, 1); super(seed, 0, 0, 1, 1);
this.biome = biome; this.biome = biome;
} }
@@ -4,7 +4,6 @@ import com.dfsek.terra.api.gaea.biome.Biome;
import com.dfsek.terra.api.gaea.biome.BiomeGrid; import com.dfsek.terra.api.gaea.biome.BiomeGrid;
import com.dfsek.terra.api.gaea.biome.NormalizationUtil; import com.dfsek.terra.api.gaea.biome.NormalizationUtil;
import com.dfsek.terra.api.gaea.generation.GenerationPhase; import com.dfsek.terra.api.gaea.generation.GenerationPhase;
import com.dfsek.terra.api.generic.world.World;
import com.dfsek.terra.api.generic.world.vector.Location; import com.dfsek.terra.api.generic.world.vector.Location;
import com.dfsek.terra.config.base.ConfigPack; import com.dfsek.terra.config.base.ConfigPack;
import com.dfsek.terra.config.base.ConfigPackTemplate; import com.dfsek.terra.config.base.ConfigPackTemplate;
@@ -16,8 +15,8 @@ public class UserDefinedGrid extends BiomeGrid {
private final ImageLoader.Channel channelX; private final ImageLoader.Channel channelX;
private final ImageLoader.Channel channelZ; private final ImageLoader.Channel channelZ;
public UserDefinedGrid(World w, double freq1, double freq2, Biome[][] b, ConfigPack c) { public UserDefinedGrid(long seed, double freq1, double freq2, Biome[][] b, ConfigPack c) {
super(w, freq1, freq2, b.length, b[0].length); super(seed, freq1, freq2, b.length, b[0].length);
super.setGrid(b); super.setGrid(b);
ConfigPackTemplate t = c.getTemplate(); ConfigPackTemplate t = c.getTemplate();
imageLoader = t.getImageLoader(); imageLoader = t.getImageLoader();
@@ -1,12 +1,11 @@
package com.dfsek.terra.biome.grid.master; package com.dfsek.terra.biome.grid.master;
import com.dfsek.terra.api.gaea.biome.BiomeGrid; import com.dfsek.terra.api.gaea.biome.BiomeGrid;
import com.dfsek.terra.api.generic.world.World;
import com.dfsek.terra.biome.grid.UserDefinedGrid; import com.dfsek.terra.biome.grid.UserDefinedGrid;
public abstract class TerraBiomeGrid extends BiomeGrid { public abstract class TerraBiomeGrid extends BiomeGrid {
public TerraBiomeGrid(World w, double freq1, double freq2, int sizeX, int sizeZ) { public TerraBiomeGrid(long seed, double freq1, double freq2, int sizeX, int sizeZ) {
super(w, freq1, freq2, sizeX, sizeZ); super(seed, freq1, freq2, sizeX, sizeZ);
} }
public abstract UserDefinedGrid getGrid(int x, int z); public abstract UserDefinedGrid getGrid(int x, int z);
@@ -3,7 +3,6 @@ package com.dfsek.terra.biome.grid.master;
import com.dfsek.terra.api.gaea.biome.Biome; import com.dfsek.terra.api.gaea.biome.Biome;
import com.dfsek.terra.api.gaea.biome.BiomeGrid; import com.dfsek.terra.api.gaea.biome.BiomeGrid;
import com.dfsek.terra.api.gaea.generation.GenerationPhase; import com.dfsek.terra.api.gaea.generation.GenerationPhase;
import com.dfsek.terra.api.generic.world.World;
import com.dfsek.terra.api.generic.world.vector.Location; import com.dfsek.terra.api.generic.world.vector.Location;
import com.dfsek.terra.api.generic.world.vector.Vector2; import com.dfsek.terra.api.generic.world.vector.Vector2;
import com.dfsek.terra.biome.BiomeZone; import com.dfsek.terra.biome.BiomeZone;
@@ -23,15 +22,15 @@ public class TerraRadialBiomeGrid extends TerraBiomeGrid {
private CoordinatePerturb perturb; private CoordinatePerturb perturb;
private ErosionNoise erode; private ErosionNoise erode;
public TerraRadialBiomeGrid(World w, double freq1, double freq2, BiomeZone zone, ConfigPack c, double radius, BiomeGrid internal) { public TerraRadialBiomeGrid(long seed, double freq1, double freq2, BiomeZone zone, ConfigPack c, double radius, BiomeGrid internal) {
super(w, freq1, freq2, 0, 0); super(seed, freq1, freq2, 0, 0);
ConfigPackTemplate t = c.getTemplate(); ConfigPackTemplate t = c.getTemplate();
if(c.getTemplate().isBlend()) { if(c.getTemplate().isBlend()) {
perturb = new CoordinatePerturb(t.getBlendFreq(), t.getBlendAmp(), w.getSeed()); perturb = new CoordinatePerturb(t.getBlendFreq(), t.getBlendAmp(), seed);
} }
this.zone = zone; this.zone = zone;
if(c.getTemplate().isErode()) { if(c.getTemplate().isErode()) {
erode = new ErosionNoise(t.getErodeFreq(), t.getErodeThresh(), t.getErodeOctaves(), w.getSeed()); erode = new ErosionNoise(t.getErodeFreq(), t.getErodeThresh(), t.getErodeOctaves(), seed);
} }
this.radiusSq = FastMath.pow2(radius); this.radiusSq = FastMath.pow2(radius);
this.internal = internal; this.internal = internal;
@@ -2,7 +2,6 @@ package com.dfsek.terra.biome.grid.master;
import com.dfsek.terra.api.gaea.biome.Biome; import com.dfsek.terra.api.gaea.biome.Biome;
import com.dfsek.terra.api.gaea.generation.GenerationPhase; import com.dfsek.terra.api.gaea.generation.GenerationPhase;
import com.dfsek.terra.api.generic.world.World;
import com.dfsek.terra.api.generic.world.vector.Location; import com.dfsek.terra.api.generic.world.vector.Location;
import com.dfsek.terra.api.generic.world.vector.Vector2; import com.dfsek.terra.api.generic.world.vector.Vector2;
import com.dfsek.terra.biome.BiomeZone; import com.dfsek.terra.biome.BiomeZone;
@@ -19,15 +18,15 @@ public class TerraStandardBiomeGrid extends TerraBiomeGrid {
private CoordinatePerturb perturb; private CoordinatePerturb perturb;
private ErosionNoise erode; private ErosionNoise erode;
public TerraStandardBiomeGrid(World w, double freq1, double freq2, BiomeZone zone, ConfigPack c) { public TerraStandardBiomeGrid(long seed, double freq1, double freq2, BiomeZone zone, ConfigPack c) {
super(w, freq1, freq2, 0, 0); super(seed, freq1, freq2, 0, 0);
ConfigPackTemplate t = c.getTemplate(); ConfigPackTemplate t = c.getTemplate();
if(c.getTemplate().isBlend()) { if(c.getTemplate().isBlend()) {
perturb = new CoordinatePerturb(t.getBlendFreq(), t.getBlendAmp(), w.getSeed()); perturb = new CoordinatePerturb(t.getBlendFreq(), t.getBlendAmp(), seed);
} }
this.zone = zone; this.zone = zone;
if(c.getTemplate().isErode()) { if(c.getTemplate().isErode()) {
erode = new ErosionNoise(t.getErodeFreq(), t.getErodeThresh(), t.getErodeOctaves(), w.getSeed()); erode = new ErosionNoise(t.getErodeFreq(), t.getErodeThresh(), t.getErodeOctaves(), seed);
} }
} }
@@ -1,9 +1,8 @@
package com.dfsek.terra.config.builder.biomegrid; package com.dfsek.terra.config.builder.biomegrid;
import com.dfsek.terra.api.gaea.biome.BiomeGrid; import com.dfsek.terra.api.gaea.biome.BiomeGrid;
import com.dfsek.terra.api.generic.world.World;
import com.dfsek.terra.config.base.ConfigPack; import com.dfsek.terra.config.base.ConfigPack;
public interface BiomeGridBuilder { public interface BiomeGridBuilder {
BiomeGrid build(World world, ConfigPack config); BiomeGrid build(long seed, ConfigPack config);
} }
@@ -1,7 +1,6 @@
package com.dfsek.terra.config.builder.biomegrid; package com.dfsek.terra.config.builder.biomegrid;
import com.dfsek.terra.api.gaea.biome.Biome; import com.dfsek.terra.api.gaea.biome.Biome;
import com.dfsek.terra.api.generic.world.World;
import com.dfsek.terra.biome.grid.SingleBiomeGrid; import com.dfsek.terra.biome.grid.SingleBiomeGrid;
import com.dfsek.terra.config.base.ConfigPack; import com.dfsek.terra.config.base.ConfigPack;
@@ -13,7 +12,7 @@ public class SingleGridBuilder implements BiomeGridBuilder {
} }
@Override @Override
public SingleBiomeGrid build(World world, ConfigPack config) { public SingleBiomeGrid build(long seed, ConfigPack config) {
return new SingleBiomeGrid(world, biome); return new SingleBiomeGrid(seed, biome);
} }
} }
@@ -1,7 +1,6 @@
package com.dfsek.terra.config.builder.biomegrid; package com.dfsek.terra.config.builder.biomegrid;
import com.dfsek.terra.api.gaea.biome.Biome; import com.dfsek.terra.api.gaea.biome.Biome;
import com.dfsek.terra.api.generic.world.World;
import com.dfsek.terra.biome.grid.UserDefinedGrid; import com.dfsek.terra.biome.grid.UserDefinedGrid;
import com.dfsek.terra.config.base.ConfigPack; import com.dfsek.terra.config.base.ConfigPack;
@@ -12,8 +11,8 @@ public class UserDefinedGridBuilder implements BiomeGridBuilder {
private Biome[][] biomes; private Biome[][] biomes;
@Override @Override
public UserDefinedGrid build(World world, ConfigPack config) { public UserDefinedGrid build(long seed, ConfigPack config) {
return new UserDefinedGrid(world, 1D / xFreq, 1D / zFreq, biomes, config); return new UserDefinedGrid(seed, 1D / xFreq, 1D / zFreq, biomes, config);
} }
public double getXFreq() { public double getXFreq() {
@@ -16,6 +16,7 @@ import com.dfsek.terra.fabric.inventory.FabricItemHandle;
import com.dfsek.terra.fabric.mixin.GeneratorTypeAccessor; import com.dfsek.terra.fabric.mixin.GeneratorTypeAccessor;
import com.dfsek.terra.fabric.world.FabricBiome; import com.dfsek.terra.fabric.world.FabricBiome;
import com.dfsek.terra.fabric.world.FabricWorldHandle; import com.dfsek.terra.fabric.world.FabricWorldHandle;
import com.dfsek.terra.fabric.world.TerraBiomeSource;
import com.dfsek.terra.fabric.world.generator.FabricChunkGeneratorWrapper; import com.dfsek.terra.fabric.world.generator.FabricChunkGeneratorWrapper;
import com.dfsek.terra.fabric.world.generator.TerraChunkGeneratorCodec; import com.dfsek.terra.fabric.world.generator.TerraChunkGeneratorCodec;
import com.dfsek.terra.registry.ConfigRegistry; import com.dfsek.terra.registry.ConfigRegistry;
@@ -24,7 +25,6 @@ import net.fabricmc.loader.api.FabricLoader;
import net.minecraft.client.world.GeneratorType; import net.minecraft.client.world.GeneratorType;
import net.minecraft.util.registry.Registry; import net.minecraft.util.registry.Registry;
import net.minecraft.world.biome.Biome; import net.minecraft.world.biome.Biome;
import net.minecraft.world.biome.source.VanillaLayeredBiomeSource;
import net.minecraft.world.gen.chunk.ChunkGenerator; import net.minecraft.world.gen.chunk.ChunkGenerator;
import net.minecraft.world.gen.chunk.ChunkGeneratorSettings; import net.minecraft.world.gen.chunk.ChunkGeneratorSettings;
import net.minecraft.world.gen.chunk.FlatChunkGeneratorConfig; import net.minecraft.world.gen.chunk.FlatChunkGeneratorConfig;
@@ -45,7 +45,8 @@ public class TerraFabricPlugin implements TerraPlugin, ModInitializer {
new StructuresConfig(Optional.empty(), Collections.emptyMap()), biomeRegistry); new StructuresConfig(Optional.empty(), Collections.emptyMap()), biomeRegistry);
config.updateLayerBlocks(); config.updateLayerBlocks();
return new FabricChunkGeneratorWrapper(new VanillaLayeredBiomeSource(seed, false, false, biomeRegistry), seed);
return new FabricChunkGeneratorWrapper(new TerraBiomeSource(biomeRegistry, seed), seed);
} }
}; };
private final TerraChunkGeneratorCodec chunkGeneratorCodec = new TerraChunkGeneratorCodec(this); private final TerraChunkGeneratorCodec chunkGeneratorCodec = new TerraChunkGeneratorCodec(this);
@@ -0,0 +1,19 @@
package com.dfsek.terra.fabric.codec;
import com.dfsek.terra.config.base.ConfigPack;
import com.mojang.datafixers.util.Pair;
import com.mojang.serialization.Codec;
import com.mojang.serialization.DataResult;
import com.mojang.serialization.DynamicOps;
public class ConfigPackCodec implements Codec<ConfigPack> {
@Override
public <T> DataResult<Pair<ConfigPack, T>> decode(DynamicOps<T> ops, T input) {
return null;
}
@Override
public <T> DataResult<T> encode(ConfigPack input, DynamicOps<T> ops, T prefix) {
return null;
}
}
@@ -0,0 +1,7 @@
package com.dfsek.terra.fabric.world;
import com.dfsek.terra.registry.TerraRegistry;
import net.minecraft.world.biome.Biome;
public class FabricBiomeRegistry extends TerraRegistry<Biome> {
}
@@ -0,0 +1,45 @@
package com.dfsek.terra.fabric.world;
import com.dfsek.terra.api.generic.TerraPlugin;
import com.dfsek.terra.fabric.TerraFabricPlugin;
import com.mojang.serialization.Codec;
import com.mojang.serialization.codecs.RecordCodecBuilder;
import net.minecraft.util.registry.Registry;
import net.minecraft.util.registry.RegistryLookupCodec;
import net.minecraft.world.biome.Biome;
import net.minecraft.world.biome.source.BiomeSource;
import java.util.stream.Collectors;
public class TerraBiomeSource extends BiomeSource {
public static final Codec<TerraBiomeSource> CODEC = RecordCodecBuilder.create(instance -> instance.group(
RegistryLookupCodec.of(Registry.BIOME_KEY).forGetter(source -> source.biomeRegistry),
Codec.LONG.fieldOf("seed").stable().forGetter(source -> source.seed))
.apply(instance, instance.stable(TerraBiomeSource::new)));
private final Registry<Biome> biomeRegistry;
private final long seed;
private final TerraPlugin main;
public TerraBiomeSource(Registry<Biome> biomes, long seed) {
super(biomes.stream().collect(Collectors.toList()));
this.biomeRegistry = biomes;
this.seed = seed;
this.main = TerraFabricPlugin.getInstance();
}
@Override
protected Codec<? extends BiomeSource> getCodec() {
return CODEC;
}
@Override
public BiomeSource withSeed(long seed) {
return new TerraBiomeSource(this.biomeRegistry, seed);
}
@Override
public Biome getBiomeForNoiseGen(int biomeX, int biomeY, int biomeZ) {
return null;
}
}