another change to save format... now there is no static offset

This commit is contained in:
cola98765
2021-12-13 10:41:33 +01:00
parent 8ef0d40f0c
commit c811e6bad6
5 changed files with 73 additions and 11 deletions
@@ -134,7 +134,7 @@ public class CubicLodTemplate
color = vertexOptimizer.getColor(lodDirection);
addPosAndColor(buffer,
vertexOptimizer.getX(lodDirection, vertexIndex),
vertexOptimizer.getY(lodDirection, vertexIndex, verticalFaceIndex) + DataPointUtil.VERTICAL_OFFSET,
vertexOptimizer.getY(lodDirection, vertexIndex, verticalFaceIndex),
vertexOptimizer.getZ(lodDirection, vertexIndex),
color, skyLight, blockLight );
}
@@ -285,7 +285,7 @@ public class LodBuilder
lightSky = (light >> 4) & 0b1111;
isDefault = ((light >> 8)) == 1;
dataToMerge[index * verticalData + count] = DataPointUtil.createDataPoint(height - DataPointUtil.VERTICAL_OFFSET, depth - DataPointUtil.VERTICAL_OFFSET, color, lightSky, lightBlock, generation, isDefault);
dataToMerge[index * verticalData + count] = DataPointUtil.createDataPoint(height, depth, color, lightSky, lightBlock, generation, isDefault);
topBlock = false;
yAbs = depth - 1;
count++;
@@ -78,7 +78,7 @@ public class LodDimensionFileHandler
* file handler, older versions (smaller numbers) will be deleted and overwritten,
* newer versions (larger numbers) will be ignored and won't be read.
*/
public static final int LOD_SAVE_FILE_VERSION = 7;
public static final int LOD_SAVE_FILE_VERSION = 8;
/**
* Allow saving asynchronously, but never try to save multiple regions
@@ -208,14 +208,14 @@ public class LodDimensionFileHandler
break;
}
else if (fileVersion == 6)
else if (fileVersion < LOD_SAVE_FILE_VERSION)
{
//this is old, but readable version
byte[] data = ThreadMapUtil.getSaveContainer(tempDetailLevel);
inputStream.read(data);
inputStream.close();
// add the data to our region
region.addLevelContainer(new VerticalLevelContainer(data, 6));
region.addLevelContainer(new VerticalLevelContainer(data, fileVersion));
} else
{
// this file is a readable version,
@@ -24,6 +24,7 @@ import com.seibel.lod.core.util.DetailDistanceUtil;
import com.seibel.lod.core.util.LevelPosUtil;
import com.seibel.lod.core.util.LodUtil;
import com.seibel.lod.core.util.ThreadMapUtil;
import com.seibel.lod.forge.wrappers.VersionConstants;
/**
*
@@ -123,6 +124,7 @@ public class VerticalLevelContainer implements LevelContainer
size = 1 << (LodUtil.REGION_DETAIL_LEVEL - detailLevel);
int x = size * size * tempMaxVerticalData;
long[] tempDataContainer = new long[x];
short minHeight = (short) VersionConstants.INSTANCE.getMinimumWorldHeight();
if (version == 6)
{
@@ -138,17 +140,17 @@ public class VerticalLevelContainer implements LevelContainer
DataPointUtil.getRed(newData),
DataPointUtil.getGreen(newData),
DataPointUtil.getBlue(newData),
DataPointUtil.getHeight(newData) - DataPointUtil.VERTICAL_OFFSET,
DataPointUtil.getDepth(newData) - DataPointUtil.VERTICAL_OFFSET,
DataPointUtil.getHeight(newData) - minHeight,
DataPointUtil.getDepth(newData) - minHeight,
DataPointUtil.getLightSky(newData),
DataPointUtil.getLightBlock(newData),
DataPointUtil.getGenerationMode(newData),
DataPointUtil.getFlag(newData)
);
DataPointUtil.getFlag(newData));
tempDataContainer[i] = newData;
}
}
else //if (version == 7)
else if (version == 7)
{
for (int i = 0; i < x; i++)
{
@@ -156,9 +158,63 @@ public class VerticalLevelContainer implements LevelContainer
for (tempIndex = 0; tempIndex < 8; tempIndex++)
newData += (((long) inputData[index + tempIndex]) & 0xff) << (8 * tempIndex);
index += 8;
newData = DataPointUtil.createDataPoint(
DataPointUtil.getAlpha(newData),
DataPointUtil.getRed(newData),
DataPointUtil.getGreen(newData),
DataPointUtil.getBlue(newData),
DataPointUtil.getHeight(newData) - 64 - minHeight,
DataPointUtil.getDepth(newData) - 64 - minHeight,
DataPointUtil.getLightSky(newData),
DataPointUtil.getLightBlock(newData),
DataPointUtil.getGenerationMode(newData),
DataPointUtil.getFlag(newData));
tempDataContainer[i] = newData;
}
}
else //if (version == 8)
{
short tempMinHeight = inputData[index];
index++;
tempMinHeight |= inputData[index] << 8;
index++;
if (tempMinHeight != minHeight)
{
for (int i = 0; i < x; i++)
{
newData = 0;
for (tempIndex = 0; tempIndex < 8; tempIndex++)
newData |= ((long) inputData[index + tempIndex]) << (8 * tempIndex);
index += 8;
newData = DataPointUtil.createDataPoint(
DataPointUtil.getAlpha(newData),
DataPointUtil.getRed(newData),
DataPointUtil.getGreen(newData),
DataPointUtil.getBlue(newData),
DataPointUtil.getHeight(newData) + tempMinHeight - minHeight,
DataPointUtil.getDepth(newData) + tempMinHeight - minHeight,
DataPointUtil.getLightSky(newData),
DataPointUtil.getLightBlock(newData),
DataPointUtil.getGenerationMode(newData),
DataPointUtil.getFlag(newData));
tempDataContainer[i] = newData;
}
}
else
{
for (int i = 0; i < x; i++)
{
newData = 0;
for (tempIndex = 0; tempIndex < 8; tempIndex++)
newData |= ((long) inputData[index + tempIndex]) << (8 * tempIndex);
index += 8;
tempDataContainer[i] = newData;
}
}
}
if (tempMaxVerticalData > DetailDistanceUtil.getMaxVerticalData(detailLevel))
{
@@ -221,11 +277,17 @@ public class VerticalLevelContainer implements LevelContainer
long current;
boolean allGenerated = true;
byte[] tempData = ThreadMapUtil.getSaveContainer(detailLevel);
short minHeight = (short) VersionConstants.INSTANCE.getMinimumWorldHeight();
tempData[index] = detailLevel;
index++;
tempData[index] = (byte) maxVerticalData;
index++;
tempData[index] = (byte) (minHeight & 0xFF);
index++;
tempData[index] = (byte) ((minHeight >> 8) & 0xFF);
index++;
int j;
for (int i = 0; i < x; i++)
{
@@ -145,7 +145,7 @@ public class ThreadMapUtil
int size = 1;
for (int i = LodUtil.DETAIL_OPTIONS - 1; i >= 0; i--)
{
array[i] = new byte[2 + 8 * size * size * DetailDistanceUtil.getMaxVerticalData(i)];
array[i] = new byte[4 + 8 * size * size * DetailDistanceUtil.getMaxVerticalData(i)];
size = size << 1;
}
saveContainer.put(Thread.currentThread().getName(), array);