diff --git a/src/main/java/com/seibel/lod/builders/LodBufferBuilder.java b/src/main/java/com/seibel/lod/builders/LodBufferBuilder.java index 56f8932f7..406ef4e06 100644 --- a/src/main/java/com/seibel/lod/builders/LodBufferBuilder.java +++ b/src/main/java/com/seibel/lod/builders/LodBufferBuilder.java @@ -235,7 +235,7 @@ public class LodBufferBuilder int maxVerticalData = 1; if (LodConfig.CLIENT.worldGenerator.lodQualityMode.get() == VerticalQuality.MULTI_LOD) { - maxVerticalData = DetailDistanceUtil.getMaxVerticalData(LodUtil.BLOCK_DETAIL_LEVEL); + maxVerticalData = 256; } // create adjData's arrays diff --git a/src/main/java/com/seibel/lod/builders/LodBuilder.java b/src/main/java/com/seibel/lod/builders/LodBuilder.java index 80b2c0915..e7804012f 100644 --- a/src/main/java/com/seibel/lod/builders/LodBuilder.java +++ b/src/main/java/com/seibel/lod/builders/LodBuilder.java @@ -322,15 +322,17 @@ public class LodBuilder yAbs = height - 1; // We search light on above air block depth = determineBottomPointFrom(chunk, config, xRel, zRel, yAbs, blockPos); - blockPos.set(xAbs, yAbs, zAbs); - light = getLightValue(chunk, blockPos, hasCeiling, hasSkyLight, topBlock); if (hasCeiling && topBlock) { yAbs = depth; + blockPos.set(xAbs, yAbs, zAbs); + light = getLightValue(chunk, blockPos, hasCeiling, hasSkyLight, topBlock); color = generateLodColor(chunk, config, xRel, yAbs, zRel, blockPos); blockPos.set(xAbs, yAbs - 1, zAbs); } else { + blockPos.set(xAbs, yAbs, zAbs); + light = getLightValue(chunk, blockPos, hasCeiling, hasSkyLight, topBlock); color = generateLodColor(chunk, config, xRel, yAbs, zRel, blockPos); blockPos.set(xAbs, yAbs + 1, zAbs); } @@ -595,7 +597,8 @@ public class LodBuilder IWorld world = mc.getClientWorld(); - int blockBrightness = world.getBrightness(LightType.BLOCK, blockPos); + //int blockBrightness = world.getBrightness(LightType.BLOCK, blockPos); + int blockBrightness = chunk.getLightEmission(blockPos); if (hasCeiling && topBlock) blockPos.set(blockPos.getX(), blockPos.getY() - 1, blockPos.getZ()); @@ -626,8 +629,7 @@ public class LodBuilder } } } - BlockState blockState = chunk.getBlockState(blockPos); - blockLight = blockState.getLightValue(chunk, blockPos); + blockLight = world.getBrightness(LightType.BLOCK, blockPos); blockLight = LodUtil.clamp(0, blockLight + blockBrightness, 15); return blockLight + (skyLight << 4); diff --git a/src/main/java/com/seibel/lod/objects/LodDimension.java b/src/main/java/com/seibel/lod/objects/LodDimension.java index f98d5cf0e..0159c5010 100644 --- a/src/main/java/com/seibel/lod/objects/LodDimension.java +++ b/src/main/java/com/seibel/lod/objects/LodDimension.java @@ -854,6 +854,16 @@ public class LodDimension { /*return regions[x][z].getMinMemoryNeeded(template);*/ + /*TODO add memory use calculated with the following cases + switch (LodConfig.CLIENT.graphics.detailDropOff.get()) + { + default: + case BY_BLOCK: + break; + case BY_REGION_FANCY: + break; + case BY_REGION_FAST: + }*/ int minDistance = LevelPosUtil.minDistance(LodUtil.REGION_DETAIL_LEVEL, x, z, halfWidth, halfWidth); int detail = DetailDistanceUtil.getTreeCutDetailFromDistance(minDistance); int levelToGen = DetailDistanceUtil.getLodDrawDetail(detail); diff --git a/src/main/java/com/seibel/lod/objects/LodRegion.java b/src/main/java/com/seibel/lod/objects/LodRegion.java index 330ac88f0..f2eca2d95 100644 --- a/src/main/java/com/seibel/lod/objects/LodRegion.java +++ b/src/main/java/com/seibel/lod/objects/LodRegion.java @@ -95,7 +95,7 @@ public class LodRegion { posX = LevelPosUtil.getRegionModule(detailLevel, posX); posZ = LevelPosUtil.getRegionModule(detailLevel, posZ); - + // For some reason the dataContainer can contain null entries if (this.dataContainer[detailLevel] == null) { @@ -104,9 +104,9 @@ public class LodRegion else this.dataContainer[detailLevel] = new VerticalLevelContainer(detailLevel); } - + this.dataContainer[detailLevel].addData(data, posX, posZ, verticalIndex); - + return true; } @@ -240,14 +240,16 @@ public class LodRegion byte supposedLevel; int maxDistance; boolean stopNow = false; + int minDistance; + int childLevel; switch (LodConfig.CLIENT.graphics.detailDropOff.get()) { default: case BY_BLOCK: maxDistance = LevelPosUtil.maxDistance(detailLevel, posX, posZ, playerPosX, playerPosZ, regionPosX, regionPosZ); supposedLevel = DetailDistanceUtil.getLodDrawDetail(DetailDistanceUtil.getDrawDetailFromDistance(maxDistance)); - int minDistance = LevelPosUtil.minDistance(detailLevel, posX, posZ, playerPosX, playerPosZ, regionPosX, regionPosZ); - int childLevel = DetailDistanceUtil.getLodDrawDetail(DetailDistanceUtil.getDrawDetailFromDistance(minDistance)); + minDistance = LevelPosUtil.minDistance(detailLevel, posX, posZ, playerPosX, playerPosZ, regionPosX, regionPosZ); + childLevel = DetailDistanceUtil.getLodDrawDetail(DetailDistanceUtil.getDrawDetailFromDistance(minDistance)); stopNow = detailLevel == childLevel - 1; break; @@ -255,28 +257,32 @@ public class LodRegion supposedLevel = minDetailLevel; break; case BY_REGION_FAST: - int playerRegionX = LevelPosUtil.getRegion(LodUtil.BLOCK_DETAIL_LEVEL,playerPosX); - int playerRegionZ = LevelPosUtil.getRegion(LodUtil.BLOCK_DETAIL_LEVEL,playerPosZ); - if(playerRegionX == regionPosX && playerRegionZ == regionPosZ) - supposedLevel = minDetailLevel; - else + int playerRegionX = LevelPosUtil.getRegion(LodUtil.BLOCK_DETAIL_LEVEL, playerPosX); + int playerRegionZ = LevelPosUtil.getRegion(LodUtil.BLOCK_DETAIL_LEVEL, playerPosZ); + if (playerRegionX == regionPosX && playerRegionZ == regionPosZ) { - maxDistance = LevelPosUtil.maxDistance(LodUtil.REGION_DETAIL_LEVEL, regionPosX, regionPosZ, playerRegionX*512 + 256, playerRegionZ*512 + 256); + maxDistance = LevelPosUtil.maxDistance(detailLevel, posX, posZ, playerPosX, playerPosZ, regionPosX, regionPosZ); + supposedLevel = DetailDistanceUtil.getLodDrawDetail(DetailDistanceUtil.getDrawDetailFromDistance(maxDistance)); + minDistance = LevelPosUtil.minDistance(detailLevel, posX, posZ, playerPosX, playerPosZ, regionPosX, regionPosZ); + childLevel = DetailDistanceUtil.getLodDrawDetail(DetailDistanceUtil.getDrawDetailFromDistance(minDistance)); + stopNow = detailLevel == childLevel - 1; + } else + { + maxDistance = LevelPosUtil.maxDistance(LodUtil.REGION_DETAIL_LEVEL, regionPosX, regionPosZ, playerRegionX * 512 + 256, playerRegionZ * 512 + 256); supposedLevel = DetailDistanceUtil.getLodDrawDetail(DetailDistanceUtil.getDrawDetailFromDistance(maxDistance)); } break; } - if(stopNow){ + if (stopNow) + { posToRender.addPosToRender(detailLevel, posX + regionPosX * size, posZ + regionPosZ * size); - } - else if (supposedLevel > detailLevel) + } else if (supposedLevel > detailLevel) { return; - } - else if (supposedLevel == detailLevel) + } else if (supposedLevel == detailLevel) { posToRender.addPosToRender(detailLevel, posX + regionPosX * size, @@ -306,7 +312,7 @@ public class LodRegion //If all the four children exist we go deeper - if(!requireCorrectDetailLevel) + if (!requireCorrectDetailLevel) { if (childrenCount == 4) {