diff --git a/src/main/java/com/seibel/lod/core/a7/datatype/column/ColumnRenderSource.java b/src/main/java/com/seibel/lod/core/a7/datatype/column/ColumnRenderSource.java index c685031c7..e3b45b397 100644 --- a/src/main/java/com/seibel/lod/core/a7/datatype/column/ColumnRenderSource.java +++ b/src/main/java/com/seibel/lod/core/a7/datatype/column/ColumnRenderSource.java @@ -1,6 +1,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.ColumnFormat; import com.seibel.lod.core.a7.datatype.column.accessor.ColumnQuadView; import com.seibel.lod.core.a7.datatype.column.accessor.IColumnDatatype; import com.seibel.lod.core.a7.datatype.column.render.ColumnRenderBuffer; 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 f5788dae1..a05d95051 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 @@ -1,15 +1,13 @@ package com.seibel.lod.core.a7.datatype.column.accessor; -import com.seibel.lod.core.a7.datatype.column.ColumnFormat; - import java.util.Arrays; public final class ColumnArrayView implements IColumnDataView { - private final long[] data; - private final int size; // size in longs - private final int offset; // offset in longs - private final int vertSize; // vertical size in longs + final long[] data; + final int size; // size in longs + final int offset; // offset in longs + final int vertSize; // vertical size in longs public ColumnArrayView(long[] data, int size, int offset, int vertSize) { this.data = data; @@ -53,12 +51,12 @@ public final class ColumnArrayView implements IColumnDataView { if (source.verticalSize() != vertSize) { for (int i = 0; i < source.dataCount(); i++) { int outputOffset = offset + outputDataIndexOffset * vertSize + i * vertSize; - source.subView(i, 1).copyTo(data, outputOffset); + source.subView(i, 1).copyTo(data, outputOffset, source.verticalSize()); Arrays.fill(data, outputOffset + source.verticalSize(), outputOffset + vertSize, 0); } } else { - source.copyTo(data, offset + outputDataIndexOffset * vertSize); + source.copyTo(data, offset + outputDataIndexOffset * vertSize, source.size()); } } public void copyFrom(IColumnDataView source) { @@ -66,7 +64,7 @@ public final class ColumnArrayView implements IColumnDataView { } @Override - public void copyTo(long[] target, int offset) { + public void copyTo(long[] target, int offset, int size) { System.arraycopy(data, this.offset, target, offset, size); } @@ -113,4 +111,22 @@ public final class ColumnArrayView implements IColumnDataView { } ColumnFormat.mergeMultiData(source, this); } + + @Override + public String toString() { + StringBuilder sb = new StringBuilder(); + sb.append("S:"); + sb.append(size); + sb.append(" V:"); + sb.append(vertSize); + sb.append(" O:"); + sb.append(offset); + sb.append(" ["); + for (int i=0; i. */ -package com.seibel.lod.core.a7.datatype.column; +package com.seibel.lod.core.a7.datatype.column.accessor; import com.seibel.lod.core.a7.datatype.column.accessor.ColumnArrayView; import com.seibel.lod.core.a7.datatype.column.accessor.IColumnDataView; @@ -111,7 +111,7 @@ public class ColumnFormat public static long createDataPoint(int height, int depth, int color, int light, int generationMode) { - LodUtil.assertTrue(light >= 0 && light <= 255, "Raw Light value must be between 0 and 255!"); + LodUtil.assertTrue(light >= 0 && light < 256, "Raw Light value must be between 0 and 255!"); return createDataPoint( ColorUtil.getAlpha(color), ColorUtil.getRed(color), @@ -127,10 +127,10 @@ public class ColumnFormat LodUtil.assertTrue(depth >= 0 && depth < MAX_WORLD_Y_SIZE, "Trying to create datapoint with depth[{}] out of range!", depth); LodUtil.assertTrue(lightSky >= 0 && lightSky < 16, "Trying to create datapoint with lightSky[{}] out of range!", lightSky); LodUtil.assertTrue(lightBlock >= 0 && lightBlock < 16, "Trying to create datapoint with lightBlock[{}] out of range!", lightBlock); - LodUtil.assertTrue(alpha >= 0 && alpha < 255, "Trying to create datapoint with alpha[{}] out of range!", alpha); - LodUtil.assertTrue(red >= 0 && red < 255, "Trying to create datapoint with red[{}] out of range!", red); - LodUtil.assertTrue(green >= 0 && green < 255, "Trying to create datapoint with green[{}] out of range!", green); - LodUtil.assertTrue(blue >= 0 && blue < 255, "Trying to create datapoint with blue[{}] out of range!", blue); + LodUtil.assertTrue(alpha >= 0 && alpha < 256, "Trying to create datapoint with alpha[{}] out of range!", alpha); + LodUtil.assertTrue(red >= 0 && red < 256, "Trying to create datapoint with red[{}] out of range!", red); + LodUtil.assertTrue(green >= 0 && green < 256, "Trying to create datapoint with green[{}] out of range!", green); + LodUtil.assertTrue(blue >= 0 && blue < 256, "Trying to create datapoint with blue[{}] out of range!", blue); LodUtil.assertTrue(generationMode >= 0 && generationMode < 8, "Trying to create datapoint with genMode[{}] out of range!", generationMode); LodUtil.assertTrue(depth <= height, "Trying to create datapoint with depth[{}] greater than height[{}]!", depth, height); @@ -253,17 +253,17 @@ public class ColumnFormat @SuppressWarnings("unused") public static String toString(long dataPoint) { - return getHeight(dataPoint) + " " + - getDepth(dataPoint) + " " + - getAlpha(dataPoint) + " " + + if (!doesItExist(dataPoint)) return "null"; + if (isVoid(dataPoint)) return "void"; + return "H:" + getHeight(dataPoint) + + " D:" + getDepth(dataPoint) + + " argb:" + getAlpha(dataPoint) + " " + getRed(dataPoint) + " " + getBlue(dataPoint) + " " + - getGreen(dataPoint) + " " + - getLightBlock(dataPoint) + " " + - getLightSky(dataPoint) + " " + - getGenerationMode(dataPoint) + " " + - isVoid(dataPoint) + " " + - doesItExist(dataPoint) + '\n'; + getGreen(dataPoint) + + " BL/SL:" + getLightBlock(dataPoint) + " " + + getLightSky(dataPoint) + + " G:" + getGenerationMode(dataPoint); } @@ -664,7 +664,7 @@ public class ColumnFormat if (!limited && dataCount == 1) // This mean source vertSize < output vertSize AND both dataCount == 1 { - output.copyFrom(sourceData); + sourceData.copyTo(output.data, output.offset, output.vertSize); } else { 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 bbc8e1793..228e48938 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 @@ -54,7 +54,7 @@ public class ColumnQuadView implements IColumnDataView { 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 * perColumnOffset + z * vertSize); + singleColumn.copyTo(data, x * perColumnOffset + z * vertSize, singleColumn.size()); } @Override @@ -86,9 +86,14 @@ public class ColumnQuadView implements IColumnDataView { } @Override - public void copyTo(long[] target, int offset) { - for (int x = 0; x < xSize; x++) { - System.arraycopy(data, this.offset + x * perColumnOffset, target, offset + x * xSize * vertSize, zSize * vertSize); + public void copyTo(long[] target, int offset, int size) { + if (size != this.size() && size > zSize * vertSize) throw new UnsupportedOperationException("Not supported yet"); + if (size <= zSize * vertSize) { + System.arraycopy(data, this.offset, target, offset, size); + } else { + for (int x = 0; x < xSize; x++) { + 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/IColumnDataView.java b/src/main/java/com/seibel/lod/core/a7/datatype/column/accessor/IColumnDataView.java index c1a93752c..a1b3650e6 100644 --- a/src/main/java/com/seibel/lod/core/a7/datatype/column/accessor/IColumnDataView.java +++ b/src/main/java/com/seibel/lod/core/a7/datatype/column/accessor/IColumnDataView.java @@ -29,6 +29,5 @@ public interface IColumnDataView { 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); + void copyTo(long[] target, int offset, int count); } diff --git a/src/main/java/com/seibel/lod/core/a7/datatype/column/render/ColumnRenderBuffer.java b/src/main/java/com/seibel/lod/core/a7/datatype/column/render/ColumnRenderBuffer.java index c6b5887bb..61edc562e 100644 --- a/src/main/java/com/seibel/lod/core/a7/datatype/column/render/ColumnRenderBuffer.java +++ b/src/main/java/com/seibel/lod/core/a7/datatype/column/render/ColumnRenderBuffer.java @@ -191,7 +191,7 @@ public class ColumnRenderBuffer extends RenderBuffer { (short) (skyLightCullingBelow - clientLevel.getMinY())); makeLodRenderData(builder, data, adjData); if (builder.getCurrentQuadsCount() > 0) { - LOGGER.info("her"); + //LOGGER.info("her"); } EVENT_LOGGER.trace("RenderRegion end QuadBuild @ {}", data.sectionPos); return builder; @@ -248,9 +248,8 @@ public class ColumnRenderBuffer extends RenderBuffer { EDebugMode debugMode = Config.Client.Advanced.Debugging.debugMode.get(); byte detailLevel = region.getDataDetail(); - int dataSize = 1 << detailLevel; - for (int x = 0; x < dataSize; x++) { - for (int z = 0; z < dataSize; z++) { + for (int x = 0; x < ColumnRenderSource.SECTION_SIZE; x++) { + for (int z = 0; z < ColumnRenderSource.SECTION_SIZE; z++) { UncheckedInterruptedException.throwIfInterrupted(); ColumnArrayView posData = region.getVerticalDataView(x, z); @@ -278,8 +277,8 @@ public class ColumnRenderBuffer extends RenderBuffer { try { int xAdj = x + lodDirection.getNormal().x; int zAdj = z + lodDirection.getNormal().z; - boolean isCrossRegionBoundary = (xAdj < 0 || xAdj >= dataSize) || - (zAdj < 0 || zAdj >= dataSize); + boolean isCrossRegionBoundary = (xAdj < 0 || xAdj >= ColumnRenderSource.SECTION_SIZE) || + (zAdj < 0 || zAdj >= ColumnRenderSource.SECTION_SIZE); ColumnRenderSource adjRegion; byte adjDetail; @@ -293,10 +292,10 @@ public class ColumnRenderBuffer extends RenderBuffer { if (adjDetail != detailLevel) { //TODO: Implement this } else { - if (xAdj < 0) xAdj += dataSize; - if (zAdj < 0) zAdj += dataSize; - if (xAdj >= dataSize) xAdj -= dataSize; - if (zAdj >= dataSize) zAdj -= dataSize; + if (xAdj < 0) xAdj += ColumnRenderSource.SECTION_SIZE; + if (zAdj < 0) zAdj += ColumnRenderSource.SECTION_SIZE; + if (xAdj >= ColumnRenderSource.SECTION_SIZE) xAdj -= ColumnRenderSource.SECTION_SIZE; + if (zAdj >= ColumnRenderSource.SECTION_SIZE) zAdj -= ColumnRenderSource.SECTION_SIZE; } } else { adjRegion = region; 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 3be1c94e7..883c2f071 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 @@ -16,7 +16,7 @@ package com.seibel.lod.core.a7.datatype.full; import com.seibel.lod.core.util.LodUtil; import org.jetbrains.annotations.Contract; -import static com.seibel.lod.core.a7.datatype.column.ColumnFormat.MAX_WORLD_Y_SIZE; +import static com.seibel.lod.core.a7.datatype.column.accessor.ColumnFormat.MAX_WORLD_Y_SIZE; public class FullFormat { diff --git a/src/main/java/com/seibel/lod/core/a7/datatype/transform/FullToColumnTransformer.java b/src/main/java/com/seibel/lod/core/a7/datatype/transform/FullToColumnTransformer.java index 009b51776..9b4bcd650 100644 --- a/src/main/java/com/seibel/lod/core/a7/datatype/transform/FullToColumnTransformer.java +++ b/src/main/java/com/seibel/lod/core/a7/datatype/transform/FullToColumnTransformer.java @@ -1,6 +1,6 @@ package com.seibel.lod.core.a7.datatype.transform; -import com.seibel.lod.core.a7.datatype.column.ColumnFormat; +import com.seibel.lod.core.a7.datatype.column.accessor.ColumnFormat; import com.seibel.lod.core.a7.datatype.column.ColumnRenderSource; import com.seibel.lod.core.a7.datatype.column.accessor.ColumnArrayView; import com.seibel.lod.core.a7.datatype.full.FullDataSource; @@ -82,6 +82,7 @@ public class FullToColumnTransformer { private static void iterateAndConvert(IClientLevel level, int blockX, int blockZ, int genMode, ColumnArrayView column, SingleFullArrayView data) { IdBiomeBlockStateMap mapping = data.getMapping(); boolean isVoid = true; + int offset = 0; for (int i = 0; i < data.getSingleLength(); i++) { long fullData = data.getSingle(i); int y = FullFormat.getY(fullData); @@ -95,7 +96,8 @@ public class FullToColumnTransformer { isVoid = false; int color = level.computeBaseColor(new DHBlockPos(blockX, y + level.getMinY(), blockZ), biome, block); long columnData = ColumnFormat.createDataPoint(y + blockLength, y, color, light, genMode); - column.set(i, columnData); + column.set(offset, columnData); + offset++; } if (isVoid) { column.set(0, ColumnFormat.createVoidDataPoint((byte) genMode)); diff --git a/src/main/java/com/seibel/lod/core/a7/render/a7LodRenderer.java b/src/main/java/com/seibel/lod/core/a7/render/a7LodRenderer.java index 46baca9b8..f32f38f46 100644 --- a/src/main/java/com/seibel/lod/core/a7/render/a7LodRenderer.java +++ b/src/main/java/com/seibel/lod/core/a7/render/a7LodRenderer.java @@ -70,7 +70,8 @@ public class a7LodRenderer public static final boolean ENABLE_IBO = true; public void setupOffset(DHBlockPos pos) { - shaderProgram.setModelPos(new Vec3f(pos.x, pos.y, pos.z)); + Vec3d cam = MC_RENDER.getCameraExactPosition(); + shaderProgram.setModelPos(new Vec3f((float) (pos.x - cam.x), (float) (pos.y - cam.y), (float) (pos.z - cam.z))); } public void drawVbo(GLVertexBuffer vbo) { diff --git a/src/main/java/com/seibel/lod/core/a7/save/io/MetaFile.java b/src/main/java/com/seibel/lod/core/a7/save/io/MetaFile.java index 799237fd7..3ef6a3edb 100644 --- a/src/main/java/com/seibel/lod/core/a7/save/io/MetaFile.java +++ b/src/main/java/com/seibel/lod/core/a7/save/io/MetaFile.java @@ -60,7 +60,7 @@ public class MetaFile { public long dataTypeId; public byte loaderVersion; - private static final ReentrantReadWriteLock assertLock = new ReentrantReadWriteLock(); + private final ReentrantReadWriteLock assertLock = new ReentrantReadWriteLock(); // Load a metaFile in this path. It also automatically read the metadata. protected MetaFile(File path) throws IOException { diff --git a/src/main/java/com/seibel/lod/core/wrapperInterfaces/chunk/IChunkWrapper.java b/src/main/java/com/seibel/lod/core/wrapperInterfaces/chunk/IChunkWrapper.java index 92320c728..36d822328 100644 --- a/src/main/java/com/seibel/lod/core/wrapperInterfaces/chunk/IChunkWrapper.java +++ b/src/main/java/com/seibel/lod/core/wrapperInterfaces/chunk/IChunkWrapper.java @@ -40,15 +40,6 @@ public interface IChunkWrapper extends IBindable int getMaxBuildHeight(); int getHeightMapValue(int xRel, int zRel); - - IBiomeWrapper getBiome(int x, int y, int z); - - @Deprecated - IBlockDetailWrapper getBlockDetail(int x, int y, int z); - - /** Returns null if block doesn't exist. Note that this can cross chunk boundaries. */ - @Deprecated - IBlockDetailWrapper getBlockDetailAtFace(int x, int y, int z, ELodDirection dir); @Deprecated int getChunkPosX(); @@ -85,8 +76,6 @@ public interface IChunkWrapper extends IBindable boolean doesNearbyChunksExist(); String toString(); - - /** This is a bad hash algorithm, but can be used for rough debugging. */ default int roughHashCode() { @@ -105,6 +94,7 @@ public interface IChunkWrapper extends IBindable } IBlockStateWrapper getBlockState(int x, int y, int z); + IBiomeWrapper getBiome(int x, int y, int z); default DHChunkPos getChunkPos() { return new DHChunkPos(getChunkPosX(), getChunkPosZ());