Fixed Critical Vanilla Save corrupt issue. Fixed? world gen not starting

This commit is contained in:
tom lee
2022-01-20 19:27:32 +08:00
parent 914a76297d
commit c69569c95f
7 changed files with 137 additions and 101 deletions
@@ -22,6 +22,7 @@ package com.seibel.lod.core.builders.lodBuilding;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import com.seibel.lod.core.api.ClientApi;
import com.seibel.lod.core.enums.config.DistanceGenerationMode;
import com.seibel.lod.core.objects.lod.LodDimension;
import com.seibel.lod.core.objects.lod.LodRegion;
@@ -146,15 +147,6 @@ public class LodBuilder
lodGenThreadPool.execute(thread);
}
/**
* Creates a LodNode for a chunk in the given world.
* @throws IllegalArgumentException thrown if either the chunk or world is null.
*/
public void generateLodNodeFromChunk(LodDimension lodDim, IChunkWrapper chunk) throws IllegalArgumentException
{
generateLodNodeFromChunk(lodDim, chunk, new LodBuilderConfig(), false);
}
/**
* Creates a LodNode for a chunk in the given world.
* @throws IllegalArgumentException thrown if either the chunk or world is null.
@@ -189,6 +181,12 @@ public class LodBuilder
int subX = i/16;
int subZ = i%16;
writeVerticalData(data, i*maxVerticalData, maxVerticalData, chunk, config, subX, subZ);
if (DataPointUtil.isVoid(data[i*maxVerticalData]))
ClientApi.LOGGER.info("Datapoint is Void: {}, {}", chunk.getMinX()+subX, chunk.getMinZ()+subZ);
if (!DataPointUtil.doesItExist(data[i*maxVerticalData]))
throw new RuntimeException("Datapoint does not exist at "+ chunk.getMinX()+subX +", "+ chunk.getMinZ()+subZ);
if (DataPointUtil.getGenerationMode(data[i*maxVerticalData]) != config.distanceGenerationMode.complexity)
throw new RuntimeException("Datapoint invalid at "+ chunk.getMinX()+subX +", "+ chunk.getMinZ()+subZ);
}
if (!chunk.isLightCorrect()) return false;
@@ -196,12 +194,19 @@ public class LodBuilder
try {
if (region.getMinDetailLevel()!= 0) {
LodRegion newRegion = lodDim.getRegionFromFile(region, (byte)0, region.getVerticalQuality());
assert(region==newRegion);
}
if (region.addChunkOfData((byte)0, chunk.getMinX(), chunk.getMinZ(), 16, 16, data, maxVerticalData, true)) {
region.regenerateLodFromArea((byte)0, chunk.getMinX(), chunk.getMinZ(), 16, 16);
lodDim.regenDimensionBuffers = true;
if (region!=newRegion)
throw new RuntimeException();
}
//ClientApi.LOGGER.info("Generate chunk: {}, {} ({}, {}) at genMode {}",
// chunk.getChunkPosX(), chunk.getChunkPosZ(), chunk.getMinX(), chunk.getMinZ(), config.distanceGenerationMode);
region.addChunkOfData((byte)0, chunk.getMinX(), chunk.getMinZ(), 16, 16, data, maxVerticalData, override);
region.regenerateLodFromArea((byte)0, chunk.getMinX(), chunk.getMinZ(), 16, 16);
lodDim.regenDimensionBuffers = true;
if (!region.doesDataExist((byte)0, chunk.getMinX(), chunk.getMinZ(), config.distanceGenerationMode))
throw new RuntimeException();
} catch (Exception e) {
e.printStackTrace();
} finally {
region.isWriting--;
}
@@ -523,6 +523,7 @@ public class LodDimension
posToGenerate = new PosToGenerateContainer((byte) 8, maxDataToGenerate, playerBlockPosX, playerBlockPosZ);
iterateByDistance((int x, int z) -> {
boolean isCloseRange = (Math.abs(x-halfWidth)+Math.abs(z-halfWidth)<=2);
//boolean isCloseRange = true;
//All of this is handled directly by the region, which scan every pos from top to bottom of the quad tree
LodRegion lodRegion = regions[x][z];
if (lodRegion != null)
@@ -19,6 +19,7 @@
package com.seibel.lod.core.objects.lod;
import com.seibel.lod.core.api.ClientApi;
import com.seibel.lod.core.enums.config.DistanceGenerationMode;
import com.seibel.lod.core.enums.config.DropoffQuality;
import com.seibel.lod.core.enums.config.GenerationPriority;
@@ -146,10 +147,22 @@ public class LodRegion {
if (this.dataContainer[detailLevel].getVerticalSize() != verticalSize) throw new RuntimeException();
boolean updated = this.dataContainer[detailLevel].addChunkOfData(data, posX, posZ, widthX, widthZ, override);
//ClientApi.LOGGER.info("addChunkOfData(region:{}, level:{}, x:{}, z:{}, wx:{}, wz:{}, override:{}, updated:{})",
// getRegionPos(), detailLevel, posX, posZ, widthX, widthZ, override, updated);
if (updated) {
needRegenBuffer = 2;
needSaving = true;
} else {
/*ClientApi.LOGGER.info("addChunkOfData nothing changed. Datapoint: {}\n Upper Datapoint: {}",
DataPointUtil.toString(this.dataContainer[detailLevel].getSingleData(posX, posZ)),
DataPointUtil.toString(this.dataContainer[9].getSingleData(0, 0))
);*/
}
if (!doesDataExist(detailLevel, posX, posZ, DistanceGenerationMode.values()[DataPointUtil.getGenerationMode(data[0])])) {
throw new RuntimeException();
}
return updated;
}
@@ -197,8 +210,8 @@ public class LodRegion {
* TODO why don't we return the posToGenerate, it would make this easier to
* understand
*/
private void getPosToGenerate(PosToGenerateContainer posToGenerate, byte detailLevel, int childOffsetPosX,
int childOffsetPosZ, int playerPosX, int playerPosZ, GenerationPriority priority, DistanceGenerationMode genMode, boolean shouldSort) {
private void getPosToGenerate(PosToGenerateContainer posToGenerate, byte detailLevel, int offsetPosX, int offsetPosZ,
int playerPosX, int playerPosZ, GenerationPriority priority, DistanceGenerationMode genMode, boolean shouldSort) {
// equivalent to 2^(...)
int size = 1 << (LodUtil.REGION_DETAIL_LEVEL - detailLevel);
@@ -208,32 +221,33 @@ public class LodRegion {
// determine this child's levelPos
byte childDetailLevel = (byte) (detailLevel - 1);
int childPosX = childOffsetPosX * 2;
int childPosZ = childOffsetPosZ * 2;
int childOffsetPosX = offsetPosX * 2;
int childOffsetPosZ = offsetPosZ * 2;
DistanceGenerationMode testerGenMode = detailLevel > LodUtil.CHUNK_DETAIL_LEVEL ? DistanceGenerationMode.NONE : genMode;
byte targetDetailLevel = DetailDistanceUtil.getGenerationDetailFromDistance(minDistance);
if (targetDetailLevel <= detailLevel) {
if (targetDetailLevel == detailLevel) {
if (!doesDataExist(detailLevel, childOffsetPosX, childOffsetPosZ, genMode))
posToGenerate.addPosToGenerate(detailLevel, childOffsetPosX + regionPosX * size,
childOffsetPosZ + regionPosZ * size, shouldSort);
if (!doesDataExist(detailLevel, offsetPosX + regionPosX * size, offsetPosZ + regionPosZ * size, testerGenMode))
posToGenerate.addPosToGenerate(detailLevel, offsetPosX + regionPosX * size,
offsetPosZ + regionPosZ * size, shouldSort);
} else {
if (priority == GenerationPriority.FAR_FIRST && detailLevel >= posToGenerate.farMinDetail
&& !doesDataExist(detailLevel, childOffsetPosX, childOffsetPosZ, genMode)) {
posToGenerate.addPosToGenerate(detailLevel, childOffsetPosX + regionPosX * size,
childOffsetPosZ + regionPosZ * size, shouldSort);
&& !doesDataExist(detailLevel, offsetPosX + regionPosX * size, offsetPosZ + regionPosZ * size, testerGenMode)) {
posToGenerate.addPosToGenerate(detailLevel, offsetPosX + regionPosX * size,
offsetPosZ + regionPosZ * size, shouldSort);
} else if (detailLevel > LodUtil.CHUNK_DETAIL_LEVEL) {
for (int x = 0; x <= 1; x++)
for (int z = 0; z <= 1; z++)
getPosToGenerate(posToGenerate, childDetailLevel, childPosX + x, childPosZ + z, playerPosX,
getPosToGenerate(posToGenerate, childDetailLevel, childOffsetPosX + x, childOffsetPosZ + z, playerPosX,
playerPosZ, priority, genMode, shouldSort);
} else {
// we want at max one request per chunk (since the world generator creates
// chunks).
// So for lod smaller than a chunk, only recurse down
// the top right child
getPosToGenerate(posToGenerate, childDetailLevel, childPosX, childPosZ, playerPosX, playerPosZ,
getPosToGenerate(posToGenerate, childDetailLevel, childOffsetPosX, childOffsetPosZ, playerPosX, playerPosZ,
priority, genMode, shouldSort);
}
}
@@ -252,7 +266,7 @@ public class LodRegion {
*/
public void getPosToRender(PosToRenderContainer posToRender, int playerPosX, int playerPosZ,
boolean requireCorrectDetailLevel, DropoffQuality dropoffQuality) {
int minDistance = LevelPosUtil.minDistance(LodUtil.REGION_DETAIL_LEVEL, 0, 0, playerPosX, playerPosZ, regionPosX, regionPosZ);
int minDistance = LevelPosUtil.minDistance(LodUtil.REGION_DETAIL_LEVEL, regionPosX, regionPosZ, playerPosX, playerPosZ);
byte targetLevel = DetailDistanceUtil.getDrawDetailFromDistance(minDistance);
if (targetLevel <= dropoffQuality.fastModeSwitch) {
getPosToRender(posToRender, LodUtil.REGION_DETAIL_LEVEL, 0, 0, playerPosX, playerPosZ,
@@ -270,7 +284,7 @@ public class LodRegion {
* understand TODO this needs some more comments, James was only able to figure
* out part of it
*/
private void getPosToRender(PosToRenderContainer posToRender, byte detailLevel, int posX, int posZ, int playerPosX,
private void getPosToRender(PosToRenderContainer posToRender, byte detailLevel, int offsetPosX, int offsetPosZ, int playerPosX,
int playerPosZ, boolean requireCorrectDetailLevel) {
// equivalent to 2^(...)
int size = 1 << (LodUtil.REGION_DETAIL_LEVEL - detailLevel);
@@ -281,13 +295,13 @@ public class LodRegion {
int childLevel;
// calculate the LevelPos that are in range
maxDistance = LevelPosUtil.maxDistance(detailLevel, posX, posZ, playerPosX, playerPosZ, regionPosX, regionPosZ);
maxDistance = LevelPosUtil.maxDistance(detailLevel, offsetPosX + regionPosX*size, offsetPosZ + regionPosZ*size, playerPosX, playerPosZ);
desiredLevel = DetailDistanceUtil.getLodDrawDetail(DetailDistanceUtil.getDrawDetailFromDistance(maxDistance));
minDistance = LevelPosUtil.minDistance(detailLevel, posX, posZ, playerPosX, playerPosZ, regionPosX, regionPosZ);
minDistance = LevelPosUtil.minDistance(detailLevel, offsetPosX + regionPosX*size, offsetPosZ + regionPosZ*size, playerPosX, playerPosZ);
childLevel = DetailDistanceUtil.getLodDrawDetail(DetailDistanceUtil.getDrawDetailFromDistance(minDistance));
if (detailLevel == childLevel - 1) {
posToRender.addPosToRender(detailLevel, posX + regionPosX * size, posZ + regionPosZ * size);
posToRender.addPosToRender(detailLevel, offsetPosX + regionPosX * size, offsetPosZ + regionPosZ * size);
} else
// if (desiredLevel > detailLevel)
// {
@@ -295,11 +309,11 @@ public class LodRegion {
// we can stop generating
// } else
if (desiredLevel == detailLevel) {
posToRender.addPosToRender(detailLevel, posX + regionPosX * size, posZ + regionPosZ * size);
posToRender.addPosToRender(detailLevel, offsetPosX + regionPosX * size, offsetPosZ + regionPosZ * size);
} else // case where (detailLevel > desiredLevel)
{
int childPosX = posX * 2;
int childPosZ = posZ * 2;
int childPosX = (offsetPosX + regionPosX*size) * 2;
int childPosZ = (offsetPosZ + regionPosZ*size) * 2;
byte childDetailLevel = (byte) (detailLevel - 1);
int childrenCount = 0;
@@ -309,7 +323,7 @@ public class LodRegion {
if (!requireCorrectDetailLevel)
childrenCount++;
else
getPosToRender(posToRender, childDetailLevel, childPosX + x, childPosZ + z, playerPosX,
getPosToRender(posToRender, childDetailLevel, offsetPosX*2 + x, offsetPosZ*2 + z, playerPosX,
playerPosZ, requireCorrectDetailLevel);
}
}
@@ -320,10 +334,10 @@ public class LodRegion {
if (childrenCount == 4) {
for (int x = 0; x <= 1; x++)
for (int z = 0; z <= 1; z++)
getPosToRender(posToRender, childDetailLevel, childPosX + x, childPosZ + z, playerPosX,
getPosToRender(posToRender, childDetailLevel, offsetPosX*2 + x, offsetPosZ*2 + z, playerPosX,
playerPosZ, requireCorrectDetailLevel);
} else {
posToRender.addPosToRender(detailLevel, posX + regionPosX * size, posZ + regionPosZ * size);
posToRender.addPosToRender(detailLevel, offsetPosX + regionPosX * size, offsetPosZ + regionPosZ * size);
}
}
}
@@ -333,16 +347,16 @@ public class LodRegion {
* This method will fill the posToRender array with all levelPos that are
* render-able. But the entire region try use the same detail level.
*/
private void getPosToRenderFlat(PosToRenderContainer posToRender, byte detailLevel, int posX, int posZ, byte targetLevel, boolean requireCorrectDetailLevel) {
private void getPosToRenderFlat(PosToRenderContainer posToRender, byte detailLevel, int offsetPosX, int offsetPosZ, byte targetLevel, boolean requireCorrectDetailLevel) {
// equivalent to 2^(...)
int size = 1 << (LodUtil.REGION_DETAIL_LEVEL - detailLevel);
if (detailLevel == targetLevel) {
posToRender.addPosToRender(detailLevel, posX + regionPosX * size, posZ + regionPosZ * size);
posToRender.addPosToRender(detailLevel, offsetPosX + regionPosX * size, offsetPosZ + regionPosZ * size);
} else // case where (detailLevel > desiredLevel)
{
int childPosX = posX * 2;
int childPosZ = posZ * 2;
int childPosX = (offsetPosX + regionPosX*size) * 2;
int childPosZ = (offsetPosZ + regionPosX*size) * 2;
byte childDetailLevel = (byte) (detailLevel - 1);
int childrenCount = 0;
@@ -352,7 +366,7 @@ public class LodRegion {
if (!requireCorrectDetailLevel)
childrenCount++;
else
getPosToRenderFlat(posToRender, childDetailLevel, childPosX + x, childPosZ + z, targetLevel, requireCorrectDetailLevel);
getPosToRenderFlat(posToRender, childDetailLevel, offsetPosX*2 + x, offsetPosZ*2 + z, targetLevel, requireCorrectDetailLevel);
}
}
}
@@ -362,9 +376,9 @@ public class LodRegion {
if (childrenCount == 4) {
for (int x = 0; x <= 1; x++)
for (int z = 0; z <= 1; z++)
getPosToRenderFlat(posToRender, childDetailLevel, childPosX + x, childPosZ + z, targetLevel, requireCorrectDetailLevel);
getPosToRenderFlat(posToRender, childDetailLevel, offsetPosX*2 + x, offsetPosZ*2 + z, targetLevel, requireCorrectDetailLevel);
} else {
posToRender.addPosToRender(detailLevel, posX + regionPosX * size, posZ + regionPosZ * size);
posToRender.addPosToRender(detailLevel, offsetPosX + regionPosX * size, offsetPosZ + regionPosZ * size);
}
}
}
@@ -399,26 +413,30 @@ public class LodRegion {
public boolean regenerateLodFromArea(byte detailLevel, int posX, int posZ, int widthX, int widthZ) {
if (detailLevel >= LodUtil.REGION_DETAIL_LEVEL) return false;
int modPosX = LevelPosUtil.getRegionModule(detailLevel, posX);
int modPosZ = LevelPosUtil.getRegionModule(detailLevel, posZ);
//ClientApi.LOGGER.info("RegenerateLodFromArea(region:{} level:{}, x:{}, z:{}, wx:{}, wz:{})",
// getRegionPos(), detailLevel, modPosX, modPosZ, widthX, widthZ);
if (detailLevel < minDetailLevel) {
byte startLevel = minDetailLevel;
int maxPosX = Math.floorDiv(posX+widthX-1, (1 << (minDetailLevel-startLevel)))+1;
int maxPosZ = Math.floorDiv(posZ+widthZ-1, (1 << (minDetailLevel-startLevel)))+1;
posX = Math.floorDiv(posX, (1 << (minDetailLevel-startLevel)));
posZ = Math.floorDiv(posZ, (1 << (minDetailLevel-startLevel)));
widthX = maxPosX-posX;
widthZ = maxPosZ-posZ;
int maxPosX = Math.floorDiv(modPosX+widthX-1, (1 << (minDetailLevel-startLevel)))+1;
int maxPosZ = Math.floorDiv(modPosZ+widthZ-1, (1 << (minDetailLevel-startLevel)))+1;
modPosX = Math.floorDiv(modPosX, (1 << (minDetailLevel-startLevel)));
modPosZ = Math.floorDiv(modPosZ, (1 << (minDetailLevel-startLevel)));
widthX = maxPosX-modPosX;
widthZ = maxPosZ-modPosZ;
detailLevel = minDetailLevel;
}
do {
int maxPosX = Math.floorDiv(posX+widthX-1, 2)+1;
int maxPosZ = Math.floorDiv(posZ+widthZ-1, 2)+1;
posX = Math.floorDiv(posX, 2);
posZ = Math.floorDiv(posZ, 2);
widthX = maxPosX-posX;
widthZ = maxPosZ-posZ;
int maxPosX = Math.floorDiv(modPosX+widthX-1, 2)+1;
int maxPosZ = Math.floorDiv(modPosZ+widthZ-1, 2)+1;
modPosX = Math.floorDiv(modPosX, 2);
modPosZ = Math.floorDiv(modPosZ, 2);
widthX = maxPosX-modPosX;
widthZ = maxPosZ-modPosZ;
detailLevel++;
chunkUpdate(detailLevel, posX, posZ, widthX, widthZ);
// ClientApi.LOGGER.info(" - Shink: (level:{}, x:{}, z:{}, wx:{}, wz:{})", detailLevel, modPosX, modPosZ, widthX, widthZ);
chunkUpdate(detailLevel, modPosX, modPosZ, widthX, widthZ);
} while (detailLevel < LodUtil.REGION_DETAIL_LEVEL);
needRegenBuffer = 2;
@@ -431,15 +449,14 @@ public class LodRegion {
* TODO could this be renamed mergeChildData?
* TODO make this return whether any value has changed
*/
private void update(byte detailLevel, int posX, int posZ) {
posX = LevelPosUtil.getRegionModule(detailLevel, posX);
posZ = LevelPosUtil.getRegionModule(detailLevel, posZ);
dataContainer[detailLevel].updateData(dataContainer[detailLevel - 1], posX, posZ);
private void update(byte detailLevel, int modPosX, int modPosZ) {
//ClientApi.LOGGER.info(" - Update: (level:{}, subLevel:{}, mx:{}, mz:{})", detailLevel, detailLevel-1, modPosX, modPosZ);
dataContainer[detailLevel].updateData(dataContainer[detailLevel - 1], modPosX, modPosZ);
}
private void chunkUpdate(byte detailLevel, int posX, int posZ, int widthX,int widthZ) {
private void chunkUpdate(byte detailLevel, int modPosX, int modPosZ, int widthX,int widthZ) {
for (int ox=0; ox<widthX; ox++) {
for (int oz=0; oz<widthZ; oz++) {
update(detailLevel, posX+ox, posZ+oz);
update(detailLevel, modPosX+ox, modPosZ+oz);
}
}
}
@@ -450,11 +467,12 @@ public class LodRegion {
public boolean doesDataExist(byte detailLevel, int posX, int posZ, DistanceGenerationMode requiredMode) {
if (detailLevel < minDetailLevel || dataContainer[detailLevel] == null)
return false;
posX = LevelPosUtil.getRegionModule(detailLevel, posX);
posZ = LevelPosUtil.getRegionModule(detailLevel, posZ);
if (!dataContainer[detailLevel].doesItExist(posX, posZ)) return false;
byte mode = DataPointUtil.getGenerationMode(dataContainer[detailLevel].getSingleData(posX, posZ));
int modPosX = LevelPosUtil.getRegionModule(detailLevel, posX);
int modPosZ = LevelPosUtil.getRegionModule(detailLevel, posZ);
if (!dataContainer[detailLevel].doesItExist(modPosX, modPosZ)) return false;
if (requiredMode==DistanceGenerationMode.NONE) return true;
byte mode = getGenerationMode(detailLevel, posX, posZ);
return (mode>=requiredMode.complexity);
}
@@ -462,10 +480,13 @@ public class LodRegion {
* Gets the generation mode for the data point at the given relative pos.
*/
public byte getGenerationMode(byte detailLevel, int posX, int posZ) {
if (dataContainer[detailLevel].doesItExist(posX, posZ))
int modPosX = LevelPosUtil.getRegionModule(detailLevel, posX);
int modPosZ = LevelPosUtil.getRegionModule(detailLevel, posZ);
if (dataContainer[detailLevel].doesItExist(modPosX, modPosZ))
// We take the bottom information always
// TODO what does that mean? bottom of what?
return DataPointUtil.getGenerationMode(dataContainer[detailLevel].getSingleData(posX, posZ));
return DataPointUtil.getGenerationMode(dataContainer[detailLevel].getSingleData(modPosX, modPosZ));
else
return DistanceGenerationMode.NONE.complexity;
}
@@ -103,8 +103,18 @@ public class RegionPos
return "(" + x + "," + z + ")";
}
public static long asLong(int i, int j) {
return (long)i & 0xFFFFFFFFL | ((long)j & 0xFFFFFFFFL) << 32;
}
public static int getX(long l) {
return (int)(l & 0xFFFFFFFFL);
}
public static int getZ(long l) {
return (int)(l >>> 32 & 0xFFFFFFFFL);
}
@Override
public int hashCode() {
return Long.hashCode((long)(x) << Integer.BYTES + z);
return Long.hashCode(asLong(x,z));
}
}
@@ -87,6 +87,13 @@ public class VerticalLevelContainer implements LevelContainer
dataContainer[posX * size * verticalSize + posZ * verticalSize + verticalIndex] = data;
return true;
}
private void forceWriteVerticalData(long[] data, int posX, int posZ)
{
int index = posX * size * verticalSize + posZ * verticalSize;
for (int verticalIndex = 0; verticalIndex < verticalSize; verticalIndex++)
dataContainer[index + verticalIndex] = data[verticalIndex];
}
@Override
public boolean addVerticalData(long[] data, int posX, int posZ, boolean override)
@@ -98,8 +105,7 @@ public class VerticalLevelContainer implements LevelContainer
} else {
if (compare<=0) return false;
}
for (int verticalIndex = 0; verticalIndex < verticalSize; verticalIndex++)
dataContainer[index + verticalIndex] = data[verticalIndex];
forceWriteVerticalData(data, posX, posZ);
return true;
}
@@ -111,6 +117,8 @@ public class VerticalLevelContainer implements LevelContainer
throw new IndexOutOfBoundsException("addChunkOfData param not inside valid range");
if (widthX*widthZ*verticalSize > data.length)
throw new IndexOutOfBoundsException("addChunkOfData data array not long enough to contain the data to be copied");
if (posX<0 || posZ<0 || widthX<0 || widthZ<0)
throw new IndexOutOfBoundsException("addChunkOfData param is negative");
for (int ox=0; ox<widthX; ox++) {
anyChange = DataPointUtil.mergeTwoDataArray(
@@ -1143,22 +1151,33 @@ public class VerticalLevelContainer implements LevelContainer
int childPosX;
int childPosZ;
long[] data;
boolean anyDataExist = false;
for (int x = 0; x <= 1; x++)
{
for (int z = 0; z <= 1; z++)
{
childPosX = 2 * posX + x;
childPosZ = 2 * posZ + z;
if (lowerLevelContainer.doesItExist(childPosX, childPosZ)) anyDataExist = true;
for (int verticalIndex = 0; verticalIndex < lowerMaxVertical; verticalIndex++)
dataToMerge[(z * 2 + x) * lowerMaxVertical + verticalIndex] = lowerLevelContainer.getData(childPosX, childPosZ, verticalIndex);
}
}
data = DataPointUtil.mergeMultiData(dataToMerge, lowerMaxVertical, getVerticalSize());
if (!anyDataExist)
throw new RuntimeException();
addVerticalData(data, posX, posZ, true);
if ((!DataPointUtil.doesItExist(data[0])) && anyDataExist)
throw new RuntimeException();
if (DataPointUtil.getGenerationMode(data[0]) != DataPointUtil.getGenerationMode(lowerLevelContainer.getSingleData(posX*2, posZ*2)))
throw new RuntimeException();
forceWriteVerticalData(data, posX, posZ);
}
public void newUpdateData(VerticalLevelContainer lowerLevelContainer, int posX, int posZ)
{
//We reset the array
@@ -323,7 +323,7 @@ public class DataPointUtil
short[] heightAndDepth = ThreadMapUtil.getHeightAndDepth((WORLD_HEIGHT + 1) * 2);
long[] dataPoint = ThreadMapUtil.getVerticalDataArray(DetailDistanceUtil.getMaxVerticalData(0));
int genMode = DistanceGenerationMode.FULL.complexity;
int genMode = getGenerationMode(dataToMerge[0]);
boolean allEmpty = true;
boolean allVoid = true;
boolean limited = false;
@@ -347,7 +347,7 @@ public class DataPointUtil
singleData = dataToMerge[dataIndex];
if (doesItExist(singleData))
{
genMode = Math.min(genMode, getGenerationMode(singleData));
//genMode = Math.min(genMode, getGenerationMode(singleData));
allEmpty = false;
if (!isVoid(singleData))
{
@@ -368,7 +368,7 @@ public class DataPointUtil
singleData = dataToMerge[index * inputVerticalData + dataIndex];
if (doesItExist(singleData))
{
genMode = Math.min(genMode, getGenerationMode(singleData));
//genMode = Math.min(genMode, getGenerationMode(singleData));
allEmpty = false;
if (!isVoid(singleData))
{
@@ -531,7 +531,6 @@ public class DataPointUtil
int tempBlue = 0;
int tempLightBlock = 0;
int tempLightSky = 0;
byte tempGenMode = DistanceGenerationMode.FULL.complexity;
allEmpty = true;
allVoid = true;
long data = 0;
@@ -573,10 +572,7 @@ public class DataPointUtil
tempLightBlock += getLightBlock(data);
tempLightSky += getLightSky(data);
}
tempGenMode = (byte) Math.min(tempGenMode, getGenerationMode(data));
}
else
tempGenMode = (byte) Math.min(tempGenMode, DistanceGenerationMode.NONE.complexity);
}
if (allEmpty)
@@ -584,7 +580,7 @@ public class DataPointUtil
dataPoint[j] = EMPTY_DATA;
else if (allVoid)
//all the children are void
dataPoint[j] = createVoidDataPoint(tempGenMode);
dataPoint[j] = createVoidDataPoint(genMode);
else
{
//we have at least 1 child
@@ -602,7 +598,7 @@ public class DataPointUtil
//{
// add simplification at the end due to color
//}
dataPoint[j] = createDataPoint(tempAlpha, tempRed, tempGreen, tempBlue, height, depth, tempLightSky, tempLightBlock, tempGenMode, false);
dataPoint[j] = createDataPoint(tempAlpha, tempRed, tempGreen, tempBlue, height, depth, tempLightSky, tempLightBlock, genMode, false);
}
}
}
@@ -173,14 +173,6 @@ public class LevelPosUtil
return maxDistance;
}
public static int maxDistance(byte detailLevel, int posX, int posZ, int playerPosX, int playerPosZ, int xRegion, int zRegion)
{
int width = 1 << (LodUtil.REGION_DETAIL_LEVEL - detailLevel);
int newPosX = xRegion * width + posX;
int newPosZ = zRegion * width + posZ;
return maxDistance(detailLevel, newPosX, newPosZ, playerPosX, playerPosZ);
}
public static int minDistance(byte detailLevel, int posX, int posZ, int playerPosX, int playerPosZ)
{
@@ -224,14 +216,6 @@ public class LevelPosUtil
}
}
public static int minDistance(byte detailLevel, int posX, int posZ, int playerPosX, int playerPosZ, int xRegion, int zRegion)
{
int width = 1 << (LodUtil.REGION_DETAIL_LEVEL - detailLevel);
int newPosX = xRegion * width + posX;
int newPosZ = zRegion * width + posZ;
return minDistance(detailLevel, newPosX, newPosZ, playerPosX, playerPosZ);
}
public static int compareDistance(int firstDistance, int secondDistance)
{
return Integer.compare(