From 59eda04949c8913b7e85669b77d7edc537f2be6c Mon Sep 17 00:00:00 2001 From: Daniel Mills Date: Mon, 26 Oct 2020 22:33:07 -0400 Subject: [PATCH] Bitshifting streams --- .../v2/scaffold/layer/ProceduralStream.java | 42 +++++++++++++++++++ .../stream/CoordinateBitShiftLeftStream.java | 42 +++++++++++++++++++ .../stream/CoordinateBitShiftRightStream.java | 42 +++++++++++++++++++ .../gen/v2/scaffold/stream/Interpolated.java | 5 +++ 4 files changed, 131 insertions(+) create mode 100644 src/main/java/com/volmit/iris/gen/v2/scaffold/stream/CoordinateBitShiftLeftStream.java create mode 100644 src/main/java/com/volmit/iris/gen/v2/scaffold/stream/CoordinateBitShiftRightStream.java diff --git a/src/main/java/com/volmit/iris/gen/v2/scaffold/layer/ProceduralStream.java b/src/main/java/com/volmit/iris/gen/v2/scaffold/layer/ProceduralStream.java index 926796703..e3025b230 100644 --- a/src/main/java/com/volmit/iris/gen/v2/scaffold/layer/ProceduralStream.java +++ b/src/main/java/com/volmit/iris/gen/v2/scaffold/layer/ProceduralStream.java @@ -12,6 +12,8 @@ import com.volmit.iris.gen.v2.scaffold.stream.CachedConversionStream; import com.volmit.iris.gen.v2.scaffold.stream.CachedStream2D; import com.volmit.iris.gen.v2.scaffold.stream.ClampedStream; import com.volmit.iris.gen.v2.scaffold.stream.ConversionStream; +import com.volmit.iris.gen.v2.scaffold.stream.CoordinateBitShiftLeftStream; +import com.volmit.iris.gen.v2.scaffold.stream.CoordinateBitShiftRightStream; import com.volmit.iris.gen.v2.scaffold.stream.DividingStream; import com.volmit.iris.gen.v2.scaffold.stream.FittedStream; import com.volmit.iris.gen.v2.scaffold.stream.ForceDoubleStream; @@ -82,6 +84,46 @@ public interface ProceduralStream extends ProceduralLayer, Interpolated return new AddingStream<>(this, a); } + default ProceduralStream blockToChunkCoords() + { + return bitShiftCoordsRight(4); + } + + default ProceduralStream chunkToRegionCoords() + { + return bitShiftCoordsRight(5); + } + + default ProceduralStream blockToRegionCoords() + { + return blockToChunkCoords().chunkToRegionCoords(); + } + + default ProceduralStream regionToBlockCoords() + { + return regionToChunkCoords().chunkToBlockCoords(); + } + + default ProceduralStream regionToChunkCoords() + { + return bitShiftCoordsLeft(5); + } + + default ProceduralStream chunkToBlockCoords() + { + return bitShiftCoordsLeft(4); + } + + default ProceduralStream bitShiftCoordsRight(int a) + { + return new CoordinateBitShiftRightStream<>(this, a); + } + + default ProceduralStream bitShiftCoordsLeft(int a) + { + return new CoordinateBitShiftLeftStream<>(this, a); + } + default ProceduralStream max(Function3 a) { return new MaxingStream<>(this, a); diff --git a/src/main/java/com/volmit/iris/gen/v2/scaffold/stream/CoordinateBitShiftLeftStream.java b/src/main/java/com/volmit/iris/gen/v2/scaffold/stream/CoordinateBitShiftLeftStream.java new file mode 100644 index 000000000..dfbfcaecc --- /dev/null +++ b/src/main/java/com/volmit/iris/gen/v2/scaffold/stream/CoordinateBitShiftLeftStream.java @@ -0,0 +1,42 @@ +package com.volmit.iris.gen.v2.scaffold.stream; + +import com.volmit.iris.gen.v2.scaffold.layer.BasicLayer; +import com.volmit.iris.gen.v2.scaffold.layer.ProceduralStream; + +public class CoordinateBitShiftLeftStream extends BasicLayer implements ProceduralStream +{ + private final ProceduralStream stream; + private final int amount; + + public CoordinateBitShiftLeftStream(ProceduralStream stream, int amount) + { + super(); + this.stream = stream; + this.amount = amount; + } + + @Override + public double toDouble(T t) + { + return stream.toDouble(t); + } + + @Override + public T fromDouble(double d) + { + return stream.fromDouble(d); + } + + @Override + public T get(double x, double z) + { + return stream.get((int) x << amount, (int) z << amount); + } + + @Override + public T get(double x, double y, double z) + { + return stream.get((int) x << amount, (int) y << amount, (int) z << amount); + } + +} diff --git a/src/main/java/com/volmit/iris/gen/v2/scaffold/stream/CoordinateBitShiftRightStream.java b/src/main/java/com/volmit/iris/gen/v2/scaffold/stream/CoordinateBitShiftRightStream.java new file mode 100644 index 000000000..31e782272 --- /dev/null +++ b/src/main/java/com/volmit/iris/gen/v2/scaffold/stream/CoordinateBitShiftRightStream.java @@ -0,0 +1,42 @@ +package com.volmit.iris.gen.v2.scaffold.stream; + +import com.volmit.iris.gen.v2.scaffold.layer.BasicLayer; +import com.volmit.iris.gen.v2.scaffold.layer.ProceduralStream; + +public class CoordinateBitShiftRightStream extends BasicLayer implements ProceduralStream +{ + private final ProceduralStream stream; + private final int amount; + + public CoordinateBitShiftRightStream(ProceduralStream stream, int amount) + { + super(); + this.stream = stream; + this.amount = amount; + } + + @Override + public double toDouble(T t) + { + return stream.toDouble(t); + } + + @Override + public T fromDouble(double d) + { + return stream.fromDouble(d); + } + + @Override + public T get(double x, double z) + { + return stream.get((int) x >> amount, (int) z >> amount); + } + + @Override + public T get(double x, double y, double z) + { + return stream.get((int) x >> amount, (int) y >> amount, (int) z >> amount); + } + +} diff --git a/src/main/java/com/volmit/iris/gen/v2/scaffold/stream/Interpolated.java b/src/main/java/com/volmit/iris/gen/v2/scaffold/stream/Interpolated.java index ffae4feea..403eba5fd 100644 --- a/src/main/java/com/volmit/iris/gen/v2/scaffold/stream/Interpolated.java +++ b/src/main/java/com/volmit/iris/gen/v2/scaffold/stream/Interpolated.java @@ -2,10 +2,15 @@ package com.volmit.iris.gen.v2.scaffold.stream; import java.util.function.Function; +import org.bukkit.block.data.BlockData; + import com.volmit.iris.gen.v2.scaffold.layer.ProceduralStream; +import com.volmit.iris.util.RNG; public interface Interpolated { + public static final Interpolated BLOCK_DATA = of((t) -> 0D, (t) -> null); + public static final Interpolated RNG = of((t) -> 0D, (t) -> null); public static final Interpolated DOUBLE = of((t) -> t, (t) -> t); public static final Interpolated INT = of((t) -> Double.valueOf(t), (t) -> t.intValue()); public static final Interpolated LONG = of((t) -> Double.valueOf(t), (t) -> t.longValue());