diff --git a/core/src/main/java/com/seibel/lod/core/datatype/AbstractRenderSourceLoader.java b/core/src/main/java/com/seibel/lod/core/datatype/AbstractRenderSourceLoader.java index 8f2924fd1..2215f3eb3 100644 --- a/core/src/main/java/com/seibel/lod/core/datatype/AbstractRenderSourceLoader.java +++ b/core/src/main/java/com/seibel/lod/core/datatype/AbstractRenderSourceLoader.java @@ -10,7 +10,7 @@ import java.io.InputStream; import java.util.*; /** - * Abstract for loading and creating {@link ILodRenderSource} objects + * Abstract for loading and creating {@link IRenderSource} objects * from {@link RenderMetaDataFile}'s and {@link IFullDataSource}'s.

* * Also holds all {@link AbstractRenderSourceLoader}'s @@ -18,8 +18,8 @@ import java.util.*; */ public abstract class AbstractRenderSourceLoader { - public static final HashMultimap, AbstractRenderSourceLoader> LOADER_BY_SOURCE_TYPE = HashMultimap.create(); - public static final HashMap> SOURCE_TYPE_BY_METADATA_VERSION = new HashMap<>(); + public static final HashMultimap, AbstractRenderSourceLoader> LOADER_BY_SOURCE_TYPE = HashMultimap.create(); + public static final HashMap> SOURCE_TYPE_BY_METADATA_VERSION = new HashMap<>(); public static AbstractRenderSourceLoader getLoader(long renderTypeId, byte loaderVersion) { @@ -28,7 +28,7 @@ public abstract class AbstractRenderSourceLoader .findFirst().orElse(null); } - public static AbstractRenderSourceLoader getLoader(Class clazz, byte loaderVersion) + public static AbstractRenderSourceLoader getLoader(Class clazz, byte loaderVersion) { return LOADER_BY_SOURCE_TYPE.get(clazz).stream() .filter(l -> Arrays.binarySearch(l.loaderSupportedRenderDataVersions, loaderVersion) >= 0) @@ -37,7 +37,7 @@ public abstract class AbstractRenderSourceLoader - public final Class renderSourceClass; + public final Class renderSourceClass; public final long renderTypeId; public final byte[] loaderSupportedRenderDataVersions; public final byte detailOffset; @@ -50,7 +50,7 @@ public abstract class AbstractRenderSourceLoader * * @throws IllegalArgumentException if another render source already exists for the given renderTypeId or supported render data versions */ - public AbstractRenderSourceLoader(Class renderSourceClass, long renderTypeId, byte[] loaderSupportedRenderDataVersions, byte detailOffset) throws IllegalArgumentException + public AbstractRenderSourceLoader(Class renderSourceClass, long renderTypeId, byte[] loaderSupportedRenderDataVersions, byte detailOffset) throws IllegalArgumentException { this.renderTypeId = renderTypeId; this.loaderSupportedRenderDataVersions = loaderSupportedRenderDataVersions; @@ -99,8 +99,8 @@ public abstract class AbstractRenderSourceLoader * @throws IOException if the file uses a unsupported data version * or there was an issue reading the file */ - public abstract ILodRenderSource loadRenderSource(RenderMetaDataFile renderFile, InputStream data, IDhLevel level) throws IOException; + public abstract IRenderSource loadRenderSource(RenderMetaDataFile renderFile, InputStream data, IDhLevel level) throws IOException; /** Should not return null */ - public abstract ILodRenderSource createRenderSource(IFullDataSource dataSource, IDhClientLevel level); + public abstract IRenderSource createRenderSource(IFullDataSource dataSource, IDhClientLevel level); } diff --git a/core/src/main/java/com/seibel/lod/core/datatype/ILodRenderSource.java b/core/src/main/java/com/seibel/lod/core/datatype/IRenderSource.java similarity index 95% rename from core/src/main/java/com/seibel/lod/core/datatype/ILodRenderSource.java rename to core/src/main/java/com/seibel/lod/core/datatype/IRenderSource.java index 37b868b69..4a5660e1a 100644 --- a/core/src/main/java/com/seibel/lod/core/datatype/ILodRenderSource.java +++ b/core/src/main/java/com/seibel/lod/core/datatype/IRenderSource.java @@ -17,7 +17,7 @@ import java.util.concurrent.atomic.AtomicReference; * * These are created via {@link com.seibel.lod.core.file.renderfile.ILodRenderSourceProvider ILodRenderSourceProvider}'s */ -public interface ILodRenderSource +public interface IRenderSource { DhSectionPos getSectionPos(); @@ -50,6 +50,6 @@ public interface ILodRenderSource void fastWrite(ChunkSizedData chunkData, IDhClientLevel level); /** Overrides any data that has not been written directly using write(). Skips empty source dataPoints. */ - void updateFromRenderSource(ILodRenderSource source); + void updateFromRenderSource(IRenderSource source); } diff --git a/core/src/main/java/com/seibel/lod/core/datatype/PlaceHolderRenderSource.java b/core/src/main/java/com/seibel/lod/core/datatype/PlaceHolderRenderSource.java index 23594efbe..a4e327a6e 100644 --- a/core/src/main/java/com/seibel/lod/core/datatype/PlaceHolderRenderSource.java +++ b/core/src/main/java/com/seibel/lod/core/datatype/PlaceHolderRenderSource.java @@ -11,7 +11,7 @@ import java.io.IOException; import java.io.OutputStream; import java.util.concurrent.atomic.AtomicReference; -public class PlaceHolderRenderSource implements ILodRenderSource +public class PlaceHolderRenderSource implements IRenderSource { final DhSectionPos pos; boolean isValid = true; @@ -57,6 +57,6 @@ public class PlaceHolderRenderSource implements ILodRenderSource public void fastWrite(ChunkSizedData chunkData, IDhClientLevel level) { /* TODO */ } @Override - public void updateFromRenderSource(ILodRenderSource source) { /* TODO */ } + public void updateFromRenderSource(IRenderSource source) { /* TODO */ } } diff --git a/core/src/main/java/com/seibel/lod/core/datatype/column/ColumnRenderLoader.java b/core/src/main/java/com/seibel/lod/core/datatype/column/ColumnRenderLoader.java index 0697b6511..b3bdb9cd3 100644 --- a/core/src/main/java/com/seibel/lod/core/datatype/column/ColumnRenderLoader.java +++ b/core/src/main/java/com/seibel/lod/core/datatype/column/ColumnRenderLoader.java @@ -6,7 +6,7 @@ import com.seibel.lod.core.datatype.column.accessor.ColumnFormat; import com.seibel.lod.core.datatype.full.FullDataSource; import com.seibel.lod.core.datatype.transform.FullToColumnTransformer; import com.seibel.lod.core.level.IDhClientLevel; -import com.seibel.lod.core.datatype.ILodRenderSource; +import com.seibel.lod.core.datatype.IRenderSource; import com.seibel.lod.core.datatype.AbstractRenderSourceLoader; import com.seibel.lod.core.level.IDhLevel; import com.seibel.lod.core.file.renderfile.RenderMetaDataFile; @@ -34,7 +34,7 @@ public class ColumnRenderLoader extends AbstractRenderSourceLoader @Override - public ILodRenderSource loadRenderSource(RenderMetaDataFile dataFile, InputStream data, IDhLevel level) throws IOException + public IRenderSource loadRenderSource(RenderMetaDataFile dataFile, InputStream data, IDhLevel level) throws IOException { DataInputStream inputStream = new DataInputStream(data); // DO NOT CLOSE int dataFileVersion = dataFile.metaData.loaderVersion; @@ -49,7 +49,7 @@ public class ColumnRenderLoader extends AbstractRenderSourceLoader } @Override - public ILodRenderSource createRenderSource(IFullDataSource dataSource, IDhClientLevel level) + public IRenderSource createRenderSource(IFullDataSource dataSource, IDhClientLevel level) { if (dataSource instanceof FullDataSource) // TODO replace with Java 7 method { diff --git a/core/src/main/java/com/seibel/lod/core/datatype/column/ColumnRenderSource.java b/core/src/main/java/com/seibel/lod/core/datatype/column/ColumnRenderSource.java index d35d7470d..b95cc736d 100644 --- a/core/src/main/java/com/seibel/lod/core/datatype/column/ColumnRenderSource.java +++ b/core/src/main/java/com/seibel/lod/core/datatype/column/ColumnRenderSource.java @@ -14,7 +14,7 @@ import com.seibel.lod.core.logging.DhLoggerBuilder; import com.seibel.lod.core.level.IDhLevel; import com.seibel.lod.core.render.LodQuadTree; import com.seibel.lod.core.render.LodRenderSection; -import com.seibel.lod.core.datatype.ILodRenderSource; +import com.seibel.lod.core.datatype.IRenderSource; import com.seibel.lod.core.util.ColorUtil; import com.seibel.lod.core.util.objects.Reference; import com.seibel.lod.core.util.LodUtil; @@ -32,7 +32,7 @@ import java.util.concurrent.atomic.AtomicReference; * @author Leetom * @version 2022-2-7 */ -public class ColumnRenderSource implements ILodRenderSource, IColumnDatatype +public class ColumnRenderSource implements IRenderSource, IColumnDatatype { private static final Logger LOGGER = DhLoggerBuilder.getLogger(); @@ -248,7 +248,7 @@ public class ColumnRenderSource implements ILodRenderSource, IColumnDatatype } @Override - public void updateFromRenderSource(ILodRenderSource source) + public void updateFromRenderSource(IRenderSource source) { // TODO if we can only write this one type of data isn't it dangerous to have it in the interface? LodUtil.assertTrue(source instanceof ColumnRenderSource); diff --git a/core/src/main/java/com/seibel/lod/core/datatype/transform/DataRenderTransformer.java b/core/src/main/java/com/seibel/lod/core/datatype/transform/DataRenderTransformer.java index a3cf92f00..bcbfb15c7 100644 --- a/core/src/main/java/com/seibel/lod/core/datatype/transform/DataRenderTransformer.java +++ b/core/src/main/java/com/seibel/lod/core/datatype/transform/DataRenderTransformer.java @@ -1,7 +1,7 @@ package com.seibel.lod.core.datatype.transform; import com.seibel.lod.core.datatype.IFullDataSource; -import com.seibel.lod.core.datatype.ILodRenderSource; +import com.seibel.lod.core.datatype.IRenderSource; import com.seibel.lod.core.datatype.column.ColumnRenderLoader; import com.seibel.lod.core.datatype.column.ColumnRenderSource; import com.seibel.lod.core.level.IDhClientLevel; @@ -16,17 +16,17 @@ public class DataRenderTransformer public static final ExecutorService TRANSFORMER_THREADS = LodUtil.makeThreadPool(4, "Data/Render Transformer"); - public static CompletableFuture transformDataSource(IFullDataSource data, IDhClientLevel level) + public static CompletableFuture transformDataSource(IFullDataSource data, IDhClientLevel level) { return CompletableFuture.supplyAsync(() -> transform(data, level), TRANSFORMER_THREADS); } - public static CompletableFuture asyncTransformDataSource(CompletableFuture data, IDhClientLevel level) + public static CompletableFuture asyncTransformDataSource(CompletableFuture data, IDhClientLevel level) { return data.thenApplyAsync((d) -> transform(d, level), TRANSFORMER_THREADS); } - private static ILodRenderSource transform(IFullDataSource dataSource, IDhClientLevel level) + private static IRenderSource transform(IFullDataSource dataSource, IDhClientLevel level) { if (dataSource == null) { diff --git a/core/src/main/java/com/seibel/lod/core/datatype/transform/FullToColumnTransformer.java b/core/src/main/java/com/seibel/lod/core/datatype/transform/FullToColumnTransformer.java index 75f0a88d1..830076118 100644 --- a/core/src/main/java/com/seibel/lod/core/datatype/transform/FullToColumnTransformer.java +++ b/core/src/main/java/com/seibel/lod/core/datatype/transform/FullToColumnTransformer.java @@ -1,7 +1,7 @@ package com.seibel.lod.core.datatype.transform; import com.seibel.lod.core.datatype.IIncompleteFullDataSource; -import com.seibel.lod.core.datatype.ILodRenderSource; +import com.seibel.lod.core.datatype.IRenderSource; import com.seibel.lod.core.datatype.column.accessor.ColumnFormat; import com.seibel.lod.core.datatype.column.ColumnRenderSource; import com.seibel.lod.core.datatype.column.accessor.ColumnArrayView; @@ -66,7 +66,7 @@ public class FullToColumnTransformer { return columnSource; } - public static ILodRenderSource transformIncompleteDataToColumnData(IDhClientLevel level, IIncompleteFullDataSource data) { + public static IRenderSource transformIncompleteDataToColumnData(IDhClientLevel level, IIncompleteFullDataSource data) { final DhSectionPos pos = data.getSectionPos(); final byte dataDetail = data.getDataDetail(); final int vertSize = Config.Client.Graphics.Quality.verticalQuality.get().calculateMaxVerticalData(data.getDataDetail()); diff --git a/core/src/main/java/com/seibel/lod/core/file/fullDatafile/FullDataMetaFile.java b/core/src/main/java/com/seibel/lod/core/file/fullDatafile/FullDataMetaFile.java index b66a75979..b45e50610 100644 --- a/core/src/main/java/com/seibel/lod/core/file/fullDatafile/FullDataMetaFile.java +++ b/core/src/main/java/com/seibel/lod/core/file/fullDatafile/FullDataMetaFile.java @@ -117,15 +117,19 @@ public class FullDataMetaFile extends AbstractMetaDataFile return (this.metaData == null) ? 0 : this.metaData.dataVersion.get(); } - public boolean isCacheVersionValid(long cacheVersion) { + public boolean isCacheVersionValid(long cacheVersion) + { debugCheck(); - boolean noWrite = writeQueue.get().queue.isEmpty(); - if (!noWrite) { + boolean noWrite = this.writeQueue.get().queue.isEmpty(); + if (!noWrite) + { return false; - } else { - MetaData getData = metaData; - //NOTE: Do this instead of direct compare so values that wrapped around still works correctly. - return (getData == null ? 0 : metaData.dataVersion.get()) - cacheVersion <= 0; + } + else + { + MetaData getData = this.metaData; + //NOTE: Do this instead of direct compare so values that wrapped around still work correctly. + return (getData == null ? 0 : this.metaData.dataVersion.get()) - cacheVersion <= 0; } } @@ -354,31 +358,31 @@ public class FullDataMetaFile extends AbstractMetaDataFile } } } - + // Return whether any write has happened to the data private boolean applyWriteQueue(IFullDataSource data) { // Poll the write queue // First check if write queue is empty, then swap the write queue. // Must be done in this order to ensure isMemoryAddressValid work properly. See isMemoryAddressValid() for details. - boolean isEmpty = writeQueue.get().queue.isEmpty(); + boolean isEmpty = this.writeQueue.get().queue.isEmpty(); if (!isEmpty) { - swapWriteQueue(); - int count = _backQueue.queue.size(); - for (ChunkSizedData chunk : _backQueue.queue) + this.swapWriteQueue(); + int count = this._backQueue.queue.size(); + for (ChunkSizedData chunk : this._backQueue.queue) { data.update(chunk); } - _backQueue.queue.clear(); - LOGGER.info("Updated Data file at {} for sect {} with {} chunk writes.", path, pos, count); + this._backQueue.queue.clear(); + //LOGGER.info("Updated Data file at {} for sect {} with {} chunk writes.", path, pos, count); } return !isEmpty; } - + private FileInputStream getDataContent() throws IOException { - FileInputStream fin = new FileInputStream(path); + FileInputStream fin = new FileInputStream(this.path); int toSkip = METADATA_SIZE; while (toSkip > 0) { diff --git a/core/src/main/java/com/seibel/lod/core/file/renderfile/ILodRenderSourceProvider.java b/core/src/main/java/com/seibel/lod/core/file/renderfile/ILodRenderSourceProvider.java index eee6316c9..17940fd9b 100644 --- a/core/src/main/java/com/seibel/lod/core/file/renderfile/ILodRenderSourceProvider.java +++ b/core/src/main/java/com/seibel/lod/core/file/renderfile/ILodRenderSourceProvider.java @@ -1,6 +1,6 @@ package com.seibel.lod.core.file.renderfile; -import com.seibel.lod.core.datatype.ILodRenderSource; +import com.seibel.lod.core.datatype.IRenderSource; import com.seibel.lod.core.datatype.full.ChunkSizedData; import com.seibel.lod.core.pos.DhSectionPos; @@ -12,17 +12,17 @@ import java.util.concurrent.CompletableFuture; * This represents LOD data that is stored in long term storage (IE LOD files stored on the hard drive)
* Example: {@link RenderFileHandler RenderFileHandler}

* - * This is used to create {@link ILodRenderSource}'s + * This is used to create {@link IRenderSource}'s */ public interface ILodRenderSourceProvider extends AutoCloseable { - CompletableFuture read(DhSectionPos pos); + CompletableFuture read(DhSectionPos pos); void addScannedFile(Collection detectedFiles); void write(DhSectionPos sectionPos, ChunkSizedData chunkData); CompletableFuture flushAndSave(); /** Returns true if the data was refreshed, false otherwise */ - boolean refreshRenderSource(ILodRenderSource source); + boolean refreshRenderSource(IRenderSource source); /** Deletes any data stored in the render cache so it can be re-created */ void deleteRenderCache(); diff --git a/core/src/main/java/com/seibel/lod/core/file/renderfile/RenderFileHandler.java b/core/src/main/java/com/seibel/lod/core/file/renderfile/RenderFileHandler.java index 5204cec0d..45dc43bc5 100644 --- a/core/src/main/java/com/seibel/lod/core/file/renderfile/RenderFileHandler.java +++ b/core/src/main/java/com/seibel/lod/core/file/renderfile/RenderFileHandler.java @@ -3,7 +3,7 @@ package com.seibel.lod.core.file.renderfile; import com.google.common.collect.HashMultimap; import com.seibel.lod.core.datatype.IFullDataSource; import com.seibel.lod.core.datatype.PlaceHolderRenderSource; -import com.seibel.lod.core.datatype.ILodRenderSource; +import com.seibel.lod.core.datatype.IRenderSource; import com.seibel.lod.core.datatype.AbstractRenderSourceLoader; import com.seibel.lod.core.datatype.column.ColumnRenderSource; import com.seibel.lod.core.datatype.full.ChunkSizedData; @@ -35,7 +35,7 @@ public class RenderFileHandler implements ILodRenderSourceProvider private final IDhClientLevel level; private final File saveDir; - private final IFullDataSourceProvider dataSourceProvider; + private final IFullDataSourceProvider fullDataSourceProvider; private final ConcurrentHashMap cacheUpdateLockBySectionPos = new ConcurrentHashMap<>(); @@ -44,7 +44,7 @@ public class RenderFileHandler implements ILodRenderSourceProvider public RenderFileHandler(IFullDataSourceProvider sourceProvider, IDhClientLevel level, File saveRootDir) { - this.dataSourceProvider = sourceProvider; + this.fullDataSourceProvider = sourceProvider; this.level = level; this.saveDir = saveRootDir; } @@ -154,7 +154,7 @@ public class RenderFileHandler implements ILodRenderSourceProvider /** This call is concurrent. I.e. it supports multiple threads calling this method at the same time. */ @Override - public CompletableFuture read(DhSectionPos pos) + public CompletableFuture read(DhSectionPos pos) { RenderMetaDataFile metaFile = this.filesBySectionPos.get(pos); if (metaFile == null) @@ -201,7 +201,7 @@ public class RenderFileHandler implements ILodRenderSourceProvider } this.writeRecursively(sectionPos,chunkData); - this.dataSourceProvider.write(sectionPos, chunkData); + this.fullDataSourceProvider.write(sectionPos, chunkData); } private void writeRecursively(DhSectionPos sectPos, ChunkSizedData chunkData) @@ -262,7 +262,7 @@ public class RenderFileHandler implements ILodRenderSourceProvider return new File(this.saveDir, pos.serialize() + ".lod"); } - public CompletableFuture onCreateRenderFile(RenderMetaDataFile file) + public CompletableFuture onCreateRenderFile(RenderMetaDataFile file) { final int vertSize = Config.Client.Graphics.Quality.verticalQuality .get().calculateMaxVerticalData((byte) (file.pos.sectionDetailLevel - ColumnRenderSource.SECTION_SIZE_OFFSET)); @@ -271,18 +271,18 @@ public class RenderFileHandler implements ILodRenderSourceProvider new ColumnRenderSource(file.pos, vertSize, this.level.getMinY())); } - private void updateCache(ILodRenderSource data, RenderMetaDataFile file) + private void updateCache(IRenderSource data, RenderMetaDataFile file) { if (this.cacheUpdateLockBySectionPos.putIfAbsent(file.pos, new Object()) != null) { return; } - final WeakReference dataRef = new WeakReference<>(data); - CompletableFuture fullDataSourceFuture = this.dataSourceProvider.read(data.getSectionPos()); + final WeakReference renderSourceReference = new WeakReference<>(data); + CompletableFuture fullDataSourceFuture = this.fullDataSourceProvider.read(data.getSectionPos()); fullDataSourceFuture = fullDataSourceFuture.thenApply((dataSource) -> { - if (dataRef.get() == null) + if (renderSourceReference.get() == null) { throw new UncheckedInterruptedException(); } @@ -294,9 +294,9 @@ public class RenderFileHandler implements ILodRenderSourceProvider return null; }); - LOGGER.info("Recreating cache for {}", data.getSectionPos()); + //LOGGER.info("Recreating cache for {}", data.getSectionPos()); DataRenderTransformer.asyncTransformDataSource(fullDataSourceFuture, this.level) - .thenAccept((newRenderDataSource) -> this.write(dataRef.get(), file, newRenderDataSource, this.dataSourceProvider.getCacheVersion(data.getSectionPos()))) + .thenAccept((newRenderDataSource) -> this.write(renderSourceReference.get(), file, newRenderDataSource, this.fullDataSourceProvider.getCacheVersion(data.getSectionPos()))) .exceptionally((ex) -> { if (!UncheckedInterruptedException.isThrowableInterruption(ex)) @@ -307,19 +307,19 @@ public class RenderFileHandler implements ILodRenderSourceProvider }).thenRun(() -> this.cacheUpdateLockBySectionPos.remove(file.pos)); } - public ILodRenderSource onRenderFileLoaded(ILodRenderSource data, RenderMetaDataFile file) + public IRenderSource onRenderFileLoaded(IRenderSource data, RenderMetaDataFile file) { - if (!this.dataSourceProvider.isCacheVersionValid(file.pos, file.metaData.dataVersion.get())) + if (!this.fullDataSourceProvider.isCacheVersionValid(file.pos, file.metaData.dataVersion.get())) { this.updateCache(data, file); } return data; } - public ILodRenderSource onLoadingRenderFile(RenderMetaDataFile file) { return null; /* Default behavior: do nothing */ } + public IRenderSource onLoadingRenderFile(RenderMetaDataFile file) { return null; /* Default behavior: do nothing */ } - private void write(ILodRenderSource target, RenderMetaDataFile file, - ILodRenderSource newData, long newDataVersion) + private void write(IRenderSource target, RenderMetaDataFile file, + IRenderSource newData, long newDataVersion) { if (target == null || newData == null) { @@ -336,15 +336,15 @@ public class RenderFileHandler implements ILodRenderSourceProvider file.save(target, this.level); } - public void onReadRenderSourceFromCache(RenderMetaDataFile file, ILodRenderSource data) + public void onReadRenderSourceFromCache(RenderMetaDataFile file, IRenderSource data) { - if (!this.dataSourceProvider.isCacheVersionValid(file.pos, file.metaData.dataVersion.get())) + if (!this.fullDataSourceProvider.isCacheVersionValid(file.pos, file.metaData.dataVersion.get())) { this.updateCache(data, file); } } - public boolean refreshRenderSource(ILodRenderSource source) + public boolean refreshRenderSource(IRenderSource source) { RenderMetaDataFile file = this.filesBySectionPos.get(source.getSectionPos()); if (source instanceof PlaceHolderRenderSource) @@ -357,7 +357,7 @@ public class RenderFileHandler implements ILodRenderSourceProvider LodUtil.assertTrue(file != null); LodUtil.assertTrue(file.metaData != null); - if (!this.dataSourceProvider.isCacheVersionValid(file.pos, file.metaData.dataVersion.get())) + if (!this.fullDataSourceProvider.isCacheVersionValid(file.pos, file.metaData.dataVersion.get())) { this.updateCache(source, file); return true; diff --git a/core/src/main/java/com/seibel/lod/core/file/renderfile/RenderMetaDataFile.java b/core/src/main/java/com/seibel/lod/core/file/renderfile/RenderMetaDataFile.java index b6cf788a3..c2454afb3 100644 --- a/core/src/main/java/com/seibel/lod/core/file/renderfile/RenderMetaDataFile.java +++ b/core/src/main/java/com/seibel/lod/core/file/renderfile/RenderMetaDataFile.java @@ -1,6 +1,6 @@ package com.seibel.lod.core.file.renderfile; -import com.seibel.lod.core.datatype.ILodRenderSource; +import com.seibel.lod.core.datatype.IRenderSource; import com.seibel.lod.core.datatype.AbstractRenderSourceLoader; import com.seibel.lod.core.datatype.full.ChunkSizedData; import com.seibel.lod.core.file.metaData.MetaData; @@ -25,7 +25,7 @@ public class RenderMetaDataFile extends AbstractMetaDataFile private static final Logger LOGGER = DhLoggerBuilder.getLogger(); public AbstractRenderSourceLoader loader; - public Class dataType; + public Class dataType; // The '?' type should either be: // SoftReference, or - File that may still be loaded @@ -84,7 +84,7 @@ public class RenderMetaDataFile extends AbstractMetaDataFile DhLodPos chunkPos = new DhLodPos((byte) (chunkData.dataDetail + 4), chunkData.x, chunkData.z); LodUtil.assertTrue(this.pos.getSectionBBoxPos().overlaps(chunkPos), "Chunk pos {} doesn't overlap with section {}", chunkPos, pos); - CompletableFuture source = this._readCached(this.data.get()); + CompletableFuture source = this._readCached(this.data.get()); if (source == null) { return; @@ -100,7 +100,7 @@ public class RenderMetaDataFile extends AbstractMetaDataFile return CompletableFuture.completedFuture(null); // No need to save if the file doesn't exist. } - CompletableFuture source = this._readCached(this.data.get()); + CompletableFuture source = this._readCached(this.data.get()); if (source == null) { return CompletableFuture.completedFuture(null); // If there is no cached data, there is no need to save. @@ -111,7 +111,7 @@ public class RenderMetaDataFile extends AbstractMetaDataFile // Suppress casting of CompletableFuture to CompletableFuture @SuppressWarnings("unchecked") - private CompletableFuture _readCached(Object obj) + private CompletableFuture _readCached(Object obj) { // Has file cached in RAM and not freed yet. if ((obj instanceof SoftReference)) @@ -119,9 +119,9 @@ public class RenderMetaDataFile extends AbstractMetaDataFile Object inner = ((SoftReference) obj).get(); if (inner != null) { - LodUtil.assertTrue(inner instanceof ILodRenderSource); - fileHandler.onReadRenderSourceFromCache(this, (ILodRenderSource) inner); - return CompletableFuture.completedFuture((ILodRenderSource) inner); + LodUtil.assertTrue(inner instanceof IRenderSource); + fileHandler.onReadRenderSourceFromCache(this, (IRenderSource) inner); + return CompletableFuture.completedFuture((IRenderSource) inner); } } @@ -129,18 +129,18 @@ public class RenderMetaDataFile extends AbstractMetaDataFile // Someone is already trying to complete it. so just return the obj. if ((obj instanceof CompletableFuture)) { - return (CompletableFuture) obj; + return (CompletableFuture) obj; } return null; } // Cause: Generic Type runtime casting cannot safety check it. // However, the Union type ensures the 'data' should only contain the listed type. - public CompletableFuture loadOrGetCached(Executor fileReaderThreads, IDhLevel level) + public CompletableFuture loadOrGetCached(Executor fileReaderThreads, IDhLevel level) { Object obj = this.data.get(); - CompletableFuture cached = this._readCached(obj); + CompletableFuture cached = this._readCached(obj); if (cached != null) { return cached; @@ -149,7 +149,7 @@ public class RenderMetaDataFile extends AbstractMetaDataFile // Create an empty and non-completed future. // Note: I do this before actually filling in the future so that I can ensure only // one task is submitted to the thread pool. - CompletableFuture future = new CompletableFuture<>(); + CompletableFuture future = new CompletableFuture<>(); // Would use faster and non-nesting Compare and exchange. But java 8 doesn't have it! :( boolean worked = this.data.compareAndSet(obj, future); @@ -197,7 +197,7 @@ public class RenderMetaDataFile extends AbstractMetaDataFile } // Load the file. - ILodRenderSource data; + IRenderSource data; data = this.fileHandler.onLoadingRenderFile(this); if (data == null) { @@ -231,7 +231,7 @@ public class RenderMetaDataFile extends AbstractMetaDataFile return future; } - private static MetaData makeMetaData(ILodRenderSource data) + private static MetaData makeMetaData(IRenderSource data) { AbstractRenderSourceLoader loader = AbstractRenderSourceLoader.getLoader(data.getClass(), data.getRenderVersion()); return new MetaData(data.getSectionPos(), -1, -1, @@ -258,7 +258,7 @@ public class RenderMetaDataFile extends AbstractMetaDataFile return fin; } - public void save(ILodRenderSource data, IDhClientLevel level) + public void save(IRenderSource data, IDhClientLevel level) { if (data.isEmpty()) { @@ -273,7 +273,7 @@ public class RenderMetaDataFile extends AbstractMetaDataFile } else { - LOGGER.info("Saving updated render file v[{}] at sect {}", this.metaData.dataVersion.get(), this.pos); + //LOGGER.info("Saving updated render file v[{}] at sect {}", this.metaData.dataVersion.get(), this.pos); try { super.writeData((out) -> data.saveRender(level, this, out)); diff --git a/core/src/main/java/com/seibel/lod/core/level/DhClientLevel.java b/core/src/main/java/com/seibel/lod/core/level/DhClientLevel.java index 28fa79948..1d3cfd66b 100644 --- a/core/src/main/java/com/seibel/lod/core/level/DhClientLevel.java +++ b/core/src/main/java/com/seibel/lod/core/level/DhClientLevel.java @@ -50,7 +50,7 @@ public class DhClientLevel implements IDhClientLevel MC_CLIENT.getPlayerBlockPos().x, MC_CLIENT.getPlayerBlockPos().z, this.renderFileHandler); this.renderBufferHandler = new RenderBufferHandler(this.tree); this.level = level; - FileScanUtil.scanFile(save, level, this.dataFileHandler, this.renderFileHandler); + FileScanUtil.scanFiles(save, level, this.dataFileHandler, this.renderFileHandler); LOGGER.info("Started DHLevel for {} with saves at {}", level, save); } diff --git a/core/src/main/java/com/seibel/lod/core/level/DhClientServerLevel.java b/core/src/main/java/com/seibel/lod/core/level/DhClientServerLevel.java index 69ffad2e2..be4aa2588 100644 --- a/core/src/main/java/com/seibel/lod/core/level/DhClientServerLevel.java +++ b/core/src/main/java/com/seibel/lod/core/level/DhClientServerLevel.java @@ -64,7 +64,7 @@ public class DhClientServerLevel implements IDhClientLevel, IDhServerLevel save.getDataFolder(level).mkdirs(); save.getRenderCacheFolder(level).mkdirs(); this.dataFileHandler = new GeneratedFullDataFileHandler(this, save.getDataFolder(level)); - FileScanUtil.scanFile(save, this.serverLevel, this.dataFileHandler, null); + FileScanUtil.scanFiles(save, this.serverLevel, this.dataFileHandler, null); LOGGER.info("Started DHLevel for {} with saves at {}", level, save); this.f3Msg = new F3Screen.NestedMessage(this::f3Log); this.chunkToLodBuilder = new ChunkToLodBuilder(); @@ -375,7 +375,7 @@ public class DhClientServerLevel implements IDhClientLevel, IDhServerLevel this.tree = new LodQuadTree(DhClientServerLevel.this, Config.Client.Graphics.Quality.lodChunkRenderDistance.get() * 16, MC_CLIENT.getPlayerBlockPos().x, MC_CLIENT.getPlayerBlockPos().z, this.renderFileHandler); this.renderBufferHandler = new RenderBufferHandler(this.tree); - FileScanUtil.scanFile(thisParent.save, thisParent.serverLevel, null, this.renderFileHandler); + FileScanUtil.scanFiles(thisParent.save, thisParent.serverLevel, null, this.renderFileHandler); this.renderer = new LodRenderer(this.renderBufferHandler); } diff --git a/core/src/main/java/com/seibel/lod/core/level/DhServerLevel.java b/core/src/main/java/com/seibel/lod/core/level/DhServerLevel.java index 57dcfc098..36026a340 100644 --- a/core/src/main/java/com/seibel/lod/core/level/DhServerLevel.java +++ b/core/src/main/java/com/seibel/lod/core/level/DhServerLevel.java @@ -26,7 +26,7 @@ public class DhServerLevel implements IDhServerLevel this.level = level; save.getDataFolder(level).mkdirs(); this.dataFileHandler = new FullDataFileHandler(this, save.getDataFolder(level)); //FIXME: GenerationQueue - FileScanUtil.scanFile(save, level, this.dataFileHandler, null); + FileScanUtil.scanFiles(save, level, this.dataFileHandler, null); LOGGER.info("Started DHLevel for {} with saves at {}", level, save); } diff --git a/core/src/main/java/com/seibel/lod/core/render/LodRenderSection.java b/core/src/main/java/com/seibel/lod/core/render/LodRenderSection.java index dad8e15fd..0cddf13b9 100644 --- a/core/src/main/java/com/seibel/lod/core/render/LodRenderSection.java +++ b/core/src/main/java/com/seibel/lod/core/render/LodRenderSection.java @@ -1,11 +1,9 @@ package com.seibel.lod.core.render; -import com.seibel.lod.api.enums.config.EVerticalQuality; -import com.seibel.lod.core.config.Config; import com.seibel.lod.core.level.IDhClientLevel; import com.seibel.lod.core.logging.DhLoggerBuilder; import com.seibel.lod.core.pos.DhSectionPos; -import com.seibel.lod.core.datatype.ILodRenderSource; +import com.seibel.lod.core.datatype.IRenderSource; import com.seibel.lod.core.file.renderfile.ILodRenderSourceProvider; import org.apache.logging.log4j.Logger; @@ -25,11 +23,11 @@ public class LodRenderSection // (Should always be 4 after tick() is done, or 0 only if this is an unloaded node) public byte childCount = 0; - private CompletableFuture loadFuture; + private CompletableFuture loadFuture; private boolean isRenderEnabled = false; // TODO: Should I provide a way to change the render source? - private ILodRenderSource renderSource; + private IRenderSource renderSource; private ILodRenderSourceProvider renderSourceProvider = null; @@ -154,7 +152,7 @@ public class LodRenderSection public boolean isOutdated() { return this.renderSource != null && !this.renderSource.isValid(); } - public ILodRenderSource getRenderSource() { return this.renderSource; } + public IRenderSource getRenderSource() { return this.renderSource; } diff --git a/core/src/main/java/com/seibel/lod/core/render/RenderBufferHandler.java b/core/src/main/java/com/seibel/lod/core/render/RenderBufferHandler.java index f7bb3620e..53b1b7cbb 100644 --- a/core/src/main/java/com/seibel/lod/core/render/RenderBufferHandler.java +++ b/core/src/main/java/com/seibel/lod/core/render/RenderBufferHandler.java @@ -1,6 +1,6 @@ package com.seibel.lod.core.render; -import com.seibel.lod.core.datatype.ILodRenderSource; +import com.seibel.lod.core.datatype.IRenderSource; import com.seibel.lod.core.enums.ELodDirection; import com.seibel.lod.core.pos.Pos2D; import com.seibel.lod.core.pos.DhSectionPos; @@ -132,7 +132,7 @@ public class RenderBufferHandler { // If this fails, there may be concurrent modification of the quad tree // (as this update() should be called from the same thread that calls update() on the quad tree) LodUtil.assertTrue(section != null); - ILodRenderSource container = section.getRenderSource(); + IRenderSource container = section.getRenderSource(); // Update self's render buffer state boolean shouldRender = section.canRender(); diff --git a/core/src/main/java/com/seibel/lod/core/util/FileScanUtil.java b/core/src/main/java/com/seibel/lod/core/util/FileScanUtil.java index f8a4b2583..94f7ba357 100644 --- a/core/src/main/java/com/seibel/lod/core/util/FileScanUtil.java +++ b/core/src/main/java/com/seibel/lod/core/util/FileScanUtil.java @@ -14,32 +14,45 @@ import java.util.stream.Collectors; import java.util.stream.Stream; // Static util class?? -public class FileScanUtil { +public class FileScanUtil +{ private static final Logger LOGGER = DhLoggerBuilder.getLogger(); public static final int MAX_SCAN_DEPTH = 5; public static final String LOD_FILE_POSTFIX = ".lod"; - public static void scanFile(AbstractSaveStructure save, ILevelWrapper level, - @Nullable IFullDataSourceProvider dataSource, - @Nullable ILodRenderSourceProvider renderSource) { - if (dataSource != null) { - try (Stream pathStream = Files.walk(save.getDataFolder(level).toPath(), MAX_SCAN_DEPTH)) { - dataSource.addScannedFile(pathStream.filter( - path -> path.toFile().getName().endsWith(LOD_FILE_POSTFIX) && path.toFile().isFile() - ).map(Path::toFile).collect(Collectors.toList()) - ); - } catch (Exception e) { - LOGGER.error("Failed to scan and collect data files for {} in {}", level, save, e); - } - } - if (renderSource != null) { - try (Stream pathStream = Files.walk(save.getRenderCacheFolder(level).toPath(), MAX_SCAN_DEPTH)) { - renderSource.addScannedFile(pathStream.filter(( - path -> path.toFile().getName().endsWith(LOD_FILE_POSTFIX) && path.toFile().isFile()) - ).map(Path::toFile).collect(Collectors.toList()) - ); - } catch (Exception e) { - LOGGER.error("Failed to scan and collect data files for {} in {}", level, save, e); - } - } - } + + public static void scanFiles(AbstractSaveStructure saveStructure, ILevelWrapper levelWrapper, + @Nullable IFullDataSourceProvider dataSourceProvider, + @Nullable ILodRenderSourceProvider renderSourceProvider) + { + if (dataSourceProvider != null) + { + try (Stream pathStream = Files.walk(saveStructure.getDataFolder(levelWrapper).toPath(), MAX_SCAN_DEPTH)) + { + dataSourceProvider.addScannedFile(pathStream.filter( + path -> path.toFile().getName().endsWith(LOD_FILE_POSTFIX) && path.toFile().isFile() + ).map(Path::toFile).collect(Collectors.toList()) + ); + } + catch (Exception e) + { + LOGGER.error("Failed to scan and collect data files for {} in {}", levelWrapper, saveStructure, e); + } + } + + if (renderSourceProvider != null) + { + try (Stream pathStream = Files.walk(saveStructure.getRenderCacheFolder(levelWrapper).toPath(), MAX_SCAN_DEPTH)) + { + renderSourceProvider.addScannedFile(pathStream.filter(( + path -> path.toFile().getName().endsWith(LOD_FILE_POSTFIX) && path.toFile().isFile()) + ).map(Path::toFile).collect(Collectors.toList()) + ); + } + catch (Exception e) + { + LOGGER.error("Failed to scan and collect data files for {} in {}", levelWrapper, saveStructure, e); + } + } + } + }