diff --git a/.idea/workspace.xml b/.idea/workspace.xml index 504971796..a8cbd353f 100644 --- a/.idea/workspace.xml +++ b/.idea/workspace.xml @@ -143,22 +143,22 @@ - + - - + + - - + + - - + + - + diff --git a/src/main/java/com/volmit/iris/v2/IrisTerrainGenerator.java b/src/main/java/com/volmit/iris/v2/IrisTerrainGenerator.java deleted file mode 100644 index e9136d5f6..000000000 --- a/src/main/java/com/volmit/iris/v2/IrisTerrainGenerator.java +++ /dev/null @@ -1,166 +0,0 @@ -package com.volmit.iris.v2; - -import java.util.Random; -import java.util.function.Predicate; - -import com.volmit.iris.v2.generator.IrisComplex; -import org.bukkit.Chunk; -import org.bukkit.Material; -import org.bukkit.World; -import org.bukkit.block.Biome; -import org.bukkit.block.data.BlockData; - -import com.volmit.iris.v2.scaffold.hunk.Hunk; -import com.volmit.iris.v2.scaffold.stream.ProceduralStream; -import com.volmit.iris.manager.IrisDataManager; -import com.volmit.iris.object.IrisBiome; -import com.volmit.iris.object.IrisDecorator; -import com.volmit.iris.object.IrisDimension; -import com.volmit.iris.util.RNG; -import org.bukkit.generator.BlockPopulator; -import org.jetbrains.annotations.NotNull; - -public class IrisTerrainGenerator extends BlockPopulator -{ - private long seed; - private IrisDataManager data; - private IrisDimension dimension; - private IrisComplex complex; - private RNG rng; - private int parallelism; - private static final Predicate PREDICATE_SOLID = (b) -> b != null && !b.getMaterial().isAir() && !b.getMaterial().equals(Material.WATER) && !b.getMaterial().equals(Material.LAVA); - - public IrisTerrainGenerator(long seed, IrisDimension dimension, IrisDataManager data) - { - parallelism = 8; - this.seed = seed; - this.rng = new RNG(seed); - complex = new IrisComplex(); - this.data = data; - this.dimension = dimension; - flash(); - } - - public void flash() - { - complex.flash(seed, dimension, data); - } - - public void generateTerrain(int x, int z, Hunk blocks) - { - fill2D(complex.getHeightFluidStream(), blocks, x, z, complex.getTerrainStream()); - } - - public void generateBiome(int x, int z, Hunk blocks) - { - fill2DYLock(complex.getMaxHeightStream(), blocks, x, z, complex.getTrueBiomeDerivativeStream()); - } - - public void generate(int x, int z, Hunk blocks, Hunk biomes) - { - generateTerrain(x, z, blocks); - generateBiome(x, z, biomes); - } - - public void generateParallax() - { - - } - - public void generatePost(int x, int z, Hunk blocks) - { - generateDecorations(x, z, blocks); - } - - @Override - public void populate(@NotNull World world, @NotNull Random random, @NotNull Chunk chunk) - { - generatePost(chunk.getX(), chunk.getZ(), Hunk.viewBlocks(chunk)); - } - - private void fill2D(ProceduralStream t, Hunk h, double x, double z, ProceduralStream v) - { - t.fill2D(h, x * 16, z * 16, v, parallelism); - } - - private void fill2DYLock(ProceduralStream t, Hunk h, double x, double z, ProceduralStream v) - { - t.fill2DYLocked(h, x * 16, z * 16, v, parallelism); - } - - public void generateDecorations(int x, int z, Hunk blocks) - { - int bx = (x * 16); - int bz = (z * 16); - - blocks.iterateSurfaces2D(parallelism, PREDICATE_SOLID, (ax, az, xx, zz, top, bottom, lastBottom, h) -> - { - int rx = bx + xx + ax; - int rz = bz + zz + az; - RNG g = rng.nextParallelRNG(rx).nextParallelRNG(rz); - IrisBiome b = complex.getTrueBiomeStream().get(rx, rz); - boolean surface = lastBottom == -1; - int floor = top + 1; - int ceiling = lastBottom == -1 ? floor < dimension.getFluidHeight() ? dimension.getFluidHeight() : blocks.getHeight() : lastBottom - 1; - int height = ceiling - floor; - - if(height < 2) - { - return; - } - - IrisDecorator deco = complex.getTerrainSurfaceDecoration().get(rx, rz); - - if(deco != null) - { - if(deco.isStacking()) - { - int stack = Math.min(g.i(deco.getStackMin(), deco.getStackMax()), height); - - for(int i = 0; i < stack; i++) - { - h.set(ax, i + floor, az, deco.getBlockData100(b, rng, rx - i, rz + i, data)); - } - - if(deco.getTopPalette().isNotEmpty()) - { - h.set(ax, stack + floor - 1, az, deco.getBlockDataForTop(b, rng, rx - stack, rz + stack, data)); - } - } - - else - { - h.set(ax, floor, az, deco.getBlockData100(b, rng, rx, rz, data)); - } - } - - if(!surface) - { - IrisDecorator cdeco = complex.getTerrainCeilingDecoration().get(rx, rz); - - if(cdeco != null) - { - if(cdeco.isStacking()) - { - int stack = Math.min(g.i(cdeco.getStackMin(), cdeco.getStackMax()), height); - - for(int i = 0; i < stack; i++) - { - h.set(ax, -i + ceiling, az, cdeco.getBlockData100(b, rng, rx - i, rz + i, data)); - } - - if(cdeco.getTopPalette().isNotEmpty()) - { - h.set(ax, -stack + ceiling - 1, az, cdeco.getBlockDataForTop(b, rng, rx - stack, rz + stack, data)); - } - } - - else - { - h.set(ax, ceiling, az, cdeco.getBlockData100(b, rng, rx, rz, data)); - } - } - } - }); - } -} diff --git a/src/main/java/com/volmit/iris/v2/TestGen.java b/src/main/java/com/volmit/iris/v2/TestGen.java index 7c17012bd..1107a9d53 100644 --- a/src/main/java/com/volmit/iris/v2/TestGen.java +++ b/src/main/java/com/volmit/iris/v2/TestGen.java @@ -24,8 +24,7 @@ public class TestGen { public static void gen(Player p) { - IrisTerrainGenerator tg = new IrisTerrainGenerator(1337, Iris.globaldata.getDimensionLoader().load("overworld"), Iris.globaldata); p.teleport(new Location(new WorldCreator("t/" + UUID.randomUUID().toString()) - .generator(EngineCompositeGenerator.newStudioWorld("overworld")).createWorld(), 0, 200, 0)); + .generator(EngineCompositeGenerator.newStudioWorld("flat")).createWorld(), 0, 70, 0)); } } diff --git a/src/main/java/com/volmit/iris/v2/generator/IrisComplex.java b/src/main/java/com/volmit/iris/v2/generator/IrisComplex.java index 8b6516685..ba52acd69 100644 --- a/src/main/java/com/volmit/iris/v2/generator/IrisComplex.java +++ b/src/main/java/com/volmit/iris/v2/generator/IrisComplex.java @@ -85,10 +85,11 @@ public class IrisComplex implements DataProvider public IrisComplex(Engine engine) { - int cacheSize = 8192; + int cacheSize = 1024; BlockData glass = B.getBlockData("GLASS"); this.rng = new RNG(engine.getWorld().getSeed()); - this.data = data; + this.data = engine.getData(); + double height = engine.getHeight(); fluidHeight = engine.getDimension().getFluidHeight(); generators = new KList<>(); RNG rng = new RNG(engine.getWorld().getSeed()); @@ -157,11 +158,10 @@ public class IrisComplex implements DataProvider trueBiomeStream = heightStream .convertAware2D((h, x, z) -> fixBiomeType(h, baseBiomeStream.get(x, z), - regionStream.get(x, z), x, z, fluidHeight)) - .cache2D(cacheSize); + regionStream.get(x, z), x, z, fluidHeight)); trueBiomeDerivativeStream = trueBiomeStream.convert(IrisBiome::getDerivative); heightFluidStream = heightStream.max(fluidHeight); - maxHeightStream = ProceduralStream.ofDouble((x, z) -> 255D); + maxHeightStream = ProceduralStream.ofDouble((x, z) -> height); terrainSurfaceDecoration = trueBiomeStream .convertAware2D((b, xx,zz) -> decorateFor(b, xx, zz, DecorationPart.NONE)); terrainCeilingDecoration = trueBiomeStream diff --git a/src/main/java/com/volmit/iris/v2/generator/actuator/IrisBiomeActuator.java b/src/main/java/com/volmit/iris/v2/generator/actuator/IrisBiomeActuator.java index b46b7279c..902bf2650 100644 --- a/src/main/java/com/volmit/iris/v2/generator/actuator/IrisBiomeActuator.java +++ b/src/main/java/com/volmit/iris/v2/generator/actuator/IrisBiomeActuator.java @@ -13,6 +13,22 @@ public class IrisBiomeActuator extends EngineAssignedActuator @Override public void actuate(int x, int z, Hunk output) { - getComplex().getMaxHeightStream().fill2DYLocked(output, x, z, getComplex().getTrueBiomeDerivativeStream(), getParallelism()); + output.compute2D(getParallelism(), (xx, yy, zz, h) -> { + int i,zf; + Biome v; + + for(int xf = 0; xf < h.getWidth(); xf++) + { + for(zf = 0; zf < h.getDepth(); zf++) + { + v = getComplex().getTrueBiomeDerivativeStream().get(xx+xf+x, zz+zf+z); + + for(i = 0; i < h.getHeight(); i++) + { + h.set(xx+xf, i, zz+zf, v); + } + } + } + }); } } diff --git a/src/main/java/com/volmit/iris/v2/generator/actuator/IrisTerrainActuator.java b/src/main/java/com/volmit/iris/v2/generator/actuator/IrisTerrainActuator.java index 4c6cf8ff0..87c5045a3 100644 --- a/src/main/java/com/volmit/iris/v2/generator/actuator/IrisTerrainActuator.java +++ b/src/main/java/com/volmit/iris/v2/generator/actuator/IrisTerrainActuator.java @@ -3,6 +3,7 @@ package com.volmit.iris.v2.generator.actuator; import com.volmit.iris.v2.scaffold.engine.Engine; import com.volmit.iris.v2.scaffold.engine.EngineAssignedActuator; import com.volmit.iris.v2.scaffold.hunk.Hunk; +import org.bukkit.block.Biome; import org.bukkit.block.data.BlockData; public class IrisTerrainActuator extends EngineAssignedActuator @@ -13,6 +14,22 @@ public class IrisTerrainActuator extends EngineAssignedActuator @Override public void actuate(int x, int z, Hunk output) { - getComplex().getHeightFluidStream().fill2D(output, x, z, getComplex().getTerrainStream(), getParallelism()); + output.compute2D(getParallelism(), (xx, yy, zz, h) -> { + int i,zf; + double he; + + for(int xf = 0; xf < h.getWidth(); xf++) + { + for(zf = 0; zf < h.getDepth(); zf++) + { + he = Math.min(h.getHeight(), getComplex().getHeightFluidStream().get(xx+xf+x, zz+zf+z)); + + for(i = 0; i < he; i++) + { + h.set(xx+xf, i, zz+zf, getComplex().getTerrainStream().get(xx+xf+x, i, zz+zf+z)); + } + } + } + }); } } diff --git a/src/main/java/com/volmit/iris/v2/scaffold/cache/Cache.java b/src/main/java/com/volmit/iris/v2/scaffold/cache/Cache.java new file mode 100644 index 000000000..a6583a46a --- /dev/null +++ b/src/main/java/com/volmit/iris/v2/scaffold/cache/Cache.java @@ -0,0 +1,23 @@ +package com.volmit.iris.v2.scaffold.cache; + +public interface Cache +{ + public int getId(); + + public V get(int x, int z); + + public static long key(int x, int z) + { + return (((long)x) << 32) | (z & 0xffffffffL); + } + + public static int keyX(long key) + { + return (int)(key >> 32); + } + + public static int keyZ(long key) + { + return (int)key; + } +} diff --git a/src/main/java/com/volmit/iris/v2/scaffold/cache/Multicache.java b/src/main/java/com/volmit/iris/v2/scaffold/cache/Multicache.java new file mode 100644 index 000000000..36591ec88 --- /dev/null +++ b/src/main/java/com/volmit/iris/v2/scaffold/cache/Multicache.java @@ -0,0 +1,10 @@ +package com.volmit.iris.v2.scaffold.cache; + +import com.volmit.iris.util.V; + +public interface Multicache +{ + public Cache getCache(int id); + + public Cache createCache(); +} diff --git a/src/main/java/com/volmit/iris/v2/scaffold/engine/Engine.java b/src/main/java/com/volmit/iris/v2/scaffold/engine/Engine.java index 96e4bdc86..241f15f58 100644 --- a/src/main/java/com/volmit/iris/v2/scaffold/engine/Engine.java +++ b/src/main/java/com/volmit/iris/v2/scaffold/engine/Engine.java @@ -22,6 +22,11 @@ public interface Engine public void generate(int x, int z, Hunk blocks, Hunk biomes); + public default int getHeight() + { + return getTarget().getHeight(); + } + public default IrisDataManager getData() { return getTarget().getData(); diff --git a/src/main/java/com/volmit/iris/v2/scaffold/engine/EngineCompositeGenerator.java b/src/main/java/com/volmit/iris/v2/scaffold/engine/EngineCompositeGenerator.java index f4e963274..5b0c8c86e 100644 --- a/src/main/java/com/volmit/iris/v2/scaffold/engine/EngineCompositeGenerator.java +++ b/src/main/java/com/volmit/iris/v2/scaffold/engine/EngineCompositeGenerator.java @@ -1,8 +1,11 @@ package com.volmit.iris.v2.scaffold.engine; +import com.mysql.jdbc.profiler.ProfilerEvent; import com.volmit.iris.Iris; import com.volmit.iris.manager.IrisDataManager; import com.volmit.iris.object.IrisDimension; +import com.volmit.iris.util.Form; +import com.volmit.iris.util.PrecisionStopwatch; import com.volmit.iris.v2.generator.IrisEngineCompound; import com.volmit.iris.v2.scaffold.hunk.Hunk; import org.bukkit.Location; @@ -106,7 +109,9 @@ public class EngineCompositeGenerator extends ChunkGenerator { ChunkData chunk = createChunkData(world); Hunk blocks = Hunk.view(chunk); Hunk biomes = Hunk.view(biome); + PrecisionStopwatch p = PrecisionStopwatch.start(); compound.generate(x * 16, z * 16, blocks, biomes); + System.out.println("Generated " + x + "," + z + " in " + Form.duration(p.getMilliseconds(), 0)); return chunk; } diff --git a/src/main/java/com/volmit/iris/v2/scaffold/stream/utility/CachedStream2D.java b/src/main/java/com/volmit/iris/v2/scaffold/stream/utility/CachedStream2D.java index 1b905273d..8204bfce5 100644 --- a/src/main/java/com/volmit/iris/v2/scaffold/stream/utility/CachedStream2D.java +++ b/src/main/java/com/volmit/iris/v2/scaffold/stream/utility/CachedStream2D.java @@ -2,20 +2,27 @@ package com.volmit.iris.v2.scaffold.stream.utility; import com.github.benmanes.caffeine.cache.Caffeine; import com.github.benmanes.caffeine.cache.LoadingCache; +import com.volmit.iris.v2.scaffold.cache.Cache; import com.volmit.iris.v2.scaffold.stream.BasicStream; import com.volmit.iris.v2.scaffold.stream.ProceduralStream; import com.volmit.iris.util.ChunkPosition; +import java.time.Duration; +import java.time.temporal.ChronoUnit; +import java.util.concurrent.TimeUnit; + public class CachedStream2D extends BasicStream implements ProceduralStream { private final ProceduralStream stream; - private final LoadingCache cache; + private final LoadingCache cache; public CachedStream2D(ProceduralStream stream, int size) { super(); this.stream = stream; - cache = Caffeine.newBuilder().maximumSize(size).build((b) -> stream.get(b.getX(), b.getZ())); + cache = Caffeine.newBuilder() + .maximumSize(size) + .build((b) -> stream.get(Cache.keyX(b), Cache.keyZ(b))); } @Override @@ -33,7 +40,7 @@ public class CachedStream2D extends BasicStream implements ProceduralStrea @Override public T get(double x, double z) { - return cache.get(new ChunkPosition((int) x, (int) z)); + return cache.get(Cache.key((int) x, (int) z)); } @Override