From 84506c65ad97f9ea72051d851c94e201649095d2 Mon Sep 17 00:00:00 2001 From: Daniel Mills Date: Fri, 30 Oct 2020 08:52:12 -0400 Subject: [PATCH] Fix biome issues --- .idea/workspace.xml | 32 +++++----- src/main/java/com/volmit/iris/v2/TestGen.java | 2 +- .../volmit/iris/v2/generator/IrisEngine.java | 13 +++- .../generator/actuator/IrisBiomeActuator.java | 24 ++++---- .../actuator/IrisDecorantActuator.java | 23 ++++--- .../actuator/IrisTerrainActuator.java | 61 ++++++++++--------- .../v2/scaffold/engine/EngineActuator.java | 48 +-------------- .../engine/EngineAssignedActuator.java | 19 +----- .../engine/EngineAssignedComponent.java | 18 ++++++ .../engine/EngineAssignedModifier.java | 21 +++++++ .../v2/scaffold/engine/EngineComponent.java | 55 +++++++++++++++++ .../engine/EngineCompositeGenerator.java | 6 +- .../v2/scaffold/engine/EngineModifier.java | 12 ++++ .../v2/scaffold/parallel/BurstExecutor.java | 14 +++++ .../iris/v2/scaffold/parallel/MultiBurst.java | 5 ++ 15 files changed, 214 insertions(+), 139 deletions(-) create mode 100644 src/main/java/com/volmit/iris/v2/scaffold/engine/EngineAssignedComponent.java create mode 100644 src/main/java/com/volmit/iris/v2/scaffold/engine/EngineAssignedModifier.java create mode 100644 src/main/java/com/volmit/iris/v2/scaffold/engine/EngineComponent.java create mode 100644 src/main/java/com/volmit/iris/v2/scaffold/engine/EngineModifier.java 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);