This commit is contained in:
Daniel Mills 2020-01-15 06:49:41 -05:00
parent f68c206a17
commit 9f8caff571
8 changed files with 192 additions and 88 deletions

View File

@ -1,6 +1,5 @@
package ninja.bytecode.iris; package ninja.bytecode.iris;
import ninja.bytecode.iris.util.InterpolationType;
import ninja.bytecode.iris.util.PerformanceMode; import ninja.bytecode.iris.util.PerformanceMode;
public class Settings public class Settings
@ -30,7 +29,7 @@ public class Settings
public double landScale = 0.325; public double landScale = 0.325;
public double landChance = 0.62; public double landChance = 0.62;
public double biomeEdgeScramble = 1550D; // 1550D public double biomeEdgeScramble = 1550D; // 1550D
public double roughness = 1.25; public double roughness = 1.55;
public double heightMultiplier = 0.806; public double heightMultiplier = 0.806;
public double heightExponentBase = 1; public double heightExponentBase = 1;
public double heightExponentMultiplier = 1.41; public double heightExponentMultiplier = 1.41;
@ -42,10 +41,10 @@ public class Settings
public double caveScale = 1.45; public double caveScale = 1.45;
public double biomeScale = 2; public double biomeScale = 2;
public boolean flatBedrock = false; public boolean flatBedrock = false;
public boolean genObjects = false; public boolean genObjects = true;
public boolean genCarving = false; public boolean genCarving = true;
public boolean genCaverns = false; public boolean genCaverns = true;
public boolean genCaves = false; public boolean genCaves = true;
public double carvingChance = 0.352; public double carvingChance = 0.352;
public double cavernChance = 0.321; public double cavernChance = 0.321;
public int minCarvingHeight = 75; public int minCarvingHeight = 75;

View File

@ -161,7 +161,7 @@ public class PackController implements IrisController
ready = true; ready = true;
} }
public CompiledDimension getDimension(String name) public CompiledDimension getDimension(String name)
{ {
return compiledDimensions.get(name); return compiledDimensions.get(name);
@ -267,4 +267,22 @@ public class PackController implements IrisController
J.attempt(() -> new File(Iris.instance.getDataFolder(), "dimensions").delete()); J.attempt(() -> new File(Iris.instance.getDataFolder(), "dimensions").delete());
compiledDimensions.clear(); compiledDimensions.clear();
} }
public IrisBiome getBiomeById(String id)
{
if(!biomes.containsKey(id))
{
try
{
biomes.put(id, Iris.getController(PackController.class).loadBiome(id));
}
catch(JSONException | IOException e)
{
e.printStackTrace();
}
}
return biomes.get(id);
}
} }

View File

