fixed LodQuadTreeDimension
This commit is contained in:
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user