diff --git a/src/main/java/com/seibel/lod/core/render/LodRenderer.java b/src/main/java/com/seibel/lod/core/render/LodRenderer.java index 02cc7f5ae..b1a127073 100644 --- a/src/main/java/com/seibel/lod/core/render/LodRenderer.java +++ b/src/main/java/com/seibel/lod/core/render/LodRenderer.java @@ -319,7 +319,8 @@ public class LodRenderer farPlaneBlockDistance = CONFIG.client().graphics().quality().getLodChunkRenderDistance() * LodUtil.CHUNK_WIDTH; drawCalculateParams.end("drawCalculateParams"); - Mat4f combinedMatrix = createCombinedMatrix(baseProjectionMatrix, baseModelViewMatrix, vanillaBlockRenderedDistance, farPlaneBlockDistance); + Mat4f combinedMatrix = createCombinedMatrix(baseProjectionMatrix, baseModelViewMatrix, + vanillaBlockRenderedDistance, farPlaneBlockDistance, partialTicks); /*---------Fill uniform data--------*/ LagSpikeCatcher drawFillData = new LagSpikeCatcher(); @@ -459,21 +460,31 @@ public class LodRenderer return MC_RENDER.getSpecialFogColor(partialTicks); } + private static float calculateNearClipPlane(float distance, float partialTicks) { + double fov = MC_RENDER.getFov(partialTicks); + double aspectRatio = (double)MC_RENDER.getScreenWidth()/MC_RENDER.getScreenHeight(); + return (float) (distance + / Math.sqrt(1d + LodUtil.pow2(Math.tan(fov/180d*Math.PI/2d)) + * (LodUtil.pow2(aspectRatio) + 1d))); + } + /** * create and return a new projection matrix based on MC's projection matrix * @param projMat this is Minecraft's current projection matrix * @param modelMat this is Minecraft's current model matrix * @param vanillaBlockRenderedDistance Minecraft's vanilla far plane distance */ - private static Mat4f createCombinedMatrix(Mat4f projMat, Mat4f modelMat, float vanillaBlockRenderedDistance, int farPlaneBlockDistance) + private static Mat4f createCombinedMatrix(Mat4f projMat, Mat4f modelMat, float vanillaBlockRenderedDistance, + int farPlaneBlockDistance, float partialTicks) { //Create a copy of the current matrix, so the current matrix isn't modified. Mat4f lodProj = projMat.copy(); //Set new far and near clip plane values. lodProj.setClipPlanes( - CONFIG.client().graphics().advancedGraphics().getUseExtendedNearClipPlane() ? - (vanillaBlockRenderedDistance-16) : 16, + calculateNearClipPlane( + CONFIG.client().graphics().advancedGraphics().getUseExtendedNearClipPlane() ? + (vanillaBlockRenderedDistance-16) : 16, partialTicks), (float)((farPlaneBlockDistance+LodUtil.REGION_WIDTH) * Math.sqrt(2))); lodProj.multiply(modelMat); diff --git a/src/main/java/com/seibel/lod/core/util/LodUtil.java b/src/main/java/com/seibel/lod/core/util/LodUtil.java index fbf7be529..9a0295983 100644 --- a/src/main/java/com/seibel/lod/core/util/LodUtil.java +++ b/src/main/java/com/seibel/lod/core/util/LodUtil.java @@ -501,6 +501,10 @@ public class LodUtil numb = Float.intBitsToFloat(i); return numb * (1.5F - half * numb * numb); } + public static float pow2(float x) {return x*x;} + public static double pow2(double x) {return x*x;} + public static int pow2(int x) {return x*x;} + // True if the requested threshold pass, or false otherwise // For details, see: