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