diff --git a/.idea/workspace.xml b/.idea/workspace.xml
index e37e65579..77067ae2c 100644
--- a/.idea/workspace.xml
+++ b/.idea/workspace.xml
@@ -16,8 +16,8 @@
@@ -60,11 +60,11 @@
+
+
+
-
-
-
@@ -123,10 +123,10 @@
-
+
-
+
@@ -143,22 +143,22 @@
-
+
-
-
+
+
-
-
+
+
-
-
+
+
-
+
@@ -171,9 +171,9 @@
-
+
-
+
\ No newline at end of file
diff --git a/src/main/java/com/volmit/iris/v2/TestGen.java b/src/main/java/com/volmit/iris/v2/TestGen.java
index cc80c2e08..a27a830e1 100644
--- a/src/main/java/com/volmit/iris/v2/TestGen.java
+++ b/src/main/java/com/volmit/iris/v2/TestGen.java
@@ -25,6 +25,6 @@ public class TestGen
public static void gen(Player p)
{
p.teleport(new Location(new WorldCreator("t/" + UUID.randomUUID().toString())
- .generator(EngineCompositeGenerator.newStudioWorld("test")).createWorld(), 0, 70, 0));
+ .generator(EngineCompositeGenerator.newStudioWorld("overworld")).createWorld(), 0, 70, 0));
}
}
diff --git a/src/main/java/com/volmit/iris/v2/generator/IrisEngine.java b/src/main/java/com/volmit/iris/v2/generator/IrisEngine.java
index ebffbbedc..264d5d2be 100644
--- a/src/main/java/com/volmit/iris/v2/generator/IrisEngine.java
+++ b/src/main/java/com/volmit/iris/v2/generator/IrisEngine.java
@@ -5,6 +5,7 @@ import com.volmit.iris.v2.scaffold.engine.Engine;
import com.volmit.iris.v2.scaffold.engine.EngineFramework;
import com.volmit.iris.v2.scaffold.engine.EngineTarget;
import com.volmit.iris.v2.scaffold.hunk.Hunk;
+import com.volmit.iris.v2.scaffold.parallel.MultiBurst;
import lombok.Getter;
import lombok.Setter;
import org.bukkit.block.Biome;
@@ -31,8 +32,14 @@ public class IrisEngine implements Engine
@Override
public void generate(int x, int z, Hunk blocks, Hunk biomes) {
- getFramework().getTerrainActuator().actuate(x, z, blocks);
- getFramework().getDecorantActuator().actuate(x, z, blocks);
- getFramework().getBiomeActuator().actuate(x, z, biomes);
+ MultiBurst.burst.burst(
+ () -> blocks.compute2D(getParallelism(), (xx,yy,zz, b) -> {
+ getFramework().getTerrainActuator().actuate(x+xx, z+zz, b);
+ getFramework().getDecorantActuator().actuate(x+xx, z+zz, b);
+ }),
+ ()->biomes.compute2D(getParallelism(), (xx,yy,zz,b) -> {
+ getFramework().getBiomeActuator().actuate(x+xx, z+zz, b);
+ })
+ );
}
}
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 3bdb05181..46f5ecfba 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
@@ -12,23 +12,21 @@ public class IrisBiomeActuator extends EngineAssignedActuator
}
@Override
- public void onActuate(int x, int z, Hunk output) {
- output.compute2D(getParallelism(), (xx, yy, zz, h) -> {
- int i,zf;
- Biome v;
+ public void onActuate(int x, int z, Hunk h) {
+ int i,zf;
+ Biome v;
- for(int xf = 0; xf < h.getWidth(); xf++)
+ for(int xf = 0; xf < h.getWidth(); xf++)
+ {
+ for(zf = 0; zf < h.getDepth(); zf++)
{
- for(zf = 0; zf < h.getDepth(); zf++)
- {
- v = getComplex().getTrueBiomeDerivativeStream().get(xx+xf+x, zz+zf+z);
+ v = getComplex().getTrueBiomeDerivativeStream().get(xf+x, zf+z);
- for(i = 0; i < h.getHeight(); i++)
- {
- h.set(xx+xf, i, zz+zf, v);
- }
+ for(i = 0; i < h.getHeight(); i++)
+ {
+ h.set(xf, i, zf, v);
}
}
- });
+ }
}
}
diff --git a/src/main/java/com/volmit/iris/v2/generator/actuator/IrisDecorantActuator.java b/src/main/java/com/volmit/iris/v2/generator/actuator/IrisDecorantActuator.java
index 1b7a09626..4f760a3ae 100644
--- a/src/main/java/com/volmit/iris/v2/generator/actuator/IrisDecorantActuator.java
+++ b/src/main/java/com/volmit/iris/v2/generator/actuator/IrisDecorantActuator.java
@@ -41,22 +41,20 @@ public class IrisDecorantActuator extends EngineAssignedActuator
if(shouldRayDecorate())
{
- output.iterateSurfaces2D(getParallelism(), PREDICATE_SOLID, (hunkRelativeX, hunkRelativeZ, hunkOffsetX, hunkOffsetZ, top, bottom, lastBottom, h) -> decorateLayer(x, z, hunkRelativeX, hunkRelativeZ, hunkOffsetX, hunkOffsetZ,top,bottom,lastBottom,h));
+ output.iterateSurfaces2D(0, PREDICATE_SOLID, (hunkRelativeX, hunkRelativeZ, hunkOffsetX, hunkOffsetZ, top, bottom, lastBottom, h) -> decorateLayer(x, z, hunkRelativeX, hunkRelativeZ, hunkOffsetX, hunkOffsetZ,top,bottom,lastBottom,h));
}
else
{
- output.compute2D(getParallelism(), (xx, yy, zz, h) -> {
- int he;
- for(int i = 0; i < h.getWidth(); i++)
+ int he;
+ for(int i = 0; i < output.getWidth(); i++)
+ {
+ for(int j = 0; j < output.getDepth(); j++)
{
- for(int j = 0; j < h.getDepth(); j++)
- {
- he = getComplex().getHeightFluidStream().get(x + xx+i, z + zz+j).intValue();
- decorateLayer(x, z, i, j, xx, zz, he, 0, getEngine().getHeight(), h);
- }
+ he = getComplex().getHeightFluidStream().get(x + i, z + j).intValue();
+ decorateLayer(x, z, i, j, 0, 0, he, 0, getEngine().getHeight(), output);
}
- });
+ }
}
}
@@ -82,6 +80,11 @@ public class IrisDecorantActuator extends EngineAssignedActuator
return;
}
+ if(b.isShore() && floor <= getDimension().getFluidHeight())
+ {
+ return;
+ }
+
IrisDecorator deco = getComplex().getTerrainSurfaceDecoration().get(realX, realZ);
if(deco != null)
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 5a989b03d..f6a5f8023 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
@@ -22,47 +22,48 @@ public class IrisTerrainActuator extends EngineAssignedActuator
}
@Override
- public void onActuate(int x, int z, Hunk output) {
- output.compute2D(getParallelism(), (xx, yy, zz, h) -> {
- int i,zf, depth, atDepth;
- double he;
- BlockData block;
- IrisBiome biome;
+ public void onActuate(int x, int z, Hunk h) {
+ int i,zf, depth, realX, realZ,hf, he;
+ IrisBiome biome;
+ KList blocks;
- for(int xf = 0; xf < h.getWidth(); xf++)
+ for(int xf = 0; xf < h.getWidth(); xf++)
+ {
+ for(zf = 0; zf < h.getDepth(); zf++)
{
- for(zf = 0; zf < h.getDepth(); zf++)
+ realX = xf + x;
+ realZ = zf + z;
+ he = (int) Math.round(Math.min(h.getHeight(), getComplex().getHeightStream().get(realX, realZ)));
+ hf = (int) Math.round(Math.max(Math.min(h.getHeight(), getDimension().getFluidHeight()), he));
+ biome = getComplex().getTrueBiomeStream().get(realX, realZ);
+ blocks = null;
+
+ for(i = hf; i >= 0; i--)
{
- he = Math.min(h.getHeight(), getComplex().getHeightFluidStream().get(xx+xf+x, zz+zf+z));
- biome = getComplex().getTrueBiomeStream().get(xx+xf+x, zz+zf+z);
- KList blocks = biome.generateLayers(xx+xf+x, zz+zf+z, rng, (int)he, (int)he, getData());
-
- for(i = 0; i < he; i++)
+ if(i > he && i <= hf)
{
- depth = ((int)he) - i;
+ h.set(xf, i, zf, getComplex().getFluidStream().get(realX, +realZ));
+ continue;
+ }
- if(i > he && i <= he)
+ if(i <= he)
+ {
+ depth = he - i;
+ if(blocks == null)
{
- h.set(xx+xf, i, zz+zf, getComplex().getFluidStream().get(xx+xf+x, zz+zf+z));
+ blocks = biome.generateLayers(realX, realZ, rng, (int)he, (int)he, getData());
+ }
+
+ if(blocks.hasIndex(depth))
+ {
+ h.set(xf, i, zf, blocks.get(depth));
continue;
}
- if(depth < -1)
- {
- h.set(xx+xf, i, zz+zf, AIR);
- continue;
- }
-
- if(blocks.hasIndex(blocks.last() - ((int)he - depth)))
- {
- h.set(xx+xf, i, zz+zf, blocks.get(blocks.last() - ((int)he - depth)));
- continue;
- }
-
- h.set(xx+xf, i, zz+zf, getComplex().getRockStream().get(xx+xf+x, zz+zf+z));
+ h.set(xf, i, zf, getComplex().getRockStream().get(realX, realZ));
}
}
}
- });
+ }
}
}
diff --git a/src/main/java/com/volmit/iris/v2/scaffold/engine/EngineActuator.java b/src/main/java/com/volmit/iris/v2/scaffold/engine/EngineActuator.java
index 5fd26712e..ffeeb320b 100644
--- a/src/main/java/com/volmit/iris/v2/scaffold/engine/EngineActuator.java
+++ b/src/main/java/com/volmit/iris/v2/scaffold/engine/EngineActuator.java
@@ -7,53 +7,7 @@ import com.volmit.iris.v2.scaffold.parallax.ParallaxAccess;
import com.volmit.iris.manager.IrisDataManager;
import com.volmit.iris.object.IrisDimension;
-public interface EngineActuator
+public interface EngineActuator extends EngineComponent
{
- public Engine getEngine();
-
- public RollingSequence getMetrics();
-
- public String getName();
-
- public default IrisDataManager getData()
- {
- return getEngine().getData();
- }
-
- public default ParallaxAccess getParallax()
- {
- return getEngine().getParallax();
- }
-
- public default EngineTarget getTarget()
- {
- return getEngine().getTarget();
- }
-
- public default IrisDimension getDimension()
- {
- return getEngine().getDimension();
- }
-
- public default long getSeed()
- {
- return getTarget().getWorld().getSeed();
- }
-
- public default EngineFramework getFramework()
- {
- return getEngine().getFramework();
- }
-
- public default int getParallelism()
- {
- return getEngine().getParallelism();
- }
-
- public default IrisComplex getComplex()
- {
- return getFramework().getComplex();
- }
-
public void actuate(int x, int z, Hunk output);
}
diff --git a/src/main/java/com/volmit/iris/v2/scaffold/engine/EngineAssignedActuator.java b/src/main/java/com/volmit/iris/v2/scaffold/engine/EngineAssignedActuator.java
index 80aac395c..335e767af 100644
--- a/src/main/java/com/volmit/iris/v2/scaffold/engine/EngineAssignedActuator.java
+++ b/src/main/java/com/volmit/iris/v2/scaffold/engine/EngineAssignedActuator.java
@@ -7,32 +7,17 @@ import lombok.AllArgsConstructor;
import lombok.Getter;
import org.bukkit.block.data.BlockData;
-public abstract class EngineAssignedActuator implements EngineActuator
+public abstract class EngineAssignedActuator extends EngineAssignedComponent implements EngineActuator
{
-
- @Getter
- private final Engine engine;
-
- @Getter
- private final RollingSequence metrics;
-
- @Getter
- private final String name;
-
public EngineAssignedActuator(Engine engine, String name)
{
- this.engine = engine;
- this.name = name;
- metrics = new RollingSequence(16);
+ super(engine, name);
}
public abstract void onActuate(int x, int z, Hunk output);
@Override
public void actuate(int x, int z, Hunk output) {
- PrecisionStopwatch p = PrecisionStopwatch.start();
onActuate(x, z, output);
- p.end();
- getMetrics().put(p.getMilliseconds());
}
}
diff --git a/src/main/java/com/volmit/iris/v2/scaffold/engine/EngineAssignedComponent.java b/src/main/java/com/volmit/iris/v2/scaffold/engine/EngineAssignedComponent.java
new file mode 100644
index 000000000..8d20f56a4
--- /dev/null
+++ b/src/main/java/com/volmit/iris/v2/scaffold/engine/EngineAssignedComponent.java
@@ -0,0 +1,18 @@
+package com.volmit.iris.v2.scaffold.engine;
+
+import com.volmit.iris.util.RollingSequence;
+import lombok.Data;
+
+@Data
+public class EngineAssignedComponent implements EngineComponent {
+ private final Engine engine;
+ private final RollingSequence metrics;
+ private final String name;
+
+ public EngineAssignedComponent(Engine engine, String name)
+ {
+ this.engine = engine;
+ this.metrics = new RollingSequence(16);
+ this.name = name;
+ }
+}
diff --git a/src/main/java/com/volmit/iris/v2/scaffold/engine/EngineAssignedModifier.java b/src/main/java/com/volmit/iris/v2/scaffold/engine/EngineAssignedModifier.java
new file mode 100644
index 000000000..fe3bf30ee
--- /dev/null
+++ b/src/main/java/com/volmit/iris/v2/scaffold/engine/EngineAssignedModifier.java
@@ -0,0 +1,21 @@
+package com.volmit.iris.v2.scaffold.engine;
+
+import com.volmit.iris.util.PrecisionStopwatch;
+import com.volmit.iris.util.RollingSequence;
+import com.volmit.iris.v2.scaffold.hunk.Hunk;
+import lombok.Getter;
+
+public abstract class EngineAssignedModifier extends EngineAssignedComponent implements EngineModifier
+{
+ public EngineAssignedModifier(Engine engine, String name)
+ {
+ super(engine, name);
+ }
+
+ public abstract void onModify(Hunk output);
+
+ @Override
+ public void modify(Hunk output) {
+ onModify(output);
+ }
+}
diff --git a/src/main/java/com/volmit/iris/v2/scaffold/engine/EngineComponent.java b/src/main/java/com/volmit/iris/v2/scaffold/engine/EngineComponent.java
new file mode 100644
index 000000000..91721ab1c
--- /dev/null
+++ b/src/main/java/com/volmit/iris/v2/scaffold/engine/EngineComponent.java
@@ -0,0 +1,55 @@
+package com.volmit.iris.v2.scaffold.engine;
+
+import com.volmit.iris.manager.IrisDataManager;
+import com.volmit.iris.object.IrisDimension;
+import com.volmit.iris.util.RollingSequence;
+import com.volmit.iris.v2.generator.IrisComplex;
+import com.volmit.iris.v2.scaffold.parallax.ParallaxAccess;
+
+public interface EngineComponent {
+ public Engine getEngine();
+
+ public RollingSequence getMetrics();
+
+ public String getName();
+
+ public default IrisDataManager getData()
+ {
+ return getEngine().getData();
+ }
+
+ public default ParallaxAccess getParallax()
+ {
+ return getEngine().getParallax();
+ }
+
+ public default EngineTarget getTarget()
+ {
+ return getEngine().getTarget();
+ }
+
+ public default IrisDimension getDimension()
+ {
+ return getEngine().getDimension();
+ }
+
+ public default long getSeed()
+ {
+ return getTarget().getWorld().getSeed();
+ }
+
+ public default EngineFramework getFramework()
+ {
+ return getEngine().getFramework();
+ }
+
+ public default int getParallelism()
+ {
+ return getEngine().getParallelism();
+ }
+
+ public default IrisComplex getComplex()
+ {
+ return getFramework().getComplex();
+ }
+}
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 d60207dbf..6fa687dee 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
@@ -5,6 +5,7 @@ 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.M;
import com.volmit.iris.util.PrecisionStopwatch;
import com.volmit.iris.v2.generator.IrisEngineCompound;
import com.volmit.iris.v2.scaffold.hunk.Hunk;
@@ -41,6 +42,7 @@ public class EngineCompositeGenerator extends ChunkGenerator implements Hotloada
public void hotload()
{
+ Iris.globaldata.dump();
initialized.lazySet(false);
}
@@ -116,9 +118,9 @@ public class EngineCompositeGenerator extends ChunkGenerator implements Hotloada
ChunkData chunk = createChunkData(world);
Hunk blocks = Hunk.view(chunk);
Hunk biomes = Hunk.view(biome);
- PrecisionStopwatch p = PrecisionStopwatch.start();
+ long m = M.ms();
compound.generate(x * 16, z * 16, blocks, biomes);
- System.out.println("Generated " + x + "," + z + " in " + Form.duration(p.getMilliseconds(), 0) + " (Terrain: " + Form.duration(compound.getEngine(0).getFramework().getTerrainActuator().getMetrics().getAverage(), 2) + ", Biome: " + Form.duration(compound.getEngine(0).getFramework().getBiomeActuator().getMetrics().getAverage(), 2) + ", Decorant: " + Form.duration(compound.getEngine(0).getFramework().getDecorantActuator().getMetrics().getAverage(), 2) + ")");
+ System.out.println("Generated " + x + "," + z + " in " + Form.duration(M.ms() - m, 0));
return chunk;
}
diff --git a/src/main/java/com/volmit/iris/v2/scaffold/engine/EngineModifier.java b/src/main/java/com/volmit/iris/v2/scaffold/engine/EngineModifier.java
new file mode 100644
index 000000000..3d2e243bc
--- /dev/null
+++ b/src/main/java/com/volmit/iris/v2/scaffold/engine/EngineModifier.java
@@ -0,0 +1,12 @@
+package com.volmit.iris.v2.scaffold.engine;
+
+import com.volmit.iris.manager.IrisDataManager;
+import com.volmit.iris.object.IrisDimension;
+import com.volmit.iris.util.RollingSequence;
+import com.volmit.iris.v2.generator.IrisComplex;
+import com.volmit.iris.v2.scaffold.hunk.Hunk;
+import com.volmit.iris.v2.scaffold.parallax.ParallaxAccess;
+
+public interface EngineModifier extends EngineComponent {
+ public void modify(Hunk t);
+}
diff --git a/src/main/java/com/volmit/iris/v2/scaffold/parallel/BurstExecutor.java b/src/main/java/com/volmit/iris/v2/scaffold/parallel/BurstExecutor.java
index 434222524..3023a92b8 100644
--- a/src/main/java/com/volmit/iris/v2/scaffold/parallel/BurstExecutor.java
+++ b/src/main/java/com/volmit/iris/v2/scaffold/parallel/BurstExecutor.java
@@ -27,6 +27,20 @@ public class BurstExecutor
}
}
+ public BurstExecutor queue(Runnable[] r)
+ {
+ synchronized(futures)
+ {
+ for(Runnable i : r)
+ {
+ CompletableFuture c = CompletableFuture.runAsync(i, executor);
+ futures.add(c);
+ }
+ }
+
+ return this;
+ }
+
public void complete()
{
synchronized(futures)
diff --git a/src/main/java/com/volmit/iris/v2/scaffold/parallel/MultiBurst.java b/src/main/java/com/volmit/iris/v2/scaffold/parallel/MultiBurst.java
index afc619274..7b26468d1 100644
--- a/src/main/java/com/volmit/iris/v2/scaffold/parallel/MultiBurst.java
+++ b/src/main/java/com/volmit/iris/v2/scaffold/parallel/MultiBurst.java
@@ -13,6 +13,11 @@ public class MultiBurst
service = Executors.newWorkStealingPool(tc);
}
+ public void burst(Runnable... r)
+ {
+ burst(r.length).queue(r).complete();
+ }
+
public BurstExecutor burst(int estimate)
{
return new BurstExecutor(service, estimate);