@ -13,6 +13,7 @@ import ninja.bytecode.iris.Iris;
import ninja.bytecode.iris.controller.PackController; import ninja.bytecode.iris.controller.PackController;
import ninja.bytecode.iris.generator.genobject.GenObjectDecorator; import ninja.bytecode.iris.generator.genobject.GenObjectDecorator;
import ninja.bytecode.iris.generator.genobject.GenObjectGroup; import ninja.bytecode.iris.generator.genobject.GenObjectGroup;
import ninja.bytecode.iris.generator.layer.GenLayerBase;
import ninja.bytecode.iris.generator.layer.GenLayerBiome; import ninja.bytecode.iris.generator.layer.GenLayerBiome;
import ninja.bytecode.iris.generator.layer.GenLayerCarving; import ninja.bytecode.iris.generator.layer.GenLayerCarving;
import ninja.bytecode.iris.generator.layer.GenLayerCaverns; import ninja.bytecode.iris.generator.layer.GenLayerCaverns;
@ -21,6 +22,7 @@ import ninja.bytecode.iris.generator.layer.GenLayerLayeredNoise;
import ninja.bytecode.iris.generator.layer.GenLayerSnow; import ninja.bytecode.iris.generator.layer.GenLayerSnow;
import ninja.bytecode.iris.pack.CompiledDimension; import ninja.bytecode.iris.pack.CompiledDimension;
import ninja.bytecode.iris.pack.IrisBiome; import ninja.bytecode.iris.pack.IrisBiome;
import ninja.bytecode.iris.pack.IrisRegion;
import ninja.bytecode.iris.util.AtomicChunkData; import ninja.bytecode.iris.util.AtomicChunkData;
import ninja.bytecode.iris.util.ChunkPlan; import ninja.bytecode.iris.util.ChunkPlan;
import ninja.bytecode.iris.util.IrisInterpolation; import ninja.bytecode.iris.util.IrisInterpolation;
@ -66,8 +68,8 @@ public class IrisGenerator extends ParallelChunkGenerator
private GenLayerCarving glCarving; private GenLayerCarving glCarving;
private GenLayerCaverns glCaverns; private GenLayerCaverns glCaverns;
private GenLayerSnow glSnow; private GenLayerSnow glSnow;
private GenLayerBase glBase;
private RNG rTerrain; private RNG rTerrain;
private CNG lerpf;
private CompiledDimension dim; private CompiledDimension dim;
private World world; private World world;
private GMap<String, GenObjectGroup> schematicCache = new GMap<>(); private GMap<String, GenObjectGroup> schematicCache = new GMap<>();
@ -128,6 +130,7 @@ public class IrisGenerator extends ParallelChunkGenerator
{ {
this.world = world; this.world = world;
rTerrain = new RNG(world.getSeed() + 1024); rTerrain = new RNG(world.getSeed() + 1024);
glBase = new GenLayerBase(this, world, random, rTerrain.nextParallelRNG(1));
glLNoise = new GenLayerLayeredNoise(this, world, random, rTerrain.nextParallelRNG(2)); glLNoise = new GenLayerLayeredNoise(this, world, random, rTerrain.nextParallelRNG(2));
glBiome = new GenLayerBiome(this, world, random, rTerrain.nextParallelRNG(4), dim.getBiomes()); glBiome = new GenLayerBiome(this, world, random, rTerrain.nextParallelRNG(4), dim.getBiomes());
glCaves = new GenLayerCaves(this, world, random, rTerrain.nextParallelRNG(-1)); glCaves = new GenLayerCaves(this, world, random, rTerrain.nextParallelRNG(-1));
@ -183,8 +186,7 @@ public class IrisGenerator extends ParallelChunkGenerator
double hv = IrisInterpolation.getNoise(wxx, wzx, double hv = IrisInterpolation.getNoise(wxx, wzx,
Iris.settings.gen.hermiteSampleRadius, Iris.settings.gen.hermiteSampleRadius,
(xf, zf) -> getBiomedHeight((int) Math.round(xf), (int) Math.round(zf), plan)); (xf, zf) -> getBiomedHeight((int) Math.round(xf), (int) Math.round(zf), plan));
hv += glLNoise.generateLayer(hv * Iris.settings.gen.roughness * 215, wxx * Iris.settings.gen.roughness * 0.82, wzx * Iris.settings.gen.roughness * 0.82) * (1.6918 * (hv * 2.35)) * 0.725; hv += glLNoise.generateLayer(hv * Iris.settings.gen.roughness * 215, wxx * Iris.settings.gen.roughness * 0.82, wzx * Iris.settings.gen.roughness * 0.82) * (1.6918 * (hv * 2.35));
int height = (int) Math.round(M.clip(hv, 0D, 1D) * 253); int height = (int) Math.round(M.clip(hv, 0D, 1D) * 253);
int max = Math.max(height, seaLevel); int max = Math.max(height, seaLevel);
IrisBiome override = null; IrisBiome override = null;
@ -192,7 +194,20 @@ public class IrisGenerator extends ParallelChunkGenerator
if(height > 61 && height < 65 + (glLNoise.getHeight(wz, wx) * Iris.settings.gen.beachScale)) if(height > 61 && height < 65 + (glLNoise.getHeight(wz, wx) * Iris.settings.gen.beachScale))
{ {
override = biome("Beach"); IrisBiome beach = null;
IrisRegion region = glBiome.getRegion(biome.getRegion());
if(region != null)
{
beach = region.getBeach();
}
if(beach == null)
{
beach = biome("Beach");
}
override = beach;
} }
else if(height < 63) else if(height < 63)
@ -323,6 +338,7 @@ public class IrisGenerator extends ParallelChunkGenerator
int wz = (int) Math.round((double) z * (Iris.settings.gen.horizontalZoom / 1.90476190476)); int wz = (int) Math.round((double) z * (Iris.settings.gen.horizontalZoom / 1.90476190476));
IrisBiome biome = glBiome.getBiome(wx * Iris.settings.gen.biomeScale, wz * Iris.settings.gen.biomeScale); IrisBiome biome = glBiome.getBiome(wx * Iris.settings.gen.biomeScale, wz * Iris.settings.gen.biomeScale);
double h = Iris.settings.gen.baseHeight + biome.getHeight(); double h = Iris.settings.gen.baseHeight + biome.getHeight();
h += (glBase.getHeight(wx, wz) * 0.5) - (0.33 * 0.5);
plan.setHeight(x, z, h); plan.setHeight(x, z, h);
return h; return h;
} }

