Fixed all negative coords bug

This commit is contained in:
Leonardo
2021-07-14 14:33:17 +02:00
parent e40ee20460
commit d054ac91b1
4 changed files with 136 additions and 97 deletions
@@ -143,12 +143,6 @@ public class LodQuadTree {
short widthRatio = (short) (lodNode.width / (2 * newLodNode.width));
int WE = Math.abs(Math.floorDiv(posX , widthRatio) % 2);
int NS = Math.abs(Math.floorDiv(posZ , widthRatio) % 2);
//These two if fix the negative coordinate problema
//I don't know why, there is some problem with the %2 operation
/*
if(posX<0) WE = 1 - WE;
if(posZ<0) NS = 1 - NS;
*/
if (getChild(NS, WE) == null) {
setChild(NS, WE);
}
@@ -4,6 +4,7 @@ import com.seibel.lod.enums.DistanceGenerationMode;
import com.seibel.lod.handlers.LodQuadTreeDimensionFileHandler;
import com.seibel.lod.util.LodUtil;
import net.minecraft.client.Minecraft;
import net.minecraft.util.math.ChunkPos;
import net.minecraft.world.DimensionType;
import net.minecraft.world.server.ServerChunkProvider;
import net.minecraft.world.server.ServerWorld;
@@ -264,8 +265,8 @@ public class LodQuadTreeDimension {
public Boolean addNode(LodQuadTreeNode lodNode)
{
RegionPos pos = new RegionPos(
lodNode.getStartX() / 512,
lodNode.getStartZ() / 512
Math.floorDiv(lodNode.getStartX(), 512),
Math.floorDiv(lodNode.getStartZ(), 512)
);
// don't continue if the region can't be saved
@@ -296,6 +297,19 @@ public class LodQuadTreeDimension {
return coorectlyAdded;
}
/**
*/
public LodQuadTreeNode getLodFromCoordinates(ChunkPos chunkPos)
{
return getLodFromCoordinates(chunkPos.x, chunkPos.z, LodQuadTreeNode.CHUNK_LEVEL);
}
/**
*/
public LodQuadTreeNode getLodFromCoordinates(int chunkPosX, int chunkPosZ)
{
return getLodFromCoordinates(chunkPosX, chunkPosZ, LodQuadTreeNode.CHUNK_LEVEL);
}
/**
* Get the LodNodeData at the given X and Z position in the level
* in this dimension.
@@ -305,9 +319,11 @@ public class LodQuadTreeDimension {
*/
public LodQuadTreeNode getLodFromCoordinates(int posX, int posZ, byte level)
{
LodQuadTree region = getRegion((int) (posX/(512/Math.pow(level,2))),(int) (posZ/(512/Math.pow(level,2))));
if(region == null)
LodQuadTree region = getRegion((Math.floorDiv(posX, (int) (512/Math.pow(level,2)))),(Math.floorDiv(posZ, (int) (512/Math.pow(level,2)))));
if(region == null) {
System.out.println("THIS CASE");
return null;
}
return region.getNodeAtLevelPosition(posX, posZ, level);
/*
RegionPos pos = LodUtil.convertChunkPosToRegionPos(new ChunkPos(chunkX, chunkZ));
@@ -146,9 +146,6 @@ public class LodQuadTreeNode {
index = data.indexOf(DATA_DELIMITER, 0);
this.level = (byte) Integer.parseInt(data.substring(0,index));
lastIndex = index;
index = data.indexOf(DATA_DELIMITER, lastIndex+1);
this.complexity = DistanceGenerationMode.valueOf(data.substring(lastIndex+1,index));
lastIndex = index;
index = data.indexOf(DATA_DELIMITER, lastIndex+1);
@@ -158,6 +155,10 @@ public class LodQuadTreeNode {
index = data.indexOf(DATA_DELIMITER, lastIndex+1);
this.posZ = Integer.parseInt(data.substring(lastIndex+1,index));
lastIndex = index;
index = data.indexOf(DATA_DELIMITER, lastIndex+1);
this.complexity = DistanceGenerationMode.valueOf(data.substring(lastIndex+1,index));
lastIndex = index;
index = data.indexOf(DATA_DELIMITER, lastIndex+1);
short height = (short) Integer.parseInt(data.substring(lastIndex+1,index));
@@ -258,18 +259,18 @@ public class LodQuadTreeNode {
* Outputs all data in a csv format
*/
public String toData(){
String s = ((int) level) + DATA_DELIMITER
String s = Integer.toString((int) level) + DATA_DELIMITER
+ Integer.toString(posX) + DATA_DELIMITER
+ Integer.toString(posZ) + DATA_DELIMITER
+ complexity.toString() + DATA_DELIMITER
+ posX + DATA_DELIMITER
+ posZ + DATA_DELIMITER
+ ((int) lodDataPoint.height) + DATA_DELIMITER
+ ((int) lodDataPoint.depth) + DATA_DELIMITER
+ lodDataPoint.color.getRed() + DATA_DELIMITER
+ lodDataPoint.color.getGreen() + DATA_DELIMITER
+ lodDataPoint.color.getBlue() + DATA_DELIMITER
+ lodDataPoint.color.getAlpha() + DATA_DELIMITER;
+ Integer.toString(((int) lodDataPoint.height)) + DATA_DELIMITER
+ Integer.toString(((int) lodDataPoint.depth)) + DATA_DELIMITER
+ Integer.toString(lodDataPoint.color.getRed()) + DATA_DELIMITER
+ Integer.toString(lodDataPoint.color.getGreen()) + DATA_DELIMITER
+ Integer.toString(lodDataPoint.color.getBlue()) + DATA_DELIMITER
+ Integer.toString(lodDataPoint.color.getAlpha()) + DATA_DELIMITER;
int val = voidNode ? 1 : 0;
s += val + DATA_DELIMITER;
s += Integer.toString(val) + DATA_DELIMITER;
return s;
}
@@ -29,7 +29,7 @@ import javax.swing.Timer;
@SuppressWarnings("serial")
public class QuadTreeImage extends JPanel {
private static final int PREF_W = 1000;
private static final int PREF_W = 1536;
private static final int PREF_H = PREF_W;
private List<MyDrawable> drawables = new ArrayList<>();
@@ -68,15 +68,6 @@ public class QuadTreeImage extends JPanel {
}
private static void createAndShowGui() {
int playerX = 32*512;
int playerZ = 32*512;
LodQuadTreeDimension dim = new LodQuadTreeDimension(null, null, 64);
System.out.println(dim.getRegion(0, 0));
dim.move(Math.floorDiv(playerX,512),Math.floorDiv(playerZ,512));
System.out.println(dim.getCenterX());
System.out.println(dim.getCenterZ());
System.out.println(dim.getWidth());
final QuadTreeImage quadTreeImage = new QuadTreeImage();
@@ -90,83 +81,115 @@ public class QuadTreeImage extends JPanel {
List<List<LodQuadTreeNode>> listOfList = new ArrayList<>();
OverworldBiomeSource biomeSource = new OverworldBiomeSource(MCVersion.v1_16_5, 1000);
//EndBiomeSource biomeSource = new EndBiomeSource(MCVersion.v1_16_5, 1000);
int[] distances = {100000,8000,4000,2000,1000,500,250,100,50,25};
for (int i = 0; i <= (9 - 2); i++) {
for (int j = 0; j < 1; j++) {
List<LodQuadTree> levelToGenerate = dim.getNodeToGenerate(playerX, playerZ, (byte) (9 - i), DistanceGenerationMode.SERVER , distances[i], 0);
//System.out.println(levelToGenerate);
for (LodQuadTree level : levelToGenerate) {
Color color;
int startX = level.getLodNodeData().startX;
int startZ = level.getLodNodeData().startZ;
int endX = level.getLodNodeData().endX;
int endZ = level.getLodNodeData().endZ;
int centerX = level.getLodNodeData().centerX;
int centerZ = level.getLodNodeData().centerZ;
int width = level.getLodNodeData().width;
byte otherLevel = LodQuadTreeNode.BLOCK_LEVEL;
int otherWidth = LodQuadTreeNode.BLOCK_WIDTH;
int sizeOfTheWorld = 16;
List<Integer> posXs = new ArrayList<>();
List<Integer> posZs = new ArrayList<>();
if (level.getLodNodeData().level == 0) {
posXs.add(Math.floorDiv(startX , otherWidth));
posZs.add(Math.floorDiv(startZ , otherWidth));
} else {
posXs.add(Math.floorDiv(startX , otherWidth));
posXs.add(Math.floorDiv(centerX + 1, otherWidth));
posZs.add(Math.floorDiv(startZ, otherWidth));
posZs.add(Math.floorDiv(centerZ +1 , otherWidth));
}
LodQuadTreeDimension dim = new LodQuadTreeDimension(null, null, sizeOfTheWorld);
//System.out.println(posXs);
//System.out.println(posZs);
//SIMULATING A PLAYER MOVING,
int[] playerXs = {0,100,200,300,400,500};
int[] playerZs = {0,100,200,300,400,500};
for(int pos=0; pos<6; pos++) {
int playerX= playerXs[pos];
int playerZ= playerZs[pos];
for (Integer posXI : posXs) {
for (Integer posZI : posZs) {
int posX = posXI.intValue();
int posZ = posZI.intValue();
//System.out.println(posX + " " + posZ);
color = BiomeColorsUtils.getColorFromBiomeManual(biomeSource.getBiome(posX, 0, posZ));
//color = BiomeColorsUtils.getColorFromIdCB(biomeSource.getBiome(posZ, 0, posX).getId());
LodQuadTreeNode node = new LodQuadTreeNode(otherLevel, posX, posZ, new LodDataPoint(0, 0, color) , DistanceGenerationMode.SERVER);
dim.addNode(node);
//int sizeOfTheWorld=512; //TRY THIS TO SEE A 250'000 BLOCK RENDER DISTANCE
dim.move(Math.floorDiv(playerX, 512), Math.floorDiv(playerZ, 512));
/*
System.out.println(dim.getRegion(0, 0));
System.out.println(dim.getCenterX());
System.out.println(dim.getCenterZ());
System.out.println(dim.getWidth());
System.out.println("GETTING LOD FROM COORDINATE BEFORE GENERETION");
System.out.println(dim.getLodFromCoordinates(-6, -6));
*/
int[] distances = {100000, 8000, 4000, 2000, 1000, 500, 250, 100, 50, 25};
for (int i = 0; i <= (9 - 2); i++) {
for (int j = 0; j < 1; j++) {
List<LodQuadTree> levelToGenerate = dim.getNodeToGenerate(playerX, playerZ, (byte) (9 - i), DistanceGenerationMode.SERVER, distances[i], 0);
//System.out.println(levelToGenerate);
for (LodQuadTree level : levelToGenerate) {
Color color;
int startX = level.getLodNodeData().startX;
int startZ = level.getLodNodeData().startZ;
int endX = level.getLodNodeData().endX;
int endZ = level.getLodNodeData().endZ;
int centerX = level.getLodNodeData().centerX;
int centerZ = level.getLodNodeData().centerZ;
int width = level.getLodNodeData().width;
byte otherLevel = LodQuadTreeNode.BLOCK_LEVEL;
int otherWidth = LodQuadTreeNode.BLOCK_WIDTH;
List<Integer> posXs = new ArrayList<>();
List<Integer> posZs = new ArrayList<>();
if (level.getLodNodeData().level == 0) {
posXs.add(Math.floorDiv(startX, otherWidth));
posZs.add(Math.floorDiv(startZ, otherWidth));
} else {
posXs.add(Math.floorDiv(startX, otherWidth));
posXs.add(Math.floorDiv(centerX + 1, otherWidth));
posZs.add(Math.floorDiv(startZ, otherWidth));
posZs.add(Math.floorDiv(centerZ + 1, otherWidth));
}
//System.out.println(posXs);
//System.out.println(posZs);
for (Integer posXI : posXs) {
for (Integer posZI : posZs) {
int posX = posXI.intValue();
int posZ = posZI.intValue();
//System.out.println(posX + " " + posZ);
color = BiomeColorsUtils.getColorFromBiomeManual(biomeSource.getBiome(posX, 0, posZ));
//color = BiomeColorsUtils.getColorFromIdCB(biomeSource.getBiome(posZ, 0, posX).getId());
LodQuadTreeNode node = new LodQuadTreeNode(otherLevel, posX, posZ, new LodDataPoint(0, 0, color), DistanceGenerationMode.SERVER);
if (dim.addNode(node)) {
}
}
}
}
}
}
/*
List<LodNodeData> lodList = new ArrayList<>();
lodList.addAll(dim.getNodeToRender(playerX,playerZ,(byte) 3, 250,0));
lodList.addAll(dim.getNodeToRender(playerX,playerZ,(byte) 4, 500,250));
lodList.addAll(dim.getNodeToRender(playerX,playerZ,(byte) 5, 1000,500));
lodList.addAll(dim.getNodeToRender(playerX,playerZ,(byte) 6, 2000,1000));
lodList.addAll(dim.getNodeToRender(playerX,playerZ,(byte) 7, 4000,2000));
lodList.addAll(dim.getNodeToRender(playerX,playerZ,(byte) 8, 8000,4000));
lodList.addAll(dim.getNodeToRender(playerX,playerZ,(byte) 9, 100000,8000));
//Set<DistanceGenerationMode> complexityMask = new HashSet<>();
//complexityMask.add(DistanceGenerationMode.SERVER);
//complexityMask.add(DistanceGenerationMode.FEATURES);
//complexityMask.add(DistanceGenerationMode.SURFACE);
//complexityMask.add(DistanceGenerationMode.BIOME_ONLY_SIMULATE_HEIGHT);
//complexityMask.add(DistanceGenerationMode.BIOME_ONLY);
Set<DistanceGenerationMode> complexityMask = LodQuadTreeDimension.FULL_COMPLEXITY_MASK;
List<LodQuadTreeNode> lodList = new ArrayList<>();
//The min and max distances should increase quadratically
lodList.addAll(dim.getNodeToRender(playerX,playerZ,(byte) 3, complexityMask, 250,0));
lodList.addAll(dim.getNodeToRender(playerX,playerZ,(byte) 4, complexityMask,500,250));
lodList.addAll(dim.getNodeToRender(playerX,playerZ,(byte) 5, complexityMask,1000,500));
lodList.addAll(dim.getNodeToRender(playerX,playerZ,(byte) 6, complexityMask,2000,1000));
lodList.addAll(dim.getNodeToRender(playerX,playerZ,(byte) 7, complexityMask,4000,2000));
lodList.addAll(dim.getNodeToRender(playerX,playerZ,(byte) 8, complexityMask,8000,4000));
lodList.addAll(dim.getNodeToRender(playerX,playerZ,(byte) 9, complexityMask,100000,8000));
System.out.println(lodList.size());
*/
Set<DistanceGenerationMode> complexityMask = new HashSet<>();
complexityMask.add(DistanceGenerationMode.SERVER);
complexityMask.add(DistanceGenerationMode.FEATURES);
complexityMask.add(DistanceGenerationMode.SURFACE);
complexityMask.add(DistanceGenerationMode.BIOME_ONLY_SIMULATE_HEIGHT);
complexityMask.add(DistanceGenerationMode.BIOME_ONLY);
List<LodQuadTreeNode> lodList = dim.getNodes(complexityMask,false,false);
// lodList.addAll(lodQuadTree.getNodeToRender(playerX, playerZ, (byte) 2, 100, 0));
// lodList.addAll(lodQuadTree.getNodeToRender(playerX, playerZ, (byte) 3, 200, 100));
// lodList.addAll(lodQuadTree.getNodeToRender(playerX, playerZ, (byte) 4, 400, 200));
// lodList.addAll(lodQuadTree.getNodeToRender(playerX, playerZ, (byte) 5, 10000, 400));
listOfList.add(lodList);
// List<LodQuadTreeNode> lodList = dim.getNodes(complexityMask, false, false); //USE THIS TO SEE AL THE LODS
listOfList.add(lodList);
}
}
System.out.println("GETTING LOD FROM COORDINATE AFTER GENERETION");
System.out.println(dim.getLodFromCoordinates(0,100, (byte) 1));
//FROM THIS POINT ON THE CODE JUST CREATE THE IMAGE
int timerDelay = 0;
int timerDelay = 200;
System.out.println("STARTING");
System.out.println(dim.getWidth());
System.out.println(dim.getCenterX());
int xOffset = listOfList.stream().mapToInt(x -> x.stream().mapToInt(y -> y.startX).min().getAsInt()).min().getAsInt();
int zOffset = listOfList.stream().mapToInt(x -> x.stream().mapToInt(y -> y.startZ).min().getAsInt()).min().getAsInt();
int maxX = listOfList.stream().mapToInt(x -> x.stream().mapToInt(y -> y.startX).max().getAsInt()).min().getAsInt();
int maxZ = listOfList.stream().mapToInt(x -> x.stream().mapToInt(y -> y.startZ).max().getAsInt()).min().getAsInt();
int maxSize = Math.max(maxX-xOffset,maxZ - zOffset)/512;
System.out.println(xOffset);
System.out.println(zOffset);
new Timer(timerDelay, new ActionListener() {
@@ -179,7 +202,7 @@ public class QuadTreeImage extends JPanel {
} else {
if(drawCount==0) quadTreeImage.clearAll();
final List<MyDrawable> myDrawables = new ArrayList<>();
double amp = 0.025;
double amp = ((double) 3)/((double) sizeOfTheWorld);
Collection<LodQuadTreeNode> lodList = listOfList.get(drawCount);
for (LodQuadTreeNode data : lodList) {
myDrawables.add(new MyDrawable(new Rectangle2D.Double(
@@ -189,15 +212,19 @@ public class QuadTreeImage extends JPanel {
data.width * amp),
data.lodDataPoint.color, new BasicStroke(1)));
}
/*
myDrawables.add(new MyDrawable(new Rectangle2D.Double(
(playerX - 10 - xOffset) * amp,
(playerZ - 10 - zOffset) * amp,
20* amp,
20* amp),
Color.yellow, new BasicStroke(1)));
*/
for (int k = 0; k < myDrawables.size(); k++) {
quadTreeImage.addMyDrawable(myDrawables.get(k));
}
/*
BufferedImage img = new BufferedImage(frame.getWidth(), frame.getHeight(), BufferedImage.TYPE_INT_RGB);
Graphics2D g2d = img.createGraphics();
frame.printAll(g2d);
@@ -207,6 +234,7 @@ public class QuadTreeImage extends JPanel {
} catch (IOException ioException) {
ioException.printStackTrace();
}
*/
drawCount++;
}
}