Refactor and comment

This commit is contained in:
James Seibel
2021-08-08 22:04:13 -05:00
parent 89115fd5d5
commit 54e5fd30ab
11 changed files with 110 additions and 81 deletions
@@ -189,7 +189,7 @@ public class QuadTreeImage extends JPanel
//int[] distances2 = {100000, 8000, 4000, 2000, 1000, 500, 250, 0};
int[] distances2 = {0, 250, 500, 1000, 2000, 4000, 8000, 100000};
for (int h = 0; h <= (9 - 3); h++) {
lodList.addAll(dim.getNodeToRender(new BlockPos(playerX, 0, playerZ), (byte) (3+h), complexityMask, distances2[h+1], distances2[h]));
lodList.addAll(dim.getNodesToRender(new BlockPos(playerX, 0, playerZ), (byte) (3+h), complexityMask, distances2[h+1], distances2[h]));
}
System.out.println("Number of node to render " + lodList.size());
listOfList.add(lodList);
@@ -89,7 +89,9 @@ public class LodNodeBuilder {
}
lodDim.addNode(node);
} catch (IllegalArgumentException | NullPointerException e) {
}
catch (IllegalArgumentException | NullPointerException e)
{
e.printStackTrace();
// if the world changes while LODs are being generated
// they will throw errors as they try to access things that no longer
@@ -30,7 +30,7 @@ import net.minecraft.client.renderer.BufferBuilder;
* BufferBuilders.
*
* @author James Seibel
* @version 06-16-2021
* @version 8-8-2021
*/
public abstract class AbstractLodNodeTemplate
{
@@ -31,7 +31,7 @@ import net.minecraft.util.math.AxisAlignedBB;
* Builds LODs as rectangular prisms.
*
* @author James Seibel
* @version 06-16-2021
* @version 8-8-2021
*/
public class CubicLodNodeTemplate extends AbstractLodNodeTemplate
{
@@ -35,6 +35,7 @@ import com.seibel.lod.objects.LodChunk;
import com.seibel.lod.objects.LodQuadTreeDimension;
import com.seibel.lod.objects.LodQuadTreeNode;
import com.seibel.lod.objects.LodRegion;
import com.seibel.lod.proxy.ClientProxy;
import com.seibel.lod.render.LodNodeRenderer;
import net.minecraft.block.Block;
@@ -159,7 +160,7 @@ public class LodNodeGenWorker implements IWorker
{
public final ServerWorld serverWorld;
public final LodQuadTreeDimension lodDim;
public final LodNodeBuilder lodChunkBuilder;
public final LodNodeBuilder lodNodeBuilder;
public final LodNodeRenderer lodRenderer;
private LodNodeBufferBuilder lodBufferBuilder;
@@ -171,7 +172,7 @@ public class LodNodeGenWorker implements IWorker
{
pos = newPos;
lodRenderer = newLodRenderer;
lodChunkBuilder = newLodBuilder;
lodNodeBuilder = newLodBuilder;
lodBufferBuilder = newLodBufferBuilder;
lodDim = newLodDimension;
serverWorld = newServerWorld;
@@ -337,14 +338,14 @@ public class LodNodeGenWorker implements IWorker
LodQuadTreeNode lod;
if (!inTheEnd)
{
lod = lodChunkBuilder.generateLodNodeFromChunk(chunk, new LodBuilderConfig(true, true, false));
lod = lodNodeBuilder.generateLodNodeFromChunk(chunk, new LodBuilderConfig(true, true, false));
}
else
{
// if we are in the end, don't generate any chunks.
// Since we don't know where the islands are, everything
// generates the same and it looks really bad.
lod = lodChunkBuilder.generateLodNodeFromChunk(chunk, new LodBuilderConfig(true, true, false));
lod = lodNodeBuilder.generateLodNodeFromChunk(chunk, new LodBuilderConfig(true, true, false));
}
lodDim.addNode(lod);
}
@@ -377,7 +378,7 @@ public class LodNodeGenWorker implements IWorker
IceAndSnowFeature snowFeature = new IceAndSnowFeature(NoFeatureConfig.CODEC);
snowFeature.place(lodServerWorld, chunkGen, serverWorld.random, chunk.getPos().getWorldPosition(), null);
LodQuadTreeNode lod = lodChunkBuilder.generateLodNodeFromChunk(chunk, new LodBuilderConfig(true, true, false));
LodQuadTreeNode lod = lodNodeBuilder.generateLodNodeFromChunk(chunk, new LodBuilderConfig(true, true, false));
lodDim.addNode(lod);
}
@@ -504,7 +505,7 @@ public class LodNodeGenWorker implements IWorker
// generate a Lod like normal
LodQuadTreeNode lod = lodChunkBuilder.generateLodNodeFromChunk(chunk, new LodBuilderConfig(true, true, false));
LodQuadTreeNode lod = lodNodeBuilder.generateLodNodeFromChunk(chunk, new LodBuilderConfig(true, true, false));
lodDim.addNode(lod);
}
@@ -518,8 +519,9 @@ public class LodNodeGenWorker implements IWorker
* Note this should not be multithreaded and does cause server/simulation lag
* (Higher lag for generating than loading)
*/
private void generateWithServer() {
//lodChunkBuilder.generateLodNodeAsync(serverWorld.getChunk(pos.x, pos.z, ChunkStatus.FEATURES), ClientProxy.getLodWorld(), serverWorld);
private void generateWithServer()
{
lodNodeBuilder.generateLodNodeAsync(serverWorld.getChunk(pos.x, pos.z, ChunkStatus.FEATURES), ClientProxy.getLodWorld(), serverWorld);
}
@@ -34,6 +34,8 @@ import com.seibel.lod.objects.LodQuadTreeNode;
import com.seibel.lod.objects.RegionPos;
import com.seibel.lod.proxy.ClientProxy;
import net.minecraft.util.math.ChunkPos;
/**
* This object handles creating LodRegions
* from files and saving LodRegion objects
@@ -199,7 +201,7 @@ public class LodQuadTreeDimensionFileHandler
// problem reading the file
return null;
}
return new LodQuadTree(dataList,regionX, regionZ);
return new LodQuadTree(dataList, regionX, regionZ);
}
@@ -246,10 +248,10 @@ public class LodQuadTreeDimensionFileHandler
*/
private void saveRegionToDisk(LodQuadTree region)
{
// convert chunk coordinates to region
// coordinates
int x = region.getLodNodeData().posX;
int z = region.getLodNodeData().posX;
// convert to region coordinates
RegionPos regionPos = new RegionPos(new ChunkPos(region.getLodNodeData().center));
int x = regionPos.x;
int z = regionPos.z;
File f = new File(getFileNameAndPathForRegion(x, z));
@@ -310,7 +312,8 @@ public class LodQuadTreeDimensionFileHandler
fw.write(LOD_FILE_VERSION_PREFIX + " " + LOD_SAVE_FILE_VERSION + "\n");
// add each LodChunk to the file
for (LodQuadTreeNode lodQuadTreeNode : Collections.unmodifiableList(region.getNodeListWithMask(LodQuadTreeDimension.FULL_COMPLEXITY_MASK , true, true)))
List<LodQuadTreeNode> nodesToSave = Collections.unmodifiableList(region.getNodeListWithMask(LodQuadTreeDimension.FULL_COMPLEXITY_MASK, false, true));
for (LodQuadTreeNode lodQuadTreeNode : nodesToSave)
{
fw.write(lodQuadTreeNode.toData() + "\n");
lodQuadTreeNode.dirty = false;
@@ -350,7 +353,7 @@ public class LodQuadTreeDimensionFileHandler
// or
// ".\Super Flat\data"
return dimensionDataSaveFolder.getCanonicalPath() + File.separatorChar +
FILE_NAME_PREFIX + regionX + "." + regionZ + FILE_EXTENSION;
FILE_NAME_PREFIX + "." + regionX + "." + regionZ + FILE_EXTENSION;
}
catch(IOException e)
{
@@ -259,7 +259,7 @@ public class LodDimension
*/
public void addLod(LodChunk lod)
{
RegionPos pos = LodUtil.convertChunkPosToRegionPos(new ChunkPos(lod.x, lod.z));
RegionPos pos = new RegionPos(new ChunkPos(lod.x, lod.z));
// don't continue if the region can't be saved
if (!regionIsInRange(pos.x, pos.z))
@@ -298,7 +298,7 @@ public class LodDimension
*/
public LodChunk getLodFromCoordinates(int chunkX, int chunkZ)
{
RegionPos pos = LodUtil.convertChunkPosToRegionPos(new ChunkPos(chunkX, chunkZ));
RegionPos pos = new RegionPos(new ChunkPos(chunkX, chunkZ));
LodRegion region = getRegion(pos.x, pos.z);
@@ -129,20 +129,6 @@ public class LodQuadTree
this(parent, new LodQuadTreeNode(level, regionPos.x, regionPos.z));
}
/**
* Constructor for a generic world via the LodNodeData
*
* @param newLodNode LodQuadTreeNode containing all the information of this node
*/
public LodQuadTree(LodQuadTree newParent, LodQuadTreeNode newLodNode)
{
parent = newParent;
lodNode = newLodNode;
children = new LodQuadTree[2][2];
treeEmpty = true;
treeFull = false;
}
/**
* Constructor using a dataList
*
@@ -156,6 +142,20 @@ public class LodQuadTree
setNodesAtLowerLevel(dataList);
}
/**
* Constructor for a generic LodQuadTree using a LodNodeData
*
* @param newLodNode LodQuadTreeNode containing all the information of this node
*/
public LodQuadTree(LodQuadTree newParent, LodQuadTreeNode newLodNode)
{
parent = newParent;
lodNode = newLodNode;
children = new LodQuadTree[2][2];
treeEmpty = true;
treeFull = false;
}
/**
* @param dataList list of data to put in the node
@@ -564,11 +564,13 @@ public class LodQuadTree
public String toString()
{
String s = lodNode.toString();
return s;
/*
if(isThereAnyChild()){
for (int NS = 0; NS <= 1; NS++) {
for (int WE = 0; WE <= 1; WE++) {
if(hasChildren())
{
for (int NS = 0; NS <= 1; NS++)
{
for (int WE = 0; WE <= 1; WE++)
{
LodQuadTree child = children[NS][WE];
if (child != null) {
s += '\n' + child.toString();
@@ -576,7 +578,8 @@ public class LodQuadTree
}
}
}
return s;
*/
}
}
@@ -44,7 +44,7 @@ import net.minecraft.world.server.ServerWorld;
*
* @author Leonardo Amato
* @author James Seibel
* @version 8-7-2021
* @version 8-8-2021
*/
public class LodQuadTreeDimension
{
@@ -77,7 +77,6 @@ public class LodQuadTreeDimension
public volatile LodQuadTree regions[][];
public volatile boolean isRegionDirty[][];
/** a chunk Position */
private volatile RegionPos center;
private LodQuadTreeDimensionFileHandler fileHandler;
@@ -145,7 +144,9 @@ public class LodQuadTreeDimension
/**
* Move the center of this LodDimension and move all owned
* regions over by the given x and z offset.
* regions over by the given x and z offset. <br><br>
*
* Synchronized to prevent multiple moves happening on top of each other.
*/
public synchronized void move(RegionPos regionOffset)
{
@@ -329,7 +330,7 @@ public class LodQuadTreeDimension
*/
public Boolean addNode(LodQuadTreeNode lodNode)
{
RegionPos regionPos = LodUtil.convertChunkPosToRegionPos(new ChunkPos(lodNode.center.getX(), lodNode.center.getZ()));
RegionPos regionPos = new RegionPos(new ChunkPos(lodNode.center.getX(), lodNode.center.getZ()));
// don't continue if the region can't be saved
if (!regionIsInRange(regionPos.x, regionPos.z))
@@ -412,7 +413,7 @@ public class LodQuadTreeDimension
* method to get all the nodes that have to be rendered based on the position of the player
* @return list of nodes
*/
public List<LodQuadTreeNode> getNodeToRender(BlockPos playerPos, int detailLevel,
public List<LodQuadTreeNode> getNodesToRender(BlockPos playerPos, int detailLevel,
Set<DistanceGenerationMode> complexityMask, int maxDistance, int minDistance)
{
List<LodQuadTreeNode> listOfData = new ArrayList<>();
@@ -430,7 +431,7 @@ public class LodQuadTreeDimension
}
/**
* method to get all the quadtree levels that have to be generated based on the position of the player
* Returns all LodQuadTreeNodes that need to be generated based on the position of the player
* @return list of quadTrees
*/
public List<LodQuadTreeNode> getNodesToGenerate(BlockPos playerPos, byte level, DistanceGenerationMode complexity,
@@ -38,7 +38,7 @@ import net.minecraft.world.gen.Heightmap;
public class LodQuadTreeNode
{
/** This is what separates each piece of data in the toData method */
private static final char DATA_DELIMITER_COUNT = LodQuadTreeDimensionFileHandler.DATA_DELIMITER;
private static final char DATA_DELIMITER = LodQuadTreeDimensionFileHandler.DATA_DELIMITER;
/** If we ever have to use a heightmap for any reason, use this one. */
public static final Heightmap.Type DEFAULT_HEIGHTMAP = Heightmap.Type.WORLD_SURFACE_WG;
@@ -52,8 +52,6 @@ public class LodQuadTreeNode
* the empty string */
public boolean dontSave = false;
// these 2 values indicate the position of the LOD in the relative Level
// this will be useful in the generation process
/** X position relative to the Quad tree. */
public final int posX;
/** Z position relative to the Quad tree */
@@ -215,11 +213,11 @@ public class LodQuadTreeNode
int count = 0;
for(int i = 0; i < data.length(); i++)
if(data.charAt(i) == DATA_DELIMITER_COUNT)
if(data.charAt(i) == DATA_DELIMITER)
count++;
if(count != DATA_DELIMITER_COUNT)
throw new IllegalArgumentException("LodQuadTreeNode constructor givin an invalid string. The data given had " + count + " delimiters when it should have had " + DATA_DELIMITER_COUNT + ".");
if(count != NUMBER_OF_DELIMITERS)
throw new IllegalArgumentException("LodQuadTreeNode constructor givin an invalid string. The data given had " + count + " delimiters when it should have had " + NUMBER_OF_DELIMITERS + ".");
// start reading the data string
@@ -227,46 +225,46 @@ public class LodQuadTreeNode
int index = 0;
int lastIndex = 0;
index = data.indexOf(DATA_DELIMITER_COUNT, 0);
index = data.indexOf(DATA_DELIMITER, 0);
this.detailLevel = (byte) Integer.parseInt(data.substring(0,index));
lastIndex = index;
index = data.indexOf(DATA_DELIMITER_COUNT, lastIndex+1);
index = data.indexOf(DATA_DELIMITER, lastIndex+1);
this.posX = Integer.parseInt(data.substring(lastIndex+1,index));
lastIndex = index;
index = data.indexOf(DATA_DELIMITER_COUNT, lastIndex+1);
index = data.indexOf(DATA_DELIMITER, lastIndex+1);
this.posZ = Integer.parseInt(data.substring(lastIndex+1,index));
lastIndex = index;
index = data.indexOf(DATA_DELIMITER_COUNT, lastIndex+1);
index = data.indexOf(DATA_DELIMITER, lastIndex+1);
this.complexity = DistanceGenerationMode.valueOf(data.substring(lastIndex+1,index));
lastIndex = index;
index = data.indexOf(DATA_DELIMITER_COUNT, lastIndex+1);
index = data.indexOf(DATA_DELIMITER, lastIndex+1);
short height = (short) Integer.parseInt(data.substring(lastIndex+1,index));
lastIndex = index;
index = data.indexOf(DATA_DELIMITER_COUNT, lastIndex+1);
index = data.indexOf(DATA_DELIMITER, lastIndex+1);
short depth = (short) Integer.parseInt(data.substring(lastIndex+1,index));
lastIndex = index;
index = data.indexOf(DATA_DELIMITER_COUNT, lastIndex+1);
int r = Integer.parseInt(data.substring(lastIndex+1,index));
index = data.indexOf(DATA_DELIMITER, lastIndex+1);
int red = Integer.parseInt(data.substring(lastIndex+1,index));
lastIndex = index;
index = data.indexOf(DATA_DELIMITER_COUNT, lastIndex+1);
int g = Integer.parseInt(data.substring(lastIndex+1,index));
index = data.indexOf(DATA_DELIMITER, lastIndex+1);
int green = Integer.parseInt(data.substring(lastIndex+1,index));
lastIndex = index;
index = data.indexOf(DATA_DELIMITER_COUNT, lastIndex+1);
int b = Integer.parseInt(data.substring(lastIndex+1,index));
index = data.indexOf(DATA_DELIMITER, lastIndex+1);
int blue = Integer.parseInt(data.substring(lastIndex+1,index));
lastIndex = index;
index = data.indexOf(DATA_DELIMITER_COUNT, lastIndex+1);
int a = Integer.parseInt(data.substring(lastIndex+1,index));
Color color = new Color(r,g,b,a);
index = data.indexOf(DATA_DELIMITER, lastIndex+1);
int alpha = Integer.parseInt(data.substring(lastIndex+1,index));
Color color = new Color(red,green,blue,alpha);
lodDataPoint = new LodDataPoint(height,depth,color);
int val = Integer.parseInt(data.substring(lastIndex+1,index));
this.voidNode = (val == 1);
int isVoid = Integer.parseInt(data.substring(lastIndex+1,index));
this.voidNode = (isVoid == 1);
width = (short) Math.pow(2, detailLevel);
@@ -419,16 +417,16 @@ public class LodQuadTreeNode
if (dontSave)
return "";
String s = Integer.toString(detailLevel) + DATA_DELIMITER_COUNT
+ Integer.toString(posX) + DATA_DELIMITER_COUNT
+ Integer.toString(posZ) + DATA_DELIMITER_COUNT
+ complexity.toString() + DATA_DELIMITER_COUNT
+ Integer.toString((lodDataPoint.height)) + DATA_DELIMITER_COUNT
+ Integer.toString((lodDataPoint.depth)) + DATA_DELIMITER_COUNT
+ Integer.toString(lodDataPoint.color.getRed()) + DATA_DELIMITER_COUNT
+ Integer.toString(lodDataPoint.color.getGreen()) + DATA_DELIMITER_COUNT
+ Integer.toString(lodDataPoint.color.getBlue()) + DATA_DELIMITER_COUNT
+ Integer.toString(lodDataPoint.color.getAlpha()) + DATA_DELIMITER_COUNT
String s = Integer.toString(detailLevel) + DATA_DELIMITER
+ Integer.toString(posX) + DATA_DELIMITER
+ Integer.toString(posZ) + DATA_DELIMITER
+ complexity.toString() + DATA_DELIMITER
+ Integer.toString((lodDataPoint.height)) + DATA_DELIMITER
+ Integer.toString((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
+ Integer.toString(voidNode ? 1 : 0);
return s;
}
@@ -17,11 +17,13 @@
*/
package com.seibel.lod.objects;
import net.minecraft.util.math.ChunkPos;
/**
* This object is similar to ChunkPos or BlockPos.
*
* @author James Seibel
* @version 03-19-2021
* @version 8-8-2021
*/
public class RegionPos
{
@@ -45,4 +47,22 @@ public class RegionPos
x = newX;
z = newZ;
}
public RegionPos(ChunkPos pos)
{
RegionPos rPos = new RegionPos();
x = pos.x / LodQuadTreeNode.REGION_WIDTH;
z = pos.z / LodQuadTreeNode.REGION_WIDTH;
// prevent issues if X/Z is negative and less than 16
if (pos.x < 0)
{
x = (Math.abs(rPos.x) * -1) - 1;
}
if (pos.z < 0)
{
z = (Math.abs(rPos.z) * -1) - 1;
}
}
}