View File

@ -1,8 +0,0 @@
package ninja.bytecode.iris.generator;
public class Snippet
{
public double horizontalZoom = 0.525; // 0.525
}

View File

@ -0,0 +1,67 @@
package ninja.bytecode.iris.generator.layer;
import java.util.Random;
import org.bukkit.World;
import ninja.bytecode.iris.Iris;
import ninja.bytecode.iris.generator.IrisGenerator;
import ninja.bytecode.iris.util.GenLayer;
import ninja.bytecode.shuriken.math.CNG;
import ninja.bytecode.shuriken.math.M;
import ninja.bytecode.shuriken.math.RNG;
public class GenLayerBase extends GenLayer
{
private CNG gen;
private CNG fracture;
private CNG hfracture;
private CNG height;
private CNG superheight;
public GenLayerBase(IrisGenerator iris, World world, Random random, RNG rng)
{
//@builder
super(iris, world, random, rng);
hfracture = new CNG(rng.nextParallelRNG(6), 1, 2)
.scale(0.0124);
gen = new CNG(rng.nextParallelRNG(7), 0.19D, 7)
.scale(0.012)
.amp(0.5)
.freq(1.1)
.fractureWith(new CNG(rng.nextParallelRNG(8), 1, 6)
.scale(0.018)
.injectWith(CNG.MULTIPLY)
.child(new CNG(rng.nextParallelRNG(9), 0.745, 2)
.scale(0.1)), 44);
height = new CNG(rng.nextParallelRNG(10), 1, 8)
.scale(0.0017601 * Iris.settings.gen.heightScale)
.fractureWith(new CNG(rng.nextParallelRNG(11), 1, 6)
.scale(0.0174)
.fractureWith(new CNG(rng.nextParallelRNG(12), 1, 1)
.scale(0.0034), 31)
.scale(0.066), 58);
superheight = new CNG(rng.nextParallelRNG(13), 1, 6)
.scale(0.025 * Iris.settings.gen.superHeightScale)
.fractureWith(new CNG(rng.nextParallelRNG(14), 1, 1)
.scale(0.13), 250);
fracture = new CNG(rng.nextParallelRNG(15), 0.6D, 4)
.scale(0.118);
//@done
}
public double getHeight(double x, double z)
{
return M.clip(Math.pow(height.noise(x + (hfracture.noise(x, z) * Iris.settings.gen.heightFracture), z + (hfracture.noise(z, x) * Iris.settings.gen.heightFracture)), Iris.settings.gen.heightExponentBase + (superheight.noise(x, z) * Iris.settings.gen.heightExponentMultiplier)) * Iris.settings.gen.heightMultiplier, 0D, 1D);
}
@Override
public double generateLayer(double gnoise, double dx, double dz)
{
double noise = gnoise + getHeight(dx, dz);
double fnoise = fracture.noise(dx, dz);
dx += (fnoise * 44);
dz -= (fnoise * 44);
return ((noise * 0.185) + (gen.noise(dx, dz) * (0.15 + (noise * 0.65))));
}
}

View File

