From 495dcd94d82e96604fb6491485ee00a7fe60ce3e Mon Sep 17 00:00:00 2001 From: Daniel Mills Date: Wed, 15 Jan 2020 02:39:07 -0500 Subject: [PATCH 1/7] Disable features for noise testing --- src/main/java/ninja/bytecode/iris/Settings.java | 5 ++++- .../ninja/bytecode/iris/generator/layer/GenLayerCarving.java | 5 +++++ .../ninja/bytecode/iris/generator/layer/GenLayerCaverns.java | 5 +++++ .../ninja/bytecode/iris/generator/layer/GenLayerCaves.java | 5 +++++ 4 files changed, 19 insertions(+), 1 deletion(-) diff --git a/src/main/java/ninja/bytecode/iris/Settings.java b/src/main/java/ninja/bytecode/iris/Settings.java index 24604ec0e..23e6fcb72 100644 --- a/src/main/java/ninja/bytecode/iris/Settings.java +++ b/src/main/java/ninja/bytecode/iris/Settings.java @@ -45,7 +45,10 @@ public class Settings public double caveScale = 1.45; public double biomeScale = 2; public boolean flatBedrock = false; - public boolean genObjects = true; + public boolean genObjects = false; + public boolean genCarving = false; + public boolean genCaverns = false; + public boolean genCaves = false; public double carvingChance = 0.352; public double cavernChance = 0.321; public int minCarvingHeight = 75; diff --git a/src/main/java/ninja/bytecode/iris/generator/layer/GenLayerCarving.java b/src/main/java/ninja/bytecode/iris/generator/layer/GenLayerCarving.java index 35f4d2ca7..0a748c52e 100644 --- a/src/main/java/ninja/bytecode/iris/generator/layer/GenLayerCarving.java +++ b/src/main/java/ninja/bytecode/iris/generator/layer/GenLayerCarving.java @@ -70,6 +70,11 @@ public class GenLayerCarving extends GenLayer public void genCarves(double wxx, double wzx, int x, int z, int s, IrisGenerator g, IrisBiome biome) { + if(!Iris.settings.gen.genCarving) + { + return; + } + if(s < Iris.settings.gen.minCarvingHeight) { return; diff --git a/src/main/java/ninja/bytecode/iris/generator/layer/GenLayerCaverns.java b/src/main/java/ninja/bytecode/iris/generator/layer/GenLayerCaverns.java index 5275d3c93..2fca49f73 100644 --- a/src/main/java/ninja/bytecode/iris/generator/layer/GenLayerCaverns.java +++ b/src/main/java/ninja/bytecode/iris/generator/layer/GenLayerCaverns.java @@ -70,6 +70,11 @@ public class GenLayerCaverns extends GenLayer public void genCaverns(double wxx, double wzx, int x, int z, int s, IrisGenerator g, IrisBiome biome) { + if(!Iris.settings.gen.genCaverns) + { + return; + } + if(s < Iris.settings.gen.minCavernHeight) { return; diff --git a/src/main/java/ninja/bytecode/iris/generator/layer/GenLayerCaves.java b/src/main/java/ninja/bytecode/iris/generator/layer/GenLayerCaves.java index 7a899f5eb..3211b59fe 100644 --- a/src/main/java/ninja/bytecode/iris/generator/layer/GenLayerCaves.java +++ b/src/main/java/ninja/bytecode/iris/generator/layer/GenLayerCaves.java @@ -30,6 +30,11 @@ public class GenLayerCaves extends GenLayer public void genCaves(double wxx, double wzx, int x, int z, int s, IrisGenerator g) { + if(!Iris.settings.gen.genCaves) + { + return; + } + for(double itr = 0; itr < 0.1 * Iris.settings.gen.caveDensity; itr += 0.1) { double thickness = 0.25 + itr + (0.5 * caveClamp.noise(wxx, wzx)); From ccf36f23c3a10db4508bcf5eb0ba4bb40bfcb2b5 Mon Sep 17 00:00:00 2001 From: Daniel Mills Date: Wed, 15 Jan 2020 02:46:22 -0500 Subject: [PATCH 2/7] Unscramble Biomes --- src/main/java/ninja/bytecode/iris/Settings.java | 3 ++- src/main/java/ninja/bytecode/iris/generator/Snippet.java | 8 ++++++++ .../bytecode/iris/generator/layer/GenLayerBiome.java | 4 ++-- 3 files changed, 12 insertions(+), 3 deletions(-) create mode 100644 src/main/java/ninja/bytecode/iris/generator/Snippet.java diff --git a/src/main/java/ninja/bytecode/iris/Settings.java b/src/main/java/ninja/bytecode/iris/Settings.java index 23e6fcb72..cd014e595 100644 --- a/src/main/java/ninja/bytecode/iris/Settings.java +++ b/src/main/java/ninja/bytecode/iris/Settings.java @@ -28,11 +28,12 @@ public class Settings public InterpolationType trilinearFunction = InterpolationType.BEZIER; public double linearSampleFractureMultiplier = 11.4; public double linearSampleFractureScale = 0.21; - public double horizontalZoom = 1; // 0.525 + public double horizontalZoom = 0.525; // 0.525 public double heightFracture = 155; public double beachScale = 76; public double landScale = 0.325; public double landChance = 0.62; + public double biomeEdgeScramble = 0D; // 1550D public double roughness = 1.25; public double heightMultiplier = 0.806; public double heightExponentBase = 1; diff --git a/src/main/java/ninja/bytecode/iris/generator/Snippet.java b/src/main/java/ninja/bytecode/iris/generator/Snippet.java new file mode 100644 index 000000000..4dde4291d --- /dev/null +++ b/src/main/java/ninja/bytecode/iris/generator/Snippet.java @@ -0,0 +1,8 @@ +package ninja.bytecode.iris.generator; + +public class Snippet +{ + public double horizontalZoom = 0.525; // 0.525 + +} + diff --git a/src/main/java/ninja/bytecode/iris/generator/layer/GenLayerBiome.java b/src/main/java/ninja/bytecode/iris/generator/layer/GenLayerBiome.java index 12b486bd8..211df4aa1 100644 --- a/src/main/java/ninja/bytecode/iris/generator/layer/GenLayerBiome.java +++ b/src/main/java/ninja/bytecode/iris/generator/layer/GenLayerBiome.java @@ -68,8 +68,8 @@ public class GenLayerBiome extends GenLayer public IrisBiome getBiome(double xx, double zz) { - double x = xx + (fracture.noise(zz, xx) * 1550D); - double z = zz - (fracture.noise(xx, zz) * 1550D); + double x = xx + (Iris.settings.gen.biomeEdgeScramble == 0 ? 0 : (fracture.noise(zz, xx) * Iris.settings.gen.biomeEdgeScramble)); + double z = zz - (Iris.settings.gen.biomeEdgeScramble == 0 ? 0 : (fracture.noise(xx, zz) * Iris.settings.gen.biomeEdgeScramble)); IrisBiome cbi = iris.biome("Ocean"); double land = island.noise(x, z); double landChance = 1D - M.clip(Iris.settings.gen.landChance, 0D, 1D); From c4d2e16433780adf35db751f4ab9c96d9e57db34 Mon Sep 17 00:00:00 2001 From: Daniel Mills Date: Wed, 15 Jan 2020 03:02:01 -0500 Subject: [PATCH 3/7] Sample radii & Remove ridges --- .../java/ninja/bytecode/iris/Settings.java | 5 +- .../iris/generator/IrisGenerator.java | 71 ++++++++---- .../iris/generator/layer/GenLayerBase.java | 101 ------------------ .../iris/generator/layer/GenLayerCarving.java | 2 +- .../iris/generator/layer/GenLayerCaverns.java | 2 +- .../generator/layer/GenLayerFracture.java | 49 --------- .../iris/generator/layer/GenLayerRidge.java | 56 ---------- .../bytecode/iris/util/InterpolationType.java | 1 - .../bytecode/iris/util/IrisInterpolation.java | 41 ++++--- 9 files changed, 72 insertions(+), 256 deletions(-) delete mode 100644 src/main/java/ninja/bytecode/iris/generator/layer/GenLayerBase.java delete mode 100644 src/main/java/ninja/bytecode/iris/generator/layer/GenLayerFracture.java delete mode 100644 src/main/java/ninja/bytecode/iris/generator/layer/GenLayerRidge.java diff --git a/src/main/java/ninja/bytecode/iris/Settings.java b/src/main/java/ninja/bytecode/iris/Settings.java index cd014e595..04ab42c28 100644 --- a/src/main/java/ninja/bytecode/iris/Settings.java +++ b/src/main/java/ninja/bytecode/iris/Settings.java @@ -28,7 +28,10 @@ public class Settings public InterpolationType trilinearFunction = InterpolationType.BEZIER; public double linearSampleFractureMultiplier = 11.4; public double linearSampleFractureScale = 0.21; - public double horizontalZoom = 0.525; // 0.525 + public int linearSampleRadius = 29; + public int bilinearSampleRadius = 1; + public int trilinearSampleRadius = 6; + public double horizontalZoom = 1; public double heightFracture = 155; public double beachScale = 76; public double landScale = 0.325; diff --git a/src/main/java/ninja/bytecode/iris/generator/IrisGenerator.java b/src/main/java/ninja/bytecode/iris/generator/IrisGenerator.java index 153259bc0..606c6eda4 100644 --- a/src/main/java/ninja/bytecode/iris/generator/IrisGenerator.java +++ b/src/main/java/ninja/bytecode/iris/generator/IrisGenerator.java @@ -13,13 +13,11 @@ import ninja.bytecode.iris.Iris; import ninja.bytecode.iris.controller.PackController; import ninja.bytecode.iris.generator.genobject.GenObjectDecorator; 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.GenLayerCarving; import ninja.bytecode.iris.generator.layer.GenLayerCaverns; import ninja.bytecode.iris.generator.layer.GenLayerCaves; import ninja.bytecode.iris.generator.layer.GenLayerLayeredNoise; -import ninja.bytecode.iris.generator.layer.GenLayerRidge; import ninja.bytecode.iris.generator.layer.GenLayerSnow; import ninja.bytecode.iris.pack.CompiledDimension; import ninja.bytecode.iris.pack.IrisBiome; @@ -54,14 +52,15 @@ public class IrisGenerator extends ParallelChunkGenerator MB.of(Material.SMOOTH_BRICK, 2), MB.of(Material.SMOOTH_BRICK, 3), }); - public GMap biomeCache = new GMap<>(); //@done + + private double[][][] scatterCache; + private CNG scatter; + public GMap biomeCache = new GMap<>(); private MB WATER = new MB(Material.STATIONARY_WATER); private MB BEDROCK = new MB(Material.BEDROCK); private GList internal; - private GenLayerBase glBase; private GenLayerLayeredNoise glLNoise; - private GenLayerRidge glRidge; private GenLayerBiome glBiome; private GenLayerCaves glCaves; private GenLayerCarving glCarving; @@ -104,6 +103,21 @@ public class IrisGenerator extends ParallelChunkGenerator } } + public int scatterInt(int x, int y, int z, int bound) + { + return (int) (scatter(x, y, z) * (double) (bound - 1)); + } + + public double scatter(int x, int y, int z) + { + return scatterCache[Math.abs(x) % 16][Math.abs(y) % 16][Math.abs(z) % 16]; + } + + public boolean scatterChance(int x, int y, int z, double chance) + { + return scatter(x, y, z) > chance; + } + public GList getLoadedBiomes() { return internal; @@ -115,14 +129,29 @@ public class IrisGenerator extends ParallelChunkGenerator this.world = world; rTerrain = new RNG(world.getSeed() + 1024); lerpf = new CNG(rTerrain.nextParallelRNG(-10000), 1D, 2).scale(Iris.settings.gen.linearSampleFractureScale); - glBase = new GenLayerBase(this, world, random, rTerrain.nextParallelRNG(1)); glLNoise = new GenLayerLayeredNoise(this, world, random, rTerrain.nextParallelRNG(2)); - glRidge = new GenLayerRidge(this, world, random, rTerrain.nextParallelRNG(3)); glBiome = new GenLayerBiome(this, world, random, rTerrain.nextParallelRNG(4), dim.getBiomes()); glCaves = new GenLayerCaves(this, world, random, rTerrain.nextParallelRNG(-1)); glCarving = new GenLayerCarving(this, world, random, rTerrain.nextParallelRNG(-2)); glCaverns = new GenLayerCaverns(this, world, random, rTerrain.nextParallelRNG(-3)); glSnow = new GenLayerSnow(this, world, random, rTerrain.nextParallelRNG(5)); + scatterCache = new double[16][][]; + scatter = new CNG(rTerrain.nextParallelRNG(52), 1, 1).scale(10); + + for(int i = 0; i < 16; i++) + { + scatterCache[i] = new double[16][]; + + for(int j = 0; j < 16; j++) + { + scatterCache[i][j] = new double[16]; + + for(int k = 0; k < 16; k++) + { + scatterCache[i][j][k] = scatter.noise(i, j, k); + } + } + } } @Override @@ -133,8 +162,8 @@ public class IrisGenerator extends ParallelChunkGenerator public IrisBiome getBiome(int wxx, int wzx) { - double wx = Math.round((double) wxx * Iris.settings.gen.horizontalZoom); - double wz = Math.round((double) wzx * Iris.settings.gen.horizontalZoom); + double wx = Math.round((double) wxx * (Iris.settings.gen.horizontalZoom / 1.90476190476)); + double wz = Math.round((double) wzx * (Iris.settings.gen.horizontalZoom / 1.90476190476)); return glBiome.getBiome(wx * Iris.settings.gen.biomeScale, wz * Iris.settings.gen.biomeScale); } @@ -149,17 +178,19 @@ public class IrisGenerator extends ParallelChunkGenerator //@builder int highest = 0; int seaLevel = Iris.settings.gen.seaLevel; - double wx = Math.round((double) wxx * Iris.settings.gen.horizontalZoom); - double wz = Math.round((double) wzx * Iris.settings.gen.horizontalZoom); + double wx = Math.round((double) wxx * (Iris.settings.gen.horizontalZoom / 1.90476190476)); + double wz = Math.round((double) wzx * (Iris.settings.gen.horizontalZoom / 1.90476190476)); IrisBiome biome = getBiome(wxx, wzx); double hv = IrisInterpolation.getNoise(wxx, wzx, + Iris.settings.gen.linearSampleRadius, + Iris.settings.gen.bilinearSampleRadius, + Iris.settings.gen.trilinearSampleRadius, (xf, zf) -> getBiomedHeight((int) Math.round(xf), (int) Math.round(zf), plan), (a, b) -> lerpf.noise(a, b), Iris.settings.gen.linearFunction, Iris.settings.gen.bilinearFunction, Iris.settings.gen.trilinearFunction); 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)); - hv -= glRidge.generateLayer(hv, wxx, wzx); int height = (int) Math.round(M.clip(hv, 0D, 1D) * 253); int max = Math.max(height, seaLevel); IrisBiome override = null; @@ -190,7 +221,7 @@ public class IrisGenerator extends ParallelChunkGenerator for(int i = 0; i < max; i++) { - MB mb = ROCK.get(glBase.scatterInt(wzx, i, wxx, ROCK.size())); + MB mb = ROCK.get(scatterInt(wzx, i, wxx, ROCK.size())); boolean underwater = i >= height && i < seaLevel; boolean underground = i < height; @@ -199,7 +230,7 @@ public class IrisGenerator extends ParallelChunkGenerator mb = WATER; } - if(underground && (height - 1) - i < glBase.scatterInt(x, i, z, 4) + 2) + if(underground && (height - 1) - i < scatterInt(x, i, z, 4) + 2) { mb = biome.getDirtRNG(); } @@ -247,7 +278,7 @@ public class IrisGenerator extends ParallelChunkGenerator mb = BEDROCK; } - if(!Iris.settings.gen.flatBedrock ? i <= 2 : i < glBase.scatterInt(x, i, z, 3)) + if(!Iris.settings.gen.flatBedrock ? i <= 2 : i < scatterInt(x, i, z, 3)) { mb = BEDROCK; } @@ -294,11 +325,10 @@ public class IrisGenerator extends ParallelChunkGenerator if(xh == -1) { - int wx = (int) Math.round((double) x * Iris.settings.gen.horizontalZoom); - int wz = (int) Math.round((double) z * Iris.settings.gen.horizontalZoom); + int wx = (int) Math.round((double) x * (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); double h = Iris.settings.gen.baseHeight + biome.getHeight(); - h += (glBase.getHeight(wx, wz) * 0.5) - (0.33 * 0.5); plan.setHeight(x, z, h); return h; @@ -327,11 +357,6 @@ public class IrisGenerator extends ParallelChunkGenerator return rTerrain; } - public GenLayerBase getGlBase() - { - return glBase; - } - public CompiledDimension getDimension() { return dim; diff --git a/src/main/java/ninja/bytecode/iris/generator/layer/GenLayerBase.java b/src/main/java/ninja/bytecode/iris/generator/layer/GenLayerBase.java deleted file mode 100644 index 0deed0f35..000000000 --- a/src/main/java/ninja/bytecode/iris/generator/layer/GenLayerBase.java +++ /dev/null @@ -1,101 +0,0 @@ -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 double[][][] scatterCache; - 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); - scatterCache = new double[16][][]; - CNG scatter = new CNG(rng.nextParallelRNG(5), 1, 1) - .scale(10); - 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.0025 * Iris.settings.gen.superHeightScale) - .fractureWith(new CNG(rng.nextParallelRNG(14), 1, 1) - .scale(0.021), 250); - fracture = new CNG(rng.nextParallelRNG(15), 0.6D, 4) - .scale(0.118); - //@done - - for(int i = 0; i < 16; i++) - { - scatterCache[i] = new double[16][]; - - for(int j = 0; j < 16; j++) - { - scatterCache[i][j] = new double[16]; - - for(int k = 0; k < 16; k++) - { - scatterCache[i][j][k] = scatter.noise(i, j, k); - } - } - } - } - - 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); - } - - public int scatterInt(int x, int y, int z, int bound) - { - return (int) (scatter(x, y, z) * (double) (bound - 1)); - } - - public double scatter(int x, int y, int z) - { - return scatterCache[Math.abs(x) % 16][Math.abs(y) % 16][Math.abs(z) % 16]; - } - - public boolean scatterChance(int x, int y, int z, double chance) - { - return scatter(x, y, z) > chance; - } - - @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)))); - } -} diff --git a/src/main/java/ninja/bytecode/iris/generator/layer/GenLayerCarving.java b/src/main/java/ninja/bytecode/iris/generator/layer/GenLayerCarving.java index 0a748c52e..09d92ccdf 100644 --- a/src/main/java/ninja/bytecode/iris/generator/layer/GenLayerCarving.java +++ b/src/main/java/ninja/bytecode/iris/generator/layer/GenLayerCarving.java @@ -146,7 +146,7 @@ public class GenLayerCarving extends GenLayer } } - else if(hit > 1 && hit < g.getGlBase().scatterInt(x, i, z, 4) + 3) + else if(hit > 1 && hit < g.scatterInt(x, i, z, 4) + 3) { if(!fail) { diff --git a/src/main/java/ninja/bytecode/iris/generator/layer/GenLayerCaverns.java b/src/main/java/ninja/bytecode/iris/generator/layer/GenLayerCaverns.java index 2fca49f73..26bd717ee 100644 --- a/src/main/java/ninja/bytecode/iris/generator/layer/GenLayerCaverns.java +++ b/src/main/java/ninja/bytecode/iris/generator/layer/GenLayerCaverns.java @@ -146,7 +146,7 @@ public class GenLayerCaverns extends GenLayer } } - else if(hit > 1 && hit < g.getGlBase().scatterInt(x, i, z, 4) + 3) + else if(hit > 1 && hit < g.scatterInt(x, i, z, 4) + 3) { if(!fail) { diff --git a/src/main/java/ninja/bytecode/iris/generator/layer/GenLayerFracture.java b/src/main/java/ninja/bytecode/iris/generator/layer/GenLayerFracture.java deleted file mode 100644 index 11dbaa028..000000000 --- a/src/main/java/ninja/bytecode/iris/generator/layer/GenLayerFracture.java +++ /dev/null @@ -1,49 +0,0 @@ -package ninja.bytecode.iris.generator.layer; - -import java.util.Random; - -import org.bukkit.World; - -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 GenLayerFracture extends GenLayer -{ - private CNG gen; - private CNG cond; - private double shootHeight = 0.963; - - public GenLayerFracture(IrisGenerator iris, World world, Random random, RNG rng) - { - //@builder - super(iris, world, random, rng); - gen = new CNG(rng.nextParallelRNG(40), 1D, 2) - .scale(0.023) - .fractureWith(new CNG(rng.nextParallelRNG(41), 1D, 1) - .scale(0.05), 333); - cond = new CNG(rng.nextParallelRNG(42), 1D, 2) - .scale(0.038) - .fractureWith(new CNG(rng.nextParallelRNG(43), 1D, 1) - .scale(0.025), 299); - //@done - } - - @Override - public double generateLayer(double noise, double dx, double dz) - { - double shootHeight = this.shootHeight + (cond.noise(dx, dz) * 0.035); - - if(noise >= shootHeight) - { - double multiplier = M.rangeScale(0, 0.055, this.shootHeight, 1D, cond.noise(-dx, -dz)); - double on = gen.noise(dx, dz) * multiplier; - - return noise + on; - } - - return noise; - } -} diff --git a/src/main/java/ninja/bytecode/iris/generator/layer/GenLayerRidge.java b/src/main/java/ninja/bytecode/iris/generator/layer/GenLayerRidge.java deleted file mode 100644 index cd53897dd..000000000 --- a/src/main/java/ninja/bytecode/iris/generator/layer/GenLayerRidge.java +++ /dev/null @@ -1,56 +0,0 @@ -package ninja.bytecode.iris.generator.layer; - -import java.util.Random; - -import org.bukkit.World; - -import ninja.bytecode.iris.generator.IrisGenerator; -import ninja.bytecode.iris.util.GenLayer; -import ninja.bytecode.shuriken.math.CNG; -import ninja.bytecode.shuriken.math.RNG; - -public class GenLayerRidge extends GenLayer -{ - private CNG gen; - private CNG fract; - private CNG g; - private CNG q; - - public GenLayerRidge(IrisGenerator iris, World world, Random random, RNG rng) - { - //@builder - super(iris, world, random, rng); - q = new CNG(rng.nextParallelRNG(21), 1D, 2).scale(0.0211); - g = new CNG(rng.nextParallelRNG(22), 1D, 2).scale(0.0011); - fract = new CNG(rng.nextParallelRNG(23), 1D, 5).scale(0.0011); - gen = new CNG(rng.nextParallelRNG(24), 0.19D, 16) - .scale(0.012) - .injectWith(CNG.MAX) - .amp(0.5) - .freq(1.1) - .fractureWith(new CNG(rng.nextParallelRNG(25), 1, 6) - .scale(0.018) - .child(new CNG(rng.nextParallelRNG(26), 0.745, 2) - .scale(0.1)) - .fractureWith(new CNG(rng.nextParallelRNG(27), 1, 3) - .scale(0.15), 24), 44); - } - - public double getHeight(double x, double z) - { - return gen.noise(x, z); - } - - @Override - public double generateLayer(double gnoise, double dx, double dz) - { - double d = gen.noise(gnoise, dx + (fract.noise(gnoise, dx, dz) * 1555), dz - (fract.noise(dz, dx, gnoise) * 1555)); - - if(d > g.noise(dx, dz) / 8D) - { - return q.noise(dx, dz, d) * (d / (7D * (g.noise(dz, dx, gnoise) + 0.1))) * (Math.PI / 2.78); - } - - return 0; - } -} diff --git a/src/main/java/ninja/bytecode/iris/util/InterpolationType.java b/src/main/java/ninja/bytecode/iris/util/InterpolationType.java index f23dec5c3..2b88c0a38 100644 --- a/src/main/java/ninja/bytecode/iris/util/InterpolationType.java +++ b/src/main/java/ninja/bytecode/iris/util/InterpolationType.java @@ -5,7 +5,6 @@ public enum InterpolationType LINEAR, PARAMETRIC_2, PARAMETRIC_4, - PARAMETRIC_NH, BEZIER, NONE; } diff --git a/src/main/java/ninja/bytecode/iris/util/IrisInterpolation.java b/src/main/java/ninja/bytecode/iris/util/IrisInterpolation.java index 1c0c85c23..56444fa3e 100644 --- a/src/main/java/ninja/bytecode/iris/util/IrisInterpolation.java +++ b/src/main/java/ninja/bytecode/iris/util/IrisInterpolation.java @@ -58,11 +58,6 @@ public class IrisInterpolation return blerpParametric(a, b, c, d, tx, ty, 4); } - if(type.equals(InterpolationType.PARAMETRIC_NH)) - { - return blerpParametric(a, b, c, d, tx, ty, -0.5); - } - return 0; } @@ -76,9 +71,9 @@ public class IrisInterpolation return lerpParametric(lerpParametric(a, b, tx, v), lerpParametric(c, d, tx, v), ty, v); } - public static double getLinearNoise(int x, int z, NoiseProvider n, NoiseProvider f, InterpolationType type) + public static double getLinearNoise(int x, int z, int rad, NoiseProvider n, NoiseProvider f, InterpolationType type) { - int h = 29; + int h = rad; int xa = x - h; int za = z - h; int xb = x + h; @@ -95,45 +90,45 @@ public class IrisInterpolation return blerp(na, nc, nb, nd, px, pz, type); } - public static double getBilinearNoise(int x, int z, NoiseProvider n, NoiseProvider f, InterpolationType linear, InterpolationType bilinear) + public static double getBilinearNoise(int x, int z, int lrad, int birad, NoiseProvider n, NoiseProvider f, InterpolationType linear, InterpolationType bilinear) { - int h = 1; + int h = birad; int fx = x >> h; int fz = z >> h; int xa = (fx << h) - 15; int za = (fz << h) - 15; int xb = ((fx + 1) << h) + 15; int zb = ((fz + 1) << h) + 15; - double na = getLinearNoise(xa, za, n, f, linear); - double nb = getLinearNoise(xa, zb, n, f, linear); - double nc = getLinearNoise(xb, za, n, f, linear); - double nd = getLinearNoise(xb, zb, n, f, linear); + double na = getLinearNoise(xa, za, lrad, n, f, linear); + double nb = getLinearNoise(xa, zb, lrad, n, f, linear); + double nc = getLinearNoise(xb, za, lrad, n, f, linear); + double nd = getLinearNoise(xb, zb, lrad, n, f, linear); double px = M.rangeScale(0, 1, xa, xb, x); double pz = M.rangeScale(0, 1, za, zb, z); return blerp(na, nc, nb, nd, px, pz, bilinear); } - public static double getTrilinearNoise(int x, int z, NoiseProvider n, NoiseProvider f, InterpolationType linear, InterpolationType bilinear, InterpolationType trilinear) + public static double getTrilinearNoise(int x, int z, int lrad, int birad, int trirad, NoiseProvider n, NoiseProvider f, InterpolationType linear, InterpolationType bilinear, InterpolationType trilinear) { - int h = 6; + int h = trirad; int fx = x >> h; int fz = z >> h; int xa = (fx << h); int za = (fz << h); int xb = ((fx + 1) << h); int zb = ((fz + 1) << h); - double na = getBilinearNoise(xa, za, n, f, linear, bilinear); - double nb = getBilinearNoise(xa, zb, n, f, linear, bilinear); - double nc = getBilinearNoise(xb, za, n, f, linear, bilinear); - double nd = getBilinearNoise(xb, zb, n, f, linear, bilinear); + double na = getBilinearNoise(xa, za, lrad, birad, n, f, linear, bilinear); + double nb = getBilinearNoise(xa, zb, lrad, birad, n, f, linear, bilinear); + double nc = getBilinearNoise(xb, za, lrad, birad, n, f, linear, bilinear); + double nd = getBilinearNoise(xb, zb, lrad, birad, n, f, linear, bilinear); double px = M.rangeScale(0, 1, xa, xb, x); double pz = M.rangeScale(0, 1, za, zb, z); return blerp(na, nc, nb, nd, px, pz, trilinear); } - public static double getNoise(int x, int z, NoiseProvider n, NoiseProvider fli, InterpolationType linear, InterpolationType bilinear, InterpolationType trilinear) + public static double getNoise(int x, int z, int lrad, int birad, int trirad, NoiseProvider n, NoiseProvider fli, InterpolationType linear, InterpolationType bilinear, InterpolationType trilinear) { if(linear.equals(InterpolationType.NONE)) { @@ -142,17 +137,17 @@ public class IrisInterpolation else if(bilinear.equals(InterpolationType.NONE)) { - return getLinearNoise(x, z, n, fli, linear); + return getLinearNoise(x, z, lrad, n, fli, linear); } else if(trilinear.equals(InterpolationType.NONE)) { - return getBilinearNoise(x, z, n, fli, linear, bilinear); + return getBilinearNoise(x, z, lrad, birad, n, fli, linear, bilinear); } else { - return getTrilinearNoise(x, z, n, fli, linear, bilinear, trilinear); + return getTrilinearNoise(x, z, lrad, birad, trirad, n, fli, linear, bilinear, trilinear); } } } From c62be9573dc4411efda8a291a208e45ade34da86 Mon Sep 17 00:00:00 2001 From: Daniel Mills Date: Wed, 15 Jan 2020 03:19:22 -0500 Subject: [PATCH 4/7] Back to linear --- .../java/ninja/bytecode/iris/Settings.java | 11 +--- .../bytecode/iris/util/IrisInterpolation.java | 65 ++----------------- 2 files changed, 10 insertions(+), 66 deletions(-) diff --git a/src/main/java/ninja/bytecode/iris/Settings.java b/src/main/java/ninja/bytecode/iris/Settings.java index 04ab42c28..31b26d190 100644 --- a/src/main/java/ninja/bytecode/iris/Settings.java +++ b/src/main/java/ninja/bytecode/iris/Settings.java @@ -23,14 +23,9 @@ public class Settings public static class GeneratorSettings { - public InterpolationType linearFunction = InterpolationType.BEZIER; - public InterpolationType bilinearFunction = InterpolationType.PARAMETRIC_2; - public InterpolationType trilinearFunction = InterpolationType.BEZIER; - public double linearSampleFractureMultiplier = 11.4; - public double linearSampleFractureScale = 0.21; - public int linearSampleRadius = 29; - public int bilinearSampleRadius = 1; - public int trilinearSampleRadius = 6; + public InterpolationType linearFunction = InterpolationType.PARAMETRIC_2; + public int linearSampleRadius = 2; + public int interpolationIntervals = 1; public double horizontalZoom = 1; public double heightFracture = 155; public double beachScale = 76; diff --git a/src/main/java/ninja/bytecode/iris/util/IrisInterpolation.java b/src/main/java/ninja/bytecode/iris/util/IrisInterpolation.java index 56444fa3e..cddcf77a4 100644 --- a/src/main/java/ninja/bytecode/iris/util/IrisInterpolation.java +++ b/src/main/java/ninja/bytecode/iris/util/IrisInterpolation.java @@ -74,80 +74,29 @@ public class IrisInterpolation public static double getLinearNoise(int x, int z, int rad, NoiseProvider n, NoiseProvider f, InterpolationType type) { int h = rad; - int xa = x - h; - int za = z - h; - int xb = x + h; - int zb = z + h; - double hfx = f.noise(x, z) * Iris.settings.gen.linearSampleFractureMultiplier; - double hfz = f.noise(z, x) * Iris.settings.gen.linearSampleFractureMultiplier; - double na = n.noise(xa + hfx, za + hfz); - double nb = n.noise(xa + hfx, zb - hfz); - double nc = n.noise(xb - hfx, za + hfz); - double nd = n.noise(xb - hfx, zb - hfz); - double px = M.rangeScale(0, 1, xa, xb, x); - double pz = M.rangeScale(0, 1, za, zb, z); - - return blerp(na, nc, nb, nd, px, pz, type); - } - - public static double getBilinearNoise(int x, int z, int lrad, int birad, NoiseProvider n, NoiseProvider f, InterpolationType linear, InterpolationType bilinear) - { - int h = birad; - int fx = x >> h; - int fz = z >> h; - int xa = (fx << h) - 15; - int za = (fz << h) - 15; - int xb = ((fx + 1) << h) + 15; - int zb = ((fz + 1) << h) + 15; - double na = getLinearNoise(xa, za, lrad, n, f, linear); - double nb = getLinearNoise(xa, zb, lrad, n, f, linear); - double nc = getLinearNoise(xb, za, lrad, n, f, linear); - double nd = getLinearNoise(xb, zb, lrad, n, f, linear); - double px = M.rangeScale(0, 1, xa, xb, x); - double pz = M.rangeScale(0, 1, za, zb, z); - - return blerp(na, nc, nb, nd, px, pz, bilinear); - } - - public static double getTrilinearNoise(int x, int z, int lrad, int birad, int trirad, NoiseProvider n, NoiseProvider f, InterpolationType linear, InterpolationType bilinear, InterpolationType trilinear) - { - int h = trirad; int fx = x >> h; int fz = z >> h; int xa = (fx << h); int za = (fz << h); int xb = ((fx + 1) << h); int zb = ((fz + 1) << h); - double na = getBilinearNoise(xa, za, lrad, birad, n, f, linear, bilinear); - double nb = getBilinearNoise(xa, zb, lrad, birad, n, f, linear, bilinear); - double nc = getBilinearNoise(xb, za, lrad, birad, n, f, linear, bilinear); - double nd = getBilinearNoise(xb, zb, lrad, birad, n, f, linear, bilinear); + double na = n.noise(xa, za); + double nb = n.noise(xa, zb); + double nc = n.noise(xb, za); + double nd = n.noise(xb, zb); double px = M.rangeScale(0, 1, xa, xb, x); double pz = M.rangeScale(0, 1, za, zb, z); - return blerp(na, nc, nb, nd, px, pz, trilinear); + return blerp(na, nc, nb, nd, px, pz, type); } - public static double getNoise(int x, int z, int lrad, int birad, int trirad, NoiseProvider n, NoiseProvider fli, InterpolationType linear, InterpolationType bilinear, InterpolationType trilinear) + public static double getNoise(int x, int z, int lrad, NoiseProvider n, NoiseProvider fli, InterpolationType linear) { if(linear.equals(InterpolationType.NONE)) { return n.noise(x, z); } - else if(bilinear.equals(InterpolationType.NONE)) - { - return getLinearNoise(x, z, lrad, n, fli, linear); - } - - else if(trilinear.equals(InterpolationType.NONE)) - { - return getBilinearNoise(x, z, lrad, birad, n, fli, linear, bilinear); - } - - else - { - return getTrilinearNoise(x, z, lrad, birad, trirad, n, fli, linear, bilinear, trilinear); - } + return getLinearNoise(x, z, lrad, n, fli, linear); } } From 8c5fdd4673505a93a02b2b2281ece810a3a64705 Mon Sep 17 00:00:00 2001 From: Daniel Mills Date: Wed, 15 Jan 2020 04:14:27 -0500 Subject: [PATCH 5/7] Cubic & Hermite --- .../java/ninja/bytecode/iris/Settings.java | 2 +- .../iris/generator/IrisGenerator.java | 8 +--- .../bytecode/iris/util/IrisInterpolation.java | 39 +++++++++++++++++-- 3 files changed, 37 insertions(+), 12 deletions(-) diff --git a/src/main/java/ninja/bytecode/iris/Settings.java b/src/main/java/ninja/bytecode/iris/Settings.java index 31b26d190..fb95a27af 100644 --- a/src/main/java/ninja/bytecode/iris/Settings.java +++ b/src/main/java/ninja/bytecode/iris/Settings.java @@ -24,7 +24,7 @@ public class Settings public static class GeneratorSettings { public InterpolationType linearFunction = InterpolationType.PARAMETRIC_2; - public int linearSampleRadius = 2; + public int linearSampleRadius = 6; public int interpolationIntervals = 1; public double horizontalZoom = 1; public double heightFracture = 155; diff --git a/src/main/java/ninja/bytecode/iris/generator/IrisGenerator.java b/src/main/java/ninja/bytecode/iris/generator/IrisGenerator.java index 606c6eda4..3e0ff8cad 100644 --- a/src/main/java/ninja/bytecode/iris/generator/IrisGenerator.java +++ b/src/main/java/ninja/bytecode/iris/generator/IrisGenerator.java @@ -128,7 +128,6 @@ public class IrisGenerator extends ParallelChunkGenerator { this.world = world; rTerrain = new RNG(world.getSeed() + 1024); - lerpf = new CNG(rTerrain.nextParallelRNG(-10000), 1D, 2).scale(Iris.settings.gen.linearSampleFractureScale); glLNoise = new GenLayerLayeredNoise(this, world, random, rTerrain.nextParallelRNG(2)); glBiome = new GenLayerBiome(this, world, random, rTerrain.nextParallelRNG(4), dim.getBiomes()); glCaves = new GenLayerCaves(this, world, random, rTerrain.nextParallelRNG(-1)); @@ -183,13 +182,8 @@ public class IrisGenerator extends ParallelChunkGenerator IrisBiome biome = getBiome(wxx, wzx); double hv = IrisInterpolation.getNoise(wxx, wzx, Iris.settings.gen.linearSampleRadius, - Iris.settings.gen.bilinearSampleRadius, - Iris.settings.gen.trilinearSampleRadius, (xf, zf) -> getBiomedHeight((int) Math.round(xf), (int) Math.round(zf), plan), - (a, b) -> lerpf.noise(a, b), - Iris.settings.gen.linearFunction, - Iris.settings.gen.bilinearFunction, - Iris.settings.gen.trilinearFunction); + Iris.settings.gen.linearFunction); 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 max = Math.max(height, seaLevel); diff --git a/src/main/java/ninja/bytecode/iris/util/IrisInterpolation.java b/src/main/java/ninja/bytecode/iris/util/IrisInterpolation.java index cddcf77a4..d40667ccb 100644 --- a/src/main/java/ninja/bytecode/iris/util/IrisInterpolation.java +++ b/src/main/java/ninja/bytecode/iris/util/IrisInterpolation.java @@ -71,7 +71,39 @@ public class IrisInterpolation return lerpParametric(lerpParametric(a, b, tx, v), lerpParametric(c, d, tx, v), ty, v); } - public static double getLinearNoise(int x, int z, int rad, NoiseProvider n, NoiseProvider f, InterpolationType type) + public static double hermite(double y0, double y1, double y2, double y3, double mu, double tension, double bias) + { + double m0, m1, mu2, mu3; + double a0, a1, a2, a3; + + mu2 = mu * mu; + mu3 = mu2 * mu; + m0 = (y1 - y0) * (1 + bias) * (1 - tension) / 2; + m0 += (y2 - y1) * (1 - bias) * (1 - tension) / 2; + m1 = (y2 - y1) * (1 + bias) * (1 - tension) / 2; + m1 += (y3 - y2) * (1 - bias) * (1 - tension) / 2; + a0 = 2 * mu3 - 3 * mu2 + 1; + a1 = mu3 - 2 * mu2 + mu; + a2 = mu3 - mu2; + a3 = -2 * mu3 + 3 * mu2; + + return (a0 * y1 + a1 * m0 + a2 * m1 + a3 * y2); + } + + public static double cubic(double y0, double y1, double y2, double y3, double mu) + { + double a0, a1, a2, a3, mu2; + + mu2 = mu * mu; + a0 = y3 - y2 - y0 + y1; + a1 = y0 - y1 - a0; + a2 = y2 - y0; + a3 = y1; + + return a0 * mu * mu2 + a1 * mu2 + a2 * mu + a3; + } + + public static double getLinearNoise(int x, int z, int rad, NoiseProvider n, InterpolationType type) { int h = rad; int fx = x >> h; @@ -86,17 +118,16 @@ public class IrisInterpolation double nd = n.noise(xb, zb); double px = M.rangeScale(0, 1, xa, xb, x); double pz = M.rangeScale(0, 1, za, zb, z); - return blerp(na, nc, nb, nd, px, pz, type); } - public static double getNoise(int x, int z, int lrad, NoiseProvider n, NoiseProvider fli, InterpolationType linear) + public static double getNoise(int x, int z, int lrad, NoiseProvider n, InterpolationType linear) { if(linear.equals(InterpolationType.NONE)) { return n.noise(x, z); } - return getLinearNoise(x, z, lrad, n, fli, linear); + return getLinearNoise(x, z, lrad, n, linear); } } From f68c206a1788405e1367de7cc3885616c79e0436 Mon Sep 17 00:00:00 2001 From: Daniel Mills Date: Wed, 15 Jan 2020 05:21:28 -0500 Subject: [PATCH 6/7] Reimpl --- .../java/ninja/bytecode/iris/Settings.java | 6 +- .../iris/generator/IrisGenerator.java | 9 +- .../bytecode/iris/util/IrisInterpolation.java | 84 ++++++++++++------- 3 files changed, 60 insertions(+), 39 deletions(-) diff --git a/src/main/java/ninja/bytecode/iris/Settings.java b/src/main/java/ninja/bytecode/iris/Settings.java index fb95a27af..6998f38ee 100644 --- a/src/main/java/ninja/bytecode/iris/Settings.java +++ b/src/main/java/ninja/bytecode/iris/Settings.java @@ -23,15 +23,13 @@ public class Settings public static class GeneratorSettings { - public InterpolationType linearFunction = InterpolationType.PARAMETRIC_2; - public int linearSampleRadius = 6; - public int interpolationIntervals = 1; + public int hermiteSampleRadius = 6; public double horizontalZoom = 1; public double heightFracture = 155; public double beachScale = 76; public double landScale = 0.325; public double landChance = 0.62; - public double biomeEdgeScramble = 0D; // 1550D + public double biomeEdgeScramble = 1550D; // 1550D public double roughness = 1.25; public double heightMultiplier = 0.806; public double heightExponentBase = 1; diff --git a/src/main/java/ninja/bytecode/iris/generator/IrisGenerator.java b/src/main/java/ninja/bytecode/iris/generator/IrisGenerator.java index 3e0ff8cad..934f69127 100644 --- a/src/main/java/ninja/bytecode/iris/generator/IrisGenerator.java +++ b/src/main/java/ninja/bytecode/iris/generator/IrisGenerator.java @@ -181,10 +181,10 @@ public class IrisGenerator extends ParallelChunkGenerator double wz = Math.round((double) wzx * (Iris.settings.gen.horizontalZoom / 1.90476190476)); IrisBiome biome = getBiome(wxx, wzx); double hv = IrisInterpolation.getNoise(wxx, wzx, - Iris.settings.gen.linearSampleRadius, - (xf, zf) -> getBiomedHeight((int) Math.round(xf), (int) Math.round(zf), plan), - Iris.settings.gen.linearFunction); - 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)); + Iris.settings.gen.hermiteSampleRadius, + (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; + int height = (int) Math.round(M.clip(hv, 0D, 1D) * 253); int max = Math.max(height, seaLevel); IrisBiome override = null; @@ -323,7 +323,6 @@ public class IrisGenerator extends ParallelChunkGenerator 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); double h = Iris.settings.gen.baseHeight + biome.getHeight(); - plan.setHeight(x, z, h); return h; } diff --git a/src/main/java/ninja/bytecode/iris/util/IrisInterpolation.java b/src/main/java/ninja/bytecode/iris/util/IrisInterpolation.java index d40667ccb..16e62fa33 100644 --- a/src/main/java/ninja/bytecode/iris/util/IrisInterpolation.java +++ b/src/main/java/ninja/bytecode/iris/util/IrisInterpolation.java @@ -71,63 +71,87 @@ public class IrisInterpolation return lerpParametric(lerpParametric(a, b, tx, v), lerpParametric(c, d, tx, v), ty, v); } - public static double hermite(double y0, double y1, double y2, double y3, double mu, double tension, double bias) + public static double hermite(double p0, double p1, double p2, double p3, double mu, double tension, double bias) { double m0, m1, mu2, mu3; double a0, a1, a2, a3; mu2 = mu * mu; mu3 = mu2 * mu; - m0 = (y1 - y0) * (1 + bias) * (1 - tension) / 2; - m0 += (y2 - y1) * (1 - bias) * (1 - tension) / 2; - m1 = (y2 - y1) * (1 + bias) * (1 - tension) / 2; - m1 += (y3 - y2) * (1 - bias) * (1 - tension) / 2; + m0 = (p1 - p0) * (1 + bias) * (1 - tension) / 2; + m0 += (p2 - p1) * (1 - bias) * (1 - tension) / 2; + m1 = (p2 - p1) * (1 + bias) * (1 - tension) / 2; + m1 += (p3 - p2) * (1 - bias) * (1 - tension) / 2; a0 = 2 * mu3 - 3 * mu2 + 1; a1 = mu3 - 2 * mu2 + mu; a2 = mu3 - mu2; a3 = -2 * mu3 + 3 * mu2; - return (a0 * y1 + a1 * m0 + a2 * m1 + a3 * y2); + return (a0 * p1 + a1 * m0 + a2 * m1 + a3 * p2); } - public static double cubic(double y0, double y1, double y2, double y3, double mu) + public static double bihermite(double p00, double p01, double p02, double p03, double p10, double p11, double p12, double p13, double p20, double p21, double p22, double p23, double p30, double p31, double p32, double p33, double mux, double muy, double tension, double bias) + { + return hermite(hermite(p00, p01, p02, p03, muy, tension, bias), hermite(p10, p11, p12, p13, muy, tension, bias), hermite(p20, p21, p22, p23, muy, tension, bias), hermite(p30, p31, p32, p33, muy, tension, bias), mux, tension, bias); + } + + public static double cubic(double p0, double p1, double p2, double p3, double mu) { double a0, a1, a2, a3, mu2; mu2 = mu * mu; - a0 = y3 - y2 - y0 + y1; - a1 = y0 - y1 - a0; - a2 = y2 - y0; - a3 = y1; + a0 = p3 - p2 - p0 + p1; + a1 = p0 - p1 - a0; + a2 = p2 - p0; + a3 = p1; return a0 * mu * mu2 + a1 * mu2 + a2 * mu + a3; } - public static double getLinearNoise(int x, int z, int rad, NoiseProvider n, InterpolationType type) + public static double bicubic(double p00, double p01, double p02, double p03, double p10, double p11, double p12, double p13, double p20, double p21, double p22, double p23, double p30, double p31, double p32, double p33, double mux, double muy) + { + return cubic(cubic(p00, p01, p02, p03, muy), cubic(p10, p11, p12, p13, muy), cubic(p20, p21, p22, p23, muy), cubic(p30, p31, p32, p33, muy), mux); + } + + public static double getHermiteNoise(int x, int z, int rad, NoiseProvider n) { int h = rad; int fx = x >> h; int fz = z >> h; - int xa = (fx << h); - int za = (fz << h); - int xb = ((fx + 1) << h); - int zb = ((fz + 1) << h); - double na = n.noise(xa, za); - double nb = n.noise(xa, zb); - double nc = n.noise(xb, za); - double nd = n.noise(xb, zb); - double px = M.rangeScale(0, 1, xa, xb, x); - double pz = M.rangeScale(0, 1, za, zb, z); - return blerp(na, nc, nb, nd, px, pz, type); + int x0 = ((fx - 1) << h); + int z0 = ((fz - 1) << h); + int x1 = (fx << h); + int z1 = (fz << h); + int x2 = ((fx + 1) << h); + int z2 = ((fz + 1) << h); + int x3 = ((fx + 2) << h); + int z3 = ((fz + 2) << h); + double px = M.rangeScale(0, 1, x1, x2, x); + double pz = M.rangeScale(0, 1, z1, z2, z); + //@builder + return bihermite( + n.noise(x0, z0), + n.noise(x0, z1), + n.noise(x0, z2), + n.noise(x0, z3), + n.noise(x1, z0), + n.noise(x1, z1), + n.noise(x1, z2), + n.noise(x1, z3), + n.noise(x2, z0), + n.noise(x2, z1), + n.noise(x2, z2), + n.noise(x2, z3), + n.noise(x3, z0), + n.noise(x3, z1), + n.noise(x3, z2), + n.noise(x3, z3), + px, pz, 0.01, 0); + //@done } - public static double getNoise(int x, int z, int lrad, NoiseProvider n, InterpolationType linear) + public static double getNoise(int x, int z, int lrad, NoiseProvider n) { - if(linear.equals(InterpolationType.NONE)) - { - return n.noise(x, z); - } - - return getLinearNoise(x, z, lrad, n, linear); + return getHermiteNoise(x, z, lrad, n); } } From 9f8caff571d83e1a071e791c93bd511986b01359 Mon Sep 17 00:00:00 2001 From: Daniel Mills Date: Wed, 15 Jan 2020 06:49:41 -0500 Subject: [PATCH 7/7] Fixes --- .../java/ninja/bytecode/iris/Settings.java | 11 ++- .../iris/controller/PackController.java | 20 +++++- .../iris/generator/IrisGenerator.java | 24 +++++-- .../bytecode/iris/generator/Snippet.java | 8 --- .../iris/generator/layer/GenLayerBase.java | 67 +++++++++++++++++++ .../iris/generator/layer/GenLayerBiome.java | 49 +++++--------- .../ninja/bytecode/iris/pack/IrisBiome.java | 41 +----------- .../ninja/bytecode/iris/pack/IrisRegion.java | 60 +++++++++++++++++ 8 files changed, 192 insertions(+), 88 deletions(-) delete mode 100644 src/main/java/ninja/bytecode/iris/generator/Snippet.java create mode 100644 src/main/java/ninja/bytecode/iris/generator/layer/GenLayerBase.java diff --git a/src/main/java/ninja/bytecode/iris/Settings.java b/src/main/java/ninja/bytecode/iris/Settings.java index 6998f38ee..762bdf59f 100644 --- a/src/main/java/ninja/bytecode/iris/Settings.java +++ b/src/main/java/ninja/bytecode/iris/Settings.java @@ -1,6 +1,5 @@ package ninja.bytecode.iris; -import ninja.bytecode.iris.util.InterpolationType; import ninja.bytecode.iris.util.PerformanceMode; public class Settings @@ -30,7 +29,7 @@ public class Settings public double landScale = 0.325; public double landChance = 0.62; public double biomeEdgeScramble = 1550D; // 1550D - public double roughness = 1.25; + public double roughness = 1.55; public double heightMultiplier = 0.806; public double heightExponentBase = 1; public double heightExponentMultiplier = 1.41; @@ -42,10 +41,10 @@ public class Settings public double caveScale = 1.45; public double biomeScale = 2; public boolean flatBedrock = false; - public boolean genObjects = false; - public boolean genCarving = false; - public boolean genCaverns = false; - public boolean genCaves = false; + public boolean genObjects = true; + public boolean genCarving = true; + public boolean genCaverns = true; + public boolean genCaves = true; public double carvingChance = 0.352; public double cavernChance = 0.321; public int minCarvingHeight = 75; diff --git a/src/main/java/ninja/bytecode/iris/controller/PackController.java b/src/main/java/ninja/bytecode/iris/controller/PackController.java index ba1a41a0d..060b42f5a 100644 --- a/src/main/java/ninja/bytecode/iris/controller/PackController.java +++ b/src/main/java/ninja/bytecode/iris/controller/PackController.java @@ -161,7 +161,7 @@ public class PackController implements IrisController ready = true; } - + public CompiledDimension getDimension(String name) { return compiledDimensions.get(name); @@ -267,4 +267,22 @@ public class PackController implements IrisController J.attempt(() -> new File(Iris.instance.getDataFolder(), "dimensions").delete()); 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); + } } diff --git a/src/main/java/ninja/bytecode/iris/generator/IrisGenerator.java b/src/main/java/ninja/bytecode/iris/generator/IrisGenerator.java index 934f69127..ce359eb3d 100644 --- a/src/main/java/ninja/bytecode/iris/generator/IrisGenerator.java +++ b/src/main/java/ninja/bytecode/iris/generator/IrisGenerator.java @@ -13,6 +13,7 @@ import ninja.bytecode.iris.Iris; import ninja.bytecode.iris.controller.PackController; import ninja.bytecode.iris.generator.genobject.GenObjectDecorator; 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.GenLayerCarving; 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.pack.CompiledDimension; import ninja.bytecode.iris.pack.IrisBiome; +import ninja.bytecode.iris.pack.IrisRegion; import ninja.bytecode.iris.util.AtomicChunkData; import ninja.bytecode.iris.util.ChunkPlan; import ninja.bytecode.iris.util.IrisInterpolation; @@ -66,8 +68,8 @@ public class IrisGenerator extends ParallelChunkGenerator private GenLayerCarving glCarving; private GenLayerCaverns glCaverns; private GenLayerSnow glSnow; + private GenLayerBase glBase; private RNG rTerrain; - private CNG lerpf; private CompiledDimension dim; private World world; private GMap schematicCache = new GMap<>(); @@ -128,6 +130,7 @@ public class IrisGenerator extends ParallelChunkGenerator { this.world = world; rTerrain = new RNG(world.getSeed() + 1024); + glBase = new GenLayerBase(this, world, random, rTerrain.nextParallelRNG(1)); glLNoise = new GenLayerLayeredNoise(this, world, random, rTerrain.nextParallelRNG(2)); glBiome = new GenLayerBiome(this, world, random, rTerrain.nextParallelRNG(4), dim.getBiomes()); glCaves = new GenLayerCaves(this, world, random, rTerrain.nextParallelRNG(-1)); @@ -183,8 +186,7 @@ public class IrisGenerator extends ParallelChunkGenerator double hv = IrisInterpolation.getNoise(wxx, wzx, Iris.settings.gen.hermiteSampleRadius, (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 max = Math.max(height, seaLevel); 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)) { - 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) @@ -323,6 +338,7 @@ public class IrisGenerator extends ParallelChunkGenerator 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); double h = Iris.settings.gen.baseHeight + biome.getHeight(); + h += (glBase.getHeight(wx, wz) * 0.5) - (0.33 * 0.5); plan.setHeight(x, z, h); return h; } diff --git a/src/main/java/ninja/bytecode/iris/generator/Snippet.java b/src/main/java/ninja/bytecode/iris/generator/Snippet.java deleted file mode 100644 index 4dde4291d..000000000 --- a/src/main/java/ninja/bytecode/iris/generator/Snippet.java +++ /dev/null @@ -1,8 +0,0 @@ -package ninja.bytecode.iris.generator; - -public class Snippet -{ - public double horizontalZoom = 0.525; // 0.525 - -} - diff --git a/src/main/java/ninja/bytecode/iris/generator/layer/GenLayerBase.java b/src/main/java/ninja/bytecode/iris/generator/layer/GenLayerBase.java new file mode 100644 index 000000000..40d89a5fc --- /dev/null +++ b/src/main/java/ninja/bytecode/iris/generator/layer/GenLayerBase.java @@ -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)))); + } +} diff --git a/src/main/java/ninja/bytecode/iris/generator/layer/GenLayerBiome.java b/src/main/java/ninja/bytecode/iris/generator/layer/GenLayerBiome.java index 211df4aa1..349f15458 100644 --- a/src/main/java/ninja/bytecode/iris/generator/layer/GenLayerBiome.java +++ b/src/main/java/ninja/bytecode/iris/generator/layer/GenLayerBiome.java @@ -3,7 +3,6 @@ package ninja.bytecode.iris.generator.layer; import java.util.Random; import java.util.function.Function; -import org.bukkit.Material; import org.bukkit.World; 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.IrisRegion; import ninja.bytecode.iris.util.GenLayer; -import ninja.bytecode.iris.util.MaxingGenerator; import ninja.bytecode.iris.util.MaxingGenerator.EnumMaxingGenerator; import ninja.bytecode.shuriken.collections.GList; import ninja.bytecode.shuriken.collections.GMap; @@ -22,27 +20,26 @@ import ninja.bytecode.shuriken.math.RNG; public class GenLayerBiome extends GenLayer { private EnumMaxingGenerator regionGenerator; - private MaxingGenerator roads; + private GMap regions; private Function factory; - private CNG pathCheck; private CNG fracture; private CNG island; public GenLayerBiome(IrisGenerator iris, World world, Random random, RNG rng, GList biomes) { - //@builder 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); 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); - pathCheck = new CNG(rng.nextParallelRNG(31), 1D, 1).scale(0.00096); - roads = new MaxingGenerator(rng.nextParallelRNG(32), 5, 0.00055, 8, factory); - //@done - - GMap regions = new GMap<>(); + regions = new GMap<>(); for(IrisBiome i : biomes) { + if(i.getName().equals("Beach")) + { + continue; + } + if(!regions.containsKey(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); } + for(IrisRegion i : regions.values()) + { + i.load(); + } + int v = 85034; regionGenerator = new EnumMaxingGenerator(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 landChance = 1D - M.clip(Iris.settings.gen.landChance, 0D, 1D); - if(land > landChance && land < landChance + 0.0175) - { - cbi = iris.biome("Beach"); - } - - else if(land > landChance + 0.0175) + if(land > landChance + 0.0175) { 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) @@ -112,4 +94,9 @@ public class GenLayerBiome extends GenLayer { return noise; } + + public IrisRegion getRegion(String name) + { + return regions.get(name); + } } diff --git a/src/main/java/ninja/bytecode/iris/pack/IrisBiome.java b/src/main/java/ninja/bytecode/iris/pack/IrisBiome.java index 042cda5e9..bba3d2af2 100644 --- a/src/main/java/ninja/bytecode/iris/pack/IrisBiome.java +++ b/src/main/java/ninja/bytecode/iris/pack/IrisBiome.java @@ -21,25 +21,10 @@ import ninja.bytecode.shuriken.math.RNG; public class IrisBiome { 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; //@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) .height(-0.5) .coreBiome() @@ -83,26 +68,6 @@ public class IrisBiome 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() { return OCEAN; @@ -146,7 +111,7 @@ public class IrisBiome public IrisBiome(String name, Biome realBiome) { - this.region = "Default"; + this.region = "default"; this.core = false; this.name = name; this.realBiome = realBiome; @@ -454,7 +419,7 @@ public class IrisBiome public static GList 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 getAllBiomes() diff --git a/src/main/java/ninja/bytecode/iris/pack/IrisRegion.java b/src/main/java/ninja/bytecode/iris/pack/IrisRegion.java index 321f74f9b..cb167cace 100644 --- a/src/main/java/ninja/bytecode/iris/pack/IrisRegion.java +++ b/src/main/java/ninja/bytecode/iris/pack/IrisRegion.java @@ -1,18 +1,37 @@ 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.shuriken.collections.GList; +import ninja.bytecode.shuriken.execution.J; +import ninja.bytecode.shuriken.json.JSONObject; public class IrisRegion { private String name; private GList biomes; private EnumMaxingGenerator gen; + private double rarity; + private IrisBiome beach; public IrisRegion(String name) { this.name = name; 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 getGen() @@ -45,13 +64,38 @@ public class IrisRegion 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 public int hashCode() { final int prime = 31; int result = 1; + result = prime * result + ((beach == null) ? 0 : beach.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()); + long temp; + temp = Double.doubleToLongBits(rarity); + result = prime * result + (int) (temp ^ (temp >>> 32)); return result; } @@ -65,6 +109,13 @@ public class IrisRegion if(getClass() != obj.getClass()) return false; 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(other.biomes != null) @@ -72,6 +123,13 @@ public class IrisRegion } else if(!biomes.equals(other.biomes)) return false; + if(gen == null) + { + if(other.gen != null) + return false; + } + else if(!gen.equals(other.gen)) + return false; if(name == null) { if(other.name != null) @@ -79,6 +137,8 @@ public class IrisRegion } else if(!name.equals(other.name)) return false; + if(Double.doubleToLongBits(rarity) != Double.doubleToLongBits(other.rarity)) + return false; return true; } }