make TerraBiomeGrid abstract, add TerraRadialBiomeGrid implementation & config options

Also adds lots of BiomeGrid validation stuff
This commit is contained in:
dfsek
2020-12-07 00:24:40 -07:00
parent 2ae2801058
commit 4ceb4e22d4
19 changed files with 161 additions and 34 deletions

View File

@@ -1,7 +1,9 @@
package com.dfsek.terra;
import com.dfsek.terra.biome.BiomeZone;
import com.dfsek.terra.biome.grid.TerraBiomeGrid;
import com.dfsek.terra.biome.grid.master.TerraBiomeGrid;
import com.dfsek.terra.biome.grid.master.TerraRadialBiomeGrid;
import com.dfsek.terra.biome.grid.master.TerraStandardBiomeGrid;
import com.dfsek.terra.config.base.ConfigPack;
import com.dfsek.terra.config.base.ConfigPackTemplate;
import com.dfsek.terra.config.base.WorldConfig;
@@ -52,7 +54,11 @@ public class TerraWorld {
}
}
zone = new BiomeZone(w, worldConfig, definedGrids);
grid = new TerraBiomeGrid(w, template.getGridFreqX(), template.getGridFreqZ(), zone, config);
if(template.getGridType().equals(TerraBiomeGrid.Type.RADIAL)) {
BiomeGrid internal = config.getBiomeGrid(template.getRadialInternalGrid()).build(w, worldConfig);
grid = new TerraRadialBiomeGrid(w, template.getGridFreqX(), template.getGridFreqZ(), zone, config, template.getRadialGridRadius(), internal);
} else grid = new TerraStandardBiomeGrid(w, template.getGridFreqX(), template.getGridFreqZ(), zone, config);
}
public static void loadWorld(WorldConfig w) {

View File

@@ -1,6 +1,6 @@
package com.dfsek.terra.async;
import com.dfsek.terra.biome.grid.TerraBiomeGrid;
import com.dfsek.terra.biome.grid.master.TerraBiomeGrid;
import com.dfsek.terra.config.base.PluginConfig;
import org.bukkit.Location;
import org.bukkit.util.Vector;

View File

@@ -1,6 +1,6 @@
package com.dfsek.terra.async;
import com.dfsek.terra.biome.grid.TerraBiomeGrid;
import com.dfsek.terra.biome.grid.master.TerraBiomeGrid;
import org.bukkit.Bukkit;
import org.bukkit.Location;
import org.bukkit.World;

View File

@@ -1,7 +1,7 @@
package com.dfsek.terra.async;
import com.dfsek.terra.biome.UserDefinedBiome;
import com.dfsek.terra.biome.grid.TerraBiomeGrid;
import com.dfsek.terra.biome.grid.master.TerraBiomeGrid;
import com.dfsek.terra.generation.items.TerraStructure;
import com.dfsek.terra.procgen.GridSpawn;
import com.dfsek.terra.structure.Rotation;

View File

@@ -0,0 +1,17 @@
package com.dfsek.terra.biome.grid.master;
import com.dfsek.terra.biome.grid.UserDefinedGrid;
import org.bukkit.World;
import org.polydev.gaea.biome.BiomeGrid;
public abstract class TerraBiomeGrid extends BiomeGrid {
public TerraBiomeGrid(World w, double freq1, double freq2, int sizeX, int sizeZ) {
super(w, freq1, freq2, sizeX, sizeZ);
}
public abstract UserDefinedGrid getGrid(int x, int z);
public enum Type {
RADIAL, STANDARD
}
}

View File

@@ -1,29 +1,29 @@
package com.dfsek.terra.biome.grid;
package com.dfsek.terra.biome.grid.master;
import com.dfsek.terra.biome.BiomeZone;
import com.dfsek.terra.biome.UserDefinedBiome;
import com.dfsek.terra.biome.grid.UserDefinedGrid;
import com.dfsek.terra.biome.postprocessing.CoordinatePerturb;
import com.dfsek.terra.biome.postprocessing.ErosionNoise;
import com.dfsek.terra.config.base.ConfigPack;
import com.dfsek.terra.config.base.ConfigPackTemplate;
import com.dfsek.terra.config.base.PluginConfig;
import com.dfsek.terra.config.lang.LangUtil;
import com.dfsek.terra.procgen.math.Vector2;
import net.jafama.FastMath;
import org.bukkit.Location;
import org.bukkit.World;
import org.polydev.gaea.biome.Biome;
import org.polydev.gaea.biome.BiomeGrid;
import org.polydev.gaea.generation.GenerationPhase;
import java.util.logging.Level;
public class TerraBiomeGrid extends BiomeGrid {
private static int failNum = 0;
public class TerraRadialBiomeGrid extends TerraBiomeGrid {
private static final int failNum = 0;
private final BiomeZone zone;
private final double radiusSq;
private final BiomeGrid internal;
private CoordinatePerturb perturb;
private ErosionNoise erode;
public TerraBiomeGrid(World w, double freq1, double freq2, BiomeZone zone, ConfigPack c) {
public TerraRadialBiomeGrid(World w, double freq1, double freq2, BiomeZone zone, ConfigPack c, double radius, BiomeGrid internal) {
super(w, freq1, freq2, 0, 0);
ConfigPackTemplate t = c.getTemplate();
if(c.getTemplate().isBlend()) {
@@ -33,16 +33,18 @@ public class TerraBiomeGrid extends BiomeGrid {
if(c.getTemplate().isErode()) {
erode = new ErosionNoise(t.getErodeFreq(), t.getErodeThresh(), t.getErodeOctaves(), w.getSeed());
}
this.radiusSq = FastMath.pow2(radius);
this.internal = internal;
}
@Override
public UserDefinedGrid getGrid(int x, int z) {
return (UserDefinedGrid) zone.getGrid(x, z);
}
@Override
public Biome getBiome(int x, int z, GenerationPhase phase) {
int xp = x;
int zp = z;
int xp = x, zp = z;
if(perturb != null && (phase.equals(GenerationPhase.PALETTE_APPLY) || phase.equals(GenerationPhase.POPULATE))) {
Vector2 perturbCoords = perturb.getShiftedCoords(x, z);
xp = (int) perturbCoords.getX();
@@ -50,14 +52,10 @@ public class TerraBiomeGrid extends BiomeGrid {
}
UserDefinedBiome b;
try {
if(x * x + z * z > radiusSq) {
b = (UserDefinedBiome) zone.getGrid(xp, zp).getBiome(xp, zp, phase);
} catch(NullPointerException e) {
if(PluginConfig.isDebug()) e.printStackTrace();
if(failNum % 256 == 0)
LangUtil.log("error.severe-config", Level.SEVERE, String.valueOf(x), String.valueOf(z));
failNum++;
return null;
} else {
b = (UserDefinedBiome) internal.getBiome(xp, zp, phase);
}
if(erode != null && erode.isEroded(xp, zp)) return b.getErode();
return b;
@@ -67,6 +65,4 @@ public class TerraBiomeGrid extends BiomeGrid {
public Biome getBiome(Location l, GenerationPhase phase) {
return getBiome(l.getBlockX(), l.getBlockZ(), phase);
}
}

View File

@@ -0,0 +1,57 @@
package com.dfsek.terra.biome.grid.master;
import com.dfsek.terra.biome.BiomeZone;
import com.dfsek.terra.biome.UserDefinedBiome;
import com.dfsek.terra.biome.grid.UserDefinedGrid;
import com.dfsek.terra.biome.postprocessing.CoordinatePerturb;
import com.dfsek.terra.biome.postprocessing.ErosionNoise;
import com.dfsek.terra.config.base.ConfigPack;
import com.dfsek.terra.config.base.ConfigPackTemplate;
import com.dfsek.terra.procgen.math.Vector2;
import org.bukkit.Location;
import org.bukkit.World;
import org.polydev.gaea.biome.Biome;
import org.polydev.gaea.generation.GenerationPhase;
public class TerraStandardBiomeGrid extends TerraBiomeGrid {
private static final int failNum = 0;
private final BiomeZone zone;
private CoordinatePerturb perturb;
private ErosionNoise erode;
public TerraStandardBiomeGrid(World w, double freq1, double freq2, BiomeZone zone, ConfigPack c) {
super(w, freq1, freq2, 0, 0);
ConfigPackTemplate t = c.getTemplate();
if(c.getTemplate().isBlend()) {
perturb = new CoordinatePerturb(t.getBlendFreq(), t.getBlendAmp(), w.getSeed());
}
this.zone = zone;
if(c.getTemplate().isErode()) {
erode = new ErosionNoise(t.getErodeFreq(), t.getErodeThresh(), t.getErodeOctaves(), w.getSeed());
}
}
@Override
public UserDefinedGrid getGrid(int x, int z) {
return (UserDefinedGrid) zone.getGrid(x, z);
}
@Override
public Biome getBiome(int x, int z, GenerationPhase phase) {
int xp = x, zp = z;
if(perturb != null && (phase.equals(GenerationPhase.PALETTE_APPLY) || phase.equals(GenerationPhase.POPULATE))) {
Vector2 perturbCoords = perturb.getShiftedCoords(x, z);
xp = (int) perturbCoords.getX();
zp = (int) perturbCoords.getZ();
}
UserDefinedBiome b = (UserDefinedBiome) zone.getGrid(xp, zp).getBiome(xp, zp, phase);
if(erode != null && erode.isEroded(xp, zp)) return b.getErode();
return b;
}
@Override
public Biome getBiome(Location l, GenerationPhase phase) {
return getBiome(l.getBlockX(), l.getBlockZ(), phase);
}
}

View File

@@ -2,7 +2,7 @@ package com.dfsek.terra.carving;
import com.dfsek.terra.TerraWorld;
import com.dfsek.terra.biome.UserDefinedBiome;
import com.dfsek.terra.biome.grid.TerraBiomeGrid;
import com.dfsek.terra.biome.grid.master.TerraBiomeGrid;
import com.dfsek.terra.config.base.PluginConfig;
import org.bukkit.World;
import org.bukkit.util.Vector;

View File

@@ -2,7 +2,7 @@ package com.dfsek.terra.command.biome;
import com.dfsek.terra.TerraWorld;
import com.dfsek.terra.biome.UserDefinedBiome;
import com.dfsek.terra.biome.grid.TerraBiomeGrid;
import com.dfsek.terra.biome.grid.master.TerraBiomeGrid;
import com.dfsek.terra.config.lang.LangUtil;
import org.bukkit.World;
import org.bukkit.command.Command;

View File

@@ -5,6 +5,7 @@ import com.dfsek.tectonic.exception.ConfigException;
import com.dfsek.tectonic.exception.LoadException;
import com.dfsek.tectonic.loading.ConfigLoader;
import com.dfsek.terra.biome.UserDefinedBiome;
import com.dfsek.terra.biome.grid.master.TerraBiomeGrid;
import com.dfsek.terra.carving.UserDefinedCarver;
import com.dfsek.terra.config.builder.biomegrid.BiomeGridBuilder;
import com.dfsek.terra.config.exception.FileMissingException;
@@ -160,6 +161,15 @@ public class ConfigPack {
throw new LoadException("Invalid erosion biome defined in biome \"" + b.getID() + "\"", e);
}
}
for(String gridName : template.getGrids()) {
if(!biomeGridRegistry.contains(gridName)) throw new LoadException("No such BiomeGrid \"" + gridName + "\"");
}
if(template.getGridType().equals(TerraBiomeGrid.Type.RADIAL) && !biomeGridRegistry.contains(template.getRadialInternalGrid())) {
throw new LoadException("No such BiomeGrid \"" + template.getRadialInternalGrid() + "\"");
}
template.getStructureLocatables().forEach((type, name) -> structureMap.put(Objects.requireNonNull(type), Objects.requireNonNull(structureRegistry.get(name))));
LangUtil.log("config-pack.loaded", Level.INFO, template.getID(), String.valueOf((System.nanoTime() - start) / 1000000D), template.getAuthor(), template.getVersion());

View File

@@ -2,7 +2,9 @@ package com.dfsek.terra.config.base;
import com.dfsek.tectonic.annotations.Default;
import com.dfsek.tectonic.annotations.Value;
import com.dfsek.tectonic.config.ConfigTemplate;
import com.dfsek.tectonic.config.ValidatedConfigTemplate;
import com.dfsek.tectonic.exception.ValidationException;
import com.dfsek.terra.biome.grid.master.TerraBiomeGrid;
import com.dfsek.terra.generation.config.NoiseBuilder;
import com.dfsek.terra.util.StructureTypeEnum;
@@ -11,7 +13,7 @@ import java.util.List;
import java.util.Map;
@SuppressWarnings({"unused", "FieldMayBeFinal"})
public class ConfigPackTemplate implements ConfigTemplate {
public class ConfigPackTemplate implements ValidatedConfigTemplate {
@Value("id")
private String id;
@@ -97,6 +99,18 @@ public class ConfigPackTemplate implements ConfigTemplate {
@Default
private String version = "0.1.0";
@Value("grid-options.type")
@Default
private TerraBiomeGrid.Type gridType = TerraBiomeGrid.Type.STANDARD;
@Value("grid-options.radial.radius")
@Default
private double radius = 1000D;
@Value("grid-options.radial.internal-grid")
@Default
private String internalGrid = null;
public String getVersion() {
return version;
}
@@ -184,4 +198,23 @@ public class ConfigPackTemplate implements ConfigTemplate {
public int getErodeOctaves() {
return erodeOctaves;
}
public double getRadialGridRadius() {
return radius;
}
public String getRadialInternalGrid() {
return internalGrid;
}
public TerraBiomeGrid.Type getGridType() {
return gridType;
}
@Override
public boolean validate() throws ValidationException {
if(gridType.equals(TerraBiomeGrid.Type.RADIAL) && internalGrid == null)
throw new ValidationException("No internal BiomeGrid specified");
return true;
}
}

View File

@@ -1,6 +1,6 @@
package com.dfsek.terra.generation;
import com.dfsek.terra.biome.grid.TerraBiomeGrid;
import com.dfsek.terra.biome.grid.master.TerraBiomeGrid;
import com.dfsek.terra.generation.config.WorldGenerator;
import org.polydev.gaea.generation.GenerationPhase;
import org.polydev.gaea.math.Interpolator;

View File

@@ -2,7 +2,7 @@ package com.dfsek.terra.image;
import com.dfsek.terra.TerraWorld;
import com.dfsek.terra.biome.BiomeZone;
import com.dfsek.terra.biome.grid.TerraBiomeGrid;
import com.dfsek.terra.biome.grid.master.TerraBiomeGrid;
import com.dfsek.terra.config.base.PluginConfig;
import com.dfsek.terra.debug.gui.DebugGUI;
import net.jafama.FastMath;

View File

@@ -1,7 +1,7 @@
package com.dfsek.terra.image;
import com.dfsek.terra.TerraWorld;
import com.dfsek.terra.biome.grid.TerraBiomeGrid;
import com.dfsek.terra.biome.grid.master.TerraBiomeGrid;
import org.bukkit.World;
import org.polydev.gaea.biome.NormalizationUtil;

View File

@@ -3,7 +3,7 @@ package com.dfsek.terra.population;
import com.dfsek.terra.TerraProfiler;
import com.dfsek.terra.TerraWorld;
import com.dfsek.terra.biome.UserDefinedBiome;
import com.dfsek.terra.biome.grid.TerraBiomeGrid;
import com.dfsek.terra.biome.grid.master.TerraBiomeGrid;
import com.dfsek.terra.generation.items.flora.FloraLayer;
import com.dfsek.terra.procgen.math.Vector2;
import org.bukkit.Chunk;

View File

@@ -3,7 +3,7 @@ package com.dfsek.terra.population;
import com.dfsek.terra.TerraProfiler;
import com.dfsek.terra.TerraWorld;
import com.dfsek.terra.biome.UserDefinedBiome;
import com.dfsek.terra.biome.grid.TerraBiomeGrid;
import com.dfsek.terra.biome.grid.master.TerraBiomeGrid;
import com.dfsek.terra.config.base.ConfigPack;
import com.dfsek.terra.debug.Debug;
import com.dfsek.terra.generation.items.TerraStructure;

View File

@@ -3,7 +3,7 @@ package com.dfsek.terra.population;
import com.dfsek.terra.TerraProfiler;
import com.dfsek.terra.TerraWorld;
import com.dfsek.terra.biome.UserDefinedBiome;
import com.dfsek.terra.biome.grid.TerraBiomeGrid;
import com.dfsek.terra.biome.grid.master.TerraBiomeGrid;
import com.dfsek.terra.generation.items.tree.TreeLayer;
import com.dfsek.terra.procgen.math.Vector2;
import net.jafama.FastMath;

View File

@@ -15,4 +15,10 @@ public class BiomeGridRegistry extends TerraRegistry<BiomeGridBuilder> {
if(id.startsWith("BIOME:")) return new SingleGridBuilder(biomeRegistry.get(id.substring(6)));
return super.get(id);
}
@Override
public boolean contains(String name) {
if(name.startsWith("BIOME:")) return biomeRegistry.contains(name.substring(6));
return super.contains(name);
}
}

View File

@@ -1,6 +1,7 @@
package com.dfsek.terra.util;
import com.dfsek.tectonic.loading.TypeRegistry;
import com.dfsek.terra.biome.grid.master.TerraBiomeGrid;
import com.dfsek.terra.biome.palette.PaletteHolder;
import com.dfsek.terra.biome.palette.PaletteLayer;
import com.dfsek.terra.carving.CarverPalette;
@@ -69,6 +70,7 @@ public final class ConfigUtil {
.registerLoader(Feature.class, new StructureFeatureLoader())
.registerLoader(ImageLoader.class, new ImageLoaderLoader())
.registerLoader(EntityType.class, (t, o, l) -> EntityType.valueOf((String) o))
.registerLoader(TerraBiomeGrid.Type.class, (t, o, l) -> TerraBiomeGrid.Type.valueOf((String) o))
.registerLoader(StructureTypeEnum.class, (t, o, l) -> StructureTypeEnum.valueOf((String) o))
.registerLoader(ImageLoader.Channel.class, (t, o, l) -> ImageLoader.Channel.valueOf((String) o))
.registerLoader(ImageLoader.Align.class, (t, o, l) -> ImageLoader.Align.valueOf((String) o))