@ -3,7 +3,6 @@ package ninja.bytecode.iris.generator.layer;
import java.util.Random; import java.util.Random;
import java.util.function.Function; import java.util.function.Function;
import org.bukkit.Material;
import org.bukkit.World; import org.bukkit.World;
import ninja.bytecode.iris.Iris; import ninja.bytecode.iris.Iris;
@ -11,7 +10,6 @@ import ninja.bytecode.iris.generator.IrisGenerator;
import ninja.bytecode.iris.pack.IrisBiome; import ninja.bytecode.iris.pack.IrisBiome;
import ninja.bytecode.iris.pack.IrisRegion; import ninja.bytecode.iris.pack.IrisRegion;
import ninja.bytecode.iris.util.GenLayer; import ninja.bytecode.iris.util.GenLayer;
import ninja.bytecode.iris.util.MaxingGenerator;
import ninja.bytecode.iris.util.MaxingGenerator.EnumMaxingGenerator; import ninja.bytecode.iris.util.MaxingGenerator.EnumMaxingGenerator;
import ninja.bytecode.shuriken.collections.GList; import ninja.bytecode.shuriken.collections.GList;
import ninja.bytecode.shuriken.collections.GMap; import ninja.bytecode.shuriken.collections.GMap;
@ -22,27 +20,26 @@ import ninja.bytecode.shuriken.math.RNG;
public class GenLayerBiome extends GenLayer public class GenLayerBiome extends GenLayer
{ {
private EnumMaxingGenerator<IrisRegion> regionGenerator; private EnumMaxingGenerator<IrisRegion> regionGenerator;
private MaxingGenerator roads; private GMap<String, IrisRegion> regions;
private Function<CNG, CNG> factory; private Function<CNG, CNG> factory;
private CNG pathCheck;
private CNG fracture; private CNG fracture;
private CNG island; private CNG island;
public GenLayerBiome(IrisGenerator iris, World world, Random random, RNG rng, GList<IrisBiome> biomes) public GenLayerBiome(IrisGenerator iris, World world, Random random, RNG rng, GList<IrisBiome> biomes)
{ {
//@builder
super(iris, world, random, rng); super(iris, world, random, rng);
island = new CNG(rng.nextParallelRNG(10334), 1D, 3).scale(0.003 * Iris.settings.gen.landScale).fractureWith(new CNG(rng.nextParallelRNG(34), 1D, 12).scale(0.6), 180); island = new CNG(rng.nextParallelRNG(10334), 1D, 3).scale(0.003 * Iris.settings.gen.landScale).fractureWith(new CNG(rng.nextParallelRNG(34), 1D, 12).scale(0.6), 180);
fracture = new CNG(rng.nextParallelRNG(28), 1D, 24).scale(0.0021).fractureWith(new CNG(rng.nextParallelRNG(34), 1D, 12).scale(0.01), 12250); fracture = new CNG(rng.nextParallelRNG(28), 1D, 24).scale(0.0021).fractureWith(new CNG(rng.nextParallelRNG(34), 1D, 12).scale(0.01), 12250);
factory = (g) -> g.fractureWith(new CNG(rng.nextParallelRNG(29), 1D, 4).scale(0.02), 56); factory = (g) -> g.fractureWith(new CNG(rng.nextParallelRNG(29), 1D, 4).scale(0.02), 56);
pathCheck = new CNG(rng.nextParallelRNG(31), 1D, 1).scale(0.00096); regions = new GMap<>();
roads = new MaxingGenerator(rng.nextParallelRNG(32), 5, 0.00055, 8, factory);
//@done
GMap<String, IrisRegion> regions = new GMap<>();
for(IrisBiome i : biomes) for(IrisBiome i : biomes)
{ {
if(i.getName().equals("Beach"))
{
continue;
}
if(!regions.containsKey(i.getRegion())) if(!regions.containsKey(i.getRegion()))
{ {
regions.put(i.getRegion(), new IrisRegion(i.getRegion())); regions.put(i.getRegion(), new IrisRegion(i.getRegion()));
@ -51,6 +48,11 @@ public class GenLayerBiome extends GenLayer
regions.get(i.getRegion()).getBiomes().add(i); regions.get(i.getRegion()).getBiomes().add(i);
} }
for(IrisRegion i : regions.values())
{
i.load();
}
int v = 85034; int v = 85034;
regionGenerator = new EnumMaxingGenerator<IrisRegion>(rng.nextParallelRNG(v), 0.00522 * Iris.settings.gen.biomeScale * 0.189, 1, regions.v().toArray(new IrisRegion[regions.v().size()]), factory); regionGenerator = new EnumMaxingGenerator<IrisRegion>(rng.nextParallelRNG(v), 0.00522 * Iris.settings.gen.biomeScale * 0.189, 1, regions.v().toArray(new IrisRegion[regions.v().size()]), factory);
@ -74,29 +76,9 @@ public class GenLayerBiome extends GenLayer
double land = island.noise(x, z); double land = island.noise(x, z);
double landChance = 1D - M.clip(Iris.settings.gen.landChance, 0D, 1D); double landChance = 1D - M.clip(Iris.settings.gen.landChance, 0D, 1D);
if(land > landChance && land < landChance + 0.0175) if(land > landChance + 0.0175)
{
cbi = iris.biome("Beach");
}
else if(land > landChance + 0.0175)
{ {
cbi = getRegionGenerator(x, z).getChoice(x, z); cbi = getRegionGenerator(x, z).getChoice(x, z);
if(pathCheck.noise(x, z) > 0.33)
{
IrisBiome road = iris.biome("Beach");
if(cbi.getSurface().get(0).material.equals(Material.GRASS))
{
road = IrisBiome.ROAD_GRASSY;
}
if(Math.abs(road.getHeight() - cbi.getHeight()) < 0.0001 && roads.hasBorder(4, 3, xx, zz))
{
return road;
}
}
} }
else if(land < 0.3) else if(land < 0.3)
@ -112,4 +94,9 @@ public class GenLayerBiome extends GenLayer
{ {
return noise; return noise;
} }
public IrisRegion getRegion(String name)
{
return regions.get(name);
}
} }

View File

@ -21,25 +21,10 @@ import ninja.bytecode.shuriken.math.RNG;
public class IrisBiome public class IrisBiome
{ {
public static final double MAX_HEIGHT = 0.77768; public static final double MAX_HEIGHT = 0.77768;
public static final double IDEAL_HEIGHT = 0.1127; public static final double IDEAL_HEIGHT = 0.0527;
public static final double MIN_HEIGHT = -0.0218; public static final double MIN_HEIGHT = -0.0218;
//@builder //@builder
private static final IrisBiome RIVER = new IrisBiome("River", Biome.RIVER)
.surface(MB.of(Material.SAND))
.coreBiome();
private static final IrisBiome BEACH = new IrisBiome("Beach", Biome.BEACHES)
.height(-0.078)
.coreBiome()
.surface(MB.of(Material.SAND));
public static final IrisBiome ROAD_GRAVEL = new IrisBiome("Gravel Road", Biome.PLAINS)
.surface(MB.of(Material.GRAVEL), MB.of(Material.COBBLESTONE))
.coreBiome()
.scatter(MB.of(Material.TORCH), 0.05);
public static final IrisBiome ROAD_GRASSY = new IrisBiome("Grass Path", Biome.PLAINS)
.surface(MB.of(Material.GRASS_PATH))
.coreBiome()
.scatter(MB.of(Material.TORCH), 0.05);
private static final IrisBiome OCEAN = new IrisBiome("Ocean", Biome.OCEAN) private static final IrisBiome OCEAN = new IrisBiome("Ocean", Biome.OCEAN)
.height(-0.5) .height(-0.5)
.coreBiome() .coreBiome()
@ -83,26 +68,6 @@ public class IrisBiome
return MIN_HEIGHT; return MIN_HEIGHT;
} }
public static IrisBiome getRiver()
{
return RIVER;
}
public static IrisBiome getBeach()
{
return BEACH;
}
public static IrisBiome getRoadGravel()
{
return ROAD_GRAVEL;
}
public static IrisBiome getRoadGrassy()
{
return ROAD_GRASSY;
}
public static IrisBiome getOcean() public static IrisBiome getOcean()
{ {
return OCEAN; return OCEAN;
@ -146,7 +111,7 @@ public class IrisBiome
public IrisBiome(String name, Biome realBiome) public IrisBiome(String name, Biome realBiome)
{ {
this.region = "Default"; this.region = "default";
this.core = false; this.core = false;
this.name = name; this.name = name;
this.realBiome = realBiome; this.realBiome = realBiome;
@ -454,7 +419,7 @@ public class IrisBiome
public static GList<IrisBiome> getBiomes() public static GList<IrisBiome> getBiomes()
{ {
return map.v().remove(IrisBiome.BEACH, IrisBiome.OCEAN, IrisBiome.DEEP_OCEAN, IrisBiome.ROAD_GRASSY, IrisBiome.ROAD_GRAVEL, IrisBiome.BEACH, IrisBiome.RIVER); return map.v().remove(IrisBiome.OCEAN, IrisBiome.DEEP_OCEAN);
} }
public static GList<IrisBiome> getAllBiomes() public static GList<IrisBiome> getAllBiomes()

View File

@ -1,18 +1,37 @@
package ninja.bytecode.iris.pack; package ninja.bytecode.iris.pack;
import ninja.bytecode.iris.Iris;
import ninja.bytecode.iris.controller.PackController;
import ninja.bytecode.iris.util.MaxingGenerator.EnumMaxingGenerator; import ninja.bytecode.iris.util.MaxingGenerator.EnumMaxingGenerator;
import ninja.bytecode.shuriken.collections.GList; import ninja.bytecode.shuriken.collections.GList;
import ninja.bytecode.shuriken.execution.J;
import ninja.bytecode.shuriken.json.JSONObject;
public class IrisRegion public class IrisRegion
{ {
private String name; private String name;
private GList<IrisBiome> biomes; private GList<IrisBiome> biomes;
private EnumMaxingGenerator<IrisBiome> gen; private EnumMaxingGenerator<IrisBiome> gen;
private double rarity;
private IrisBiome beach;
public IrisRegion(String name) public IrisRegion(String name)
{ {
this.name = name; this.name = name;
this.biomes = new GList<>(); this.biomes = new GList<>();
rarity = 1;
beach = null;
}
public void load()
{
J.attempt(() ->
{
JSONObject o = Iris.getController(PackController.class).loadJSON("pack/regions/" + name + ".json");
J.attempt(() -> name = o.getString("name"));
J.attempt(() -> rarity = o.getDouble("rarity"));
J.attempt(() -> beach = Iris.getController(PackController.class).getBiomeById(o.getString("beach")));
});
} }
public EnumMaxingGenerator<IrisBiome> getGen() public EnumMaxingGenerator<IrisBiome> getGen()
@ -45,13 +64,38 @@ public class IrisRegion
this.biomes = biomes; this.biomes = biomes;
} }
public double getRarity()
{
return rarity;
}
public void setRarity(double rarity)
{
this.rarity = rarity;
}
public IrisBiome getBeach()
{
return beach;
}
public void setBeach(IrisBiome beach)
{
this.beach = beach;
}
@Override @Override
public int hashCode() public int hashCode()
{ {
final int prime = 31; final int prime = 31;
int result = 1; int result = 1;
result = prime * result + ((beach == null) ? 0 : beach.hashCode());
result = prime * result + ((biomes == null) ? 0 : biomes.hashCode()); result = prime * result + ((biomes == null) ? 0 : biomes.hashCode());
result = prime * result + ((gen == null) ? 0 : gen.hashCode());
result = prime * result + ((name == null) ? 0 : name.hashCode()); result = prime * result + ((name == null) ? 0 : name.hashCode());
long temp;
temp = Double.doubleToLongBits(rarity);
result = prime * result + (int) (temp ^ (temp >>> 32));
return result; return result;
} }
@ -65,6 +109,13 @@ public class IrisRegion
if(getClass() != obj.getClass()) if(getClass() != obj.getClass())
return false; return false;
IrisRegion other = (IrisRegion) obj; IrisRegion other = (IrisRegion) obj;
if(beach == null)
{
if(other.beach != null)
return false;
}
else if(!beach.equals(other.beach))
return false;
if(biomes == null) if(biomes == null)
{ {
if(other.biomes != null) if(other.biomes != null)
@ -72,6 +123,13 @@ public class IrisRegion
} }
else if(!biomes.equals(other.biomes)) else if(!biomes.equals(other.biomes))
return false; return false;
if(gen == null)
{
if(other.gen != null)
return false;
}
else if(!gen.equals(other.gen))
return false;
if(name == null) if(name == null)
{ {
if(other.name != null) if(other.name != null)
@ -79,6 +137,8 @@ public class IrisRegion
} }
else if(!name.equals(other.name)) else if(!name.equals(other.name))
return false; return false;
if(Double.doubleToLongBits(rarity) != Double.doubleToLongBits(other.rarity))
return false;
return true; return true;
} }
} }