diff --git a/core/src/main/java/com/seibel/lod/core/datatype/DataSourceLoader.java b/core/src/main/java/com/seibel/lod/core/datatype/DataSourceLoader.java index 9de87796b..fdf3a3fdb 100644 --- a/core/src/main/java/com/seibel/lod/core/datatype/DataSourceLoader.java +++ b/core/src/main/java/com/seibel/lod/core/datatype/DataSourceLoader.java @@ -8,51 +8,61 @@ import java.io.IOException; import java.io.InputStream; import java.util.*; -public abstract class DataSourceLoader { - - public static final HashMultimap, DataSourceLoader> loaderRegistry = HashMultimap.create(); - public final Class clazz; - public static final HashMap> datatypeIdRegistry = new HashMap<>(); - public static DataSourceLoader getLoader(long dataTypeId, byte dataVersion) { - return loaderRegistry.get(datatypeIdRegistry.get(dataTypeId)).stream() - .filter(l -> Arrays.binarySearch(l.loaderSupportedVersions, dataVersion) >= 0) - .findFirst().orElse(null); - } - public static DataSourceLoader getLoader(Class clazz, byte dataVersion) { - return loaderRegistry.get(clazz).stream() - .filter(l -> Arrays.binarySearch(l.loaderSupportedVersions, dataVersion) >= 0) - .findFirst().orElse(null); - } - - public final long datatypeId; - public final byte[] loaderSupportedVersions; - - public DataSourceLoader(Class clazz, long datatypeId, byte[] loaderSupportedVersions) { - this.datatypeId = datatypeId; - this.loaderSupportedVersions = loaderSupportedVersions; - Arrays.sort(loaderSupportedVersions); // sort to allow fast access - this.clazz = clazz; - if (datatypeIdRegistry.containsKey(datatypeId) && datatypeIdRegistry.get(datatypeId) != clazz) { - throw new IllegalArgumentException("Loader for datatypeId " + datatypeId + " already registered with different class: " - + datatypeIdRegistry.get(datatypeId) + " != " + clazz); - } - Set loaders = loaderRegistry.get(clazz); - if (loaders.stream().anyMatch(other -> { - // see if any loaderSupportsVersion conflicts with this one - for (byte otherVer : other.loaderSupportedVersions) { - if (Arrays.binarySearch(loaderSupportedVersions, otherVer) >= 0) return true; - } - return false; - })) { - throw new IllegalArgumentException("Loader for class " + clazz + " that supports one of the version in " - + Arrays.toString(loaderSupportedVersions) + " already registered!"); - } - datatypeIdRegistry.put(datatypeId, clazz); - loaderRegistry.put(clazz, this); - } - - // Can return null as meaning the requirement is not met - public abstract LodDataSource loadData(DataMetaFile dataFile, InputStream data, IDhLevel level) throws IOException; - - +public abstract class DataSourceLoader +{ + + public static final HashMultimap, DataSourceLoader> loaderRegistry = HashMultimap.create(); + public final Class clazz; + public static final HashMap> datatypeIdRegistry = new HashMap<>(); + + public static DataSourceLoader getLoader(long dataTypeId, byte dataVersion) + { + return loaderRegistry.get(datatypeIdRegistry.get(dataTypeId)).stream() + .filter(l -> Arrays.binarySearch(l.loaderSupportedVersions, dataVersion) >= 0) + .findFirst().orElse(null); + } + + public static DataSourceLoader getLoader(Class clazz, byte dataVersion) + { + return loaderRegistry.get(clazz).stream() + .filter(l -> Arrays.binarySearch(l.loaderSupportedVersions, dataVersion) >= 0) + .findFirst().orElse(null); + } + + public final long datatypeId; + public final byte[] loaderSupportedVersions; + + public DataSourceLoader(Class clazz, long datatypeId, byte[] loaderSupportedVersions) + { + this.datatypeId = datatypeId; + this.loaderSupportedVersions = loaderSupportedVersions; + Arrays.sort(loaderSupportedVersions); // sort to allow fast access + this.clazz = clazz; + if (datatypeIdRegistry.containsKey(datatypeId) && datatypeIdRegistry.get(datatypeId) != clazz) + { + throw new IllegalArgumentException("Loader for datatypeId " + datatypeId + " already registered with different class: " + + datatypeIdRegistry.get(datatypeId) + " != " + clazz); + } + Set loaders = loaderRegistry.get(clazz); + if (loaders.stream().anyMatch(other -> { + // see if any loaderSupportsVersion conflicts with this one + for (byte otherVer : other.loaderSupportedVersions) + { + if (Arrays.binarySearch(loaderSupportedVersions, otherVer) >= 0) + return true; + } + return false; + })) + { + throw new IllegalArgumentException("Loader for class " + clazz + " that supports one of the version in " + + Arrays.toString(loaderSupportedVersions) + " already registered!"); + } + datatypeIdRegistry.put(datatypeId, clazz); + loaderRegistry.put(clazz, this); + } + + // Can return null as meaning the requirement is not met + public abstract LodDataSource loadData(DataMetaFile dataFile, InputStream data, IDhLevel level) throws IOException; + + } diff --git a/core/src/main/java/com/seibel/lod/core/datatype/LodDataSource.java b/core/src/main/java/com/seibel/lod/core/datatype/LodDataSource.java index 4be5b6dd7..eb9795344 100644 --- a/core/src/main/java/com/seibel/lod/core/datatype/LodDataSource.java +++ b/core/src/main/java/com/seibel/lod/core/datatype/LodDataSource.java @@ -8,15 +8,18 @@ import com.seibel.lod.core.file.datafile.DataMetaFile; import java.io.IOException; import java.io.OutputStream; -public interface LodDataSource { - DhSectionPos getSectionPos(); - byte getDataDetail(); - byte getDataVersion(); - - void update(ChunkSizedData data); - - boolean isEmpty(); - - // Saving related - void saveData(IDhLevel level, DataMetaFile file, OutputStream dataStream) throws IOException; +public interface LodDataSource +{ + DhSectionPos getSectionPos(); + + byte getDataDetail(); + + byte getDataVersion(); + + void update(ChunkSizedData data); + + boolean isEmpty(); + + // Saving related + void saveData(IDhLevel level, DataMetaFile file, OutputStream dataStream) throws IOException; } diff --git a/core/src/main/java/com/seibel/lod/core/datatype/LodRenderSource.java b/core/src/main/java/com/seibel/lod/core/datatype/LodRenderSource.java index 2fb5b5130..3ffbed1e8 100644 --- a/core/src/main/java/com/seibel/lod/core/datatype/LodRenderSource.java +++ b/core/src/main/java/com/seibel/lod/core/datatype/LodRenderSource.java @@ -11,35 +11,38 @@ import java.io.IOException; import java.io.OutputStream; import java.util.concurrent.atomic.AtomicReference; -public interface LodRenderSource { - DhSectionPos getSectionPos(); - byte getDataDetail(); - - void enableRender(IDhClientLevel level, LodQuadTree quadTree); - void disableRender(); - void dispose(); // notify the container that the parent lodSection is now disposed (can be in loaded or unloaded state) - - - /** - * Try and swap in new render buffer for this section. Note that before this call, there should be no other - * places storing or referencing the render buffer. - * @param referenceSlot The slot for swapping in the new buffer. - * @return True if the swap was successful. False if swap is not needed or if it is in progress. - */ - boolean trySwapRenderBuffer(LodQuadTree quadTree, AtomicReference referenceSlot); - - void saveRender(IDhClientLevel level, RenderMetaFile file, OutputStream dataStream) throws IOException; - - byte getRenderVersion(); - - /** - * Whether this object is still valid. If not, a new one should be created. - */ - boolean isValid(); - - boolean isEmpty(); - - void fastWrite(ChunkSizedData chunkData, IDhClientLevel level); - // Only override the data that has not been written directly using write(), and skip those that are empty - void weakWrite(LodRenderSource source); +public interface LodRenderSource +{ + DhSectionPos getSectionPos(); + + byte getDataDetail(); + + void enableRender(IDhClientLevel level, LodQuadTree quadTree); + + void disableRender(); + + void dispose(); // notify the container that the parent lodSection is now disposed (can be in loaded or unloaded state) + + + /** + * Try and swap in new render buffer for this section. Note that before this call, there should be no other + * places storing or referencing the render buffer. + * @param referenceSlot The slot for swapping in the new buffer. + * @return True if the swap was successful. False if swap is not needed or if it is in progress. + */ + boolean trySwapRenderBuffer(LodQuadTree quadTree, AtomicReference referenceSlot); + + void saveRender(IDhClientLevel level, RenderMetaFile file, OutputStream dataStream) throws IOException; + + byte getRenderVersion(); + + /** Whether this object is still valid. If not, a new one should be created. */ + boolean isValid(); + + boolean isEmpty(); + + void fastWrite(ChunkSizedData chunkData, IDhClientLevel level); + + /** Only override the data that has not been written directly using write(), and skip those that are empty */ + void weakWrite(LodRenderSource 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 8d859d016..5e3919b2a 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,64 +11,53 @@ import java.io.IOException; import java.io.OutputStream; import java.util.concurrent.atomic.AtomicReference; -public class PlaceHolderRenderSource implements LodRenderSource { - final DhSectionPos pos; - boolean isValid = true; - public PlaceHolderRenderSource(DhSectionPos pos) { - this.pos = pos; - } - - @Override - public DhSectionPos getSectionPos() { - return pos; - } - - @Override - public byte getDataDetail() { - return 0; - } - - @Override - public void enableRender(IDhClientLevel level, LodQuadTree quadTree) { - } - - @Override - public void disableRender() {} - @Override - public void dispose() {} - @Override - public boolean trySwapRenderBuffer(LodQuadTree quadTree, AtomicReference referenceSlots) { - return false; - } - @Override - public void saveRender(IDhClientLevel level, RenderMetaFile file, OutputStream dataStream) throws IOException { - throw new UnsupportedOperationException("EmptyRenderSource should NEVER be saved!"); - } - - @Override - public byte getRenderVersion() { - return 0; - } - - public void markInvalid() { - isValid = false; - } - - @Override - public boolean isValid() { - return isValid; - } - - @Override - public boolean isEmpty() { - return true; - } - - @Override - public void fastWrite(ChunkSizedData chunkData, IDhClientLevel level) {} - - @Override - public void weakWrite(LodRenderSource source) {} - - +public class PlaceHolderRenderSource implements LodRenderSource +{ + final DhSectionPos pos; + boolean isValid = true; + + public PlaceHolderRenderSource(DhSectionPos pos) { this.pos = pos; } + + @Override + public DhSectionPos getSectionPos() { return pos; } + + @Override + public byte getDataDetail() { return 0; } + + @Override + public void enableRender(IDhClientLevel level, LodQuadTree quadTree){ /* TODO */ } + + @Override + public void disableRender(){ /* TODO */ } + + @Override + public void dispose(){ /* TODO */ } + + @Override + public boolean trySwapRenderBuffer(LodQuadTree quadTree, AtomicReference referenceSlots) { return false; } + + @Override + public void saveRender(IDhClientLevel level, RenderMetaFile file, OutputStream dataStream) throws IOException + { + throw new UnsupportedOperationException("EmptyRenderSource should NEVER be saved!"); + } + + @Override + public byte getRenderVersion() { return 0; } + + public void markInvalid() { isValid = false; } + + @Override + public boolean isValid() { return isValid; } + + @Override + public boolean isEmpty() { return true; } + + @Override + public void fastWrite(ChunkSizedData chunkData, IDhClientLevel level) { /* TODO */ } + + @Override + public void weakWrite(LodRenderSource source) { /* TODO */ } + + } diff --git a/core/src/main/java/com/seibel/lod/core/datatype/RenderSourceLoader.java b/core/src/main/java/com/seibel/lod/core/datatype/RenderSourceLoader.java index 1ff0fda7a..20cc97f93 100644 --- a/core/src/main/java/com/seibel/lod/core/datatype/RenderSourceLoader.java +++ b/core/src/main/java/com/seibel/lod/core/datatype/RenderSourceLoader.java @@ -9,53 +9,63 @@ import java.io.IOException; import java.io.InputStream; import java.util.*; -public abstract class RenderSourceLoader { - public static final HashMultimap, RenderSourceLoader> loaderRegistry = HashMultimap.create(); - public static final HashMap> renderTypeIdRegistry = new HashMap<>(); - public static RenderSourceLoader getLoader(long renderTypeId, byte loaderVersion) { - return loaderRegistry.get(renderTypeIdRegistry.get(renderTypeId)).stream() - .filter(l -> Arrays.binarySearch(l.loaderSupportedVersions, loaderVersion) >= 0) - .findFirst().orElse(null); - } - public static RenderSourceLoader getLoader(Class clazz, byte loaderVersion) { - return loaderRegistry.get(clazz).stream() - .filter(l -> Arrays.binarySearch(l.loaderSupportedVersions, loaderVersion) >= 0) - .findFirst().orElse(null); - } - - public final Class clazz; - public final long renderTypeId; - public final byte[] loaderSupportedVersions; - public final byte detailOffset; - - public RenderSourceLoader(Class clazz, long renderTypeId, byte[] loaderSupportedVersions, byte detailOffset) { - this.renderTypeId = renderTypeId; - this.loaderSupportedVersions = loaderSupportedVersions; - Arrays.sort(loaderSupportedVersions); // sort to allow fast access - this.clazz = clazz; - if (renderTypeIdRegistry.containsKey(renderTypeId) && renderTypeIdRegistry.get(renderTypeId) != clazz) { - throw new IllegalArgumentException("Loader for renderTypeId " + renderTypeId + " already registered with different class: " - + renderTypeIdRegistry.get(renderTypeId) + " != " + clazz); - } - Set loaders = loaderRegistry.get(clazz); - if (loaders.stream().anyMatch(other -> { - // see if any loaderSupportsVersion conflicts with this one - for (byte otherVer : other.loaderSupportedVersions) { - if (Arrays.binarySearch(loaderSupportedVersions, otherVer) >= 0) return true; - } - return false; - })) { - throw new IllegalArgumentException("Loader for class " + clazz + " that supports one of the version in " - + Arrays.toString(loaderSupportedVersions) + " already registered!"); - } - renderTypeIdRegistry.put(renderTypeId, clazz); - loaderRegistry.put(clazz, this); - this.detailOffset = detailOffset; - } - - // Can return null as meaning the file is out of date or something - public abstract LodRenderSource loadRender(RenderMetaFile renderFile, InputStream data, IDhLevel level) throws IOException; - public abstract LodRenderSource createRender(LodDataSource dataSource, IDhClientLevel level); - - +public abstract class RenderSourceLoader +{ + public static final HashMultimap, RenderSourceLoader> loaderRegistry = HashMultimap.create(); + public static final HashMap> renderTypeIdRegistry = new HashMap<>(); + + public static RenderSourceLoader getLoader(long renderTypeId, byte loaderVersion) + { + return loaderRegistry.get(renderTypeIdRegistry.get(renderTypeId)).stream() + .filter(l -> Arrays.binarySearch(l.loaderSupportedVersions, loaderVersion) >= 0) + .findFirst().orElse(null); + } + + public static RenderSourceLoader getLoader(Class clazz, byte loaderVersion) + { + return loaderRegistry.get(clazz).stream() + .filter(l -> Arrays.binarySearch(l.loaderSupportedVersions, loaderVersion) >= 0) + .findFirst().orElse(null); + } + + public final Class clazz; + public final long renderTypeId; + public final byte[] loaderSupportedVersions; + public final byte detailOffset; + + public RenderSourceLoader(Class clazz, long renderTypeId, byte[] loaderSupportedVersions, byte detailOffset) + { + this.renderTypeId = renderTypeId; + this.loaderSupportedVersions = loaderSupportedVersions; + Arrays.sort(loaderSupportedVersions); // sort to allow fast access + this.clazz = clazz; + if (renderTypeIdRegistry.containsKey(renderTypeId) && renderTypeIdRegistry.get(renderTypeId) != clazz) + { + throw new IllegalArgumentException("Loader for renderTypeId " + renderTypeId + " already registered with different class: " + + renderTypeIdRegistry.get(renderTypeId) + " != " + clazz); + } + Set loaders = loaderRegistry.get(clazz); + if (loaders.stream().anyMatch(other -> { + // see if any loaderSupportsVersion conflicts with this one + for (byte otherVer : other.loaderSupportedVersions) + { + if (Arrays.binarySearch(loaderSupportedVersions, otherVer) >= 0) + return true; + } + return false; + })) + { + throw new IllegalArgumentException("Loader for class " + clazz + " that supports one of the version in " + + Arrays.toString(loaderSupportedVersions) + " already registered!"); + } + renderTypeIdRegistry.put(renderTypeId, clazz); + loaderRegistry.put(clazz, this); + this.detailOffset = detailOffset; + } + + // Can return null as meaning the file is out of date or something + public abstract LodRenderSource loadRender(RenderMetaFile renderFile, InputStream data, IDhLevel level) throws IOException; + public abstract LodRenderSource createRender(LodDataSource dataSource, IDhClientLevel level); + + }