mirror of
https://github.com/VolmitSoftware/Iris.git
synced 2025-07-20 03:04:08 +00:00
Hunks Galore
This commit is contained in:
parent
4a11ac917b
commit
0dd45cdfa2
@ -1,171 +0,0 @@
|
|||||||
package com.volmit.iris.gen.v2.scaffold;
|
|
||||||
|
|
||||||
public class HunkView<T> implements Hunk<T>
|
|
||||||
{
|
|
||||||
private final int ox;
|
|
||||||
private final int oy;
|
|
||||||
private final int oz;
|
|
||||||
private final int w;
|
|
||||||
private final int h;
|
|
||||||
private final int d;
|
|
||||||
private final Hunk<T> src;
|
|
||||||
|
|
||||||
public HunkView(Hunk<T> src)
|
|
||||||
{
|
|
||||||
this(src, src.getWidth(), src.getHeight(), src.getDepth());
|
|
||||||
}
|
|
||||||
|
|
||||||
public HunkView(Hunk<T> src, int w, int h, int d)
|
|
||||||
{
|
|
||||||
this(src, w, h, d, 0, 0, 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
public HunkView(Hunk<T> src, int w, int h, int d, int ox, int oy, int oz)
|
|
||||||
{
|
|
||||||
this.src = src;
|
|
||||||
this.w = w;
|
|
||||||
this.h = h;
|
|
||||||
this.d = d;
|
|
||||||
this.ox = ox;
|
|
||||||
this.oy = oy;
|
|
||||||
this.oz = oz;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public Hunk<T> croppedView(int x1, int y1, int z1, int x2, int y2, int z2)
|
|
||||||
{
|
|
||||||
return new HunkView<T>(this, x2 - x1, y2 - y1, z2 - z1, x1 + ox, y1 + oy, z1 + oz);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public ArrayHunk<T> crop(int x1, int y1, int z1, int x2, int y2, int z2)
|
|
||||||
{
|
|
||||||
ArrayHunk<T> h = new ArrayHunk<T>(x2 - x1, y2 - y1, z2 - z1);
|
|
||||||
|
|
||||||
for(int i = x1; i < x2; i++)
|
|
||||||
{
|
|
||||||
for(int j = y1; j < y2; j++)
|
|
||||||
{
|
|
||||||
for(int k = z1; k < z2; k++)
|
|
||||||
{
|
|
||||||
h.set(i - x1, j - y1, k - z1, get(i, j, k));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return h;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void insert(int offX, int offY, int offZ, Hunk<T> hunk, boolean invertY)
|
|
||||||
{
|
|
||||||
if(offX + (hunk.getWidth() - 1) >= w || offY + (hunk.getHeight() - 1) >= h || offZ + (hunk.getDepth() - 1) >= d || offX < 0 || offY < 0 || offZ < 0)
|
|
||||||
{
|
|
||||||
throw new RuntimeException("Cannot insert hunk " + hunk.getWidth() + "," + hunk.getHeight() + "," + hunk.getDepth() + " into Hunk " + w + "," + h + "," + d + " with offset " + offZ + "," + offY + "," + offZ);
|
|
||||||
}
|
|
||||||
|
|
||||||
for(int i = offX; i < offX + hunk.getWidth(); i++)
|
|
||||||
{
|
|
||||||
for(int j = offY; j < offY + hunk.getHeight(); j++)
|
|
||||||
{
|
|
||||||
for(int k = offZ; k < offZ + hunk.getDepth(); k++)
|
|
||||||
{
|
|
||||||
set(i, j, k, hunk.get(i - offX, j - offY, k - offZ));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void set(int x1, int y1, int z1, int x2, int y2, int z2, T t)
|
|
||||||
{
|
|
||||||
if(x1 >= w || y1 >= h || z1 >= d || x2 >= w || y2 >= h || z2 >= d)
|
|
||||||
{
|
|
||||||
throw new RuntimeException(x1 + "-" + x2 + " " + y1 + "-" + y2 + " " + z1 + "-" + z2 + " is out of the bounds 0,0,0 - " + (w - 1) + "," + (h - 1) + "," + (d - 1));
|
|
||||||
}
|
|
||||||
|
|
||||||
src.set(x1, y1, z1, x2, y2, z2, t);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void set(int x, int y, int z, T t)
|
|
||||||
{
|
|
||||||
if(x >= w || y >= h || z >= d)
|
|
||||||
{
|
|
||||||
throw new RuntimeException(x + " " + y + " " + z + " is out of the bounds 0,0,0 - " + (w - 1) + "," + (h - 1) + "," + (d - 1));
|
|
||||||
}
|
|
||||||
|
|
||||||
src.set(x + ox, y + oy, z + oz, t);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public T get(int x, int y, int z)
|
|
||||||
{
|
|
||||||
if(x >= w || y >= h || z >= d)
|
|
||||||
{
|
|
||||||
throw new RuntimeException(x + " " + y + " " + z + " is out of the bounds 0,0,0 - " + (w - 1) + "," + (h - 1) + "," + (d - 1));
|
|
||||||
}
|
|
||||||
|
|
||||||
return src.get(x + ox, y + oy, z + oz);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public T getClosest(int x, int y, int z)
|
|
||||||
{
|
|
||||||
return src.get(x >= w ? w + ox - 1 : x + ox, y >= h ? h + oy - 1 : y + oy, z >= d ? d + oz - 1 : z + oz);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void fill(T t)
|
|
||||||
{
|
|
||||||
set(0 + ox, 0 + oy, 0 + oz, w - 1 + ox, h - 1 + oy, d - 1 + oz, t);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public int getWidth()
|
|
||||||
{
|
|
||||||
return w;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public int getDepth()
|
|
||||||
{
|
|
||||||
return d;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public int getHeight()
|
|
||||||
{
|
|
||||||
return h;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public Hunk<T> getFace(HunkFace f)
|
|
||||||
{
|
|
||||||
switch(f)
|
|
||||||
{
|
|
||||||
case BOTTOM:
|
|
||||||
return croppedView(0, 0, 0, getWidth() - 1, 0, getDepth() - 1);
|
|
||||||
case EAST:
|
|
||||||
return croppedView(getWidth() - 1, 0, 0, getWidth() - 1, getHeight() - 1, getDepth() - 1);
|
|
||||||
case NORTH:
|
|
||||||
return croppedView(0, 0, 0, getWidth() - 1, getHeight() - 1, 0);
|
|
||||||
case SOUTH:
|
|
||||||
return croppedView(0, 0, 0, 0, getHeight() - 1, getDepth() - 1);
|
|
||||||
case TOP:
|
|
||||||
return croppedView(0, getHeight() - 1, 0, getWidth() - 1, getHeight() - 1, getDepth() - 1);
|
|
||||||
case WEST:
|
|
||||||
return croppedView(0, 0, getDepth() - 1, getWidth() - 1, getHeight() - 1, getDepth() - 1);
|
|
||||||
default:
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public Hunk<T> getSource()
|
|
||||||
{
|
|
||||||
return src;
|
|
||||||
}
|
|
||||||
}
|
|
@ -0,0 +1,43 @@
|
|||||||
|
package com.volmit.iris.gen.v2.scaffold.hunk;
|
||||||
|
|
||||||
|
import org.bouncycastle.util.Arrays;
|
||||||
|
|
||||||
|
import lombok.Data;
|
||||||
|
import lombok.EqualsAndHashCode;
|
||||||
|
|
||||||
|
@Data
|
||||||
|
@EqualsAndHashCode(callSuper = false)
|
||||||
|
public class ArrayHunk<T> extends StorageHunk<T> implements Hunk<T>
|
||||||
|
{
|
||||||
|
private final T[] data;
|
||||||
|
|
||||||
|
@SuppressWarnings("unchecked")
|
||||||
|
protected ArrayHunk(int w, int h, int d)
|
||||||
|
{
|
||||||
|
super(w, h, d);
|
||||||
|
data = (T[]) new Object[w * h * d];
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setRaw(int x, int y, int z, T t)
|
||||||
|
{
|
||||||
|
data[index(x, y, z)] = t;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public T getRaw(int x, int y, int z)
|
||||||
|
{
|
||||||
|
return data[index(x, y, z)];
|
||||||
|
}
|
||||||
|
|
||||||
|
private int index(int x, int y, int z)
|
||||||
|
{
|
||||||
|
return (z * getWidth() * getHeight()) + (y * getWidth()) + x;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void fill(T t)
|
||||||
|
{
|
||||||
|
Arrays.fill(data, t);
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,36 @@
|
|||||||
|
package com.volmit.iris.gen.v2.scaffold.hunk;
|
||||||
|
|
||||||
|
import com.google.common.util.concurrent.AtomicDoubleArray;
|
||||||
|
|
||||||
|
import lombok.Data;
|
||||||
|
import lombok.EqualsAndHashCode;
|
||||||
|
|
||||||
|
@Data
|
||||||
|
@EqualsAndHashCode(callSuper = false)
|
||||||
|
public class AtomicDoubleHunk extends StorageHunk<Double> implements Hunk<Double>
|
||||||
|
{
|
||||||
|
private final AtomicDoubleArray data;
|
||||||
|
|
||||||
|
protected AtomicDoubleHunk(int w, int h, int d)
|
||||||
|
{
|
||||||
|
super(w, h, d);
|
||||||
|
data = new AtomicDoubleArray(w * h * d);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setRaw(int x, int y, int z, Double t)
|
||||||
|
{
|
||||||
|
data.set(index(x, y, z), t);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Double getRaw(int x, int y, int z)
|
||||||
|
{
|
||||||
|
return data.get(index(x, y, z));
|
||||||
|
}
|
||||||
|
|
||||||
|
private int index(int x, int y, int z)
|
||||||
|
{
|
||||||
|
return (z * getWidth() * getHeight()) + (y * getWidth()) + x;
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,36 @@
|
|||||||
|
package com.volmit.iris.gen.v2.scaffold.hunk;
|
||||||
|
|
||||||
|
import java.util.concurrent.atomic.AtomicReferenceArray;
|
||||||
|
|
||||||
|
import lombok.Data;
|
||||||
|
import lombok.EqualsAndHashCode;
|
||||||
|
|
||||||
|
@Data
|
||||||
|
@EqualsAndHashCode(callSuper = false)
|
||||||
|
public class AtomicHunk<T> extends StorageHunk<T> implements Hunk<T>
|
||||||
|
{
|
||||||
|
private final AtomicReferenceArray<T> data;
|
||||||
|
|
||||||
|
protected AtomicHunk(int w, int h, int d)
|
||||||
|
{
|
||||||
|
super(w, h, d);
|
||||||
|
data = new AtomicReferenceArray<T>(w * h * d);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setRaw(int x, int y, int z, T t)
|
||||||
|
{
|
||||||
|
data.set(index(x, y, z), t);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public T getRaw(int x, int y, int z)
|
||||||
|
{
|
||||||
|
return data.get(index(x, y, z));
|
||||||
|
}
|
||||||
|
|
||||||
|
private int index(int x, int y, int z)
|
||||||
|
{
|
||||||
|
return (z * getWidth() * getHeight()) + (y * getWidth()) + x;
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,36 @@
|
|||||||
|
package com.volmit.iris.gen.v2.scaffold.hunk;
|
||||||
|
|
||||||
|
import java.util.concurrent.atomic.AtomicIntegerArray;
|
||||||
|
|
||||||
|
import lombok.Data;
|
||||||
|
import lombok.EqualsAndHashCode;
|
||||||
|
|
||||||
|
@Data
|
||||||
|
@EqualsAndHashCode(callSuper = false)
|
||||||
|
public class AtomicIntegerHunk extends StorageHunk<Integer> implements Hunk<Integer>
|
||||||
|
{
|
||||||
|
private final AtomicIntegerArray data;
|
||||||
|
|
||||||
|
protected AtomicIntegerHunk(int w, int h, int d)
|
||||||
|
{
|
||||||
|
super(w, h, d);
|
||||||
|
data = new AtomicIntegerArray(w * h * d);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setRaw(int x, int y, int z, Integer t)
|
||||||
|
{
|
||||||
|
data.set(index(x, y, z), t);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Integer getRaw(int x, int y, int z)
|
||||||
|
{
|
||||||
|
return data.get(index(x, y, z));
|
||||||
|
}
|
||||||
|
|
||||||
|
private int index(int x, int y, int z)
|
||||||
|
{
|
||||||
|
return (z * getWidth() * getHeight()) + (y * getWidth()) + x;
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,36 @@
|
|||||||
|
package com.volmit.iris.gen.v2.scaffold.hunk;
|
||||||
|
|
||||||
|
import java.util.concurrent.atomic.AtomicLongArray;
|
||||||
|
|
||||||
|
import lombok.Data;
|
||||||
|
import lombok.EqualsAndHashCode;
|
||||||
|
|
||||||
|
@Data
|
||||||
|
@EqualsAndHashCode(callSuper = false)
|
||||||
|
public class AtomicLongHunk extends StorageHunk<Long> implements Hunk<Long>
|
||||||
|
{
|
||||||
|
private final AtomicLongArray data;
|
||||||
|
|
||||||
|
protected AtomicLongHunk(int w, int h, int d)
|
||||||
|
{
|
||||||
|
super(w, h, d);
|
||||||
|
data = new AtomicLongArray(w * h * d);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setRaw(int x, int y, int z, Long t)
|
||||||
|
{
|
||||||
|
data.set(index(x, y, z), t);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Long getRaw(int x, int y, int z)
|
||||||
|
{
|
||||||
|
return data.get(index(x, y, z));
|
||||||
|
}
|
||||||
|
|
||||||
|
private int index(int x, int y, int z)
|
||||||
|
{
|
||||||
|
return (z * getWidth() * getHeight()) + (y * getWidth()) + x;
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,44 @@
|
|||||||
|
package com.volmit.iris.gen.v2.scaffold.hunk;
|
||||||
|
|
||||||
|
import org.bukkit.block.Biome;
|
||||||
|
import org.bukkit.generator.ChunkGenerator.BiomeGrid;
|
||||||
|
|
||||||
|
public class BiomeGridHunkView implements Hunk<Biome>
|
||||||
|
{
|
||||||
|
private final BiomeGrid chunk;
|
||||||
|
|
||||||
|
public BiomeGridHunkView(BiomeGrid chunk)
|
||||||
|
{
|
||||||
|
this.chunk = chunk;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int getWidth()
|
||||||
|
{
|
||||||
|
return 16;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int getDepth()
|
||||||
|
{
|
||||||
|
return 16;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int getHeight()
|
||||||
|
{
|
||||||
|
return 256;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setRaw(int x, int y, int z, Biome t)
|
||||||
|
{
|
||||||
|
chunk.setBiome(x, y, z, t);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Biome getRaw(int x, int y, int z)
|
||||||
|
{
|
||||||
|
return chunk.getBiome(x, y, z);
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,51 @@
|
|||||||
|
package com.volmit.iris.gen.v2.scaffold.hunk;
|
||||||
|
|
||||||
|
import org.bukkit.block.data.BlockData;
|
||||||
|
import org.bukkit.generator.ChunkGenerator.ChunkData;
|
||||||
|
|
||||||
|
public class ChunkDataHunkView implements Hunk<BlockData>
|
||||||
|
{
|
||||||
|
private final ChunkData chunk;
|
||||||
|
|
||||||
|
public ChunkDataHunkView(ChunkData chunk)
|
||||||
|
{
|
||||||
|
this.chunk = chunk;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int getWidth()
|
||||||
|
{
|
||||||
|
return 16;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int getDepth()
|
||||||
|
{
|
||||||
|
return 16;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int getHeight()
|
||||||
|
{
|
||||||
|
return chunk.getMaxHeight();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void set(int x1, int y1, int z1, int x2, int y2, int z2, BlockData t)
|
||||||
|
{
|
||||||
|
enforceBounds(x1, y1, z1, x2 - x1, y2 - y1, z2 - z1);
|
||||||
|
chunk.setRegion(x1, y1, z1, x2, y2, z2, t);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setRaw(int x, int y, int z, BlockData t)
|
||||||
|
{
|
||||||
|
chunk.setBlock(x, y, z, t);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public BlockData getRaw(int x, int y, int z)
|
||||||
|
{
|
||||||
|
return chunk.getBlockData(x, y, z);
|
||||||
|
}
|
||||||
|
}
|
738
src/main/java/com/volmit/iris/gen/v2/scaffold/hunk/Hunk.java
Normal file
738
src/main/java/com/volmit/iris/gen/v2/scaffold/hunk/Hunk.java
Normal file
@ -0,0 +1,738 @@
|
|||||||
|
package com.volmit.iris.gen.v2.scaffold.hunk;
|
||||||
|
|
||||||
|
import java.util.function.Consumer;
|
||||||
|
|
||||||
|
import org.bukkit.block.Biome;
|
||||||
|
import org.bukkit.block.data.BlockData;
|
||||||
|
import org.bukkit.generator.ChunkGenerator.BiomeGrid;
|
||||||
|
import org.bukkit.generator.ChunkGenerator.ChunkData;
|
||||||
|
|
||||||
|
import com.volmit.iris.gen.v2.scaffold.multicore.BurstExecutor;
|
||||||
|
import com.volmit.iris.gen.v2.scaffold.multicore.MultiBurst;
|
||||||
|
import com.volmit.iris.util.Consumer2;
|
||||||
|
import com.volmit.iris.util.Consumer3;
|
||||||
|
import com.volmit.iris.util.Consumer4;
|
||||||
|
import com.volmit.iris.util.Consumer5;
|
||||||
|
import com.volmit.iris.util.Function3;
|
||||||
|
import com.volmit.iris.util.KList;
|
||||||
|
|
||||||
|
public interface Hunk<T>
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* Create a hunk view from a source hunk. This view reads and writes through to
|
||||||
|
* the source hunk. Its is not a copy.
|
||||||
|
*
|
||||||
|
* @param <T>
|
||||||
|
* the type
|
||||||
|
* @param src
|
||||||
|
* the source hunk
|
||||||
|
* @return the hunk view
|
||||||
|
*/
|
||||||
|
public static <T> Hunk<T> view(Hunk<T> src)
|
||||||
|
{
|
||||||
|
return new HunkView<T>(src);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static Hunk<Biome> view(BiomeGrid biome)
|
||||||
|
{
|
||||||
|
return new BiomeGridHunkView(biome);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static Hunk<BlockData> view(ChunkData src)
|
||||||
|
{
|
||||||
|
return new ChunkDataHunkView(src);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static <T> Hunk<T> newHunk(int w, int h, int d)
|
||||||
|
{
|
||||||
|
return newArrayHunk(w, h, d);
|
||||||
|
}
|
||||||
|
|
||||||
|
@SafeVarargs
|
||||||
|
public static <T> Hunk<T> newCombinedHunk(Hunk<T>... hunks)
|
||||||
|
{
|
||||||
|
return newCombinedArrayHunk(hunks);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static <T> Hunk<T> newArrayHunk(int w, int h, int d)
|
||||||
|
{
|
||||||
|
return new ArrayHunk<>(w, h, d);
|
||||||
|
}
|
||||||
|
|
||||||
|
@SafeVarargs
|
||||||
|
public static <T> Hunk<T> newCombinedArrayHunk(Hunk<T>... hunks)
|
||||||
|
{
|
||||||
|
return combined(Hunk::newArrayHunk, hunks);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static <T> Hunk<T> newSynchronizedArrayHunk(int w, int h, int d)
|
||||||
|
{
|
||||||
|
return new SynchronizedArrayHunk<>(w, h, d);
|
||||||
|
}
|
||||||
|
|
||||||
|
@SafeVarargs
|
||||||
|
public static <T> Hunk<T> newCombinedSynchronizedArrayHunk(Hunk<T>... hunks)
|
||||||
|
{
|
||||||
|
return combined(Hunk::newSynchronizedArrayHunk, hunks);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static <T> Hunk<T> newMappedHunk(int w, int h, int d)
|
||||||
|
{
|
||||||
|
return new MappedHunk<>(w, h, d);
|
||||||
|
}
|
||||||
|
|
||||||
|
@SafeVarargs
|
||||||
|
public static <T> Hunk<T> newCombinedMappedHunk(Hunk<T>... hunks)
|
||||||
|
{
|
||||||
|
return combined(Hunk::newMappedHunk, hunks);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static <T> Hunk<T> newAtomicHunk(int w, int h, int d)
|
||||||
|
{
|
||||||
|
return new AtomicHunk<>(w, h, d);
|
||||||
|
}
|
||||||
|
|
||||||
|
@SafeVarargs
|
||||||
|
public static <T> Hunk<T> newCombinedAtomicHunk(Hunk<T>... hunks)
|
||||||
|
{
|
||||||
|
return combined(Hunk::newAtomicHunk, hunks);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static Hunk<Double> newAtomicDoubleHunk(int w, int h, int d)
|
||||||
|
{
|
||||||
|
return new AtomicDoubleHunk(w, h, d);
|
||||||
|
}
|
||||||
|
|
||||||
|
@SafeVarargs
|
||||||
|
public static Hunk<Double> newCombinedAtomicDoubleHunk(Hunk<Double>... hunks)
|
||||||
|
{
|
||||||
|
return combined(Hunk::newAtomicDoubleHunk, hunks);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static Hunk<Long> newAtomicLongHunk(int w, int h, int d)
|
||||||
|
{
|
||||||
|
return new AtomicLongHunk(w, h, d);
|
||||||
|
}
|
||||||
|
|
||||||
|
@SafeVarargs
|
||||||
|
public static Hunk<Long> newCombinedAtomicLongHunk(Hunk<Long>... hunks)
|
||||||
|
{
|
||||||
|
return combined(Hunk::newAtomicLongHunk, hunks);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static Hunk<Integer> newAtomicIntegerHunk(int w, int h, int d)
|
||||||
|
{
|
||||||
|
return new AtomicIntegerHunk(w, h, d);
|
||||||
|
}
|
||||||
|
|
||||||
|
@SafeVarargs
|
||||||
|
public static Hunk<Integer> newCombinedAtomicIntegerHunk(Hunk<Integer>... hunks)
|
||||||
|
{
|
||||||
|
return combined(Hunk::newAtomicIntegerHunk, hunks);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Creates a new bounding hunk from the given hunks
|
||||||
|
*
|
||||||
|
* @param <T>
|
||||||
|
* the type
|
||||||
|
* @param factory
|
||||||
|
* the factory that creates a hunk
|
||||||
|
* @param hunks
|
||||||
|
* the hunks
|
||||||
|
* @return the new bounding hunk
|
||||||
|
*/
|
||||||
|
@SafeVarargs
|
||||||
|
public static <T> Hunk<T> combined(Function3<Integer, Integer, Integer, Hunk<T>> factory, Hunk<T>... hunks)
|
||||||
|
{
|
||||||
|
int w = 0;
|
||||||
|
int h = 0;
|
||||||
|
int d = 0;
|
||||||
|
|
||||||
|
for(Hunk<T> i : hunks)
|
||||||
|
{
|
||||||
|
w = Math.max(w, i.getWidth());
|
||||||
|
h = Math.max(h, i.getHeight());
|
||||||
|
d = Math.max(d, i.getDepth());
|
||||||
|
}
|
||||||
|
|
||||||
|
Hunk<T> b = factory.apply(w, h, d);
|
||||||
|
|
||||||
|
for(Hunk<T> i : hunks)
|
||||||
|
{
|
||||||
|
b.insert(i);
|
||||||
|
}
|
||||||
|
|
||||||
|
return b;
|
||||||
|
}
|
||||||
|
|
||||||
|
default Hunk<T> iterate(Consumer3<Integer, Integer, Integer> c)
|
||||||
|
{
|
||||||
|
for(int i = 0; i < getWidth(); i++)
|
||||||
|
{
|
||||||
|
for(int j = 0; j < getWidth(); j++)
|
||||||
|
{
|
||||||
|
for(int k = 0; k < getWidth(); k++)
|
||||||
|
{
|
||||||
|
c.accept(i, j, k);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
default Hunk<T> iterate(Consumer4<Integer, Integer, Integer, T> c)
|
||||||
|
{
|
||||||
|
for(int i = 0; i < getWidth(); i++)
|
||||||
|
{
|
||||||
|
for(int j = 0; j < getWidth(); j++)
|
||||||
|
{
|
||||||
|
for(int k = 0; k < getWidth(); k++)
|
||||||
|
{
|
||||||
|
c.accept(i, j, k, get(i, j, k));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
default Hunk<T> compute3D(int parallelism, Consumer4<Integer, Integer, Integer, Hunk<T>> v)
|
||||||
|
{
|
||||||
|
BurstExecutor e = MultiBurst.burst.burst(parallelism);
|
||||||
|
KList<Runnable> rq = new KList<Runnable>(parallelism);
|
||||||
|
getSections3D(parallelism, (xx, yy, zz, h, r) -> e.queue(() ->
|
||||||
|
{
|
||||||
|
v.accept(xx, yy, zz, h);
|
||||||
|
synchronized(rq)
|
||||||
|
{
|
||||||
|
rq.add(r);
|
||||||
|
}
|
||||||
|
}), (xx, yy, zz, c) -> insert(xx, yy, zz, c));
|
||||||
|
e.complete();
|
||||||
|
rq.forEach(Runnable::run);
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
default Hunk<T> compute2D(int parallelism, Consumer4<Integer, Integer, Integer, Hunk<T>> v)
|
||||||
|
{
|
||||||
|
BurstExecutor e = MultiBurst.burst.burst(parallelism);
|
||||||
|
KList<Runnable> rq = new KList<Runnable>(parallelism);
|
||||||
|
getSections2D(parallelism, (xx, yy, zz, h, r) -> e.queue(() ->
|
||||||
|
{
|
||||||
|
v.accept(xx, yy, zz, h);
|
||||||
|
synchronized(rq)
|
||||||
|
{
|
||||||
|
rq.add(r);
|
||||||
|
}
|
||||||
|
}), (xx, yy, zz, c) -> insert(xx, yy, zz, c));
|
||||||
|
e.complete();
|
||||||
|
rq.forEach(Runnable::run);
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
default Hunk<T> compute2DAtomically(int parallelism, Consumer4<Integer, Integer, Integer, Hunk<T>> v)
|
||||||
|
{
|
||||||
|
BurstExecutor e = MultiBurst.burst.burst(parallelism);
|
||||||
|
KList<Runnable> rq = new KList<Runnable>(parallelism);
|
||||||
|
getAtomicSections2D(parallelism, (xx, yy, zz, h) -> e.queue(() -> v.accept(xx, yy, zz, h)));
|
||||||
|
e.complete();
|
||||||
|
rq.forEach(Runnable::run);
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
default Hunk<T> compute3DAtomically(int parallelism, Consumer4<Integer, Integer, Integer, Hunk<T>> v)
|
||||||
|
{
|
||||||
|
BurstExecutor e = MultiBurst.burst.burst(parallelism);
|
||||||
|
KList<Runnable> rq = new KList<Runnable>(parallelism);
|
||||||
|
getAtomicSections3D(parallelism, (xx, yy, zz, h) -> e.queue(() -> v.accept(xx, yy, zz, h)));
|
||||||
|
e.complete();
|
||||||
|
rq.forEach(Runnable::run);
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
default Hunk<T> getSections2D(int sections, Consumer5<Integer, Integer, Integer, Hunk<T>, Runnable> v)
|
||||||
|
{
|
||||||
|
return getSections2D(sections, v, (xx, yy, zz, c) -> insert(xx, yy, zz, c));
|
||||||
|
}
|
||||||
|
|
||||||
|
default Hunk<T> getSections2D(int sections, Consumer5<Integer, Integer, Integer, Hunk<T>, Runnable> v, Consumer4<Integer, Integer, Integer, Hunk<T>> inserter)
|
||||||
|
{
|
||||||
|
int dim = (int) Math.ceil(Math.sqrt(sections));
|
||||||
|
dim = dim < 2 ? 2 : dim;
|
||||||
|
dim = dim % 2 != 0 ? dim + 1 : dim;
|
||||||
|
int w = getWidth() / dim;
|
||||||
|
int d = getDepth() / dim;
|
||||||
|
int i, j;
|
||||||
|
|
||||||
|
for(i = 0; i < getWidth(); i += w)
|
||||||
|
{
|
||||||
|
int ii = i;
|
||||||
|
|
||||||
|
for(j = 0; j < getDepth(); j += d)
|
||||||
|
{
|
||||||
|
int jj = j;
|
||||||
|
getSection(i, 0, j, i + w - 1, getHeight() - 1, j + d - 1, (h, r) -> v.accept(ii, 0, jj, h, r), inserter);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
default Hunk<T> getAtomicSections2D(int sections, Consumer4<Integer, Integer, Integer, Hunk<T>> v)
|
||||||
|
{
|
||||||
|
int dim = (int) Math.ceil(Math.sqrt(sections));
|
||||||
|
dim = dim < 2 ? 2 : dim;
|
||||||
|
dim = dim % 2 != 0 ? dim + 1 : dim;
|
||||||
|
int w = getWidth() / dim;
|
||||||
|
int d = getDepth() / dim;
|
||||||
|
int i, j;
|
||||||
|
|
||||||
|
for(i = 0; i < getWidth(); i += w)
|
||||||
|
{
|
||||||
|
int ii = i;
|
||||||
|
|
||||||
|
for(j = 0; j < getDepth(); j += d)
|
||||||
|
{
|
||||||
|
int jj = j;
|
||||||
|
getAtomicSection(i, 0, j, i + w - 1, getHeight() - 1, j + d - 1, (h) -> v.accept(ii, 0, jj, h));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
default Hunk<T> getSections3D(int sections, Consumer5<Integer, Integer, Integer, Hunk<T>, Runnable> v)
|
||||||
|
{
|
||||||
|
return getSections3D(sections, v, (xx, yy, zz, c) -> insert(xx, yy, zz, c));
|
||||||
|
}
|
||||||
|
|
||||||
|
default Hunk<T> getSections3D(int sections, Consumer5<Integer, Integer, Integer, Hunk<T>, Runnable> v, Consumer4<Integer, Integer, Integer, Hunk<T>> inserter)
|
||||||
|
{
|
||||||
|
int dim = (int) Math.ceil(Math.cbrt(sections));
|
||||||
|
dim = dim < 2 ? 2 : dim;
|
||||||
|
dim = dim % 2 != 0 ? dim + 1 : dim;
|
||||||
|
int w = getWidth() / dim;
|
||||||
|
int h = getHeight() / dim;
|
||||||
|
int d = getDepth() / dim;
|
||||||
|
int i, j, k;
|
||||||
|
|
||||||
|
for(i = 0; i < getWidth(); i += w)
|
||||||
|
{
|
||||||
|
int ii = i;
|
||||||
|
|
||||||
|
for(j = 0; j < getHeight(); j += d)
|
||||||
|
{
|
||||||
|
int jj = j;
|
||||||
|
|
||||||
|
for(k = 0; k < getDepth(); k += d)
|
||||||
|
{
|
||||||
|
int kk = k;
|
||||||
|
getSection(i, j, k, i + w - 1, j + h - 1, k + d - 1, (hh, r) -> v.accept(ii, jj, kk, hh, r), inserter);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
default Hunk<T> getAtomicSections3D(int sections, Consumer4<Integer, Integer, Integer, Hunk<T>> v)
|
||||||
|
{
|
||||||
|
int dim = (int) Math.ceil(Math.cbrt(sections));
|
||||||
|
dim = dim < 2 ? 2 : dim;
|
||||||
|
dim = dim % 2 != 0 ? dim + 1 : dim;
|
||||||
|
int w = getWidth() / dim;
|
||||||
|
int h = getHeight() / dim;
|
||||||
|
int d = getDepth() / dim;
|
||||||
|
int i, j, k;
|
||||||
|
|
||||||
|
for(i = 0; i < getWidth(); i += w)
|
||||||
|
{
|
||||||
|
int ii = i;
|
||||||
|
|
||||||
|
for(j = 0; j < getHeight(); j += d)
|
||||||
|
{
|
||||||
|
int jj = j;
|
||||||
|
|
||||||
|
for(k = 0; k < getDepth(); k += d)
|
||||||
|
{
|
||||||
|
int kk = k;
|
||||||
|
getAtomicSection(i, j, k, i + w - 1, j + h - 1, k + d - 1, (hh) -> v.accept(ii, jj, kk, hh));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
default Hunk<T> getSection(int x, int y, int z, int x1, int y1, int z1, Consumer2<Hunk<T>, Runnable> v)
|
||||||
|
{
|
||||||
|
return getSection(x, y, z, x1, y1, z1, v, (xx, yy, zz, c) -> insert(xx, yy, zz, c));
|
||||||
|
}
|
||||||
|
|
||||||
|
default Hunk<T> getSection(int x, int y, int z, int x1, int y1, int z1, Consumer2<Hunk<T>, Runnable> v, Consumer4<Integer, Integer, Integer, Hunk<T>> inserter)
|
||||||
|
{
|
||||||
|
Hunk<T> copy = crop(x, y, z, x1, y1, z1);
|
||||||
|
v.accept(copy, () -> inserter.accept(x, y, z, copy));
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
default Hunk<T> getAtomicSection(int x, int y, int z, int x1, int y1, int z1, Consumer<Hunk<T>> v)
|
||||||
|
{
|
||||||
|
v.accept(croppedView(x, y, z, x1, y1, z1));
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
default void enforceBounds(int x, int y, int z)
|
||||||
|
{
|
||||||
|
if(x < 0 || x >= getWidth() || y < 0 || y >= getHeight() || z < 0 || z >= getDepth())
|
||||||
|
{
|
||||||
|
throw new IndexOutOfBoundsException(x + "," + y + "," + z + " does not fit within size " + getWidth() + "," + getHeight() + "," + getDepth() + " (0,0,0 to " + (getWidth() - 1) + "," + (getHeight() - 1) + "," + (getDepth() - 1) + ")");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
default void enforceBounds(int x, int y, int z, int w, int h, int d)
|
||||||
|
{
|
||||||
|
if(x < 0 || x >= getWidth() || y < 0 || y >= getHeight() || z < 0 || z >= getDepth() || x + w < 0 || x + w >= getWidth() || y + h < 0 || y + h >= getHeight() || z + d < 0 || z + d >= getDepth())
|
||||||
|
{
|
||||||
|
throw new IndexOutOfBoundsException("The hunk " + w + "," + h + "," + d + " with an offset of " + x + "," + y + "," + z + " does not fit within the parent hunk " + getWidth() + "," + getHeight() + "," + getDepth() + " (0,0,0 to " + (getWidth() - 1) + "," + (getHeight() - 1) + "," + (getDepth() - 1) + ")");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create a new hunk from a section of this hunk.
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* @param x1
|
||||||
|
* The min x (inclusive)
|
||||||
|
* @param y1
|
||||||
|
* The min y (inclusive)
|
||||||
|
* @param z1
|
||||||
|
* The min z (inclusive)
|
||||||
|
* @param x2
|
||||||
|
* The max x (exclusive)
|
||||||
|
* @param y2
|
||||||
|
* The max y (exclusive)
|
||||||
|
* @param z2
|
||||||
|
* The max z (exclusive)
|
||||||
|
* @return the new hunk (x2-x1, y2-y1, z2-z1)
|
||||||
|
*/
|
||||||
|
default ArrayHunk<T> crop(int x1, int y1, int z1, int x2, int y2, int z2)
|
||||||
|
{
|
||||||
|
ArrayHunk<T> h = new ArrayHunk<T>(x2 - x1, y2 - y1, z2 - z1);
|
||||||
|
enforceBounds(x1, y1, z1, x2 - x1, y2 - y1, z2 - z1);
|
||||||
|
|
||||||
|
for(int i = x1; i < x2; i++)
|
||||||
|
{
|
||||||
|
for(int j = y1; j < y2; j++)
|
||||||
|
{
|
||||||
|
for(int k = z1; k < z2; k++)
|
||||||
|
{
|
||||||
|
h.setRaw(i - x1, j - y1, k - z1, getRaw(i, j, k));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return h;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create a new view of this same hunk from a section of this hunk.
|
||||||
|
* Modifications are routed to this hunk!
|
||||||
|
*
|
||||||
|
* @param x1
|
||||||
|
* The min x (inclusive)
|
||||||
|
* @param y1
|
||||||
|
* The min y (inclusive)
|
||||||
|
* @param z1
|
||||||
|
* The min z (inclusive)
|
||||||
|
* @param x2
|
||||||
|
* The max x (exclusive)
|
||||||
|
* @param y2
|
||||||
|
* The max y (exclusive)
|
||||||
|
* @param z2
|
||||||
|
* The max z (exclusive)
|
||||||
|
* @return the cropped view of this hunk (x2-x1, y2-y1, z2-z1)
|
||||||
|
*/
|
||||||
|
default Hunk<T> croppedView(int x1, int y1, int z1, int x2, int y2, int z2)
|
||||||
|
{
|
||||||
|
enforceBounds(x1, y1, z1, x2 - x1, y2 - y1, z2 - z1);
|
||||||
|
return new HunkView<T>(this, x2 - x1, y2 - y1, z2 - z1, x1, y1, z1);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return The X length
|
||||||
|
*/
|
||||||
|
public int getWidth();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return The Z length
|
||||||
|
*/
|
||||||
|
public int getDepth();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return The Y length
|
||||||
|
*/
|
||||||
|
public int getHeight();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set a region
|
||||||
|
*
|
||||||
|
* @param x1
|
||||||
|
* inclusive 1st x
|
||||||
|
* @param y1
|
||||||
|
* inclusive 1st y
|
||||||
|
* @param z1
|
||||||
|
* inclusive 1st z
|
||||||
|
* @param x2
|
||||||
|
* inclusive 2nd x
|
||||||
|
* @param y2
|
||||||
|
* inclusive 2nd y
|
||||||
|
* @param z2
|
||||||
|
* inclusive 2nd z
|
||||||
|
* @param t
|
||||||
|
* the value to set
|
||||||
|
*/
|
||||||
|
default void set(int x1, int y1, int z1, int x2, int y2, int z2, T t)
|
||||||
|
{
|
||||||
|
enforceBounds(x1, y1, z1, x2 - x1, y2 - y1, z2 - z1);
|
||||||
|
for(int i = x1; i <= x2; i++)
|
||||||
|
{
|
||||||
|
for(int j = y1; j <= y2; j++)
|
||||||
|
{
|
||||||
|
for(int k = z1; k <= z2; k++)
|
||||||
|
{
|
||||||
|
setRaw(i, j, k, t);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the value to the closest valid position
|
||||||
|
*
|
||||||
|
* @param x
|
||||||
|
* the x
|
||||||
|
* @param y
|
||||||
|
* the y
|
||||||
|
* @param z
|
||||||
|
* the z
|
||||||
|
* @return the value closest to the border of the hunk
|
||||||
|
*/
|
||||||
|
default T getClosest(int x, int y, int z)
|
||||||
|
{
|
||||||
|
return getRaw(x >= getWidth() ? getWidth() - 1 : x, y >= getHeight() ? getHeight() - 1 : y, z >= getDepth() ? getDepth() - 1 : z);
|
||||||
|
}
|
||||||
|
|
||||||
|
default void fill(T t)
|
||||||
|
{
|
||||||
|
set(0, 0, 0, getWidth() - 1, getHeight() - 1, getDepth() - 1, t);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get a 1 node thick hunk representing the face of this hunk
|
||||||
|
*
|
||||||
|
* @param f
|
||||||
|
* the face
|
||||||
|
* @return the hunk view of this hunk
|
||||||
|
*/
|
||||||
|
default Hunk<T> viewFace(HunkFace f)
|
||||||
|
{
|
||||||
|
switch(f)
|
||||||
|
{
|
||||||
|
case BOTTOM:
|
||||||
|
return croppedView(0, 0, 0, getWidth() - 1, 0, getDepth() - 1);
|
||||||
|
case EAST:
|
||||||
|
return croppedView(getWidth() - 1, 0, 0, getWidth() - 1, getHeight() - 1, getDepth() - 1);
|
||||||
|
case NORTH:
|
||||||
|
return croppedView(0, 0, 0, getWidth() - 1, getHeight() - 1, 0);
|
||||||
|
case SOUTH:
|
||||||
|
return croppedView(0, 0, 0, 0, getHeight() - 1, getDepth() - 1);
|
||||||
|
case TOP:
|
||||||
|
return croppedView(0, getHeight() - 1, 0, getWidth() - 1, getHeight() - 1, getDepth() - 1);
|
||||||
|
case WEST:
|
||||||
|
return croppedView(0, 0, getDepth() - 1, getWidth() - 1, getHeight() - 1, getDepth() - 1);
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Crop (copy) a 1 node thick hunk representing the face of this hunk
|
||||||
|
*
|
||||||
|
* @param f
|
||||||
|
* the face
|
||||||
|
* @return the hunk copy (face) of this hunk
|
||||||
|
*/
|
||||||
|
default Hunk<T> cropFace(HunkFace f)
|
||||||
|
{
|
||||||
|
switch(f)
|
||||||
|
{
|
||||||
|
case BOTTOM:
|
||||||
|
return crop(0, 0, 0, getWidth() - 1, 0, getDepth() - 1);
|
||||||
|
case EAST:
|
||||||
|
return crop(getWidth() - 1, 0, 0, getWidth() - 1, getHeight() - 1, getDepth() - 1);
|
||||||
|
case NORTH:
|
||||||
|
return crop(0, 0, 0, getWidth() - 1, getHeight() - 1, 0);
|
||||||
|
case SOUTH:
|
||||||
|
return crop(0, 0, 0, 0, getHeight() - 1, getDepth() - 1);
|
||||||
|
case TOP:
|
||||||
|
return crop(0, getHeight() - 1, 0, getWidth() - 1, getHeight() - 1, getDepth() - 1);
|
||||||
|
case WEST:
|
||||||
|
return crop(0, 0, getDepth() - 1, getWidth() - 1, getHeight() - 1, getDepth() - 1);
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set a value at the given position
|
||||||
|
*
|
||||||
|
* @param x
|
||||||
|
* the x
|
||||||
|
* @param y
|
||||||
|
* the y
|
||||||
|
* @param z
|
||||||
|
* the z
|
||||||
|
* @param t
|
||||||
|
* the value
|
||||||
|
*/
|
||||||
|
default void set(int x, int y, int z, T t)
|
||||||
|
{
|
||||||
|
enforceBounds(x, y, z);
|
||||||
|
setRaw(x, y, z, t);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set a value at the given position without checking coordinate bounds
|
||||||
|
*
|
||||||
|
* @param x
|
||||||
|
* the x
|
||||||
|
* @param y
|
||||||
|
* the y
|
||||||
|
* @param z
|
||||||
|
* the z
|
||||||
|
* @param t
|
||||||
|
* the value
|
||||||
|
*/
|
||||||
|
public void setRaw(int x, int y, int z, T t);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get a value at the given position without checking coordinate bounds
|
||||||
|
*
|
||||||
|
* @param x
|
||||||
|
* the x
|
||||||
|
* @param y
|
||||||
|
* the y
|
||||||
|
* @param z
|
||||||
|
* the z
|
||||||
|
* @return the value or null
|
||||||
|
*/
|
||||||
|
public T getRaw(int x, int y, int z);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get a value at the given position
|
||||||
|
*
|
||||||
|
* @param x
|
||||||
|
* the x
|
||||||
|
* @param y
|
||||||
|
* the y
|
||||||
|
* @param z
|
||||||
|
* the z
|
||||||
|
* @return the value or null
|
||||||
|
*/
|
||||||
|
default T get(int x, int y, int z)
|
||||||
|
{
|
||||||
|
enforceBounds(x, y, z);
|
||||||
|
return getRaw(x, y, z);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Insert a hunk into this one with an offset the inserted hunk
|
||||||
|
*
|
||||||
|
* @param offX
|
||||||
|
* the offset from zero for x
|
||||||
|
* @param offY
|
||||||
|
* the offset from zero for y
|
||||||
|
* @param offZ
|
||||||
|
* the offset from zero for z
|
||||||
|
* @param hunk
|
||||||
|
* the hunk to insert
|
||||||
|
*/
|
||||||
|
default void insert(int offX, int offY, int offZ, Hunk<T> hunk)
|
||||||
|
{
|
||||||
|
insert(offX, offY, offZ, hunk, false);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Insert a hunk into this one
|
||||||
|
*
|
||||||
|
* @param hunk
|
||||||
|
* the hunk to insert
|
||||||
|
*/
|
||||||
|
default void insert(Hunk<T> hunk)
|
||||||
|
{
|
||||||
|
insert(0, 0, 0, hunk, false);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the source of this hunk view. This could return another hunk view,
|
||||||
|
* not an actual source, however it does return it's underlying data source. If
|
||||||
|
* this hunk is a data source and not a view, it will return null.
|
||||||
|
*
|
||||||
|
* @return the source or null if this is already the source
|
||||||
|
*/
|
||||||
|
default Hunk<T> getSource()
|
||||||
|
{
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Insert a hunk into this one
|
||||||
|
*
|
||||||
|
* @param hunk
|
||||||
|
* the hunk to insert
|
||||||
|
* @param inverted
|
||||||
|
* invert the inserted hunk or not
|
||||||
|
*/
|
||||||
|
default void insert(Hunk<T> hunk, boolean inverted)
|
||||||
|
{
|
||||||
|
insert(0, 0, 0, hunk, inverted);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Insert a hunk into this one with an offset and possibly inverting the y of
|
||||||
|
* the inserted hunk
|
||||||
|
*
|
||||||
|
* @param offX
|
||||||
|
* the offset from zero for x
|
||||||
|
* @param offY
|
||||||
|
* the offset from zero for y
|
||||||
|
* @param offZ
|
||||||
|
* the offset from zero for z
|
||||||
|
* @param hunk
|
||||||
|
* the hunk to insert
|
||||||
|
* @param invertY
|
||||||
|
* should the inserted hunk be inverted
|
||||||
|
*/
|
||||||
|
default void insert(int offX, int offY, int offZ, Hunk<T> hunk, boolean invertY)
|
||||||
|
{
|
||||||
|
enforceBounds(offX, offY, offZ, hunk.getWidth(), hunk.getHeight(), hunk.getDepth());
|
||||||
|
|
||||||
|
for(int i = offX; i < offX + hunk.getWidth(); i++)
|
||||||
|
{
|
||||||
|
for(int j = offY; j < offY + hunk.getHeight(); j++)
|
||||||
|
{
|
||||||
|
for(int k = offZ; k < offZ + hunk.getDepth(); k++)
|
||||||
|
{
|
||||||
|
setRaw(i, j, k, hunk.getRaw(i - offX, j - offY, k - offZ));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -1,4 +1,4 @@
|
|||||||
package com.volmit.iris.gen.v2.scaffold;
|
package com.volmit.iris.gen.v2.scaffold.hunk;
|
||||||
|
|
||||||
public enum HunkFace
|
public enum HunkFace
|
||||||
{
|
{
|
@ -0,0 +1,69 @@
|
|||||||
|
package com.volmit.iris.gen.v2.scaffold.hunk;
|
||||||
|
|
||||||
|
public class HunkView<T> implements Hunk<T>
|
||||||
|
{
|
||||||
|
private final int ox;
|
||||||
|
private final int oy;
|
||||||
|
private final int oz;
|
||||||
|
private final int w;
|
||||||
|
private final int h;
|
||||||
|
private final int d;
|
||||||
|
private final Hunk<T> src;
|
||||||
|
|
||||||
|
public HunkView(Hunk<T> src)
|
||||||
|
{
|
||||||
|
this(src, src.getWidth(), src.getHeight(), src.getDepth());
|
||||||
|
}
|
||||||
|
|
||||||
|
public HunkView(Hunk<T> src, int w, int h, int d)
|
||||||
|
{
|
||||||
|
this(src, w, h, d, 0, 0, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
public HunkView(Hunk<T> src, int w, int h, int d, int ox, int oy, int oz)
|
||||||
|
{
|
||||||
|
this.src = src;
|
||||||
|
this.w = w;
|
||||||
|
this.h = h;
|
||||||
|
this.d = d;
|
||||||
|
this.ox = ox;
|
||||||
|
this.oy = oy;
|
||||||
|
this.oz = oz;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setRaw(int x, int y, int z, T t)
|
||||||
|
{
|
||||||
|
src.setRaw(x + ox, y + oy, z + oz, t);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public T getRaw(int x, int y, int z)
|
||||||
|
{
|
||||||
|
return src.getRaw(x + ox, y + oy, z + oz);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int getWidth()
|
||||||
|
{
|
||||||
|
return w;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int getDepth()
|
||||||
|
{
|
||||||
|
return d;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int getHeight()
|
||||||
|
{
|
||||||
|
return h;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Hunk<T> getSource()
|
||||||
|
{
|
||||||
|
return src;
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,32 @@
|
|||||||
|
package com.volmit.iris.gen.v2.scaffold.hunk;
|
||||||
|
|
||||||
|
import com.volmit.iris.util.BlockPosition;
|
||||||
|
import com.volmit.iris.util.KMap;
|
||||||
|
|
||||||
|
import lombok.Data;
|
||||||
|
import lombok.EqualsAndHashCode;
|
||||||
|
|
||||||
|
@Data
|
||||||
|
@EqualsAndHashCode(callSuper = false)
|
||||||
|
public class MappedHunk<T> extends StorageHunk<T> implements Hunk<T>
|
||||||
|
{
|
||||||
|
private final KMap<BlockPosition, T> data;
|
||||||
|
|
||||||
|
protected MappedHunk(int w, int h, int d)
|
||||||
|
{
|
||||||
|
super(w, h, d);
|
||||||
|
data = new KMap<>();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setRaw(int x, int y, int z, T t)
|
||||||
|
{
|
||||||
|
data.put(new BlockPosition(x, y, z), t);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public T getRaw(int x, int y, int z)
|
||||||
|
{
|
||||||
|
return data.get(new BlockPosition(x, y, z));
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,29 @@
|
|||||||
|
package com.volmit.iris.gen.v2.scaffold.hunk;
|
||||||
|
|
||||||
|
import lombok.Data;
|
||||||
|
|
||||||
|
@Data
|
||||||
|
public abstract class StorageHunk<T> implements Hunk<T>
|
||||||
|
{
|
||||||
|
private final int width;
|
||||||
|
private final int height;
|
||||||
|
private final int depth;
|
||||||
|
|
||||||
|
protected StorageHunk(int width, int height, int depth)
|
||||||
|
{
|
||||||
|
if(width <= 0 || height <= 0 || depth <= 0)
|
||||||
|
{
|
||||||
|
throw new RuntimeException("Unsupported size " + width + " " + height + " " + depth);
|
||||||
|
}
|
||||||
|
|
||||||
|
this.width = width;
|
||||||
|
this.height = height;
|
||||||
|
this.depth = depth;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public abstract void setRaw(int x, int y, int z, T t);
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public abstract T getRaw(int x, int y, int z);
|
||||||
|
}
|
@ -0,0 +1,52 @@
|
|||||||
|
package com.volmit.iris.gen.v2.scaffold.hunk;
|
||||||
|
|
||||||
|
import org.bouncycastle.util.Arrays;
|
||||||
|
|
||||||
|
import lombok.Data;
|
||||||
|
import lombok.EqualsAndHashCode;
|
||||||
|
|
||||||
|
@Data
|
||||||
|
@EqualsAndHashCode(callSuper = false)
|
||||||
|
public class SynchronizedArrayHunk<T> extends StorageHunk<T> implements Hunk<T>
|
||||||
|
{
|
||||||
|
private final T[] data;
|
||||||
|
|
||||||
|
@SuppressWarnings("unchecked")
|
||||||
|
protected SynchronizedArrayHunk(int w, int h, int d)
|
||||||
|
{
|
||||||
|
super(w, h, d);
|
||||||
|
data = (T[]) new Object[w * h * d];
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setRaw(int x, int y, int z, T t)
|
||||||
|
{
|
||||||
|
synchronized(data)
|
||||||
|
{
|
||||||
|
data[index(x, y, z)] = t;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public T getRaw(int x, int y, int z)
|
||||||
|
{
|
||||||
|
synchronized(data)
|
||||||
|
{
|
||||||
|
return data[index(x, y, z)];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private int index(int x, int y, int z)
|
||||||
|
{
|
||||||
|
return (z * getWidth() * getHeight()) + (y * getWidth()) + x;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void fill(T t)
|
||||||
|
{
|
||||||
|
synchronized(data)
|
||||||
|
{
|
||||||
|
Arrays.fill(data, t);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
Loading…
x
Reference in New Issue
Block a user