Added getDataToRender to the bufferBuilder

This commit is contained in:
Leonardo
2021-08-20 19:02:11 +02:00
parent 0f0179bd19
commit 550c0f1bf2
8 changed files with 128 additions and 36 deletions
@@ -17,10 +17,14 @@
*/
package com.seibel.lod.builders;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.atomic.AtomicInteger;
import kaptainwutax.mathutils.decomposition.LUDecomposition;
import org.lwjgl.opengl.GL11;
import com.seibel.lod.builders.worldGeneration.LodNodeGenWorker;
@@ -285,7 +289,7 @@ public class LodNodeBufferBuilder
continue;
} // lod null or empty
/*
BufferBuilder currentBuffer = null;
try
{
@@ -323,12 +327,65 @@ public class LodNodeBufferBuilder
// add this LOD to the buffer
LodConfig.CLIENT.lodTemplate.get().
template.addLodToBuffer(currentBuffer, lodDim, lodData,
posX, yOffset, posZ, renderer.debugging, detail);
posX, yOffset, posZ, renderer.debugging, (byte) detail.detailLevel);
}
*/
}
}
int width;
List<LevelPos> posList = new ArrayList<>();
LodDataPoint lodData;
for (int xRegion = 0; xRegion < lodDim.regions.length; xRegion++)
{
for (int zRegion = 0; zRegion < lodDim.regions.length; zRegion++)
{
RegionPos regionPos = new RegionPos(xRegion + lodDim.getCenterX() - lodDim.getWidth()/2, zRegion + lodDim.getCenterZ() - lodDim.getWidth()/2);
BufferBuilder currentBuffer = null;
try
{
// local position in the vbo and bufferBuilder arrays
currentBuffer = buildableBuffers[regionPos.x][regionPos.z];
}
catch(Exception e)
{
e.printStackTrace();
continue;
}
posList.addAll(lodDim.getDataToRender(regionPos, playerBlockPosRounded.getX(), playerBlockPosRounded.getZ(), 0, 200, (byte) 0));
posList.addAll(lodDim.getDataToRender(regionPos, playerBlockPosRounded.getX(), playerBlockPosRounded.getZ(), 200, 400, (byte) 1));
posList.addAll(lodDim.getDataToRender(regionPos, playerBlockPosRounded.getX(), playerBlockPosRounded.getZ(), 400, 600, (byte) 2));
posList.addAll(lodDim.getDataToRender(regionPos, playerBlockPosRounded.getX(), playerBlockPosRounded.getZ(), 600, 800, (byte) 3));
posList.addAll(lodDim.getDataToRender(regionPos, playerBlockPosRounded.getX(), playerBlockPosRounded.getZ(), 800, 1000, (byte) 4));
posList.addAll(lodDim.getDataToRender(regionPos, playerBlockPosRounded.getX(), playerBlockPosRounded.getZ(), 1000, 10000000, (byte) 5));
for(LevelPos pos : posList){
LevelPos chunkPos = pos.convert((byte) 3);
int chunkX = chunkPos.posX + startChunkPos.x;
int chunkZ = chunkPos.posZ + startChunkPos.z;
// skip any chunks that Minecraft is going to render
if (isCoordInCenterArea(pos.convert((byte) 3).posX, pos.convert((byte) 3).posZ, (numbChunksWide / 2))
&& renderer.vanillaRenderedChunks.contains(new ChunkPos(chunkX, chunkZ)))
{
}else{
// set where this square will be drawn in the world
double xOffset = (LodUtil.CHUNK_WIDTH * chunkPos.posX) + // offset by the number of LOD blocks
startBlockPos.getX(); // offset so the center LOD block is centered underneath the player
double yOffset = 0;
double zOffset = (LodUtil.CHUNK_WIDTH * chunkPos.posZ) + startBlockPos.getZ();
width = (int) Math.pow(2, pos.detailLevel);
lodData = lodDim.getData(pos);
LodConfig.CLIENT.lodTemplate.get().
template.addLodToBuffer(currentBuffer, lodDim, lodData,
pos.posX * width, 0, pos.posZ * width, renderer.debugging, pos.detailLevel);
}
}
posList.clear();
}
}
// issue #19
// TODO add a way for a server side mod to generate chunks requested here
@@ -38,7 +38,7 @@ public abstract class AbstractLodNodeTemplate
public abstract void addLodToBuffer(BufferBuilder buffer,
LodDimension lodDim, LodDataPoint lod,
double xOffset, double yOffset, double zOffset,
boolean debugging, LodDetail detail);
boolean debugging, byte detail);
/** add the given position and color to the buffer */
protected void addPosAndColor(BufferBuilder buffer,
@@ -46,7 +46,7 @@ public class CubicLodNodeTemplate extends AbstractLodNodeTemplate
public void addLodToBuffer(BufferBuilder buffer,
LodDimension lodDim, LodDataPoint lod,
double xOffset, double yOffset, double zOffset,
boolean debugging, LodDetail detail)
boolean debugging, byte detail)
{
AxisAlignedBB bbox;
@@ -54,7 +54,7 @@ public class CubicLodNodeTemplate extends AbstractLodNodeTemplate
bbox = generateBoundingBox(
lod.height,
lod.depth,
detail.dataPointWidth,
(int) Math.pow(2, detail),
xOffset,
yOffset,
zOffset);
@@ -62,7 +62,7 @@ public class CubicLodNodeTemplate extends AbstractLodNodeTemplate
Color color = lod.color;
if (LodConfig.CLIENT.debugMode.get())
{
color = LodUtil.DEBUG_DETAIL_LEVEL_COLORS[detail.detailLevel];
color = LodUtil.DEBUG_DETAIL_LEVEL_COLORS[detail];
}
if (bbox != null)
@@ -38,7 +38,7 @@ public class DynamicLodNodeTemplate extends AbstractLodNodeTemplate
public void addLodToBuffer(BufferBuilder buffer,
LodDimension lodDim, LodDataPoint lod,
double xOffset, double yOffset, double zOffset,
boolean debugging, LodDetail detail)
boolean debugging, byte detail)
{
System.err.println("DynamicLodTemplate not implemented!");
}
@@ -36,7 +36,7 @@ public class TriangularLodNodeTemplate extends AbstractLodNodeTemplate
public void addLodToBuffer(BufferBuilder buffer,
LodDimension lodDim, LodDataPoint lod,
double xOffset, double yOffset, double zOffset,
boolean debugging, LodDetail detail)
boolean debugging, byte detail)
{
System.err.println("DynamicLodTemplate not implemented!");
}
@@ -63,12 +63,12 @@ public class LevelPos implements Cloneable
int blockPosX = regionPosX * 512 + posX * width + width / 2;
int blockPosZ = regionPosZ * 512 + posZ * width + width / 2;
int maxDistance = (int) Math.sqrt(Math.pow(playerPosX - blockPosX, 2) + Math.pow(playerPosZ - blockPosZ, 2));
for (int x = 0; x <= 1; x++)
for (int x = 0; x <= 3; x++)
{
for (int z = 0; z <= 1; z++)
for (int z = 0; z <= 3; z++)
{
blockPosX = regionPosX * 512 + posX * width + width * x;
blockPosZ = regionPosZ * 512 + posZ * width + width * z;
blockPosX = regionPosX * 512 + posX * width + width/2 * x;
blockPosZ = regionPosZ * 512 + posZ * width + width/2 * z;
maxDistance = Math.max(maxDistance, (int) Math.sqrt(Math.pow(playerPosX - blockPosX, 2) + Math.pow(playerPosZ - blockPosZ, 2)));
}
}
@@ -85,12 +85,12 @@ public class LevelPos implements Cloneable
int blockPosX = regionPosX * 512 + posX * width + width / 2;
int blockPosZ = regionPosZ * 512 + posZ * width + width / 2;
int minDistance = (int) Math.sqrt(Math.pow(playerPosX - blockPosX, 2) + Math.pow(playerPosZ - blockPosZ, 2));
for (int x = 0; x <= 1; x++)
for (int x = 0; x <= 3; x++)
{
for (int z = 0; z <= 1; z++)
for (int z = 0; z <= 3; z++)
{
blockPosX = regionPosX * 512 + posX * width + width * x;
blockPosZ = regionPosZ * 512 + posZ * width + width * z;
blockPosX = regionPosX * 512 + posX * width + width/2 * x;
blockPosZ = regionPosZ * 512 + posZ * width + width/2 * z;
minDistance = Math.min(minDistance, (int) Math.sqrt(Math.pow(playerPosX - blockPosX, 2) + Math.pow(playerPosZ - blockPosZ, 2)));
}
}
@@ -355,53 +355,65 @@ public class LodDimension
/**
* method to get all the quadtree level that have to be generated based on the position of the player
*
* @return list of quadTrees
*/
public List<LevelPos> getDataToGenerate(int playerPosX, int playerPosZ, int start, int end, byte generation, byte detailLevel){
public List<LevelPos> getDataToGenerate(int playerPosX, int playerPosZ, int start, int end, byte generation, byte detailLevel, int dataNumber)
{
int n = regions.length;
int xIndex;
int zIndex;
LodRegion region;
List<Map.Entry<LevelPos,Integer>> listOfData = new ArrayList<>();
for(int xRegion=0; xRegion<n; xRegion++){
for(int zRegion=0; zRegion<n; zRegion++){
List<Map.Entry<LevelPos, Integer>> listOfData = new ArrayList<>();
for (int xRegion = 0; xRegion < n; xRegion++)
{
for (int zRegion = 0; zRegion < n; zRegion++)
{
xIndex = (xRegion + center.x) - halfWidth;
zIndex = (zRegion + center.z) - halfWidth;
RegionPos regionPos = new RegionPos(xIndex, zIndex);
region = getRegion(regionPos);
if (region == null){
if (region == null)
{
region = new LodRegion((byte) 0, regionPos);
addOrOverwriteRegion(region);
}
listOfData.addAll(region.getDataToGenerate(playerPosX, playerPosZ, start, end, generation, detailLevel));
listOfData.addAll(region.getDataToGenerate(playerPosX, playerPosZ, start, end, generation, detailLevel, dataNumber));
}
}
Collections.sort(listOfData,Map.Entry.comparingByValue());
return listOfData.stream().map(entry -> entry.getKey()).collect(Collectors.toList());
Collections.sort(listOfData, Map.Entry.comparingByValue());
dataNumber = Math.min(dataNumber, listOfData.size());
return listOfData.stream().map(entry -> entry.getKey()).collect(Collectors.toList()).subList(0, dataNumber);
}
/**
* method to get all the nodes that have to be rendered based on the position of the player
*
* @return list of nodes
*/
public List<LevelPos> getDataToRender(int playerPosX, int playerPosZ, int start, int end, byte detailLevel){
public List<LevelPos> getDataToRender(int playerPosX, int playerPosZ, int start, int end, byte detailLevel)
{
int n = regions.length;
List<LevelPos> listOfData = new ArrayList<>();
int xIndex;
int zIndex;
LodRegion region;
for(int xRegion=0; xRegion<n; xRegion++){
for(int zRegion=0; zRegion<n; zRegion++){
for (int xRegion = 0; xRegion < n; xRegion++)
{
for (int zRegion = 0; zRegion < n; zRegion++)
{
xIndex = (xRegion + center.x) - halfWidth;
zIndex = (zRegion + center.z) - halfWidth;
RegionPos regionPos = new RegionPos(xIndex, zIndex);
region = getRegion(regionPos);
if (region == null){
if (region == null)
{
region = new LodRegion((byte) 0, regionPos);
addOrOverwriteRegion(region);
}else{
} else
{
listOfData.addAll(region.getDataToRender(playerPosX, playerPosZ, start, end, detailLevel));
}
}
@@ -409,6 +421,26 @@ public class LodDimension
return listOfData;
}
/**
* method to get all the nodes that have to be rendered based on the position of the player
*
* @return list of nodes
*/
public List<LevelPos> getDataToRender(RegionPos regionPos, int playerPosX, int playerPosZ, int start, int end, byte detailLevel)
{
int n = regions.length;
List<LevelPos> listOfData = new ArrayList<>();
LodRegion region = getRegion(regionPos);
if (region == null)
{
region = new LodRegion((byte) 0, regionPos);
addOrOverwriteRegion(region);
} else
{
listOfData.addAll(region.getDataToRender(playerPosX, playerPosZ, start, end, detailLevel));
}
return listOfData;
}
/**
* Get the data point at the given X and Z coordinates
@@ -8,10 +8,9 @@ import net.minecraft.util.math.ChunkPos;
import java.awt.*;
import java.io.Serializable;
import java.util.AbstractMap;
import java.util.ArrayList;
import java.util.*;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
/**
* STANDARD TO FOLLOW
@@ -208,13 +207,17 @@ public class LodRegion implements Serializable
/**
* @return
*/
public List<Map.Entry<LevelPos,Integer>> getDataToGenerate(int playerPosX, int playerPosZ, int start, int end, byte generation, byte detailLevel)
public List<Map.Entry<LevelPos,Integer>> getDataToGenerate(int playerPosX, int playerPosZ, int start, int end, byte generation, byte detailLevel, int dataNumber)
{
LevelPos levelPos = new LevelPos(LodUtil.REGION_DETAIL_LEVEL, 0, 0);
return getDataToGenerate(levelPos, playerPosX, playerPosZ, start, end, generation, detailLevel);
List<Map.Entry<LevelPos,Integer>> listOfPos = getDataToGenerate(levelPos, playerPosX, playerPosZ, start, end, generation, detailLevel);
Collections.sort(listOfPos,Map.Entry.comparingByValue());
dataNumber = Math.min(dataNumber, listOfPos.size());
return listOfPos.subList(0,dataNumber);
}
public List<Map.Entry<LevelPos,Integer>> getDataToGenerate(LevelPos levelPos, int playerPosX, int playerPosZ, int start, int end, byte generation, byte detailLevel)
private List<Map.Entry<LevelPos,Integer>> getDataToGenerate(LevelPos levelPos, int playerPosX, int playerPosZ, int start, int end, byte generation, byte detailLevel)
{
List<Map.Entry<LevelPos,Integer>> levelPosList = new ArrayList<>();
@@ -317,7 +320,7 @@ public class LodRegion implements Serializable
/**
* @return
*/
public List<LevelPos> getDataToRender(LevelPos levelPos, int playerPosX, int playerPosZ, int start, int end, byte detailLevel)
private List<LevelPos> getDataToRender(LevelPos levelPos, int playerPosX, int playerPosZ, int start, int end, byte detailLevel)
{
List<LevelPos> levelPosList = new ArrayList<>();