fixed face culling
This commit is contained in:
@@ -15,10 +15,10 @@ public class Main
|
||||
{
|
||||
Map<Direction, long[]> adjData = new HashMap()
|
||||
{{
|
||||
put(Direction.EAST, new long[]{DataPointUtil.createDataPoint(70, 50, 0, 0, 0, 0), DataPointUtil.createDataPoint(45, 30, 0, 0, 0, 0), DataPointUtil.createDataPoint(28, 25, 0, 0, 0, 0)});
|
||||
put(Direction.WEST, new long[]{DataPointUtil.createDataPoint(70, 10, 0, 0, 0, 0)});
|
||||
put(Direction.NORTH, new long[]{DataPointUtil.createDataPoint(50, 0, 0, 0, 0, 0)});
|
||||
put(Direction.SOUTH, new long[]{DataPointUtil.createDataPoint(50, 30, 0, 0, 0, 0)});
|
||||
put(Direction.EAST, new long[]{DataPointUtil.createDataPoint(40, 20, 0, 0, 0, 0)});
|
||||
put(Direction.WEST, new long[]{DataPointUtil.createDataPoint(40, 20, 0, 0, 0, 0)});
|
||||
put(Direction.NORTH, new long[]{DataPointUtil.createDataPoint(40, 20, 0, 0, 0, 0)});
|
||||
put(Direction.SOUTH, new long[]{DataPointUtil.createDataPoint(40, 20, 0, 0, 0, 0)});
|
||||
}};
|
||||
|
||||
Box box = new Box();
|
||||
|
||||
@@ -223,9 +223,9 @@ public class LodBufferBuilder
|
||||
final int zR = zRegion;
|
||||
Callable<Boolean> dataToRenderThread = () ->
|
||||
{
|
||||
|
||||
Map<Direction, long[]> adjData = new HashMap<>();
|
||||
if(LodConfig.CLIENT.worldGenerator.lodQualityMode.get() == LodQualityMode.HEIGHTMAP){
|
||||
if (LodConfig.CLIENT.worldGenerator.lodQualityMode.get() == LodQualityMode.HEIGHTMAP)
|
||||
{
|
||||
adjData.put(Direction.WEST, new long[1]);
|
||||
adjData.put(Direction.EAST, new long[1]);
|
||||
adjData.put(Direction.SOUTH, new long[1]);
|
||||
@@ -259,7 +259,6 @@ public class LodBufferBuilder
|
||||
int chunkZdist;
|
||||
short gameChunkRenderDistance = (short) (renderer.vanillaRenderedChunks.length / 2 - 1);
|
||||
//long dataPoint;
|
||||
|
||||
for (int index = 0; index < posToRender.getNumberOfPos(); index++)
|
||||
{
|
||||
detailLevel = posToRender.getNthDetailLevel(index);
|
||||
@@ -278,32 +277,32 @@ public class LodBufferBuilder
|
||||
// skip any chunks that Minecraft is going to render
|
||||
try
|
||||
{
|
||||
|
||||
for (Direction direction : Box.ADJ_DIRECTIONS)
|
||||
{
|
||||
|
||||
|
||||
xAdj = posX + direction.getNormal().getX();
|
||||
zAdj = posZ + direction.getNormal().getZ();
|
||||
chunkXdist = LevelPosUtil.getChunkPos(detailLevel,xAdj) - playerChunkPos.x;
|
||||
chunkZdist = LevelPosUtil.getChunkPos(detailLevel,zAdj) - playerChunkPos.z;
|
||||
chunkXdist = LevelPosUtil.getChunkPos(detailLevel, xAdj) - playerChunkPos.x;
|
||||
chunkZdist = LevelPosUtil.getChunkPos(detailLevel, zAdj) - playerChunkPos.z;
|
||||
|
||||
if (gameChunkRenderDistance >= Math.abs(chunkXdist) && gameChunkRenderDistance >= Math.abs(chunkZdist))
|
||||
{
|
||||
if (!renderer.vanillaRenderedChunks[chunkXdist + gameChunkRenderDistance + 1][chunkZdist + gameChunkRenderDistance + 1]
|
||||
&& posToRender.contains(detailLevel, xAdj, zAdj))
|
||||
{
|
||||
if(LodConfig.CLIENT.worldGenerator.lodQualityMode.get() == LodQualityMode.HEIGHTMAP){
|
||||
if (LodConfig.CLIENT.worldGenerator.lodQualityMode.get() == LodQualityMode.HEIGHTMAP)
|
||||
{
|
||||
adjData.get(direction)[0] = lodDim.getSingleData(detailLevel, xAdj, zAdj);
|
||||
}else
|
||||
} else
|
||||
{
|
||||
adjData.put(direction, lodDim.getData(detailLevel, xAdj, zAdj));
|
||||
}
|
||||
|
||||
}else{
|
||||
if(LodConfig.CLIENT.worldGenerator.lodQualityMode.get() == LodQualityMode.HEIGHTMAP){
|
||||
} else
|
||||
{
|
||||
if (LodConfig.CLIENT.worldGenerator.lodQualityMode.get() == LodQualityMode.HEIGHTMAP)
|
||||
{
|
||||
adjData.get(direction)[0] = DataPointUtil.createVoidDataPoint(0);
|
||||
}else
|
||||
} else
|
||||
{
|
||||
adjData.put(direction, null);
|
||||
}
|
||||
@@ -312,24 +311,26 @@ public class LodBufferBuilder
|
||||
{
|
||||
if (posToRender.contains(detailLevel, xAdj, zAdj))
|
||||
{
|
||||
if(LodConfig.CLIENT.worldGenerator.lodQualityMode.get() == LodQualityMode.HEIGHTMAP){
|
||||
if (LodConfig.CLIENT.worldGenerator.lodQualityMode.get() == LodQualityMode.HEIGHTMAP)
|
||||
{
|
||||
adjData.get(direction)[0] = lodDim.getSingleData(detailLevel, xAdj, zAdj);
|
||||
}else
|
||||
} else
|
||||
{
|
||||
adjData.put(direction, lodDim.getData(detailLevel, xAdj, zAdj));
|
||||
}
|
||||
}else{
|
||||
} else
|
||||
{
|
||||
|
||||
if(LodConfig.CLIENT.worldGenerator.lodQualityMode.get() == LodQualityMode.HEIGHTMAP){
|
||||
if (LodConfig.CLIENT.worldGenerator.lodQualityMode.get() == LodQualityMode.HEIGHTMAP)
|
||||
{
|
||||
adjData.get(direction)[0] = DataPointUtil.createVoidDataPoint(0);
|
||||
}else
|
||||
} else
|
||||
{
|
||||
adjData.put(direction, null);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (region.getLodQualityMode() == LodQualityMode.HEIGHTMAP)
|
||||
{
|
||||
//dataPoint = lodDim.getData(detailLevel, posX, posZ)[0];
|
||||
@@ -337,7 +338,7 @@ public class LodBufferBuilder
|
||||
if (!DataPointUtil.isItVoid(dataPoint) && DataPointUtil.doesItExist(dataPoint))
|
||||
{
|
||||
LodConfig.CLIENT.graphics.lodTemplate.get().template.addLodToBuffer(currentBuffer, playerBlockPosRounded, dataPoint, adjData,
|
||||
detailLevel, posX, posZ, boxCache[xR][zR],renderer.previousDebugMode, renderer.lightMap);
|
||||
detailLevel, posX, posZ, boxCache[xR][zR], renderer.previousDebugMode, renderer.lightMap);
|
||||
}
|
||||
|
||||
} else if (region.getLodQualityMode() == LodQualityMode.MULTI_LOD)
|
||||
@@ -347,7 +348,7 @@ public class LodBufferBuilder
|
||||
if (!DataPointUtil.isItVoid(dataPoint) && DataPointUtil.doesItExist(dataPoint))
|
||||
{
|
||||
LodConfig.CLIENT.graphics.lodTemplate.get().template.addLodToBuffer(currentBuffer, playerBlockPosRounded, dataPoint, adjData,
|
||||
detailLevel, posX, posZ, boxCache[xR][zR], renderer.previousDebugMode, renderer.lightMap);
|
||||
detailLevel, posX, posZ, boxCache[xR][zR], renderer.previousDebugMode, renderer.lightMap);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -395,13 +396,11 @@ public class LodBufferBuilder
|
||||
|
||||
// mark that the buildable buffers as ready to swap
|
||||
switchVbos = true;
|
||||
}
|
||||
catch (Exception e)
|
||||
} catch (Exception e)
|
||||
{
|
||||
ClientProxy.LOGGER.warn("\"LodNodeBufferBuilder.generateLodBuffersAsync\" ran into trouble: ");
|
||||
e.printStackTrace();
|
||||
}
|
||||
finally
|
||||
} finally
|
||||
{
|
||||
// regardless of if we successfully created the buffers
|
||||
// we are done generating.
|
||||
@@ -540,8 +539,7 @@ public class LodBufferBuilder
|
||||
// this probably is necessary, but it makes me feel good :)
|
||||
GL11.glFlush();
|
||||
glProxy.setGlContext(GlProxyContext.NONE);
|
||||
}
|
||||
catch(IllegalStateException e)
|
||||
} catch (IllegalStateException e)
|
||||
{
|
||||
ClientProxy.LOGGER.error(LodBufferBuilder.class.getSimpleName() + " - UploadBuffers failed: " + e.getMessage());
|
||||
e.printStackTrace();
|
||||
|
||||
@@ -84,15 +84,8 @@ public class Box
|
||||
|
||||
public int[][] box;
|
||||
public Map<Direction, int[]> colorMap;
|
||||
public Map<Direction, long[]> adjData;
|
||||
public int color;
|
||||
public Map<Direction, int[][]> adjHeightAndDepth = new HashMap()
|
||||
{{
|
||||
put(Direction.EAST, new int[256][2]);
|
||||
put(Direction.WEST, new int[256][2]);
|
||||
put(Direction.SOUTH, new int[256][2]);
|
||||
put(Direction.NORTH, new int[256][2]);
|
||||
}};
|
||||
public Map<Direction, int[][]> adjHeightAndDepth;
|
||||
|
||||
public Box()
|
||||
{
|
||||
@@ -106,6 +99,13 @@ public class Box
|
||||
put(Direction.SOUTH, new int[1]);
|
||||
put(Direction.NORTH, new int[1]);
|
||||
}};
|
||||
adjHeightAndDepth = new HashMap()
|
||||
{{
|
||||
put(Direction.EAST, new int[256][2]);
|
||||
put(Direction.WEST, new int[256][2]);
|
||||
put(Direction.SOUTH, new int[256][2]);
|
||||
put(Direction.NORTH, new int[256][2]);
|
||||
}};
|
||||
}
|
||||
|
||||
public void setColor(int color)
|
||||
@@ -128,15 +128,33 @@ public class Box
|
||||
}
|
||||
}
|
||||
|
||||
public void reset()
|
||||
{
|
||||
for(int i = 0; i < box.length; i++){
|
||||
for(int j = 0; j < box[i].length; j++){
|
||||
box[i][j] = 0;
|
||||
}
|
||||
}
|
||||
for(Direction direction : DIRECTIONS)
|
||||
{
|
||||
colorMap.get(direction)[0] = 0;
|
||||
}
|
||||
|
||||
for(Direction direction : ADJ_DIRECTIONS)
|
||||
{
|
||||
for(int i = 0; i < adjHeightAndDepth.get(direction).length; i++)
|
||||
{
|
||||
adjHeightAndDepth.get(direction)[i][0] = VOID_FACE;
|
||||
adjHeightAndDepth.get(direction)[i][1] = VOID_FACE;
|
||||
}
|
||||
}
|
||||
}
|
||||
public void setAdjData(Map<Direction, long[]> adjData)
|
||||
{
|
||||
int height;
|
||||
int depth;
|
||||
this.adjData = adjData;
|
||||
|
||||
for (Direction direction : ADJ_DIRECTIONS)
|
||||
{
|
||||
boolean noMatch = true;
|
||||
long[] dataPoint = adjData.get(direction);
|
||||
if (dataPoint == null)
|
||||
{
|
||||
@@ -152,13 +170,13 @@ public class Box
|
||||
boolean toFinish = false;
|
||||
for (i = 0; i < dataPoint.length; i++)
|
||||
{
|
||||
|
||||
if (DataPointUtil.isItVoid(dataPoint[i]))
|
||||
long singleDataPoint = dataPoint[i];
|
||||
if (DataPointUtil.isItVoid(singleDataPoint))
|
||||
{
|
||||
continue;
|
||||
}
|
||||
height = DataPointUtil.getHeight(dataPoint[i]);
|
||||
depth = DataPointUtil.getDepth(dataPoint[i]);
|
||||
height = DataPointUtil.getHeight(singleDataPoint);
|
||||
depth = DataPointUtil.getDepth(singleDataPoint);
|
||||
|
||||
if (depth > getMaxY())
|
||||
{//the adj data is higher than the current data
|
||||
@@ -233,7 +251,7 @@ public class Box
|
||||
continue;
|
||||
}
|
||||
}
|
||||
if(toFinish)
|
||||
if (toFinish)
|
||||
{
|
||||
adjHeightAndDepth.get(direction)[faceToDraw][1] = getMinY();
|
||||
faceToDraw++;
|
||||
@@ -271,6 +289,11 @@ public class Box
|
||||
return box[OFFSET][X] + box[WIDTH][X] * DIRECTION_VERTEX_MAP.get(direction)[vertexIndex][X];
|
||||
}
|
||||
|
||||
public int getY(Direction direction, int vertexIndex)
|
||||
{
|
||||
return box[OFFSET][Y] + box[WIDTH][Y] * DIRECTION_VERTEX_MAP.get(direction)[vertexIndex][Y];
|
||||
}
|
||||
|
||||
public int getY(Direction direction, int vertexIndex, int adjIndex)
|
||||
{
|
||||
if (direction == Direction.DOWN || direction == Direction.UP)
|
||||
|
||||
@@ -51,6 +51,13 @@ public class CubicLodTemplate extends AbstractLodTemplate
|
||||
|
||||
int color = DataPointUtil.getLightColor(data,lightMap);
|
||||
// add each LOD for the detail level
|
||||
|
||||
if (debugging != DebugMode.OFF)
|
||||
|
||||
{
|
||||
color = LodUtil.DEBUG_DETAIL_LEVEL_COLORS[detailLevel].getRGB();
|
||||
}
|
||||
|
||||
generateBoundingBox(
|
||||
box,
|
||||
DataPointUtil.getHeight(data),
|
||||
@@ -63,15 +70,6 @@ public class CubicLodTemplate extends AbstractLodTemplate
|
||||
adjData,
|
||||
color);
|
||||
|
||||
//color = DataPointUtil.getColor(data);
|
||||
|
||||
|
||||
if (debugging != DebugMode.OFF)
|
||||
|
||||
{
|
||||
color = LodUtil.DEBUG_DETAIL_LEVEL_COLORS[detailLevel].getRGB();
|
||||
}
|
||||
|
||||
if (box != null)
|
||||
|
||||
{
|
||||
@@ -98,10 +96,11 @@ public class CubicLodTemplate extends AbstractLodTemplate
|
||||
// which only uses floats
|
||||
double x = -bufferCenterBlockPos.getX();
|
||||
double z = -bufferCenterBlockPos.getZ();
|
||||
box.setAdjData(adjData);
|
||||
box.reset();
|
||||
box.setColor(color);
|
||||
box.set(width, height - depth, width);
|
||||
box.move((int) (xOffset + x), (int) (yOffset + depth), (int) (zOffset + z));
|
||||
box.setAdjData(adjData);
|
||||
}
|
||||
|
||||
private void addBoundingBoxToBuffer(BufferBuilder buffer, Box box)
|
||||
|
||||
Reference in New Issue
Block a user