Files
distant-horizons-sharded/src/main/java/com/seibel/lod/util/DetailDistanceUtil.java
T
2021-08-27 11:28:29 +02:00

153 lines
5.1 KiB
Java

package com.seibel.lod.util;
import com.seibel.lod.enums.DistanceGenerationMode;
import com.seibel.lod.enums.LodDetail;
import com.seibel.lod.handlers.LodConfig;
import net.minecraft.client.Minecraft;
public class DetailDistanceUtil
{
private static double genMultiplier = 1.25;
private static double treeGenMultiplier = 1.5;
private static double treeCutMultiplier = 1.25;
private static int minDetail = LodConfig.CLIENT.maxGenerationDetail.get().detailLevel;
private static int maxDetail = LodUtil.REGION_DETAIL_LEVEL + 1;
private static int minDistance = 0;
private static int maxDistance = LodConfig.CLIENT.lodChunkRenderDistance.get() * 16;
private static DistanceGenerationMode[] distancesGenerators = {
DistanceGenerationMode.SURFACE,
DistanceGenerationMode.SURFACE,
DistanceGenerationMode.SURFACE,
DistanceGenerationMode.SURFACE,
DistanceGenerationMode.SURFACE,
DistanceGenerationMode.SURFACE,
DistanceGenerationMode.SURFACE,
DistanceGenerationMode.SURFACE,
DistanceGenerationMode.SURFACE,
DistanceGenerationMode.SURFACE};
/*private static DistanceGenerationMode[] distancesGenerators = {
DistanceGenerationMode.BIOME_ONLY_SIMULATE_HEIGHT,
DistanceGenerationMode.BIOME_ONLY_SIMULATE_HEIGHT,
DistanceGenerationMode.BIOME_ONLY_SIMULATE_HEIGHT,
DistanceGenerationMode.BIOME_ONLY_SIMULATE_HEIGHT,
DistanceGenerationMode.BIOME_ONLY_SIMULATE_HEIGHT,
DistanceGenerationMode.BIOME_ONLY_SIMULATE_HEIGHT,
DistanceGenerationMode.BIOME_ONLY_SIMULATE_HEIGHT,
DistanceGenerationMode.BIOME_ONLY_SIMULATE_HEIGHT,
DistanceGenerationMode.BIOME_ONLY_SIMULATE_HEIGHT,
DistanceGenerationMode.BIOME_ONLY_SIMULATE_HEIGHT};*/
private static LodDetail[] lodDetails = {
LodDetail.FULL,
LodDetail.HALF,
LodDetail.QUAD,
LodDetail.DOUBLE,
LodDetail.SINGLE,
LodDetail.SINGLE,
LodDetail.SINGLE,
LodDetail.SINGLE,
LodDetail.SINGLE,
LodDetail.SINGLE,
LodDetail.SINGLE};
private static LodDetail[] lodDetailsCut = {
LodDetail.FULL,
LodDetail.HALF,
LodDetail.QUAD,
LodDetail.DOUBLE,
LodDetail.SINGLE,
LodDetail.SINGLE,
LodDetail.SINGLE,
LodDetail.SINGLE,
LodDetail.SINGLE,
LodDetail.SINGLE,
LodDetail.SINGLE};
public static int getDistanceRendering(int detail)
{
int initial;
int distance = 0;
if(detail <= minDetail)
return minDistance;
if(detail == maxDetail)
return maxDistance*2;
if(detail == maxDetail+1)
return maxDistance*3;
switch (LodConfig.CLIENT.lodDistanceCalculatorType.get())
{
case LINEAR:
initial = LodConfig.CLIENT.lodQuality.get() * 128;
return (detail * initial);
case QUADRATIC:
initial = LodConfig.CLIENT.lodQuality.get() * 128;
return (int) (Math.pow(2, detail) * initial);
case RENDER_DEPENDANT:
int realRenderDistance = Minecraft.getInstance().options.renderDistance * 16;
int border = 64;
byte detailAtBorder = (byte) 4;
if(detail > detailAtBorder){
return (detail * (border-realRenderDistance)/detailAtBorder + realRenderDistance);
}else{
return ((maxDetail - detail) * (maxDistance-border)/(maxDetail - detailAtBorder) + border);
}
}
return distance;
}
public static int getDistanceGeneration(int detail)
{
if(detail == maxDetail)
return maxDistance;
return (int) (getDistanceRendering(detail) * genMultiplier);
}
public static int getDistanceTreeCut(int detail)
{
if(detail == maxDetail)
return maxDistance;
return (int) (getDistanceRendering(detail) * treeCutMultiplier);
}
public static int getDistanceTreeGen(int detail)
{
if(detail == maxDetail)
return maxDistance;
return (int) (getDistanceRendering(detail) * treeGenMultiplier);
}
public static DistanceGenerationMode getDistanceGenerationMode(int detail)
{
return distancesGenerators[detail];
}
public static LodDetail getLodDetail(int detail)
{
if(detail < minDetail)
{
return lodDetails[minDetail];
}
else
{
return lodDetails[detail];
}
}
public static byte getCutLodDetail(int detail)
{
if(detail < minDetail)
{
return lodDetailsCut[minDetail].detailLevel;
}
else if(detail == maxDetail)
{
return LodUtil.REGION_DETAIL_LEVEL;
}
else
{
return lodDetailsCut[detail].detailLevel;
}
}
}