Added getDataToRender to the bufferBuilder
This commit is contained in:
@@ -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!");
|
||||
}
|
||||
|
||||
+1
-1
@@ -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<>();
|
||||
|
||||
|
||||
Reference in New Issue
Block a user