Add render cache listener to draw resolution config

This commit is contained in:
James Seibel
2023-05-13 12:09:54 -05:00
parent d87cf40b22
commit 5894af6eca
4 changed files with 35 additions and 55 deletions
@@ -20,8 +20,10 @@
package com.seibel.lod.api.enums.config;
/**
* heightmap <br>
* multi_lod <br>
* LOW <br>
* MEDIUM <br>
* HIGH <br>
* ULTRA <br>
*
* @author Leonardo Amato
* @version 2023-2-5
@@ -34,6 +36,7 @@ public enum EVerticalQuality
HIGH(new int[] { 8, 6, 4, 2, 2, 2, 2, 1, 1, 1, 1 }),
ULTRA(new int[] { 16, 8, 4, 2, 2, 2, 2, 1, 1, 1, 1 });
/** represents how many LODs can be rendered in a single vertical slice */
public final int[] maxVerticalData;
@@ -42,40 +45,6 @@ public enum EVerticalQuality
/** returns null if out of range */
public static EVerticalQuality previous(EVerticalQuality mode)
{
switch (mode)
{
case ULTRA:
return EVerticalQuality.HIGH;
case HIGH:
return EVerticalQuality.MEDIUM;
case MEDIUM:
return EVerticalQuality.LOW;
case LOW:
default:
return null;
}
}
/** returns null if out of range */
public static EVerticalQuality next(EVerticalQuality mode)
{
switch (mode)
{
case MEDIUM:
return EVerticalQuality.HIGH;
case LOW:
return EVerticalQuality.MEDIUM;
case HIGH:
return EVerticalQuality.ULTRA;
case ULTRA:
default:
return null;
}
}
public int calculateMaxVerticalData(byte dataDetail)
{
if (dataDetail >= this.maxVerticalData.length)
@@ -104,6 +104,7 @@ public class Config
+ "\n"
+ "Lowest Quality: " + EHorizontalResolution.CHUNK + "\n"
+ "Highest Quality: " + EHorizontalResolution.BLOCK)
.addListener(RenderCacheConfigEventHandler.INSTANCE)
.build();
public static ConfigEntry<Integer> lodChunkRenderDistance = new ConfigEntry.Builder<Integer>()
@@ -1,9 +1,11 @@
package com.seibel.lod.core.config.eventHandlers;
import com.seibel.lod.api.DhApiMain;
import com.seibel.lod.api.enums.config.EHorizontalResolution;
import com.seibel.lod.api.enums.config.EVerticalQuality;
import com.seibel.lod.core.config.Config;
import com.seibel.lod.core.config.types.ConfigEntry;
import com.seibel.lod.core.util.DetailDistanceUtil;
/**
* Listens to the config and will automatically
@@ -18,7 +20,9 @@ public class RenderCacheConfigEventHandler implements ConfigEntry.Listener
{
public static RenderCacheConfigEventHandler INSTANCE = new RenderCacheConfigEventHandler();
// previous values used to check if a watched setting was actually modified
private EVerticalQuality previousVerticalQualitySetting = null;
private EHorizontalResolution previousHorizontalResolution = null;
@@ -29,19 +33,32 @@ public class RenderCacheConfigEventHandler implements ConfigEntry.Listener
@Override
public void onModify()
{
// check if the vertical quality changed
{
// confirm a setting was actually changed
boolean refreshRenderData = false;
EVerticalQuality newVerticalQuality = Config.Client.Graphics.Quality.verticalQuality.get();
if (this.previousVerticalQualitySetting != newVerticalQuality)
{
// TODO add a cancelable delay between the method being fired and any data getting cleared,
// this would be to prevent clearing the same data 5 times in rapid succession
// when the user is switching through settings in the config UI
if (DhApiMain.Delayed.renderProxy.clearRenderDataCache().success)
{
this.previousVerticalQualitySetting = newVerticalQuality;
}
this.previousVerticalQualitySetting = newVerticalQuality;
refreshRenderData = true;
}
EHorizontalResolution newHorizontalResolution = Config.Client.Graphics.Quality.drawResolution.get();
if (this.previousHorizontalResolution != newHorizontalResolution)
{
this.previousHorizontalResolution = newHorizontalResolution;
refreshRenderData = true;
}
if (refreshRenderData)
{
// TODO add a timeout to prevent rapidly changing settings causing the render data thrashing.
DetailDistanceUtil.minDetail = newHorizontalResolution.detailLevel;
DhApiMain.Delayed.renderProxy.clearRenderDataCache();
}
}
@@ -31,7 +31,8 @@ import com.seibel.lod.coreapi.util.MathUtil;
@Deprecated
public class DetailDistanceUtil
{
private static byte minDetail = Config.Client.Graphics.Quality.drawResolution.get().detailLevel;
public static byte minDetail = Config.Client.Graphics.Quality.drawResolution.get().detailLevel;
private static final byte maxDetail = Byte.MAX_VALUE;
private static final double minDistance = 0;
private static double distanceUnit = 16 * Config.Client.Graphics.Quality.horizontalScale.get();
@@ -93,12 +94,4 @@ public class DetailDistanceUtil
return baseInverseFunction(distance);
}
// NOTE: The recent LodWorldGenerator changes assumes that this value doesn't change with 'detail'.
// If this is changed, LodWorldGenerator needs to be fixed!
/*
public static DistanceGenerationMode getDistanceGenerationMode(int detail)
{
return CONFIG.client().worldGenerator().getDistanceGenerationMode();
}*/
}