Put logger in ApiShared.java

This commit is contained in:
Ran
2022-02-21 17:27:53 +06:00
parent 59fa6eed73
commit 1ddf2091b1
24 changed files with 167 additions and 147 deletions
@@ -19,10 +19,13 @@
package com.seibel.lod.core.api;
import com.seibel.lod.core.ModInfo;
import com.seibel.lod.core.builders.bufferBuilding.LodBufferBuilderFactory;
import com.seibel.lod.core.builders.lodBuilding.LodBuilder;
import com.seibel.lod.core.enums.config.VerticalQuality;
import com.seibel.lod.core.objects.lod.LodWorld;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
/**
* This stores objects and variables that
@@ -34,6 +37,7 @@ import com.seibel.lod.core.objects.lod.LodWorld;
public class ApiShared
{
public ApiShared INSTANCE = new ApiShared();
public static final Logger LOGGER = LogManager.getLogger(ModInfo.NAME);
public static final LodBufferBuilderFactory lodBufferBuilderFactory = new LodBufferBuilderFactory();
public static final LodWorld lodWorld = new LodWorld();
@@ -63,7 +63,6 @@ public class ClientApi
= Collections.synchronizedList(new LinkedList<WeakReference<SpamReducedLogger>>());
public static final ClientApi INSTANCE = new ClientApi();
public static final Logger LOGGER = LogManager.getLogger(ModInfo.NAME);
public static LodRenderer renderer = new LodRenderer(ApiShared.lodBufferBuilderFactory);
@@ -86,7 +85,7 @@ public class ClientApi
if (!ENABLE_LAG_SPIKE_LOGGING) return;
timer = System.nanoTime() - timer;
if (timer > LAG_SPIKE_THRESOLD_NS) {
ClientApi.LOGGER.info("LagSpikeCatcher: "+source+" took "+Duration.ofNanos(timer)+"!");
ApiShared.LOGGER.info("LagSpikeCatcher: "+source+" took "+Duration.ofNanos(timer)+"!");
}
}
}
@@ -122,7 +121,7 @@ public class ClientApi
public void clientChunkLoadEvent(IChunkWrapper chunk, IWorldWrapper world)
{
LagSpikeCatcher clientChunkLoad = new LagSpikeCatcher();
//ClientApi.LOGGER.info("Lod Generating add: "+chunk.getLongChunkPos());
//ApiShared.LOGGER.info("Lod Generating add: "+chunk.getLongChunkPos());
toBeLoaded.add(chunk.getLongChunkPos());
clientChunkLoad.end("clientChunkLoad");
}
@@ -177,7 +176,7 @@ public class ClientApi
LagSpikeCatcher updateToBeLoadedChunk = new LagSpikeCatcher();
for (long pos : toBeLoaded) {
if (generating.size() >= 8) {
//ClientApi.LOGGER.info("Lod Generating Full! Remining: "+toBeLoaded.size());
//ApiShared.LOGGER.info("Lod Generating Full! Remining: "+toBeLoaded.size());
break;
}
IChunkWrapper chunk = world.tryGetChunk(FACTORY.createChunkPos(pos));
@@ -188,10 +187,10 @@ public class ClientApi
//if (!chunk.isLightCorrect()) continue;
toBeLoaded.remove(pos);
generating.add(pos);
//ClientApi.LOGGER.info("Lod Generation trying "+pos+". Remining: " +toBeLoaded.size());
//ApiShared.LOGGER.info("Lod Generation trying "+pos+". Remining: " +toBeLoaded.size());
ApiShared.lodBuilder.generateLodNodeAsync(chunk, ApiShared.lodWorld,
world.getDimensionType(), DistanceGenerationMode.FULL, true, true, () -> {
//ClientApi.LOGGER.info("Lod Generation for "+pos+" done. Remining: " +toBeLoaded.size());
//ApiShared.LOGGER.info("Lod Generation for "+pos+" done. Remining: " +toBeLoaded.size());
generating.remove(pos);
}, () -> {
generating.remove(pos);
@@ -234,7 +233,7 @@ public class ClientApi
ClientApi.renderer.drawLODs(lodDim, mcModelViewMatrix, mcProjectionMatrix, partialTicks, MC.getProfiler());
} catch (RuntimeException e) {
rendererDisabledBecauseOfExceptions = true;
ClientApi.LOGGER.error("Renderer thrown an uncaught exception: ",e);
ApiShared.LOGGER.error("Renderer thrown an uncaught exception: ",e);
try {
MC.sendChatMessage("\u00A74\u00A7l\u00A7uERROR: Distant Horizons"
+ " renderer has encountered an exception!");
@@ -256,7 +255,7 @@ public class ClientApi
}
catch (Exception e)
{
ClientApi.LOGGER.error("client proxy uncaught exception: ", e);
ApiShared.LOGGER.error("client proxy uncaught exception: ", e);
}
}
@@ -116,7 +116,7 @@ public class EventApi {
/** This is also called when a new dimension loads */
public void worldLoadEvent(IWorldWrapper world) {
if (ENABLE_STACK_DUMP_LOGGING)
ClientApi.LOGGER.info(
ApiShared.LOGGER.info(
"WorldLoadEvent called here for "
+ (world.getWorldType() == WorldType.ClientWorld ? "clientLevel" : "serverLevel"),
new RuntimeException());
@@ -143,7 +143,7 @@ public class EventApi {
/** This is also called when the user disconnects from a server+ */
public void worldUnloadEvent(IWorldWrapper world) {
if (ENABLE_STACK_DUMP_LOGGING)
ClientApi.LOGGER.info(
ApiShared.LOGGER.info(
"WorldUnloadEvent called here for "
+ (world.getWorldType() == WorldType.ClientWorld ? "clientLevel" : "serverLevel"),
new RuntimeException());
@@ -39,7 +39,7 @@ public class ModAccessorApi {
{
throw new IllegalStateException("The singleton [" + interfaceClass.getSimpleName() + "] doesn't implement the interface [" + interfaceClass.getSimpleName() + "].");
}
ClientApi.LOGGER.info("DistantHorizon: Registored mod comatibility accessor for "+modAccessor.getModName());
ApiShared.LOGGER.info("DistantHorizon: Registored mod comatibility accessor for "+modAccessor.getModName());
singletons.put(interfaceClass, modAccessor);
}
@@ -31,6 +31,7 @@ import java.util.concurrent.TimeUnit;
import java.util.concurrent.TimeoutException;
import java.util.concurrent.locks.ReentrantLock;
import com.seibel.lod.core.api.ApiShared;
import com.seibel.lod.core.api.ClientApi;
import com.seibel.lod.core.builders.lodBuilding.LodBuilder;
import com.seibel.lod.core.enums.LodDirection;
@@ -86,7 +87,7 @@ public class LodBufferBuilderFactory {
return;
timer = System.nanoTime() - timer;
if (timer > LAG_SPIKE_THRESOLD_NS) {
ClientApi.LOGGER.info("LagSpikeCatcher: " + source + " took " + Duration.ofNanos(timer) + "!");
ApiShared.LOGGER.info("LagSpikeCatcher: " + source + " took " + Duration.ofNanos(timer) + "!");
}
}
}
@@ -304,7 +305,7 @@ public class LodBufferBuilderFactory {
try {
uploadBuffers(result.quadBuilder, result.regionPos);
} catch (Exception e3) {
ClientApi.LOGGER.error("\"LodNodeBufferBuilder\" was unable to upload buffer: ", e3);
ApiShared.LOGGER.error("\"LodNodeBufferBuilder\" was unable to upload buffer: ", e3);
}
}, bufferUploadThread);
futuresBuffer.add(future);
@@ -322,7 +323,7 @@ public class LodBufferBuilderFactory {
try {
allFutures.get(60, TimeUnit.SECONDS);
} catch (TimeoutException te) {
ClientApi.LOGGER.error("LodBufferBuilder timed out: ", te);
ApiShared.LOGGER.error("LodBufferBuilder timed out: ", te);
bufferBuilderThreadFactory.dumpAllThreadStacks();
bufferUploadThreadFactory.dumpAllThreadStacks();
bufferBuilderThreads.shutdownNow();
@@ -336,7 +337,7 @@ public class LodBufferBuilderFactory {
bufferUploadThread = Executors.newSingleThreadExecutor(bufferUploadThreadFactory);
return;
} catch (Exception e) {
ClientApi.LOGGER.error("LodBufferBuilder ran into trouble: ", e);
ApiShared.LOGGER.error("LodBufferBuilder ran into trouble: ", e);
}
long executeEnd = System.currentTimeMillis();
@@ -344,13 +345,13 @@ public class LodBufferBuilderFactory {
long buildTime = endTime - startTime;
long executeTime = executeEnd - executeStart;
if (ENABLE_BUFFER_PERF_LOGGING)
ClientApi.LOGGER.info("Thread Build&Upload(" + nodeToRenderThreads.size() + "/"
ApiShared.LOGGER.info("Thread Build&Upload(" + nodeToRenderThreads.size() + "/"
+ (lodDim.getWidth() * lodDim.getWidth()) + (fullRegen ? "FULL" : "") + ") time: " + buildTime
+ " ms" + '\n' + "thread execute time: " + executeTime + " ms");
// mark that the buildable buffers as ready to swap
switchVbos = true;
} catch (Exception e) {
ClientApi.LOGGER.error("\"LodNodeBufferBuilder.generateLodBuffersAsync\" ran into trouble: ", e);
ApiShared.LOGGER.error("\"LodNodeBufferBuilder.generateLodBuffersAsync\" ran into trouble: ", e);
} finally {
// regardless of whether we were able to successfully create
// the buffers, we are done generating.
@@ -579,7 +580,7 @@ public class LodBufferBuilderFactory {
private boolean swapBuffers() {
bufferLock.lock();
if (ENABLE_BUFFER_SWAP_LOGGING)
ClientApi.LOGGER.debug("Lod Swap Buffers");
ApiShared.LOGGER.debug("Lod Swap Buffers");
{
boolean shouldRegenBuff = true;
try {
@@ -587,7 +588,7 @@ public class LodBufferBuilderFactory {
drawableVbos = buildableVbos;
buildableVbos = tmpVbo;
// ClientApi.LOGGER.info("Lod Swapped Buffers: "+drawableVbos.toDetailString());
// ApiShared.LOGGER.info("Lod Swapped Buffers: "+drawableVbos.toDetailString());
// the vbos have been swapped
switchVbos = false;
@@ -599,7 +600,7 @@ public class LodBufferBuilderFactory {
hideBackBuffer = false;
} catch (Exception e) {
// this shouldn't normally happen, but just in case it sill prevent deadlock
ClientApi.LOGGER.error("swapBuffers ran into trouble: " + e.getMessage(), e);
ApiShared.LOGGER.error("swapBuffers ran into trouble: " + e.getMessage(), e);
} finally {
bufferLock.unlock();
}
@@ -22,6 +22,7 @@ package com.seibel.lod.core.builders.lodBuilding;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import com.seibel.lod.core.api.ApiShared;
import com.seibel.lod.core.api.ClientApi;
import com.seibel.lod.core.enums.LodDirection;
import com.seibel.lod.core.enums.config.DistanceGenerationMode;
@@ -179,7 +180,7 @@ public class LodBuilder
int subZ = i%16;
writeVerticalData(data, i*maxVerticalData, maxVerticalData, chunk, config, subX, subZ);
//if (DataPointUtil.isVoid(data[i*maxVerticalData]))
// ClientApi.LOGGER.debug("Datapoint is Void: {}, {}", chunk.getMinX()+subX, chunk.getMinZ()+subZ);
// ApiShared.LOGGER.debug("Datapoint is Void: {}, {}", chunk.getMinX()+subX, chunk.getMinZ()+subZ);
if (!DataPointUtil.doesItExist(data[i*maxVerticalData]))
throw new RuntimeException("writeVerticalData result: Datapoint does not exist at "+ chunk.getMinX()+subX +", "+ chunk.getMinZ()+subZ);
if (DataPointUtil.getGenerationMode(data[i*maxVerticalData]) != config.distanceGenerationMode.complexity)
@@ -199,7 +200,7 @@ public class LodBuilder
return writePartialLodNodeData(lodDim, region, chunk.getChunkPosX(), chunk.getChunkPosZ(), data, config, override);
}
} catch (RuntimeException e) {
ClientApi.LOGGER.error("LodBuilder encountered an error on building lod for chunk {}: {}", chunk ,e);
ApiShared.LOGGER.error("LodBuilder encountered an error on building lod for chunk {}: {}", chunk ,e);
return false;
}
@@ -212,7 +213,7 @@ public class LodBuilder
try {
if (region.getMinDetailLevel()!= 0) {
if (!LodUtil.checkRamUsage(0.05, 16)) {
ClientApi.LOGGER.debug("LodBuilder: Not enough RAM avalible for loading files to build lods! Returning...");
ApiShared.LOGGER.debug("LodBuilder: Not enough RAM avalible for loading files to build lods! Returning...");
return false;
}
@@ -220,7 +221,7 @@ public class LodBuilder
if (region!=newRegion)
throw new RuntimeException();
}
//ClientApi.LOGGER.info("Generate chunk: {}, {} ({}, {}) at genMode {}",
//ApiShared.LOGGER.info("Generate chunk: {}, {} ({}, {}) at genMode {}",
// chunk.getChunkPosX(), chunk.getChunkPosZ(), chunk.getMinX(), chunk.getMinZ(), config.distanceGenerationMode);
region.addChunkOfData((byte)0, chunkX*16, chunkZ*16, 16, 16, data, data.length/16/16, override);
region.regenerateLodFromArea((byte)0, chunkX*16, chunkZ*16, 16, 16);
@@ -268,7 +269,7 @@ public class LodBuilder
for (int i=0; i<data.length; i+=vertQual) {
if (!DataPointUtil.doesItExist(data[i]) ||
DataPointUtil.getGenerationMode(data[i]) != config.distanceGenerationMode.complexity) {
ClientApi.LOGGER.error("NULL data at {}, detail {}, vertQual {}, lodCount {}, chunkPos [{},{}]\n"
ApiShared.LOGGER.error("NULL data at {}, detail {}, vertQual {}, lodCount {}, chunkPos [{},{}]\n"
+ "Data: {}",
i, targetLevel, vertQual, lodCount, chunkX, chunkZ, DataPointUtil.toString(data[i]));
throw new RuntimeException("Null data!");
@@ -276,7 +277,7 @@ public class LodBuilder
}
//ClientApi.LOGGER.info("Generate chunk: {}, {} ({}, {}) at genMode {}",
//ApiShared.LOGGER.info("Generate chunk: {}, {} ({}, {}) at genMode {}",
// chunk.getChunkPosX(), chunk.getChunkPosZ(), chunk.getMinX(), chunk.getMinZ(), config.distanceGenerationMode);
region.addChunkOfData(targetLevel,
LevelPosUtil.convert(LodUtil.CHUNK_DETAIL_LEVEL, chunkX, targetLevel),
@@ -19,6 +19,7 @@
package com.seibel.lod.core.builders.worldGeneration;
import com.seibel.lod.core.api.ApiShared;
import com.seibel.lod.core.api.ClientApi;
import com.seibel.lod.core.builders.lodBuilding.LodBuilder;
import com.seibel.lod.core.enums.config.DistanceGenerationMode;
@@ -55,7 +56,7 @@ public class BatchGenerator {
targetLodDim = newLodDimension;
generationGroup = FACTORY.createBatchGenerator(newLodBuilder, newLodDimension, world);
MC.sendChatMessage("NOTE: You are currently using Distant Horizon's Batch Chunk Pre-Generator.");
ClientApi.LOGGER.info("Batch Chunk Generator initialized");
ApiShared.LOGGER.info("Batch Chunk Generator initialized");
}
@SuppressWarnings("unused")
@@ -65,7 +66,7 @@ public class BatchGenerator {
IWorldWrapper dim = LodUtil.getServerWorldFromDimension(lodDim.dimension);
generationGroup = FACTORY.createBatchGenerator(lodBuilder, lodDim, dim);
targetLodDim = lodDim;
ClientApi.LOGGER.info("1.18 Experimental Chunk Generator reinitialized");
ApiShared.LOGGER.info("1.18 Experimental Chunk Generator reinitialized");
}
DistanceGenerationMode mode = CONFIG.client().worldGenerator().getDistanceGenerationMode();
@@ -112,7 +113,7 @@ public class BatchGenerator {
estimatedPointsToQueue = newThreadCount * 10;
}
// ClientApi.LOGGER.info("PosToGenerate: {}", posToGenerate);
// ApiShared.LOGGER.info("PosToGenerate: {}", posToGenerate);
// Find the max number of iterations we need to go though.
// We are checking one FarPos, and one NearPos per iterations. This ensure we
@@ -142,14 +143,14 @@ public class BatchGenerator {
}
if (ENABLE_GENERATOR_STATS_LOGGING)
ClientApi.LOGGER.info("WorldGen. Near:" + posToGenerate.getNumberOfNearPos() + " Far:"
ApiShared.LOGGER.info("WorldGen. Near:" + posToGenerate.getNumberOfNearPos() + " Far:"
+ posToGenerate.getNumberOfFarPos());
if (priority == GenerationPriority.FAR_FIRST || priority == GenerationPriority.BALANCED) {
int nearCount = posToGenerate.getNumberOfNearPos();
int farCount = posToGenerate.getNumberOfFarPos();
if (ENABLE_GENERATOR_STATS_LOGGING)
ClientApi.LOGGER.info("WorldGen. Near:" + nearCount + " Far:" + farCount);
ApiShared.LOGGER.info("WorldGen. Near:" + nearCount + " Far:" + farCount);
int maxIteration = Math.max(nearCount, farCount);
for (int i = 0; i < maxIteration; i++) {
@@ -224,11 +225,11 @@ public class BatchGenerator {
if (targetToGenerate != toGenerate && ENABLE_GENERATOR_STATS_LOGGING) {
if (toGenerate <= 0) {
ClientApi.LOGGER.info(
ApiShared.LOGGER.info(
"WorldGenerator: Sampled " + posToGenerate.getNumberOfPos() + " out of " + estimatedSampleNeeded
+ " points, started all targeted " + targetToGenerate + " generations.");
} else {
ClientApi.LOGGER.info("WorldGenerator: Sampled " + posToGenerate.getNumberOfPos() + " out of "
ApiShared.LOGGER.info("WorldGenerator: Sampled " + posToGenerate.getNumberOfPos() + " out of "
+ estimatedSampleNeeded + " points, started " + (targetToGenerate - toGenerate)
+ " out of targeted " + targetToGenerate + " generations.");
}
@@ -242,7 +243,7 @@ public class BatchGenerator {
if (estimatedSampleNeeded > 32768)
estimatedSampleNeeded = 32768;
if (ENABLE_GENERATOR_STATS_LOGGING)
ClientApi.LOGGER.info("WorldGenerator: Increasing estimatedSampleNeeeded to " + estimatedSampleNeeded);
ApiShared.LOGGER.info("WorldGenerator: Increasing estimatedSampleNeeeded to " + estimatedSampleNeeded);
} else if (toGenerate <= 0 && positionGoneThough * 1.5 < posToGenerate.getNumberOfPos()) {
// We haven't gone though half of them and it's already enough.
@@ -252,13 +253,13 @@ public class BatchGenerator {
if (estimatedSampleNeeded < 4)
estimatedSampleNeeded = 4;
if (ENABLE_GENERATOR_STATS_LOGGING)
ClientApi.LOGGER.info("WorldGenerator: Decreasing estimatedSampleNeeeded to " + estimatedSampleNeeded);
ApiShared.LOGGER.info("WorldGenerator: Decreasing estimatedSampleNeeeded to " + estimatedSampleNeeded);
}
}
public void stop(boolean blocking) {
ClientApi.LOGGER.info("1.18 Experimental Chunk Generator shutting down...");
ApiShared.LOGGER.info("1.18 Experimental Chunk Generator shutting down...");
generationGroup.stop(blocking);
}
@@ -27,6 +27,7 @@ import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicInteger;
import com.google.common.util.concurrent.ThreadFactoryBuilder;
import com.seibel.lod.core.api.ApiShared;
import com.seibel.lod.core.api.ClientApi;
import com.seibel.lod.core.builders.lodBuilding.LodBuilder;
import com.seibel.lod.core.enums.config.DistanceGenerationMode;
@@ -312,7 +313,7 @@ public class LodWorldGenerator {
}
// catch (Exception e)
// {
// ClientApi.LOGGER.error(LodWorldGenerator.class.getSimpleName() + ": ran into
// ApiShared.LOGGER.error(LodWorldGenerator.class.getSimpleName() + ": ran into
// an error: " + e.getMessage());
// e.printStackTrace();
// }
@@ -338,16 +339,16 @@ public class LodWorldGenerator {
public void restartExecutorService() {
if (genSubThreads != null && !genSubThreads.isShutdown()) {
ClientApi.LOGGER.info("Blocking until generator sub threads terminated!!");
ApiShared.LOGGER.info("Blocking until generator sub threads terminated!!");
try {
mainGenThread.shutdownNow();
genSubThreads.shutdownNow();
boolean worked = genSubThreads.awaitTermination(30, TimeUnit.SECONDS);
if (!worked)
ClientApi.LOGGER.error(
ApiShared.LOGGER.error(
"Generator sub threads timed out! May cause crash on game exit due to cleanup failure.");
} catch (InterruptedException e) {
ClientApi.LOGGER.error(
ApiShared.LOGGER.error(
"Generator sub threads shutdown is interrupted! May cause crash on game exit due to cleanup failure.");
e.printStackTrace();
} finally {
@@ -33,6 +33,7 @@ import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.concurrent.locks.ReentrantLock;
import com.seibel.lod.core.api.ApiShared;
import org.apache.commons.compress.compressors.xz.XZCompressorInputStream;
import org.apache.commons.compress.compressors.xz.XZCompressorOutputStream;
@@ -141,18 +142,18 @@ public class LodDimensionFileHandler
subFile.getName().equals("BIOME_ONLY") ||
subFile.getName().equals("NONE"))
{
ClientApi.LOGGER.info("Noticed old save structure files. Starting merge process...");
ApiShared.LOGGER.info("Noticed old save structure files. Starting merge process...");
LodDimensionOldFileStructureHandler oldFileStructHandler = new LodDimensionOldFileStructureHandler(this);
if (mergeOldFileLock.tryLock())
{
// I got the lock to merge file.
ClientApi.LOGGER.info("Updating VerticalQuality LOW...");
ApiShared.LOGGER.info("Updating VerticalQuality LOW...");
oldFileStructHandler.mergeOldFileStructureForVertQuality(VerticalQuality.LOW);
ClientApi.LOGGER.info("Updating VerticalQuality MEDIUM...");
ApiShared.LOGGER.info("Updating VerticalQuality MEDIUM...");
oldFileStructHandler.mergeOldFileStructureForVertQuality(VerticalQuality.MEDIUM);
ClientApi.LOGGER.info("Updating VerticalQuality HIGH...");
ApiShared.LOGGER.info("Updating VerticalQuality HIGH...");
oldFileStructHandler.mergeOldFileStructureForVertQuality(VerticalQuality.HIGH);
ClientApi.LOGGER.info("Update completed.");
ApiShared.LOGGER.info("Update completed.");
}
else
{
@@ -160,7 +161,7 @@ public class LodDimensionFileHandler
mergeOldFileLock.lock();
mergeOldFileLock.unlock();
}
ClientApi.LOGGER.info("Merge process completed.");
ApiShared.LOGGER.info("Merge process completed.");
return;
}
}
@@ -229,7 +230,7 @@ public class LodDimensionFileHandler
// close the reader and delete the file.
inputStream.close();
file.delete();
ClientApi.LOGGER.info("Outdated LOD region file for region: (" + regionX + "," + regionZ + ")"
ApiShared.LOGGER.info("Outdated LOD region file for region: (" + regionX + "," + regionZ + ")"
+ " version found: " + fileVersion
+ ", version requested: " + LOD_SAVE_FILE_VERSION
+ ". File has been deleted.");
@@ -242,7 +243,7 @@ public class LodDimensionFileHandler
// close the reader and ignore the file, we don't
// want to accidentally delete anything the user may want.
inputStream.close();
ClientApi.LOGGER.info("Newer LOD region file for region: (" + regionX + "," + regionZ + ")"
ApiShared.LOGGER.info("Newer LOD region file for region: (" + regionX + "," + regionZ + ")"
+ " version found: " + fileVersion
+ ", version requested: " + LOD_SAVE_FILE_VERSION
+ " this region will not be written to in order to protect the newer file.");
@@ -251,7 +252,7 @@ public class LodDimensionFileHandler
}
else if (fileVersion < LOD_SAVE_FILE_VERSION)
{
ClientApi.LOGGER.debug("Old LOD region file for region: (" + regionX + "," + regionZ + ")"
ApiShared.LOGGER.debug("Old LOD region file for region: (" + regionX + "," + regionZ + ")"
+ " version found: " + fileVersion
+ ", version requested: " + LOD_SAVE_FILE_VERSION
+ ". File will be loaded and updated to new format in next save.");
@@ -273,7 +274,7 @@ public class LodDimensionFileHandler
}
catch (IOException ioEx)
{
ClientApi.LOGGER.error("LOD file read error. Unable to read xz compressed file [" + file + "] error [" + ioEx.getMessage() + "]: ");
ApiShared.LOGGER.error("LOD file read error. Unable to read xz compressed file [" + file + "] error [" + ioEx.getMessage() + "]: ");
ioEx.printStackTrace();
region.addLevelContainer(new VerticalLevelContainer(tempDetailLevel));
}
@@ -292,7 +293,7 @@ public class LodDimensionFileHandler
DETAIL_FOLDER_NAME_PREFIX + dataContainer.detailLevel + File.separatorChar +
FILE_NAME_PREFIX + "." + posX + "." + posZ + FILE_EXTENSION);
if (file.exists()) {
ClientApi.LOGGER.warn("LOD file write warn. Unable to write [" + file + "] because the newer version file already exist! Skipping this position...");
ApiShared.LOGGER.warn("LOD file write warn. Unable to write [" + file + "] because the newer version file already exist! Skipping this position...");
return;
}
if (!file.getParentFile().exists())
@@ -300,7 +301,7 @@ public class LodDimensionFileHandler
try {
file.createNewFile();
} catch (IOException e) {
ClientApi.LOGGER.error("LOD file write error. Unable to create parent directory for [" + file + "] error [" + e.getMessage() + "]: ");
ApiShared.LOGGER.error("LOD file write error. Unable to create parent directory for [" + file + "] error [" + e.getMessage() + "]: ");
e.printStackTrace();
return;
}
@@ -317,7 +318,7 @@ public class LodDimensionFileHandler
}
catch (IOException e)
{
ClientApi.LOGGER.error("LOD file write error. Unable to write to temp file [" + file + "] error [" + e.getMessage() + "]: ");
ApiShared.LOGGER.error("LOD file write error. Unable to write to temp file [" + file + "] error [" + e.getMessage() + "]: ");
e.printStackTrace();
}
}
@@ -346,7 +347,7 @@ public class LodDimensionFileHandler
if (r.isWriting.get() != 0) writingRegionCount++;
LevelContainer[] container = r.debugGetDataContainers().clone();
if (container == null || container.length != LodUtil.DETAIL_OPTIONS) {
ClientApi.LOGGER.warn("DumpRamUsage encountered an invalid region!");
ApiShared.LOGGER.warn("DumpRamUsage encountered an invalid region!");
continue;
}
for (int i = 0; i < LodUtil.DETAIL_OPTIONS; i++) {
@@ -387,14 +388,14 @@ public class LodDimensionFileHandler
}
trySaveRegionsToBeSaved();
if (blockUntilFinished) {
if (ENABLE_SAVE_THREAD_LOGGING) ClientApi.LOGGER.info("Blocking until lod file save finishes!");
if (ENABLE_SAVE_THREAD_LOGGING) ApiShared.LOGGER.info("Blocking until lod file save finishes!");
try {
fileWritingThreadPool.shutdown();
boolean worked = fileWritingThreadPool.awaitTermination(30, TimeUnit.SECONDS);
if (!worked)
ClientApi.LOGGER.error("File writing timed out! File data may not be saved correctly and may cause corruptions!!!");
ApiShared.LOGGER.error("File writing timed out! File data may not be saved correctly and may cause corruptions!!!");
} catch (InterruptedException e) {
ClientApi.LOGGER.error("File writing wait is interrupted! File data may not be saved correctly and may cause corruptions!!!");
ApiShared.LOGGER.error("File writing wait is interrupted! File data may not be saved correctly and may cause corruptions!!!");
e.printStackTrace();
} finally {
fileWritingThreadPool = Executors.newSingleThreadExecutor(new LodThreadFactory(this.getClass().getSimpleName(), Thread.NORM_PRIORITY+1));
@@ -425,7 +426,7 @@ public class LodDimensionFileHandler
if (!isStarted) throw new ConcurrentModificationException("WriterMain Triggered but the thead state is not started!?");
if (ENABLE_SAVE_THREAD_LOGGING)
ClientApi.LOGGER.info("Lod File Writer started. To-be-written-regions: "+regionToSave.size());
ApiShared.LOGGER.info("Lod File Writer started. To-be-written-regions: "+regionToSave.size());
Instant start = Instant.now();
// Note: Since regionToSave is a ConcurrentHashMap, and the .values() return one that support concurrency,
// this for loop should be safe and loop until all values are gone.
@@ -439,12 +440,12 @@ public class LodDimensionFileHandler
r.needSaving = false;
Instant i = Instant.now();
if (ENABLE_SAVE_REGION_LOGGING)
ClientApi.LOGGER.info("Lod: Saving Region "+r.getRegionPos());
ApiShared.LOGGER.info("Lod: Saving Region "+r.getRegionPos());
saveRegionToFile(r);
Instant j = Instant.now();
Duration d = Duration.between(i, j);
if (ENABLE_SAVE_REGION_LOGGING)
ClientApi.LOGGER.info("Lod: Region "+r.getRegionPos()+" save finish. Took "+d);
ApiShared.LOGGER.info("Lod: Region "+r.getRegionPos()+" save finish. Took "+d);
}
catch (Exception e)
{
@@ -456,7 +457,7 @@ public class LodDimensionFileHandler
}
Instant end = Instant.now();
if (ENABLE_SAVE_THREAD_LOGGING)
ClientApi.LOGGER.info("Lod File Writer completed. Took "+Duration.between(start, end));
ApiShared.LOGGER.info("Lod File Writer completed. Took "+Duration.between(start, end));
// Use Memory order Release to release any memory changes on setting this boolean
// (Corresponding call is the this::saveRegions(...)::...compareAndExchangeAcquire(false, true);)
// isFileWritingThreadRunning.setRelease(false);
@@ -479,7 +480,7 @@ public class LodDimensionFileHandler
// Get the old file
File oldFile = getRegionFile(region.regionPosX, region.regionPosZ, detailLevel, region.getVerticalQuality());
if (ENABLE_SAVE_REGION_LOGGING)
ClientApi.LOGGER.debug("saving region [" + region.regionPosX + ", " + region.regionPosZ + "] detail "+detailLevel+" to file.");
ApiShared.LOGGER.debug("saving region [" + region.regionPosX + ", " + region.regionPosZ + "] detail "+detailLevel+" to file.");
boolean isFileFullyGened = false;
// make sure the file and folder exists
@@ -492,7 +493,7 @@ public class LodDimensionFileHandler
try {
oldFile.createNewFile();
} catch (IOException e) {
ClientApi.LOGGER.error("LOD file write error. Unable to create parent directory for [" + oldFile + "] error [" + e.getMessage() + "]: ");
ApiShared.LOGGER.error("LOD file write error. Unable to create parent directory for [" + oldFile + "] error [" + e.getMessage() + "]: ");
e.printStackTrace();
continue;
}
@@ -514,7 +515,7 @@ public class LodDimensionFileHandler
}
catch (IOException e)
{
ClientApi.LOGGER.warn("LOD file write warning. Unable to read existing file [" + oldFile + "] version. Treating it as latest version. [" + e.getMessage() + "]: ");
ApiShared.LOGGER.warn("LOD file write warning. Unable to read existing file [" + oldFile + "] version. Treating it as latest version. [" + e.getMessage() + "]: ");
e.printStackTrace();
}
@@ -548,7 +549,7 @@ public class LodDimensionFileHandler
// existing file is complete while new one is only partially generate
// this can happen is for some reason loading failed
// this doesn't fix the bug, but at least protects old data
ClientApi.LOGGER.error("LOD file write error. Attempted to overwrite complete region with incomplete one [" + oldFile + "]");
ApiShared.LOGGER.error("LOD file write error. Attempted to overwrite complete region with incomplete one [" + oldFile + "]");
try {
tempFile.delete();
} catch (SecurityException e) {
@@ -559,7 +560,7 @@ public class LodDimensionFileHandler
}
catch (IOException e)
{
ClientApi.LOGGER.error("LOD file write error. Unable to write to temp file [" + tempFile + "] error [" + e.getMessage() + "]: ");
ApiShared.LOGGER.error("LOD file write error. Unable to write to temp file [" + tempFile + "] error [" + e.getMessage() + "]: ");
e.printStackTrace();
continue;
}
@@ -568,7 +569,7 @@ public class LodDimensionFileHandler
try {
Files.move(tempFile.toPath(), oldFile.toPath(), StandardCopyOption.ATOMIC_MOVE, StandardCopyOption.REPLACE_EXISTING);
} catch (IOException e) {
ClientApi.LOGGER.error("LOD file write error. Unable to update file [" + oldFile + "] error [" + e.getMessage() + "]: ");
ApiShared.LOGGER.error("LOD file write error. Unable to update file [" + oldFile + "] error [" + e.getMessage() + "]: ");
e.printStackTrace();
}
}
@@ -592,7 +593,7 @@ public class LodDimensionFileHandler
try {
return dimensionDataSaveFolder.getCanonicalPath() + File.separatorChar;
} catch (IOException e) {
ClientApi.LOGGER.warn("Unable to get the base save file path. One possible cause is that"
ApiShared.LOGGER.warn("Unable to get the base save file path. One possible cause is that"
+ " the process failed to read the current path location due to security configs.");
throw new RuntimeException("DistantHorizons Get Save File Path Failure");
}
@@ -12,6 +12,7 @@ import java.util.concurrent.Executors;
import java.util.concurrent.Future;
import java.util.concurrent.locks.ReentrantLock;
import com.seibel.lod.core.api.ApiShared;
import org.apache.commons.compress.compressors.xz.XZCompressorInputStream;
import com.google.common.util.concurrent.ThreadFactoryBuilder;
@@ -99,7 +100,7 @@ public class LodDimensionOldFileStructureHandler
// the file we are reading is too old.
// close the reader and delete the file.
inputStream.close();
ClientApi.LOGGER.info("Outdated LOD region file for region: (" + regionX + "," + regionZ + ")"
ApiShared.LOGGER.info("Outdated LOD region file for region: (" + regionX + "," + regionZ + ")"
+ " version found: " + fileVersion
+ ", version requested: " + LOD_SAVE_FILE_VERSION
+ ". this region file will not be read and merged into the new save structure.");
@@ -111,7 +112,7 @@ public class LodDimensionOldFileStructureHandler
// close the reader and ignore the file, we don't
// want to accidentally delete anything the user may want.
inputStream.close();
ClientApi.LOGGER.info("Unexpected newer LOD region file for region: (" + regionX + "," + regionZ + ")"
ApiShared.LOGGER.info("Unexpected newer LOD region file for region: (" + regionX + "," + regionZ + ")"
+ " version found: " + fileVersion
+ ", version requested: " + LOD_SAVE_FILE_VERSION
+ " this region file will not be read and merged into the new save structure.");
@@ -119,7 +120,7 @@ public class LodDimensionOldFileStructureHandler
}
else if (fileVersion < LOD_SAVE_FILE_VERSION)
{
ClientApi.LOGGER.debug("Old LOD region file for region: (" + regionX + "," + regionZ + ")"
ApiShared.LOGGER.debug("Old LOD region file for region: (" + regionX + "," + regionZ + ")"
+ " version found: " + fileVersion
+ ", version requested: " + LOD_SAVE_FILE_VERSION
+ ". this region file be read, updated, and merged into the new save structure.");
@@ -134,7 +135,7 @@ public class LodDimensionOldFileStructureHandler
}
catch (IOException ioEx)
{
ClientApi.LOGGER.error("LOD file read error. Unable to read xz compressed file [" + file + "] error [" + ioEx.getMessage() + "]: ");
ApiShared.LOGGER.error("LOD file read error. Unable to read xz compressed file [" + file + "] error [" + ioEx.getMessage() + "]: ");
ioEx.printStackTrace();
}
}
@@ -149,18 +150,18 @@ public class LodDimensionOldFileStructureHandler
private void loadAndMergeAndSaveRegion(VerticalQuality verticalQuality, RegionPos regionPos)
{
ClientApi.LOGGER.info("Merging region "+regionPos+" at "+verticalQuality+"...");
ApiShared.LOGGER.info("Merging region "+regionPos+" at "+verticalQuality+"...");
TempLodRegion region = new TempLodRegion(verticalQuality, regionPos);
ClientApi.LOGGER.info("Reading data...");
ApiShared.LOGGER.info("Reading data...");
loadGenModeToRegion(region, OldDistanceGenerationMode.FULL);
loadGenModeToRegion(region, OldDistanceGenerationMode.FEATURES);
loadGenModeToRegion(region, OldDistanceGenerationMode.SURFACE);
loadGenModeToRegion(region, OldDistanceGenerationMode.BIOME_ONLY_SIMULATE_HEIGHT);
loadGenModeToRegion(region, OldDistanceGenerationMode.BIOME_ONLY);
loadGenModeToRegion(region, OldDistanceGenerationMode.NONE);
ClientApi.LOGGER.info("Writing data...");
ApiShared.LOGGER.info("Writing data...");
saveRegion(region);
ClientApi.LOGGER.info("region "+regionPos+" at "+verticalQuality+" merged");
ApiShared.LOGGER.info("region "+regionPos+" at "+verticalQuality+" merged");
}
@@ -245,7 +246,7 @@ public class LodDimensionOldFileStructureHandler
try {
return dimensionDataSaveFolder.getCanonicalPath() + File.separatorChar;
} catch (IOException e) {
ClientApi.LOGGER.warn("Unable to get the base save file path. One possible cause is that"
ApiShared.LOGGER.warn("Unable to get the base save file path. One possible cause is that"
+ " the process failed to read the current path location due to security configs.");
throw new RuntimeException("DistantHorizons Get Save File Path Failure");
}
@@ -21,6 +21,7 @@ package com.seibel.lod.core.objects;
import java.util.Arrays;
import com.seibel.lod.core.api.ApiShared;
import com.seibel.lod.core.api.ClientApi;
import com.seibel.lod.core.util.LevelPosUtil;
import com.seibel.lod.core.util.LodUtil;
@@ -60,7 +61,7 @@ public class PosToRenderContainer
{
// This is might be due to dimensions having a different width
// when first loading in
ClientApi.LOGGER.error("Unable to addPosToRender. numberOfPosToRender [" + numberOfPosToRender + "] detailLevel [" + detailLevel + "] Pos [" + posX + "," + posZ + "]");
ApiShared.LOGGER.error("Unable to addPosToRender. numberOfPosToRender [" + numberOfPosToRender + "] detailLevel [" + detailLevel + "] Pos [" + posX + "," + posZ + "]");
numberOfPosToRender++; // incrementing so we can see how many pos over the limit we would go
return;
}
@@ -26,6 +26,7 @@ import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;
import com.seibel.lod.core.api.ApiShared;
import com.seibel.lod.core.api.ClientApi;
import com.seibel.lod.core.enums.config.DistanceGenerationMode;
import com.seibel.lod.core.enums.config.DropoffQuality;
@@ -179,11 +180,11 @@ public class LodDimension
*/
public synchronized void move(RegionPos regionOffset)
{
ClientApi.LOGGER.info("LodDim MOVE. Offset: "+regionOffset);
ApiShared.LOGGER.info("LodDim MOVE. Offset: "+regionOffset);
saveDirtyRegionsToFile(false); //async add dirty regions to be saved.
Pos p = regions.getCenter();
regions.move(p.x+regionOffset.x, p.y+regionOffset.z);
ClientApi.LOGGER.info("LodDim MOVE complete. Offset: "+regionOffset);
ApiShared.LOGGER.info("LodDim MOVE complete. Offset: "+regionOffset);
}
@@ -285,7 +286,7 @@ public class LodDimension
// don't run the tree cutter multiple times
// for the same location
Runnable thread = () -> {
//ClientApi.LOGGER.info("LodDim cut Region: " + playerPosX + "," + playerPosZ);
//ApiShared.LOGGER.info("LodDim cut Region: " + playerPosX + "," + playerPosZ);
totalDirtiedRegions = 0;
Pos minPos = regions.getMinInRange();
// go over every region in the dimension
@@ -311,7 +312,7 @@ public class LodDimension
});
if (totalDirtiedRegions > 8) this.saveDirtyRegionsToFile(false);
dirtiedRegionsRoughCount = totalDirtiedRegions;
//ClientApi.LOGGER.info("LodDim cut Region complete: " + playerPosX + "," + playerPosZ);
//ApiShared.LOGGER.info("LodDim cut Region complete: " + playerPosX + "," + playerPosZ);
isCutting = false;
// See if we need to save and flush some data out.
@@ -327,7 +328,7 @@ public class LodDimension
// If we have less than 20% or 128MB ram left. Don't expend.
if (expandOrLoadPaused) {
if (LodUtil.checkRamUsage(0.2, 128)) {
ClientApi.LOGGER.info("Enough ram for expandOrLoadThread. Restarting...");
ApiShared.LOGGER.info("Enough ram for expandOrLoadThread. Restarting...");
expandOrLoadPaused = false;
}
}
@@ -342,13 +343,13 @@ public class LodDimension
// don't run the expander multiple times
// for the same location
Runnable thread = () -> {
//ClientApi.LOGGER.info("LodDim expend Region: " + playerPosX + "," + playerPosZ);
//ApiShared.LOGGER.info("LodDim expend Region: " + playerPosX + "," + playerPosZ);
Pos minPos = regions.getMinInRange();
iterateWithSpiral((int x, int z) -> {
if (!expandOrLoadPaused && !LodUtil.checkRamUsage(0.02, 64)) {
Runtime.getRuntime().gc();
if (!LodUtil.checkRamUsage(0.2, 128)) {
ClientApi.LOGGER.warn("Not enough ram for expandOrLoadThread. Pausing until Ram is freed...");
ApiShared.LOGGER.warn("Not enough ram for expandOrLoadThread. Pausing until Ram is freed...");
// We have less than 10% or 64MB ram left. Don't expend.
expandOrLoadPaused = true;
saveDirtyRegionsToFile(false);
@@ -379,7 +380,7 @@ public class LodDimension
double deltaRPosZ = debugRPosZ - playerPosZ;
double debugDistance = Math.sqrt(deltaRPosX*deltaRPosX + deltaRPosZ*deltaRPosZ);
if (minDistance > debugDistance || maxDistance < debugDistance || minDistance > maxDistance) {
ClientApi.LOGGER.error("MinDistance/MaxDistance is WRONG!!! minDist: [{}], maxDist: [{}], centerDist: [{}]\n"
ApiShared.LOGGER.error("MinDistance/MaxDistance is WRONG!!! minDist: [{}], maxDist: [{}], centerDist: [{}]\n"
+ "At center block pos: {} {}, region pos: {}",
minDistance, maxDistance, debugDistance, debugRPosX, debugRPosZ, regionPos);
return;
@@ -414,7 +415,7 @@ public class LodDimension
regenDimensionBuffers = true;
}
});
//ClientApi.LOGGER.info("LodDim expend Region complete: " + playerPosX + "," + playerPosZ);
//ApiShared.LOGGER.info("LodDim expend Region complete: " + playerPosX + "," + playerPosZ);
isExpanding = false;
};
@@ -738,7 +739,7 @@ public class LodDimension
if (r.isWriting.get() != 0) writingRegionCount++;
LevelContainer[] container = r.debugGetDataContainers().clone();
if (container == null || container.length != LodUtil.DETAIL_OPTIONS) {
ClientApi.LOGGER.warn("DumpRamUsage encountered an invalid region!");
ApiShared.LOGGER.warn("DumpRamUsage encountered an invalid region!");
continue;
}
for (int i = 0; i < LodUtil.DETAIL_OPTIONS; i++) {
@@ -775,9 +776,9 @@ public class LodDimension
try {
boolean worked = cutAndExpandThread.awaitTermination(5, TimeUnit.SECONDS);
if (!worked)
ClientApi.LOGGER.error("Cut And Expend threads timed out! May cause crash on game exit due to cleanup failure.");
ApiShared.LOGGER.error("Cut And Expend threads timed out! May cause crash on game exit due to cleanup failure.");
} catch (InterruptedException e) {
ClientApi.LOGGER.error("Cut And Expend threads shutdown is interrupted! May cause crash on game exit due to cleanup failure: ", e);
ApiShared.LOGGER.error("Cut And Expend threads shutdown is interrupted! May cause crash on game exit due to cleanup failure: ", e);
}
}
@@ -160,13 +160,13 @@ public class LodRegion {
throw new RuntimeException("Provided data's verticalSize is different from current storage's verticalSize!");
boolean updated = this.dataContainer[detailLevel].addChunkOfData(data, posX, posZ, widthX, widthZ, override);
//ClientApi.LOGGER.info("addChunkOfData(region:{}, level:{}, x:{}, z:{}, wx:{}, wz:{}, override:{}, updated:{})",
//ApiShared.LOGGER.info("addChunkOfData(region:{}, level:{}, x:{}, z:{}, wx:{}, wz:{}, override:{}, updated:{})",
// getRegionPos(), detailLevel, posX, posZ, widthX, widthZ, override, updated);
if (updated) {
needRegenBuffer = 2;
needSaving = true;
} else {
/*ClientApi.LOGGER.info("addChunkOfData nothing changed. Datapoint: {}\n Upper Datapoint: {}",
/*ApiShared.LOGGER.info("addChunkOfData nothing changed. Datapoint: {}\n Upper Datapoint: {}",
DataPointUtil.toString(this.dataContainer[detailLevel].getSingleData(posX, posZ)),
DataPointUtil.toString(this.dataContainer[9].getSingleData(0, 0))
);*/
@@ -445,7 +445,7 @@ public class LodRegion {
if (detailLevel >= LodUtil.REGION_DETAIL_LEVEL) return false;
int modPosX = LevelPosUtil.getRegionModule(detailLevel, posX);
int modPosZ = LevelPosUtil.getRegionModule(detailLevel, posZ);
//ClientApi.LOGGER.info("RegenerateLodFromArea(region:{} level:{}, x:{}, z:{}, wx:{}, wz:{})",
//ApiShared.LOGGER.info("RegenerateLodFromArea(region:{} level:{}, x:{}, z:{}, wx:{}, wz:{})",
// getRegionPos(), detailLevel, modPosX, modPosZ, widthX, widthZ);
if (detailLevel < minDetailLevel) {
byte startLevel = minDetailLevel;
@@ -465,7 +465,7 @@ public class LodRegion {
widthX = maxPosX-modPosX;
widthZ = maxPosZ-modPosZ;
detailLevel++;
// ClientApi.LOGGER.info(" - Shink: (level:{}, x:{}, z:{}, wx:{}, wz:{})", detailLevel, modPosX, modPosZ, widthX, widthZ);
// ApiShared.LOGGER.info(" - Shink: (level:{}, x:{}, z:{}, wx:{}, wz:{})", detailLevel, modPosX, modPosZ, widthX, widthZ);
chunkUpdate(detailLevel, modPosX, modPosZ, widthX, widthZ);
} while (detailLevel < LodUtil.REGION_DETAIL_LEVEL);
@@ -480,7 +480,7 @@ public class LodRegion {
* TODO make this return whether any value has changed
*/
private void update(byte detailLevel, int modPosX, int modPosZ) {
//ClientApi.LOGGER.info(" - Update: (level:{}, subLevel:{}, mx:{}, mz:{})", detailLevel, detailLevel-1, modPosX, modPosZ);
//ApiShared.LOGGER.info(" - Update: (level:{}, subLevel:{}, mx:{}, mz:{})", detailLevel, detailLevel-1, modPosX, modPosZ);
dataContainer[detailLevel].updateData(dataContainer[detailLevel - 1], modPosX, modPosZ);
}
private void chunkUpdate(byte detailLevel, int modPosX, int modPosZ, int widthX,int widthZ) {
@@ -22,6 +22,7 @@ package com.seibel.lod.core.objects.lod;
import java.util.Hashtable;
import java.util.Map;
import com.seibel.lod.core.api.ApiShared;
import com.seibel.lod.core.api.ClientApi;
import com.seibel.lod.core.wrapperInterfaces.world.IDimensionTypeWrapper;
@@ -142,7 +143,7 @@ public class LodWorld
// TODO we should only print this if lods were actually saved to file
// but that requires a LodDimension.hasDirtyRegions() method or something similar
ClientApi.LOGGER.info("Saving LODs");
ApiShared.LOGGER.info("Saving LODs");
for (IDimensionTypeWrapper key : lodDimensions.keySet()) {
lodDimensions.get(key).saveDirtyRegionsToFile(isBlocking);
@@ -6,6 +6,7 @@ import java.util.ArrayList;
import java.util.Iterator;
import java.util.ListIterator;
import com.seibel.lod.core.api.ApiShared;
import com.seibel.lod.core.api.ClientApi;
import com.seibel.lod.core.enums.LodDirection;
import com.seibel.lod.core.enums.LodDirection.Axis;
@@ -97,7 +98,7 @@ public class LodQuadBuilder {
return false;
if (z + w0 > o.z)
{
ClientApi.LOGGER.warn("Overlapping quads detected!");
ApiShared.LOGGER.warn("Overlapping quads detected!");
o.color = ColorUtil.rgbToInt(255, 0, 0);
return false;
}
@@ -116,7 +117,7 @@ public class LodQuadBuilder {
return false;
if (x + w0 > o.x)
{
ClientApi.LOGGER.warn("Overlapping quads detected!");
ApiShared.LOGGER.warn("Overlapping quads detected!");
o.color = ColorUtil.rgbToInt(255, 0, 0);
return false;
}
@@ -135,7 +136,7 @@ public class LodQuadBuilder {
return false;
if (x + w0 > o.x)
{
ClientApi.LOGGER.warn("Overlapping quads detected!");
ApiShared.LOGGER.warn("Overlapping quads detected!");
o.color = ColorUtil.rgbToInt(255, 0, 0);
return false;
}
@@ -166,7 +167,7 @@ public class LodQuadBuilder {
return false;
if (y + w1 > o.y)
{
ClientApi.LOGGER.warn("Overlapping quads detected!");
ApiShared.LOGGER.warn("Overlapping quads detected!");
o.color = ColorUtil.rgbToInt(255, 0, 0);
return false;
}
@@ -184,7 +185,7 @@ public class LodQuadBuilder {
return false;
if (z + w1 > o.z)
{
ClientApi.LOGGER.warn("Overlapping quads detected!");
ApiShared.LOGGER.warn("Overlapping quads detected!");
o.color = ColorUtil.rgbToInt(255, 0, 0);
return false;
}
@@ -202,7 +203,7 @@ public class LodQuadBuilder {
return false;
if (y + w1 > o.y)
{
ClientApi.LOGGER.warn("Overlapping quads detected!");
ApiShared.LOGGER.warn("Overlapping quads detected!");
o.color = ColorUtil.rgbToInt(255, 0, 0);
return false;
}
@@ -375,7 +376,7 @@ public class LodQuadBuilder {
mergeCount += merggeQuadsPass2();
long postQuadsCount = quads.size();
//if (mergeCount != 0)
//ClientApi.LOGGER.info("Merged {} out of {} quads, to now {} quads.", mergeCount, preQuadsCount, postQuadsCount);
//ApiShared.LOGGER.info("Merged {} out of {} quads, to now {} quads.", mergeCount, preQuadsCount, postQuadsCount);
}
public Iterator<ByteBuffer> makeVertexBuffers() {
@@ -21,6 +21,7 @@ package com.seibel.lod.core.objects.opengl;
import java.nio.ByteBuffer;
import com.seibel.lod.core.api.ApiShared;
import org.lwjgl.opengl.GL32;
import org.lwjgl.opengl.GL44;
@@ -142,7 +143,7 @@ public class LodVertexBuffer implements AutoCloseable
} catch (IllegalArgumentException e) {
throw e;
} catch (Exception e) {
ClientApi.LOGGER.error("vboUpload failed: ", e);
ApiShared.LOGGER.error("vboUpload failed: ", e);
}
}
@@ -153,9 +154,9 @@ public class LodVertexBuffer implements AutoCloseable
if (this.id >= 0)
{
_destroy();
if (count==0) ClientApi.LOGGER.info("All LodVerrtexBuffer is freed.");
if (count==0) ApiShared.LOGGER.info("All LodVerrtexBuffer is freed.");
} else {
ClientApi.LOGGER.error("LodVertexBuffer double close!");
ApiShared.LOGGER.error("LodVertexBuffer double close!");
}
}
@@ -27,6 +27,7 @@ import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;
import com.seibel.lod.core.api.ApiShared;
import org.lwjgl.glfw.GLFW;
import org.lwjgl.opengl.GL;
import org.lwjgl.opengl.GL11;
@@ -162,9 +163,9 @@ public class GLProxy
boolean enableDebugLogging = true;
// this must be created on minecraft's render context to work correctly
ClientApi.LOGGER.info("Creating " + GLProxy.class.getSimpleName() + "... If this is the last message you see in the log there must have been a OpenGL error.");
ApiShared.LOGGER.info("Creating " + GLProxy.class.getSimpleName() + "... If this is the last message you see in the log there must have been a OpenGL error.");
ClientApi.LOGGER.info("Lod Render OpenGL version [" + GL11.glGetString(GL11.GL_VERSION) + "].");
ApiShared.LOGGER.info("Lod Render OpenGL version [" + GL11.glGetString(GL11.GL_VERSION) + "].");
// getting Minecraft's context has to be done on the render thread,
// where the GL context is
@@ -191,7 +192,7 @@ public class GLProxy
"Additional info:\n"+supportedVersionInfo;
MC.crashMinecraft(errorMessage, new UnsupportedOperationException("This GPU doesn't support OpenGL 3.2."));
}
ClientApi.LOGGER.info("minecraftGlCapabilities:\n"+getVersionInfo(minecraftGlCapabilities));
ApiShared.LOGGER.info("minecraftGlCapabilities:\n"+getVersionInfo(minecraftGlCapabilities));
// context creation setup
GLFW.glfwDefaultWindowHints();
@@ -206,13 +207,13 @@ public class GLProxy
lodBuilderGlContext = GLFW.glfwCreateWindow(64, 48, "LOD Builder Window", 0L, minecraftGlContext);
GLFW.glfwMakeContextCurrent(lodBuilderGlContext);
lodBuilderGlCapabilities = GL.createCapabilities();
ClientApi.LOGGER.info("lodBuilderGlCapabilities:\n"+getVersionInfo(lodBuilderGlCapabilities));
ApiShared.LOGGER.info("lodBuilderGlCapabilities:\n"+getVersionInfo(lodBuilderGlCapabilities));
// create the proxyWorker's context
proxyWorkerGlContext = GLFW.glfwCreateWindow(64, 48, "LOD proxy worker Window", 0L, minecraftGlContext);
GLFW.glfwMakeContextCurrent(proxyWorkerGlContext);
proxyWorkerGlCapabilities = GL.createCapabilities();
ClientApi.LOGGER.info("proxyWorkerGlCapabilities:\n"+getVersionInfo(lodBuilderGlCapabilities));
ApiShared.LOGGER.info("proxyWorkerGlCapabilities:\n"+getVersionInfo(lodBuilderGlCapabilities));
// Check if we can use the make-over version of Vertex Attribute, which is available in GL4.3 or after
VertexAttributeBufferBindingSupported = minecraftGlCapabilities.glBindVertexBuffer != 0L; // Nullptr
@@ -251,7 +252,7 @@ public class GLProxy
// display the capabilities
if (!bufferStorageSupported)
{
ClientApi.LOGGER.warn("This GPU doesn't support Buffer Storage (OpenGL 4.4), falling back to using other methods.");
ApiShared.LOGGER.warn("This GPU doesn't support Buffer Storage (OpenGL 4.4), falling back to using other methods.");
}
String vendor = GL32.glGetString(GL32.GL_VENDOR).toUpperCase(); // example return: "NVIDIA CORPORATION"
@@ -266,7 +267,7 @@ public class GLProxy
preferredUploadMethod = GpuUploadMethod.BUFFER_MAPPING;
}
ClientApi.LOGGER.info("GPU Vendor [" + vendor + "], Preferred upload method is [" + preferredUploadMethod + "].");
ApiShared.LOGGER.info("GPU Vendor [" + vendor + "], Preferred upload method is [" + preferredUploadMethod + "].");
setGlContext(GLProxyContext.PROXY_WORKER);
File workerLog = new File("OpenGL-Lod-WorkerContext.log");
@@ -292,7 +293,7 @@ public class GLProxy
setGlContext(GLProxyContext.MINECRAFT);
// GLProxy creation success
ClientApi.LOGGER.info(GLProxy.class.getSimpleName() + " creation successful. OpenGL smiles upon you this day.");
ApiShared.LOGGER.info(GLProxy.class.getSimpleName() + " creation successful. OpenGL smiles upon you this day.");
}
/**
@@ -409,7 +410,7 @@ public class GLProxy
}
catch (Exception e)
{
ClientApi.LOGGER.error(Thread.currentThread().getName() + " ran into a issue: " + e.getMessage());
ApiShared.LOGGER.error(Thread.currentThread().getName() + " ran into a issue: " + e.getMessage());
e.printStackTrace();
}
finally
@@ -421,14 +422,14 @@ public class GLProxy
public static void ensureAllGLJobCompleted() {
if (!hasInstance()) return;
ClientApi.LOGGER.info("Blocking until GL jobs finished!");
ApiShared.LOGGER.info("Blocking until GL jobs finished!");
try {
instance.workerThread.shutdown();
boolean worked = instance.workerThread.awaitTermination(30, TimeUnit.SECONDS);
if (!worked)
ClientApi.LOGGER.error("GLWorkerThread shutdown timed out! Game may crash on exit due to cleanup failure!");
ApiShared.LOGGER.error("GLWorkerThread shutdown timed out! Game may crash on exit due to cleanup failure!");
} catch (InterruptedException e) {
ClientApi.LOGGER.error("GLWorkerThread shutdown is interrupted! Game may crash on exit due to cleanup failure!");
ApiShared.LOGGER.error("GLWorkerThread shutdown is interrupted! Game may crash on exit due to cleanup failure!");
e.printStackTrace();
} finally {
instance.workerThread = Executors.newSingleThreadExecutor(new ThreadFactoryBuilder().setNameFormat(GLProxy.class.getSimpleName() + "-Worker-Thread").build());
@@ -72,7 +72,7 @@ public class LodRenderer
if (!ENABLE_DRAW_LAG_SPIKE_LOGGING) return;
timer = System.nanoTime() - timer;
if (timer> DRAW_LAG_SPIKE_THRESOLD_NS) { //4 ms
ClientApi.LOGGER.info("NOTE: "+source+" took "+Duration.ofNanos(timer)+"!");
ApiShared.LOGGER.info("NOTE: "+source+" took "+Duration.ofNanos(timer)+"!");
}
}
@@ -347,7 +347,7 @@ public class LodRenderer
}
}
//if (drawCall==0)
// ClientApi.LOGGER.info("DrawCall Count: "+drawCall+"("+vCount0+")");
// ApiShared.LOGGER.info("DrawCall Count: "+drawCall+"("+vCount0+")");
//================//
// render cleanup //
@@ -391,11 +391,11 @@ public class LodRenderer
/** Setup all render objects - REQUIRES to be in render thread */
private void setup() {
if (isSetupComplete) {
ClientApi.LOGGER.warn("Renderer setup called but it has already completed setup!");
ApiShared.LOGGER.warn("Renderer setup called but it has already completed setup!");
return;
}
if (!GLProxy.hasInstance()) {
ClientApi.LOGGER.warn("Renderer setup called but GLProxy has not yet been setup!");
ApiShared.LOGGER.warn("Renderer setup called but GLProxy has not yet been setup!");
return;
}
@@ -451,17 +451,17 @@ public class LodRenderer
* (Many objects are Native, outside of JVM, and need manual cleanup) */
private void cleanup() {
if (!isSetupComplete) {
ClientApi.LOGGER.warn("Renderer cleanup called but Renderer has not completed setup!");
ApiShared.LOGGER.warn("Renderer cleanup called but Renderer has not completed setup!");
return;
}
if (!GLProxy.hasInstance()) {
ClientApi.LOGGER.warn("Renderer Cleanup called but the GLProxy has never been inited!");
ApiShared.LOGGER.warn("Renderer Cleanup called but the GLProxy has never been inited!");
return;
}
isSetupComplete = false;
ClientApi.LOGGER.info("Renderer Cleanup Started");
ApiShared.LOGGER.info("Renderer Cleanup Started");
shaderProgram.free();
ClientApi.LOGGER.info("Renderer Cleanup Complete");
ApiShared.LOGGER.info("Renderer Cleanup Complete");
}
/** Calls the BufferBuilder's destroyBuffers method. */
@@ -26,6 +26,7 @@ import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import com.seibel.lod.core.api.ApiShared;
import org.lwjgl.opengl.GL32;
import com.seibel.lod.core.api.ClientApi;
@@ -50,7 +51,7 @@ public class Shader
*/
public Shader(int type, String path, boolean absoluteFilePath)
{
ClientApi.LOGGER.info("Loading shader at "+path);
ApiShared.LOGGER.info("Loading shader at "+path);
// Create an empty shader object
id = GL32.glCreateShader(type);
StringBuilder source = loadFile(path, absoluteFilePath);
@@ -64,7 +65,7 @@ public class Shader
free(); // important!
throw new RuntimeException(message);
}
ClientApi.LOGGER.info("Shader at "+path+" loaded sucessfully.");
ApiShared.LOGGER.info("Shader at "+path+" loaded sucessfully.");
}
// REMEMBER to always free the resource!
@@ -1,5 +1,6 @@
package com.seibel.lod.core.render.objects;
import com.seibel.lod.core.api.ApiShared;
import org.lwjgl.opengl.GL43;
import com.seibel.lod.core.api.ClientApi;
@@ -63,11 +64,11 @@ public final class VertexAttributePostGL43 extends VertexAttribute {
// Requires VertexAttribute binded
public void completeAndCheck(int expectedStrideSize) {
if (strideSize != expectedStrideSize) {
ClientApi.LOGGER.error("Vertex Attribute calculated stride size " + strideSize +
ApiShared.LOGGER.error("Vertex Attribute calculated stride size " + strideSize +
" does not match the provided expected stride size " + expectedStrideSize + "!");
throw new IllegalArgumentException("Vertex Attribute Incorrect Format");
}
ClientApi.LOGGER.info("Vertex Attribute (GL43+) completed. It contains "+numberOfBindingPoints
ApiShared.LOGGER.info("Vertex Attribute (GL43+) completed. It contains "+numberOfBindingPoints
+" binding points and a stride size of "+strideSize);
}
@@ -5,6 +5,7 @@ import java.util.Iterator;
import java.util.TreeMap;
import java.util.TreeSet;
import com.seibel.lod.core.api.ApiShared;
import org.lwjgl.opengl.GL32;
import com.seibel.lod.core.api.ClientApi;
@@ -119,31 +120,31 @@ public final class VertexAttributePreGL43 extends VertexAttribute {
for (int i = 0; i < pointers.length; i++) {
VertexPointer pointer = pointers[i];
if (pointer == null) {
ClientApi.LOGGER.warn("Vertex Attribute index "+i+" is not set! No index should be skipped normally!");
ApiShared.LOGGER.warn("Vertex Attribute index "+i+" is not set! No index should be skipped normally!");
continue;
}
pointersOffset[i] = currentOffset;
currentOffset += pointer.byteSize;
}
if (currentOffset != expectedStrideSize) {
ClientApi.LOGGER.error("Vertex Attribute calculated stride size " + currentOffset +
ApiShared.LOGGER.error("Vertex Attribute calculated stride size " + currentOffset +
" does not match the provided expected stride size " + expectedStrideSize + "!");
throw new IllegalArgumentException("Vertex Attribute Incorrect Format");
}
strideSize = currentOffset;
ClientApi.LOGGER.info("Vertex Attribute (pre GL43) completed.");
ApiShared.LOGGER.info("Vertex Attribute (pre GL43) completed.");
// Debug logging
ClientApi.LOGGER.info("Vertex Attribute Debug Data:");
ClientApi.LOGGER.info("AttributeIndex: ElementCount, glType, normalized, strideSize, offset");
ApiShared.LOGGER.info("Vertex Attribute Debug Data:");
ApiShared.LOGGER.info("AttributeIndex: ElementCount, glType, normalized, strideSize, offset");
for (int i=0; i< pointers.length; i++) {
VertexPointer pointer = pointers[i];
if (pointer==null) {
ClientApi.LOGGER.warn(i + ": Null!!!!");
ApiShared.LOGGER.warn(i + ": Null!!!!");
continue;
}
ClientApi.LOGGER.info(i + ": "+pointer.elementCount+", "+
ApiShared.LOGGER.info(i + ": "+pointer.elementCount+", "+
pointer.glType+", "+pointer.normalized+", "+strideSize+", "+pointersOffset[i]);
}
@@ -74,7 +74,7 @@ public class DetailDistanceUtil
{
double maxDetailDistance = getDrawDistanceFromDetail(maxDetail-1);
if (distance > maxDetailDistance) {
//ClientApi.LOGGER.info("DEBUG: Scale as max: {}", distance);
//ApiShared.LOGGER.info("DEBUG: Scale as max: {}", distance);
return maxDetail-1;
}
@@ -23,6 +23,7 @@ import java.lang.ref.WeakReference;
import java.util.LinkedList;
import java.util.concurrent.ThreadFactory;
import com.seibel.lod.core.api.ApiShared;
import com.seibel.lod.core.api.ClientApi;
/**
@@ -73,7 +74,7 @@ public class LodThreadFactory implements ThreadFactory
if (t != null) {
StackTraceElement[] stacks = t.getStackTrace();
if (stacks.length != 0) {
ClientApi.LOGGER.info("===========================================\n"
ApiShared.LOGGER.info("===========================================\n"
+ "Thread: "+t.getName()+"\n"+StackTraceToString(stacks));
}
}
@@ -3,6 +3,7 @@ package com.seibel.lod.core.util;
import java.lang.ref.WeakReference;
import java.util.concurrent.atomic.AtomicInteger;
import com.seibel.lod.core.api.ApiShared;
import com.seibel.lod.core.api.ClientApi;
public class SpamReducedLogger {
@@ -19,22 +20,22 @@ public class SpamReducedLogger {
public void info(String str, Object... param) {
if (sectionLogCount == -1) sectionLogCount = logTries.getAndIncrement();
if (sectionLogCount >= maxLogCount) return;
ClientApi.LOGGER.info(str, param);
ApiShared.LOGGER.info(str, param);
}
public void debug(String str, Object... param) {
if (sectionLogCount == -1) sectionLogCount = logTries.getAndIncrement();
if (sectionLogCount >= maxLogCount) return;
ClientApi.LOGGER.debug(str, param);
ApiShared.LOGGER.debug(str, param);
}
public void warn(String str, Object... param) {
if (sectionLogCount == -1) sectionLogCount = logTries.getAndIncrement();
if (sectionLogCount >= maxLogCount) return;
ClientApi.LOGGER.warn(str, param);
ApiShared.LOGGER.warn(str, param);
}
public void error(String str, Object... param) {
if (sectionLogCount == -1) sectionLogCount = logTries.getAndIncrement();
if (sectionLogCount >= maxLogCount) return;
ClientApi.LOGGER.error(str, param);
ApiShared.LOGGER.error(str, param);
}
public void incLogTries() {
sectionLogCount = -1;
@@ -42,18 +43,18 @@ public class SpamReducedLogger {
public void infoInc(String str, Object... param) {
if (logTries.getAndIncrement() >= maxLogCount) return;
ClientApi.LOGGER.info(str, param);
ApiShared.LOGGER.info(str, param);
}
public void debugInc(String str, Object... param) {
if (logTries.getAndIncrement() >= maxLogCount) return;
ClientApi.LOGGER.debug(str, param);
ApiShared.LOGGER.debug(str, param);
}
public void warnInc(String str, Object... param) {
if (logTries.getAndIncrement() >= maxLogCount) return;
ClientApi.LOGGER.warn(str, param);
ApiShared.LOGGER.warn(str, param);
}
public void errorInc(String str, Object... param) {
if (logTries.getAndIncrement() >= maxLogCount) return;
ClientApi.LOGGER.error(str, param);
ApiShared.LOGGER.error(str, param);
}
}