From ef65f87777653f85b2801641cd34ccb2e06b8945 Mon Sep 17 00:00:00 2001 From: James Seibel Date: Sat, 27 Feb 2021 19:41:45 -0600 Subject: [PATCH] Improve how different fog levels are rendered --- .../lod/builders/LodBufferBuilder.java | 23 +--- .../lod/objects/NearFarFogSetting.java | 28 +++++ .../com/backsun/lod/renderer/LodRenderer.java | 105 +++++++++++++----- 3 files changed, 110 insertions(+), 46 deletions(-) create mode 100644 src/main/java/com/backsun/lod/objects/NearFarFogSetting.java diff --git a/src/main/java/com/backsun/lod/builders/LodBufferBuilder.java b/src/main/java/com/backsun/lod/builders/LodBufferBuilder.java index 995123c14..330e49940 100644 --- a/src/main/java/com/backsun/lod/builders/LodBufferBuilder.java +++ b/src/main/java/com/backsun/lod/builders/LodBufferBuilder.java @@ -57,18 +57,6 @@ public class LodBufferBuilder int blue; int alpha; - // this is done if the FogDistance is either - // NEAR or FAR, if it is NEAR_AND_FAR - // the buffer is determined for each LOD - if (distanceMode == FogDistance.NEAR) - { - currentBuffer = nearBuffer; - } - else // if (distanceMode == FogDistance.FAR) - { - currentBuffer = farBuffer; - } - // x axis for (int i = 0; i < numbChunksWide; i++) @@ -88,13 +76,10 @@ public class LodBufferBuilder alpha = colors[i][j].getAlpha(); - if (distanceMode == FogDistance.NEAR_AND_FAR) - { - if (isCoordinateInNearFogArea(i, j, numbChunksWide / 2)) - currentBuffer = nearBuffer; - else - currentBuffer = farBuffer; - } + if (isCoordinateInNearFogArea(i, j, numbChunksWide / 2)) + currentBuffer = nearBuffer; + else + currentBuffer = farBuffer; if (bb.minY != bb.maxY) diff --git a/src/main/java/com/backsun/lod/objects/NearFarFogSetting.java b/src/main/java/com/backsun/lod/objects/NearFarFogSetting.java new file mode 100644 index 000000000..9a69e8f61 --- /dev/null +++ b/src/main/java/com/backsun/lod/objects/NearFarFogSetting.java @@ -0,0 +1,28 @@ +package com.backsun.lod.objects; + +import com.backsun.lod.util.enums.FogDistance; + +/** + * This object is just a replacement for an array + * to make things easier to understand in the LodRenderer. + * + * @author James Seibel + * @version 02-27-2021 + */ +public class NearFarFogSetting +{ + public FogDistance nearFogSetting = FogDistance.NEAR; + public FogDistance farFogSetting = FogDistance.FAR; + + + public NearFarFogSetting() + { + + } + + public NearFarFogSetting(FogDistance newNearFogSetting, FogDistance newFarFogSetting) + { + nearFogSetting = newNearFogSetting; + farFogSetting = newFarFogSetting; + } +} diff --git a/src/main/java/com/backsun/lod/renderer/LodRenderer.java b/src/main/java/com/backsun/lod/renderer/LodRenderer.java index efdd9c933..101650eba 100644 --- a/src/main/java/com/backsun/lod/renderer/LodRenderer.java +++ b/src/main/java/com/backsun/lod/renderer/LodRenderer.java @@ -14,6 +14,7 @@ import com.backsun.lod.handlers.ReflectionHandler; import com.backsun.lod.objects.LodChunk; import com.backsun.lod.objects.LodDimension; import com.backsun.lod.objects.NearFarBuffer; +import com.backsun.lod.objects.NearFarFogSetting; import com.backsun.lod.util.LodConfig; import com.backsun.lod.util.enums.ColorDirection; import com.backsun.lod.util.enums.FogDistance; @@ -269,9 +270,9 @@ public class LodRenderer setupProjectionMatrix(partialTicks); // setupLighting(partialTicks); - - - + NearFarFogSetting fogSetting = determineFogSettings(); + + @@ -282,30 +283,11 @@ public class LodRenderer // rendering // //===========// - switch(LodConfig.COMMON.fogDistance.get()) - { - case NEAR_AND_FAR: - // when drawing NEAR_AND_FAR fog we need 2 draw - // calls since fog can only go in one direction at a time - - setupFog(FogDistance.NEAR, reflectionHandler.getFogQuality()); - sendLodsToGpuAndDraw(nearVbo, modelViewMatrix); - - setupFog(FogDistance.FAR, reflectionHandler.getFogQuality()); - sendLodsToGpuAndDraw(farVbo, modelViewMatrix); - break; - - case NEAR: - setupFog(FogDistance.NEAR, reflectionHandler.getFogQuality()); - sendLodsToGpuAndDraw(nearVbo, modelViewMatrix); - break; - - case FAR: - setupFog(FogDistance.FAR, reflectionHandler.getFogQuality()); - sendLodsToGpuAndDraw(farVbo, modelViewMatrix); - break; - } + setupFog(fogSetting.nearFogSetting, reflectionHandler.getFogQuality()); + sendLodsToGpuAndDraw(nearVbo, modelViewMatrix); + setupFog(fogSetting.farFogSetting, reflectionHandler.getFogQuality()); + sendLodsToGpuAndDraw(farVbo, modelViewMatrix); @@ -336,6 +318,8 @@ public class LodRenderer } + + private Matrix4f generateModelViewMatrix() { // get all relevant camera info @@ -459,7 +443,7 @@ public class LodRenderer Matrix4f projectionMatrix = Matrix4f.perspective( - gameRender.getFOVModifier(activeRenderInfoIn, partialTicks, true), + getFov(partialTicks, true), (float)this.mc.getMainWindow().getFramebufferWidth() / (float)this.mc.getMainWindow().getFramebufferHeight(), 0.5F, this.farPlaneDistance * LOD_CHUNK_DISTANCE_RADIUS * 2); @@ -723,5 +707,72 @@ public class LodRenderer } + /** + * Based on the fogDistance setting and + * optifine's fogQuality setting return what fog + * settings should be used when rendering. + */ + private NearFarFogSetting determineFogSettings() + { + NearFarFogSetting fogSetting = new NearFarFogSetting(); + + LodConfig.COMMON.fogDistance.get(); + switch(reflectionHandler.getFogQuality()) + { + case FANCY: + + switch(LodConfig.COMMON.fogDistance.get()) + { + case NEAR_AND_FAR: + fogSetting.nearFogSetting = FogDistance.NEAR; + fogSetting.farFogSetting = FogDistance.FAR; + break; + + case NEAR: + fogSetting.nearFogSetting = FogDistance.NEAR; + fogSetting.farFogSetting = FogDistance.NEAR; + break; + + case FAR: + fogSetting.nearFogSetting = FogDistance.FAR; + fogSetting.farFogSetting = FogDistance.FAR; + break; + } + + break; + case FAST: + // fast fog setting should only have one type of + // fog, since the LODs are separated into a near + // and far portion; and fast fog is rendered from the + // frustrum's perspective instead of the camera + + switch(LodConfig.COMMON.fogDistance.get()) + { + case NEAR_AND_FAR: + fogSetting.nearFogSetting = FogDistance.NEAR; + fogSetting.farFogSetting = FogDistance.NEAR; + break; + + case NEAR: + fogSetting.nearFogSetting = FogDistance.NEAR; + fogSetting.farFogSetting = FogDistance.NEAR; + break; + + case FAR: + fogSetting.nearFogSetting = FogDistance.FAR; + fogSetting.farFogSetting = FogDistance.FAR; + break; + } + + break; + case OFF: + break; + + } + + return fogSetting; + } + + } \ No newline at end of file