From bc194f8e6cbd7b8ec3cc62b7b3110310cae57a84 Mon Sep 17 00:00:00 2001 From: TomTheFurry Date: Thu, 23 Jun 2022 16:37:28 +0800 Subject: [PATCH] Start working on Full Datatype --- .../core/a7/datatype/column/ColumnFormat.java | 4 +- .../column/accessor/ColumnArrayView.java | 10 +-- .../column/accessor/ColumnQuadView.java | 36 ++++---- ...lumnDataView.java => IColumnDataView.java} | 5 +- .../core/a7/datatype/full/ChunkSizedData.java | 11 +++ .../lod/core/a7/datatype/full/Data.java | 49 ----------- .../lod/core/a7/datatype/full/EGenMode.java | 14 ++++ .../core/a7/datatype/full/FullDataSource.java | 61 ++++++++++++++ .../lod/core/a7/datatype/full/FullFormat.java | 83 ++++++++----------- .../datatype/full/accessor/FullArrayView.java | 53 ++++++++++++ .../datatype/full/accessor/IFullDataType.java | 13 +++ .../datatype/full/accessor/IFullDataView.java | 25 ++++++ .../full/accessor/SingleFullArrayView.java | 49 +++++++++++ .../a7/datatype/transform/LodDataBuilder.java | 13 +++ .../core/a7/save/io/file/DataMetaFile.java | 6 +- .../a7/save/io/file/IDataSourceProvider.java | 4 +- .../a7/save/io/file/LocalDataFileHandler.java | 4 +- .../save/io/file/RemoteDataFileHandler.java | 4 +- .../save/io/render/IRenderSourceProvider.java | 4 +- .../a7/save/io/render/RenderFileHandler.java | 4 +- 20 files changed, 315 insertions(+), 137 deletions(-) rename src/main/java/com/seibel/lod/core/a7/datatype/column/accessor/{ColumnDataView.java => IColumnDataView.java} (77%) create mode 100644 src/main/java/com/seibel/lod/core/a7/datatype/full/ChunkSizedData.java delete mode 100644 src/main/java/com/seibel/lod/core/a7/datatype/full/Data.java create mode 100644 src/main/java/com/seibel/lod/core/a7/datatype/full/EGenMode.java create mode 100644 src/main/java/com/seibel/lod/core/a7/datatype/full/FullDataSource.java create mode 100644 src/main/java/com/seibel/lod/core/a7/datatype/full/accessor/FullArrayView.java create mode 100644 src/main/java/com/seibel/lod/core/a7/datatype/full/accessor/IFullDataType.java create mode 100644 src/main/java/com/seibel/lod/core/a7/datatype/full/accessor/IFullDataView.java create mode 100644 src/main/java/com/seibel/lod/core/a7/datatype/full/accessor/SingleFullArrayView.java create mode 100644 src/main/java/com/seibel/lod/core/a7/datatype/transform/LodDataBuilder.java diff --git a/src/main/java/com/seibel/lod/core/a7/datatype/column/ColumnFormat.java b/src/main/java/com/seibel/lod/core/a7/datatype/column/ColumnFormat.java index 7d48ab975..79b4452ae 100644 --- a/src/main/java/com/seibel/lod/core/a7/datatype/column/ColumnFormat.java +++ b/src/main/java/com/seibel/lod/core/a7/datatype/column/ColumnFormat.java @@ -20,7 +20,7 @@ package com.seibel.lod.core.a7.datatype.column; import com.seibel.lod.core.a7.datatype.column.accessor.ColumnArrayView; -import com.seibel.lod.core.a7.datatype.column.accessor.ColumnDataView; +import com.seibel.lod.core.a7.datatype.column.accessor.IColumnDataView; import com.seibel.lod.core.logging.SpamReducedLogger; import com.seibel.lod.core.util.ColorUtil; @@ -298,7 +298,7 @@ public class ColumnFormat * @param sourceData one or more columns of data * @param output one column of space for the result to be written to */ - public static void mergeMultiData(ColumnDataView sourceData, ColumnArrayView output) + public static void mergeMultiData(IColumnDataView sourceData, ColumnArrayView output) { if (output.dataCount() != 1) throw new IllegalArgumentException("output must be only reserved for one datapoint!"); int inputVerticalSize = sourceData.verticalSize(); diff --git a/src/main/java/com/seibel/lod/core/a7/datatype/column/accessor/ColumnArrayView.java b/src/main/java/com/seibel/lod/core/a7/datatype/column/accessor/ColumnArrayView.java index f3210bbe1..f5788dae1 100644 --- a/src/main/java/com/seibel/lod/core/a7/datatype/column/accessor/ColumnArrayView.java +++ b/src/main/java/com/seibel/lod/core/a7/datatype/column/accessor/ColumnArrayView.java @@ -5,7 +5,7 @@ import com.seibel.lod.core.a7.datatype.column.ColumnFormat; import java.util.Arrays; -public final class ColumnArrayView implements ColumnDataView { +public final class ColumnArrayView implements IColumnDataView { private final long[] data; private final int size; // size in longs private final int offset; // offset in longs @@ -47,7 +47,7 @@ public final class ColumnArrayView implements ColumnDataView { Arrays.fill(data, offset, offset + size, value); } - public void copyFrom(ColumnDataView source, int outputDataIndexOffset) { + public void copyFrom(IColumnDataView source, int outputDataIndexOffset) { if (source.verticalSize() > vertSize) throw new IllegalArgumentException("source verticalSize must be <= self's verticalSize to copy"); if (source.dataCount() + outputDataIndexOffset > dataCount()) throw new IllegalArgumentException("dataIndexStart + source.dataCount() must be <= self.dataCount() to copy"); if (source.verticalSize() != vertSize) { @@ -61,7 +61,7 @@ public final class ColumnArrayView implements ColumnDataView { source.copyTo(data, offset + outputDataIndexOffset * vertSize); } } - public void copyFrom(ColumnDataView source) { + public void copyFrom(IColumnDataView source) { copyFrom(source, 0); } @@ -94,7 +94,7 @@ public final class ColumnArrayView implements ColumnDataView { return anyChange; } - public void changeVerticalSizeFrom(ColumnDataView source) { + public void changeVerticalSizeFrom(IColumnDataView source) { if (dataCount() != source.dataCount()) { throw new IllegalArgumentException("Cannot copy and resize to views with different dataCounts"); } @@ -107,7 +107,7 @@ public final class ColumnArrayView implements ColumnDataView { } } - public void mergeMultiDataFrom(ColumnDataView source) { + public void mergeMultiDataFrom(IColumnDataView source) { if (dataCount() != 1) { throw new IllegalArgumentException("output dataCount must be 1"); } diff --git a/src/main/java/com/seibel/lod/core/a7/datatype/column/accessor/ColumnQuadView.java b/src/main/java/com/seibel/lod/core/a7/datatype/column/accessor/ColumnQuadView.java index 856caa7f4..bbc8e1793 100644 --- a/src/main/java/com/seibel/lod/core/a7/datatype/column/accessor/ColumnQuadView.java +++ b/src/main/java/com/seibel/lod/core/a7/datatype/column/accessor/ColumnQuadView.java @@ -1,8 +1,8 @@ package com.seibel.lod.core.a7.datatype.column.accessor; -public class ColumnQuadView implements ColumnDataView { +public class ColumnQuadView implements IColumnDataView { private final long[] data; - private final int perRowOffset; // per row offset in longs + private final int perColumnOffset; // per column (of columns of data) offset in longs private final int xSize; // x size in datapoints private final int zSize; // x size in datapoints private final int offset; // offset in longs @@ -15,12 +15,12 @@ public class ColumnQuadView implements ColumnDataView { this.xSize = xSize; this.zSize = zSize; this.vertSize = dataVertSize; - this.perRowOffset = dataZWidth * dataVertSize; - this.offset = (viewXOffset * perRowOffset + viewZOffset) * dataVertSize; + this.perColumnOffset = dataZWidth * dataVertSize; + this.offset = (viewXOffset * perColumnOffset + viewZOffset) * dataVertSize; } - private ColumnQuadView(long[] data, int perRowOffset, int offset, int vertSize, int xSize, int zSize) { + private ColumnQuadView(long[] data, int perColumnOffset, int offset, int vertSize, int xSize, int zSize) { this.data = data; - this.perRowOffset = perRowOffset; + this.perColumnOffset = perColumnOffset; this.offset = offset; this.vertSize = vertSize; this.xSize = xSize; @@ -29,32 +29,32 @@ public class ColumnQuadView implements ColumnDataView { @Override public long get(int index) { - int x = index % (xSize * vertSize); - int z = index / (xSize * vertSize); + int x = index / perColumnOffset; + int z = (index % perColumnOffset) / vertSize; int v = index % vertSize; return get(x, z, v); } public long get(int x, int z, int v) { - return data[offset + x * perRowOffset + z * vertSize + v]; + return data[offset + x * perColumnOffset + z * vertSize + v]; } public long set(int x, int z, int v, long value) { - return data[offset + x * perRowOffset + z * vertSize + v] = value; + return data[offset + x * perColumnOffset + z * vertSize + v] = value; } public ColumnArrayView get(int x, int z) { - return new ColumnArrayView(data, vertSize, offset + x * perRowOffset + z * vertSize, vertSize); + return new ColumnArrayView(data, vertSize, offset + x * perColumnOffset + z * vertSize, vertSize); } public ColumnArrayView getRow(int x) { - return new ColumnArrayView(data, vertSize, offset + x * perRowOffset, zSize * vertSize); + return new ColumnArrayView(data, vertSize, offset + x * perColumnOffset, zSize * vertSize); } - public void set(int x, int z, ColumnDataView singleColumn) { + public void set(int x, int z, IColumnDataView singleColumn) { if (singleColumn.verticalSize() != vertSize) throw new IllegalArgumentException("Vertical size of singleColumn must be equal to vertSize"); if (singleColumn.dataCount() != 1) throw new IllegalArgumentException("SingleColumn must contain exactly one data point"); - singleColumn.copyTo(data, x * perRowOffset + z * vertSize); + singleColumn.copyTo(data, x * perColumnOffset + z * vertSize); } @Override @@ -73,22 +73,22 @@ public class ColumnQuadView implements ColumnDataView { } @Override - public ColumnDataView subView(int dataIndexStart, int dataCount) { + public IColumnDataView subView(int dataIndexStart, int dataCount) { if (dataCount != 1) throw new UnsupportedOperationException("Fixme: subView for QUadView only support one data point!"); int x = dataIndexStart % xSize; int z = dataIndexStart / xSize; - return new ColumnArrayView(data, vertSize, offset + x * perRowOffset + z * vertSize, vertSize); + return new ColumnArrayView(data, vertSize, offset + x * perColumnOffset + z * vertSize, vertSize); } public ColumnQuadView subView(int xOffset, int zOffset, int xSize, int zSize) { if (xOffset + xSize > this.xSize || zOffset + zSize > this.zSize) throw new IllegalArgumentException("SubView is out of bounds"); - return new ColumnQuadView(data, perRowOffset, offset + xOffset * perRowOffset + zOffset * vertSize, vertSize, xSize, zSize); + return new ColumnQuadView(data, perColumnOffset, offset + xOffset * perColumnOffset + zOffset * vertSize, vertSize, xSize, zSize); } @Override public void copyTo(long[] target, int offset) { for (int x = 0; x < xSize; x++) { - System.arraycopy(data, this.offset + x * perRowOffset, target, offset + x * xSize * vertSize, zSize * vertSize); + System.arraycopy(data, this.offset + x * perColumnOffset, target, offset + x * xSize * vertSize, zSize * vertSize); } } diff --git a/src/main/java/com/seibel/lod/core/a7/datatype/column/accessor/ColumnDataView.java b/src/main/java/com/seibel/lod/core/a7/datatype/column/accessor/IColumnDataView.java similarity index 77% rename from src/main/java/com/seibel/lod/core/a7/datatype/column/accessor/ColumnDataView.java rename to src/main/java/com/seibel/lod/core/a7/datatype/column/accessor/IColumnDataView.java index 0fe554f48..c1a93752c 100644 --- a/src/main/java/com/seibel/lod/core/a7/datatype/column/accessor/ColumnDataView.java +++ b/src/main/java/com/seibel/lod/core/a7/datatype/column/accessor/IColumnDataView.java @@ -2,7 +2,7 @@ package com.seibel.lod.core.a7.datatype.column.accessor; import java.util.Iterator; -public interface ColumnDataView { +public interface IColumnDataView { long get(int index); int size(); @@ -27,7 +27,8 @@ public interface ColumnDataView { int dataCount(); - ColumnDataView subView(int dataIndexStart, int dataCount); + IColumnDataView subView(int dataIndexStart, int dataCount); + @Deprecated //This is unsafe for quadViews. And its a mess for multi-columns! void copyTo(long[] target, int offset); } diff --git a/src/main/java/com/seibel/lod/core/a7/datatype/full/ChunkSizedData.java b/src/main/java/com/seibel/lod/core/a7/datatype/full/ChunkSizedData.java new file mode 100644 index 000000000..50be6e77d --- /dev/null +++ b/src/main/java/com/seibel/lod/core/a7/datatype/full/ChunkSizedData.java @@ -0,0 +1,11 @@ +package com.seibel.lod.core.a7.datatype.full; + +import com.seibel.lod.core.a7.datatype.full.accessor.FullArrayView; + +public class ChunkSizedData extends FullArrayView { + private final long[][] chunkDataArray = new long[16*16][]; + + public ChunkSizedData(long[][] dataArrays) { + super(dataArrays, 16); + } +} \ No newline at end of file diff --git a/src/main/java/com/seibel/lod/core/a7/datatype/full/Data.java b/src/main/java/com/seibel/lod/core/a7/datatype/full/Data.java deleted file mode 100644 index 16dc84e10..000000000 --- a/src/main/java/com/seibel/lod/core/a7/datatype/full/Data.java +++ /dev/null @@ -1,49 +0,0 @@ -package com.seibel.lod.core.a7.datatype.full; - -// Static class for the data format: -// ID: blockState id Y: Height(signed) DP: Depth(signed?) -// =======Bit layout======= -// __ __ __ __ __ __ __ __ <-- Top bits -// YY YY YY YY YY YY YY YY -// YY YY YY YY DP DP DP DP -// DP DP DP DP DP DP DP DP -// ID ID ID ID ID ID IO ID -// ID ID ID ID ID ID IO ID -// ID ID ID ID ID ID IO ID -// ID ID ID ID ID ID IO ID <-- Bottom bits - - -public class Data { - - public static final int ID_WIDTH = 32; - public static final int DP_WIDTH = 12; - public static final int Y_WIDTH = 12; - public static final int ID_OFFSET = 0; - public static final int DP_OFFSET = ID_OFFSET + ID_WIDTH; - public static final int Y_OFFSET = DP_OFFSET + DP_WIDTH; - - public static final int ID_MASK = (int)Math.pow(2, ID_WIDTH) - 1; - public static final int DP_MASK = (int)Math.pow(2, DP_WIDTH) - 1; - public static final int Y_MASK = (int)Math.pow(2, Y_WIDTH) - 1; - - public static long encode(int id, int depth, int y) { - long data = 0; - data |= id & ID_MASK; - data |= (long) (depth & DP_MASK) << DP_OFFSET; - data |= (long) (y & Y_MASK) << Y_OFFSET; - return data; - } - - public static int getId(long data) { - return (int) (data & ID_MASK); - } - - public static int getDepth(long data) { - return (int) (data << (64 - DP_OFFSET - DP_WIDTH) >> DP_OFFSET); - } - - public static int getY(long data) { - return (int) (data << (64 - Y_OFFSET - Y_WIDTH) >> Y_OFFSET); - } - -} diff --git a/src/main/java/com/seibel/lod/core/a7/datatype/full/EGenMode.java b/src/main/java/com/seibel/lod/core/a7/datatype/full/EGenMode.java new file mode 100644 index 000000000..e84505593 --- /dev/null +++ b/src/main/java/com/seibel/lod/core/a7/datatype/full/EGenMode.java @@ -0,0 +1,14 @@ +package com.seibel.lod.core.a7.datatype.full; + +public enum EGenMode { + Empty, + Surface, + Feature, + Complete; + public static EGenMode get(byte genMode) { + return EGenMode.values()[genMode]; + } + public static byte get(EGenMode genMode) { + return (byte) genMode.ordinal(); + } +} diff --git a/src/main/java/com/seibel/lod/core/a7/datatype/full/FullDataSource.java b/src/main/java/com/seibel/lod/core/a7/datatype/full/FullDataSource.java new file mode 100644 index 000000000..5c501d314 --- /dev/null +++ b/src/main/java/com/seibel/lod/core/a7/datatype/full/FullDataSource.java @@ -0,0 +1,61 @@ +package com.seibel.lod.core.a7.datatype.full; + +import com.seibel.lod.core.a7.level.ILevel; +import com.seibel.lod.core.a7.save.io.file.DataMetaFile; +import com.seibel.lod.core.a7.datatype.LodDataSource; +import com.seibel.lod.core.a7.util.IdMappingUtil; +import com.seibel.lod.core.a7.pos.DhSectionPos; +import com.seibel.lod.core.wrapperInterfaces.chunk.IChunkWrapper; + +import java.io.IOException; +import java.io.OutputStream; +import java.util.ArrayList; +import java.util.HashMap; + +public class FullDataSource implements LodDataSource { // 1 chunk + private DhSectionPos sectionPos; + ArrayList idMap; + protected FullDataSource() { + idMap = new ArrayList(); + } + + @Override + public DhSectionPos getSectionPos() { + return sectionPos; + } + + @Override + public byte getDataDetail() { + return 0; + } + + @Override + public void setLocalVersion(int localVer) { + + } + + @Override + public byte getDataVersion() { + return 0; + } + + @Override + public void saveData(ILevel level, DataMetaFile file, OutputStream dataStream) throws IOException { + + } + + public static FullDataSource createNewFromChunk(IChunkWrapper chunk) { + FullDataSource dataContainer = new FullDataSource(); + HashMap idMap = new HashMap(); + + idMap.put(IdMappingUtil.BLOCKSTATE_ID_AIR, 0); + for (int x = 0; x < 16; x++) { + for (int z = 0; z < 16; z++) { + int y = chunk.getMaxY(x, z); + String currentBlockState = IdMappingUtil.BLOCKSTATE_ID_AIR; + // FIXME: Move LodBuilder code to here + } + } + return dataContainer; + } +} diff --git a/src/main/java/com/seibel/lod/core/a7/datatype/full/FullFormat.java b/src/main/java/com/seibel/lod/core/a7/datatype/full/FullFormat.java index 3a8d28bc4..84f8f3d43 100644 --- a/src/main/java/com/seibel/lod/core/a7/datatype/full/FullFormat.java +++ b/src/main/java/com/seibel/lod/core/a7/datatype/full/FullFormat.java @@ -1,62 +1,49 @@ package com.seibel.lod.core.a7.datatype.full; -import com.seibel.lod.core.a7.level.ILevel; -import com.seibel.lod.core.a7.save.io.file.DataMetaFile; -import com.seibel.lod.core.a7.datatype.LodDataSource; -import com.seibel.lod.core.a7.util.IdMappingUtil; -import com.seibel.lod.core.a7.pos.DhSectionPos; -import com.seibel.lod.core.wrapperInterfaces.chunk.IChunkWrapper; +// Static class for the data format: +// ID: blockState id Y: Height(signed) DP: Depth(signed?) +// =======Bit layout======= +// __ __ __ __ __ __ __ __ <-- Top bits +// YY YY YY YY YY YY YY YY +// YY YY YY YY DP DP +// DP DP DP DP DP DP DP DP DP DP +// ID ID ID ID ID ID IO ID +// ID ID ID ID ID ID IO ID +// ID ID ID ID ID ID IO ID +// ID ID ID ID ID ID IO ID <-- Bottom bits +// -import java.io.IOException; -import java.io.OutputStream; -import java.util.ArrayList; -import java.util.HashMap; +public class FullFormat { -public class FullFormat implements LodDataSource { // 1 chunk - private DhSectionPos sectionPos; - ArrayList idMap; + public static final int ID_WIDTH = 32; + public static final int DP_WIDTH = 12; + public static final int Y_WIDTH = 12; + public static final int ID_OFFSET = 0; + public static final int DP_OFFSET = ID_OFFSET + ID_WIDTH; + public static final int Y_OFFSET = DP_OFFSET + DP_WIDTH; - protected FullFormat() { - idMap = new ArrayList(); + public static final int ID_MASK = (int)Math.pow(2, ID_WIDTH) - 1; + public static final int DP_MASK = (int)Math.pow(2, DP_WIDTH) - 1; + public static final int Y_MASK = (int)Math.pow(2, Y_WIDTH) - 1; + + public static long encode(int id, int depth, int y) { + long data = 0; + data |= id & ID_MASK; + data |= (long) (depth & DP_MASK) << DP_OFFSET; + data |= (long) (y & Y_MASK) << Y_OFFSET; + return data; } - @Override - public DhSectionPos getSectionPos() { - return sectionPos; + public static int getId(long data) { + return (int) (data & ID_MASK); } - @Override - public byte getDataDetail() { - return 0; + public static int getDepth(long data) { + return (int) (data << (64 - DP_OFFSET - DP_WIDTH) >> DP_OFFSET); } - @Override - public void setLocalVersion(int localVer) { - + public static int getY(long data) { + return (int) (data << (64 - Y_OFFSET - Y_WIDTH) >> Y_OFFSET); } - @Override - public byte getDataVersion() { - return 0; - } - - @Override - public void saveData(ILevel level, DataMetaFile file, OutputStream dataStream) throws IOException { - - } - - public static FullFormat createNewFromChunk(IChunkWrapper chunk) { - FullFormat dataContainer = new FullFormat(); - HashMap idMap = new HashMap(); - - idMap.put(IdMappingUtil.BLOCKSTATE_ID_AIR, 0); - for (int x = 0; x < 16; x++) { - for (int z = 0; z < 16; z++) { - int y = chunk.getMaxY(x, z); - String currentBlockState = IdMappingUtil.BLOCKSTATE_ID_AIR; - // FIXME: Move LodBuilder code to here - } - } - return dataContainer; - } } diff --git a/src/main/java/com/seibel/lod/core/a7/datatype/full/accessor/FullArrayView.java b/src/main/java/com/seibel/lod/core/a7/datatype/full/accessor/FullArrayView.java new file mode 100644 index 000000000..cdd8dbb69 --- /dev/null +++ b/src/main/java/com/seibel/lod/core/a7/datatype/full/accessor/FullArrayView.java @@ -0,0 +1,53 @@ +package com.seibel.lod.core.a7.datatype.full.accessor; + +public class FullArrayView implements IFullDataView { + private final long[][] dataArrays; + private final int offset; + private final int size; + + public FullArrayView(long[][] dataArrays, int size) { + if (dataArrays.length != size*size) + throw new IllegalArgumentException( + "tried constructing dataArrayView with invalid input!"); + this.dataArrays = dataArrays; + this.size = size; + offset = 0; + } + public FullArrayView(FullArrayView source, int size, int offsetX, int offsetZ) { + if (source.size < size || source.size < size+offsetX || source.size < size+offsetZ) + throw new IllegalArgumentException( + "tried constructing dataArrayView subview with invalid input!"); + dataArrays = source.dataArrays; + this.size = size; + offset = source.offset + offsetX * size + offsetZ; + } + + @Override + public SingleFullArrayView get(int index) { + return new SingleFullArrayView(dataArrays, index + offset); + } + + @Override + public SingleFullArrayView get(int x, int z) { + return new SingleFullArrayView(dataArrays, x*size + z + offset); + } + + @Override + public int width() { + return size; + } + + @Override + public IFullDataView subView(int size, int ox, int oz) { + return new FullArrayView(this, size, ox, oz); + } + + public void copyTo(FullArrayView target) { + if (target.size != size) + throw new IllegalArgumentException("Target view must have same size as this view"); + for (int x=0; x iterator() { + return new Iterator() { + private int index = 0; + private final int size = width(); + @Override + public boolean hasNext() { + return index < size; + } + + @Override + public SingleFullArrayView next() { + return get(index++); + } + }; + } + IFullDataView subView(int size, int ox, int oz); +} diff --git a/src/main/java/com/seibel/lod/core/a7/datatype/full/accessor/SingleFullArrayView.java b/src/main/java/com/seibel/lod/core/a7/datatype/full/accessor/SingleFullArrayView.java new file mode 100644 index 000000000..b554b877b --- /dev/null +++ b/src/main/java/com/seibel/lod/core/a7/datatype/full/accessor/SingleFullArrayView.java @@ -0,0 +1,49 @@ +package com.seibel.lod.core.a7.datatype.full.accessor; + +public class SingleFullArrayView implements IFullDataView { + private final long[][] dataArrays; + private final int offset; + public SingleFullArrayView(long[][] dataArrays, int offset) { + this.dataArrays = dataArrays; + this.offset = offset; + } + + public boolean doesItExist() { + return dataArrays[offset].length!=0; + } + + @Override + public SingleFullArrayView get(int index) { + if (index != 0) throw new IllegalArgumentException("Only contains 1 column of full data!"); + return this; + } + + @Override + public SingleFullArrayView get(int x, int z) { + if (x != 0 || z != 0) throw new IllegalArgumentException("Only contains 1 column of full data!"); + return this; + } + + public long getSingle(int yIndex) { + return dataArrays[offset][yIndex]; + } + public void setSingle(int yIndex, long value) { + dataArrays[offset][yIndex] = value; + } + public void setNew(long[] newArray) { + dataArrays[offset] = newArray; + } + + @Override + public int width() { + return 1; + } + + @Override + public IFullDataView subView(int size, int ox, int oz) { + if (size != 1 || ox != 1 || oz != 1) + throw new IllegalArgumentException("Getting invalid range of subView from SingleFullArrayView!"); + return this; + } + +} diff --git a/src/main/java/com/seibel/lod/core/a7/datatype/transform/LodDataBuilder.java b/src/main/java/com/seibel/lod/core/a7/datatype/transform/LodDataBuilder.java new file mode 100644 index 000000000..c2e44a6b5 --- /dev/null +++ b/src/main/java/com/seibel/lod/core/a7/datatype/transform/LodDataBuilder.java @@ -0,0 +1,13 @@ +package com.seibel.lod.core.a7.datatype.transform; + +import com.seibel.lod.core.a7.datatype.full.ChunkSizedData; +import com.seibel.lod.core.wrapperInterfaces.chunk.IChunkWrapper; + +public class LodDataBuilder { + public static ChunkSizedData createChunkData(IChunkWrapper chunk) { + + + + + } +} diff --git a/src/main/java/com/seibel/lod/core/a7/save/io/file/DataMetaFile.java b/src/main/java/com/seibel/lod/core/a7/save/io/file/DataMetaFile.java index f0ad1851e..56b66de71 100644 --- a/src/main/java/com/seibel/lod/core/a7/save/io/file/DataMetaFile.java +++ b/src/main/java/com/seibel/lod/core/a7/save/io/file/DataMetaFile.java @@ -12,7 +12,7 @@ import java.util.concurrent.locks.ReentrantReadWriteLock; import com.seibel.lod.core.a7.datatype.LodDataSource; import com.seibel.lod.core.a7.datatype.DataSourceLoader; -import com.seibel.lod.core.a7.datatype.full.Data; +import com.seibel.lod.core.a7.datatype.full.FullFormat; import com.seibel.lod.core.a7.save.io.MetaFile; import com.seibel.lod.core.a7.level.ILevel; import com.seibel.lod.core.a7.pos.DhSectionPos; @@ -36,13 +36,13 @@ public class DataMetaFile extends MetaFile { //TODO: use ConcurrentAppendSingleSwapContainer instead of below: private static class GuardedMultiAppendQueue { ReentrantReadWriteLock appendLock = new ReentrantReadWriteLock(); - ConcurrentLinkedQueue queue = new ConcurrentLinkedQueue<>(); + ConcurrentLinkedQueue queue = new ConcurrentLinkedQueue<>(); } AtomicReference writeQueue = new AtomicReference<>(new GuardedMultiAppendQueue()); GuardedMultiAppendQueue _backQueue = new GuardedMultiAppendQueue(); - public void addToWriteQueue(Data datatype) { + public void addToWriteQueue(FullFormat datatype) { GuardedMultiAppendQueue queue = writeQueue.get(); // Using read lock is OK, because the queue's underlying data structure is thread-safe. // This lock is only used to insure on polling the queue, that the queue is not being diff --git a/src/main/java/com/seibel/lod/core/a7/save/io/file/IDataSourceProvider.java b/src/main/java/com/seibel/lod/core/a7/save/io/file/IDataSourceProvider.java index feb45b62c..7bb45eace 100644 --- a/src/main/java/com/seibel/lod/core/a7/save/io/file/IDataSourceProvider.java +++ b/src/main/java/com/seibel/lod/core/a7/save/io/file/IDataSourceProvider.java @@ -1,7 +1,7 @@ package com.seibel.lod.core.a7.save.io.file; import com.seibel.lod.core.a7.datatype.LodDataSource; -import com.seibel.lod.core.a7.datatype.full.Data; +import com.seibel.lod.core.a7.datatype.full.FullFormat; import com.seibel.lod.core.a7.pos.DhSectionPos; import java.io.File; @@ -12,6 +12,6 @@ public interface IDataSourceProvider extends AutoCloseable { void addScannedFile(Collection detectedFiles); CompletableFuture read(DhSectionPos pos); - void write(DhSectionPos sectionPos, Data chunkData); + void write(DhSectionPos sectionPos, FullFormat chunkData); CompletableFuture flushAndSave(); } diff --git a/src/main/java/com/seibel/lod/core/a7/save/io/file/LocalDataFileHandler.java b/src/main/java/com/seibel/lod/core/a7/save/io/file/LocalDataFileHandler.java index d8a55a9ed..ef8a182e7 100644 --- a/src/main/java/com/seibel/lod/core/a7/save/io/file/LocalDataFileHandler.java +++ b/src/main/java/com/seibel/lod/core/a7/save/io/file/LocalDataFileHandler.java @@ -2,7 +2,7 @@ package com.seibel.lod.core.a7.save.io.file; import com.google.common.collect.HashMultimap; import com.seibel.lod.core.a7.datatype.LodDataSource; -import com.seibel.lod.core.a7.datatype.full.Data; +import com.seibel.lod.core.a7.datatype.full.FullFormat; import com.seibel.lod.core.a7.level.IServerLevel; import com.seibel.lod.core.a7.pos.DhSectionPos; import com.seibel.lod.core.logging.DhLoggerBuilder; @@ -110,7 +110,7 @@ public class LocalDataFileHandler implements IDataSourceProvider { * This call is concurrent. I.e. it supports multiple threads calling this method at the same time. */ @Override - public void write(DhSectionPos sectionPos, Data chunkData) { + public void write(DhSectionPos sectionPos, FullFormat chunkData) { DataMetaFile metaFile = files.get(sectionPos); if (metaFile != null) { // Fast path: if there is a file for this section, just write to it. metaFile.addToWriteQueue(chunkData); diff --git a/src/main/java/com/seibel/lod/core/a7/save/io/file/RemoteDataFileHandler.java b/src/main/java/com/seibel/lod/core/a7/save/io/file/RemoteDataFileHandler.java index 5a5d34c64..8d0eeb51a 100644 --- a/src/main/java/com/seibel/lod/core/a7/save/io/file/RemoteDataFileHandler.java +++ b/src/main/java/com/seibel/lod/core/a7/save/io/file/RemoteDataFileHandler.java @@ -1,7 +1,7 @@ package com.seibel.lod.core.a7.save.io.file; import com.seibel.lod.core.a7.datatype.LodDataSource; -import com.seibel.lod.core.a7.datatype.full.Data; +import com.seibel.lod.core.a7.datatype.full.FullFormat; import com.seibel.lod.core.a7.pos.DhSectionPos; import java.io.File; @@ -20,7 +20,7 @@ public class RemoteDataFileHandler implements IDataSourceProvider { } @Override - public void write(DhSectionPos sectionPos, Data chunkData) { + public void write(DhSectionPos sectionPos, FullFormat chunkData) { } diff --git a/src/main/java/com/seibel/lod/core/a7/save/io/render/IRenderSourceProvider.java b/src/main/java/com/seibel/lod/core/a7/save/io/render/IRenderSourceProvider.java index 63430309f..d8731b89d 100644 --- a/src/main/java/com/seibel/lod/core/a7/save/io/render/IRenderSourceProvider.java +++ b/src/main/java/com/seibel/lod/core/a7/save/io/render/IRenderSourceProvider.java @@ -1,6 +1,6 @@ package com.seibel.lod.core.a7.save.io.render; -import com.seibel.lod.core.a7.datatype.full.Data; +import com.seibel.lod.core.a7.datatype.full.FullFormat; import com.seibel.lod.core.a7.pos.DhSectionPos; import java.io.File; @@ -9,6 +9,6 @@ import java.util.concurrent.CompletableFuture; public interface IRenderSourceProvider extends AutoCloseable { void addScannedFile(Collection detectedFiles); - void write(DhSectionPos sectionPos, Data chunkData); + void write(DhSectionPos sectionPos, FullFormat chunkData); CompletableFuture flushAndSave(); } diff --git a/src/main/java/com/seibel/lod/core/a7/save/io/render/RenderFileHandler.java b/src/main/java/com/seibel/lod/core/a7/save/io/render/RenderFileHandler.java index ef687baf9..bc3bf7abc 100644 --- a/src/main/java/com/seibel/lod/core/a7/save/io/render/RenderFileHandler.java +++ b/src/main/java/com/seibel/lod/core/a7/save/io/render/RenderFileHandler.java @@ -1,7 +1,7 @@ package com.seibel.lod.core.a7.save.io.render; import com.seibel.lod.core.a7.datatype.RenderSourceLoader; -import com.seibel.lod.core.a7.datatype.full.Data; +import com.seibel.lod.core.a7.datatype.full.FullFormat; import com.seibel.lod.core.a7.save.io.file.IDataSourceProvider; import com.seibel.lod.core.a7.pos.DhSectionPos; import com.seibel.lod.core.logging.DhLoggerBuilder; @@ -36,7 +36,7 @@ public class RenderFileHandler implements IRenderSourceProvider { } @Override - public void write(DhSectionPos sectionPos, Data chunkData) { + public void write(DhSectionPos sectionPos, FullFormat chunkData) { }