fixed LodQuadTreeDimension

This commit is contained in:
Morippi
2021-07-09 14:58:48 +02:00
parent 2b5b023472
commit 712d9db2fa
4 changed files with 87 additions and 80 deletions
@@ -136,8 +136,8 @@ public class LodQuadTree {
int posX = newLodNodeData.posX;
int posZ = newLodNodeData.posZ;
short widthRatio = (short) (lodNodeData.width / (2 * newLodNodeData.width));
int NS = (posX / widthRatio) % 2;
int WE = (posZ / widthRatio) % 2;
int NS = Math.abs((posX / widthRatio) % 2);
int WE = Math.abs((posZ / widthRatio) % 2);
if (getChild(NS, WE) == null) {
setChild(NS, WE);
}
@@ -34,40 +34,34 @@ public class LodQuadTreeDimension {
{
dimension = newDimension;
width = newMaxWidth;
if(newDimension != null && lodWorld != null) {
try {
Minecraft mc = Minecraft.getInstance();
/*
try
{
Minecraft mc = Minecraft.getInstance();
File saveDir;
if (mc.hasSingleplayerServer()) {
// local world
File saveDir;
if(mc.hasSingleplayerServer())
{
// local world
ServerWorld serverWorld = LodUtil.getServerWorldFromDimension(newDimension);
seed = serverWorld.getSeed();
// provider needs a separate variable to prevent
// the compiler from complaining
ServerChunkProvider provider = serverWorld.getChunkSource();
saveDir = new File(provider.dataStorage.dataFolder.getCanonicalFile().getPath() + File.separatorChar + "lod");
} else {
// connected to server
ServerWorld serverWorld = LodUtil.getServerWorldFromDimension(newDimension);
seed = serverWorld.getSeed();
// provider needs a separate variable to prevent
// the compiler from complaining
ServerChunkProvider provider = serverWorld.getChunkSource();
saveDir = new File(provider.dataStorage.dataFolder.getCanonicalFile().getPath() + File.separatorChar + "lod");
saveDir = new File(mc.gameDirectory.getCanonicalFile().getPath() +
File.separatorChar + "lod server data" + File.separatorChar + LodUtil.getDimensionIDFromWorld(mc.level));
}
fileHandler = new LodQuadTreeDimensionFileHandler(saveDir, this);
} catch (IOException e) {
// the file handler wasn't able to be created
// we won't be able to read or write any files
}
else
{
// connected to server
saveDir = new File(mc.gameDirectory.getCanonicalFile().getPath() +
File.separatorChar + "lod server data" + File.separatorChar + LodUtil.getDimensionIDFromWorld(mc.level));
}
fileHandler = new LodQuadTreeDimensionFileHandler(saveDir, this);
}
catch(IOException e)
{
// the file handler wasn't able to be created
// we won't be able to read or write any files
} */
regions = new LodQuadTree[width][width];
@@ -262,8 +256,8 @@ public class LodQuadTreeDimension {
public void addNode(LodNodeData lodNodeData)
{
RegionPos pos = new RegionPos(
lodNodeData.posX / lodNodeData.width,
lodNodeData.posZ / lodNodeData.width
lodNodeData.startX / 512,
lodNodeData.startZ / 512
);
// don't continue if the region can't be saved
@@ -280,10 +274,6 @@ public class LodQuadTreeDimension {
region = new LodQuadTree(pos.x, pos.z);
setRegion(region);
}
System.out.println("Adding this node");
System.out.println(lodNodeData);
System.out.println("to");
System.out.println(region);
region.setNodeAtLowerLevel(lodNodeData, true);
// don't save empty place holders to disk
@@ -341,11 +331,22 @@ public class LodQuadTreeDimension {
* @return list of quadTrees
*/
public List<LodQuadTree> getNodeToGenerate(int x, int z, byte level, int maxDistance, int minDistance){
int n = regions.length;
int xIndex;
int zIndex;
LodQuadTree region;
List<Map.Entry<LodQuadTree,Integer>> listOfQuadTree = new ArrayList<>();
for(int i=0; i<n; i++){
for(int j=0; j<n; j++){
listOfQuadTree.addAll(regions[i][j].getLevelToGenerate(x,z,level,maxDistance,minDistance));
for(int xRegion=0; xRegion<n; xRegion++){
for(int zRegion=0; zRegion<n; zRegion++){
xIndex = (xRegion + centerX) - halfWidth;
zIndex = (zRegion + centerZ) - halfWidth;
region = getRegion(xIndex,zIndex);
if (region == null){
region = new LodQuadTree(xIndex, zIndex);
setRegion(region);
}
listOfQuadTree.addAll(region.getLevelToGenerate(x,z,level,maxDistance,minDistance));
}
}
Collections.sort(listOfQuadTree,Map.Entry.comparingByValue());
@@ -359,9 +360,17 @@ public class LodQuadTreeDimension {
public List<LodNodeData> getNodes(boolean getOnlyReal, boolean getOnlyDirty, boolean getOnlyLeaf){
int n = regions.length;
List<LodNodeData> listOfNodes = new ArrayList<>();
for(int i=0; i<n; i++){
for(int j=0; j<n; j++){
listOfNodes.addAll(regions[i][j].getNodeList(getOnlyReal, getOnlyDirty, getOnlyLeaf));
int xIndex;
int zIndex;
LodQuadTree region;
for(int xRegion=0; xRegion<n; xRegion++){
for(int zRegion=0; zRegion<n; zRegion++){
xIndex = (xRegion + centerX) - halfWidth;
zIndex = (zRegion + centerZ) - halfWidth;
region = getRegion(xIndex,zIndex);
if (region != null){
listOfNodes.addAll(region.getNodeList(getOnlyReal, getOnlyDirty, getOnlyLeaf));
}
}
}
return listOfNodes;
@@ -73,17 +73,17 @@ public class QuadTreeImage extends JPanel {
}
private static void createAndShowGui() {
int playerX = 600;
int playerZ = 260;
LodQuadTreeDimension dim = new LodQuadTreeDimension(null, null, 10);
dim.move(playerX / 512, playerZ / 512);
dim.initializeNullRegions();
int playerX = 0;
int playerZ = 0;
LodQuadTreeDimension dim = new LodQuadTreeDimension(null, null, 8);
System.out.println(dim.getRegion(0, 0));
List<LodQuadTree> levelToGenerate2 = dim.getNodeToGenerate(playerX, playerZ, (byte) 0, 1000, 0);
System.out.println(levelToGenerate2);
dim.move(playerX/512,playerZ/512);
System.out.println(dim.getCenterX());
System.out.println(dim.getCenterZ());
System.out.println(dim.getWidth());
final QuadTreeImage quadTreeImage = new QuadTreeImage();
JFrame frame = new JFrame("DrawChit");
frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
frame.getContentPane().add(quadTreeImage);
@@ -92,18 +92,16 @@ public class QuadTreeImage extends JPanel {
frame.setVisible(true);
List<Collection<LodNodeData>> listOfList = new ArrayList<>();
OverworldBiomeSource biomeSource = new OverworldBiomeSource(MCVersion.v1_16_5, 100);
for (int i = 0; i <= (9 - 8); i++) {
for (int i = 0; i <= (9 - 5); i++) {
for (int j = 0; j < 1; j++) {
int dist;
if (i == 9) {
dist = 1000;
dist = 10000;
} else {
dist = 100;
}
List<LodQuadTree> levelToGenerate = dim.getNodeToGenerate(playerX, playerZ, (byte) (9 - i), (int) dist * (9 - i + 1), 0);
List<LodQuadTree> levelToGenerate = dim.getNodeToGenerate(playerX, playerZ, (byte) (9 - i), (int) dist, 0);
for (LodQuadTree level : levelToGenerate) {
System.out.println(level);
Color color;
int startX = level.getLodNodeData().startX;
int startZ = level.getLodNodeData().startZ;
@@ -117,6 +115,7 @@ public class QuadTreeImage extends JPanel {
List<Integer> posXs = new ArrayList<>();
List<Integer> posZs = new ArrayList<>();
/*
if (level.getLodNodeData().level == 0) {
posXs.add(startX / otherWidth);
posZs.add(startZ / otherWidth);
@@ -135,6 +134,11 @@ public class QuadTreeImage extends JPanel {
//posZs.add(centerZ / otherWidth);
//posZs.add(endZ / otherWidth);
}
*/
posXs.add(startX / otherWidth);
//posXs.add(centerX / otherWidth);
posZs.add(startZ / otherWidth);
//posXs.add(centerZ / otherWidth);
for (Integer posXI : posXs) {
for (Integer posZI : posZs) {
@@ -148,29 +152,13 @@ public class QuadTreeImage extends JPanel {
}
}
}
Collection<LodNodeData> lodList = dim.getNodes(false, false, true);
Collection<LodNodeData> lodList = dim.getNodes(false, 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));
//lodList = lodQuadTree.getNodeList(false,false,false);
listOfList.add(lodList);
/*
final List<MyDrawable> myDrawables = new ArrayList<>();
int amp = 2;
for (LodNodeData data : lodList) {
myDrawables.add(new MyDrawable(new Rectangle2D.Double(data.startX * amp, data.startZ * amp, data.width * amp, data.width * amp),
data.color, new BasicStroke(1)));
}
myDrawables.add(new MyDrawable(new Rectangle2D.Double(playerZ * amp - 10, playerX * amp - 10, 20, 20),
Color.yellow, new BasicStroke(1)));
for (int k = 0; k < myDrawables.size(); k++) {
quadTreeImage.addMyDrawable(myDrawables.get(k));
}
*/
System.out.println(lodList);
}
@@ -182,16 +170,26 @@ public class QuadTreeImage extends JPanel {
public void actionPerformed(ActionEvent e) {
if (drawCount >= listOfList.size()) {
drawCount = 0;
quadTreeImage.clearAll();
} else {
if(drawCount==0) quadTreeImage.clearAll();
final List<MyDrawable> myDrawables = new ArrayList<>();
int amp = 1;
double amp = 1;
int xOffset = (dim.getCenterX() - (dim.getWidth()/2))*512;
int zOffset = (dim.getCenterZ() - (dim.getWidth()/2))*512;
Collection<LodNodeData> lodList = listOfList.get(drawCount);
for (LodNodeData data : lodList) {
myDrawables.add(new MyDrawable(new Rectangle2D.Double(data.startX * amp, data.startZ * amp, data.width * amp, data.width * amp),
myDrawables.add(new MyDrawable(new Rectangle2D.Double(
((data.startX - xOffset ) * amp),
((data.startZ - zOffset) * amp),
data.width * amp,
data.width * amp),
data.color, new BasicStroke(1)));
}
myDrawables.add(new MyDrawable(new Rectangle2D.Double(playerX * amp - 10, playerZ * amp - 10, 20, 20),
myDrawables.add(new MyDrawable(new Rectangle2D.Double(
(playerX - 10 + xOffset) * amp,
(playerZ - 10 + zOffset) * amp,
20,
20),
Color.yellow, new BasicStroke(1)));
for (int k = 0; k < myDrawables.size(); k++) {
quadTreeImage.addMyDrawable(myDrawables.get(k));
@@ -79,8 +79,8 @@ public class LodUtil
public static RegionPos convertChunkPosToRegionPos(ChunkPos pos)
{
RegionPos rPos = new RegionPos();
rPos.x = pos.x / LodRegion.SIZE;
rPos.z = pos.z / LodRegion.SIZE;
rPos.x = pos.x / 512;
rPos.z = pos.z / 512;
// prevent issues if X/Z is negative and less than 16
if (pos.x < 0)