diff --git a/core/src/com/riiablo/assets/AssetLoader.java b/core/src/com/riiablo/assets/AssetLoader.java index 8dc2989f..c86513f2 100644 --- a/core/src/com/riiablo/assets/AssetLoader.java +++ b/core/src/com/riiablo/assets/AssetLoader.java @@ -2,7 +2,24 @@ package com.riiablo.assets; import com.badlogic.gdx.utils.Array; -public interface AssetLoader { - FileHandleResolver resolver(); - Array getDependencies(Asset asset); +public class AssetLoader { + final FileHandleResolver resolver; + final Class type; + + protected AssetLoader(FileHandleResolver resolver, Class type) { + this.resolver = resolver; + this.type = type; + } + + public final Class type() { + return type; + } + + public final FileHandleResolver resolver() { + return resolver; + } + + public Array getDependencies(Asset asset) { + return null; + } } diff --git a/core/src/com/riiablo/assets/AssetManager.java b/core/src/com/riiablo/assets/AssetManager.java index ede0b881..4c70a6bb 100644 --- a/core/src/com/riiablo/assets/AssetManager.java +++ b/core/src/com/riiablo/assets/AssetManager.java @@ -1,6 +1,12 @@ package com.riiablo.assets; -import io.netty.util.AsciiString; +import com.badlogic.gdx.files.FileHandle; +import com.badlogic.gdx.math.MathUtils; +import com.badlogic.gdx.utils.Array; +import com.badlogic.gdx.utils.Disposable; +import com.riiablo.logger.LogManager; +import com.riiablo.logger.Logger; + import java.util.ArrayList; import java.util.List; import java.util.Map; @@ -11,13 +17,7 @@ import java.util.concurrent.Executors; import java.util.concurrent.ThreadFactory; import java.util.concurrent.TimeUnit; -import com.badlogic.gdx.files.FileHandle; -import com.badlogic.gdx.math.MathUtils; -import com.badlogic.gdx.utils.Array; -import com.badlogic.gdx.utils.Disposable; - -import com.riiablo.logger.LogManager; -import com.riiablo.logger.Logger; +import io.netty.util.AsciiString; /** * n io threads perform async io to retrieve ByteBuf or MPQInputStream @@ -34,7 +34,7 @@ public class AssetManager implements Disposable, LoadTask.Callback, AsyncReader. final ArrayBlockingQueue completedTasks = new ArrayBlockingQueue<>(256); final ArrayList drain = new ArrayList<>(256); - final Map readers = new ConcurrentHashMap<>(); + final Map adapters = new ConcurrentHashMap<>(); final ExecutorService io; final ExecutorService async; @@ -87,7 +87,7 @@ public class AssetManager implements Disposable, LoadTask.Callback, AsyncReader. return loader; } - public void setLoader(Class type, AssetLoader loader) { + public void setLoader(Class type, AssetLoader loader) { if (type == null) throw new IllegalArgumentException("type cannot be null"); if (loader == null) throw new IllegalArgumentException("loader cannot be null"); log.debug("Loader set {} -> {}", type.getSimpleName(), loader.getClass()); @@ -95,7 +95,7 @@ public class AssetManager implements Disposable, LoadTask.Callback, AsyncReader. } public FileHandleAdapter getAdapter(Class type) { - return readers.get(type); + return adapters.get(type); } FileHandleAdapter findAdapter(Class type) { @@ -108,7 +108,7 @@ public class AssetManager implements Disposable, LoadTask.Callback, AsyncReader. if (type == null) throw new IllegalArgumentException("type cannot be null"); if (adapter == null) throw new IllegalArgumentException("adapter cannot be null"); log.debug("Adapter set {} -> {}", type.getSimpleName(), adapter.getClass()); - readers.put(type, adapter); + adapters.put(type, adapter); } public void clear() { @@ -166,7 +166,7 @@ public class AssetManager implements Disposable, LoadTask.Callback, AsyncReader. if (adapter instanceof AsyncAdapter) { // io.submit(((AsyncReader) reader).readFuture(asset, this)); } else { - ((AsyncAssetLoader) loader).loadAsync(this, asset, adapter, handle); + ((AsyncAssetLoader) loader).loadAsync(this, asset, adapter.adapt(handle, loader.type())); } } else { // io.submit(reader.create(asset)); diff --git a/core/src/com/riiablo/assets/AsyncAssetLoader.java b/core/src/com/riiablo/assets/AsyncAssetLoader.java index 02e38967..7cb58b99 100644 --- a/core/src/com/riiablo/assets/AsyncAssetLoader.java +++ b/core/src/com/riiablo/assets/AsyncAssetLoader.java @@ -1,31 +1,14 @@ package com.riiablo.assets; -import io.netty.buffer.ByteBuf; -import java.io.InputStream; - import com.badlogic.gdx.files.FileHandle; -public abstract class AsyncAssetLoader implements AssetLoader { - final Reader reader; +import java.io.InputStream; - public AsyncAssetLoader(Reader reader) { - this.reader = reader; - } +import io.netty.buffer.ByteBuf; - protected Reader reader() { - return reader; - } - - void loadAsync(AssetManager assets, Asset asset, FileHandleAdapter adapter, F handle) { - loadAsync(assets, asset, reader.get(adapter, handle)); - } - - void unloadAsync(AssetManager assets, Asset asset, FileHandleAdapter adapter, F handle) { - unloadAsync(assets, asset, reader.get(adapter, handle)); - } - - T loadSync(AssetManager assets, Asset asset, FileHandleAdapter adapter, F handle) { - return loadSync(assets, asset, reader.get(adapter, handle)); +public abstract class AsyncAssetLoader extends AssetLoader { + public AsyncAssetLoader(FileHandleResolver resolver, Class type) { + super(resolver, type); } protected abstract void loadAsync(AssetManager assets, Asset asset, V data); diff --git a/core/src/com/riiablo/assets/FileHandleAdapter.java b/core/src/com/riiablo/assets/FileHandleAdapter.java index ca99d6a9..9ade7873 100644 --- a/core/src/com/riiablo/assets/FileHandleAdapter.java +++ b/core/src/com/riiablo/assets/FileHandleAdapter.java @@ -1,12 +1,32 @@ package com.riiablo.assets; -import io.netty.buffer.ByteBuf; -import java.io.InputStream; - import com.badlogic.gdx.files.FileHandle; -public interface FileHandleAdapter { - byte[] readBytes(T handle); - InputStream read(T handle); - ByteBuf readByteBuf(T handle); +import java.io.InputStream; +import java.util.HashMap; +import java.util.Map; + +import io.netty.buffer.ByteBuf; + +public abstract class FileHandleAdapter { + final Class type; + final Map readers; + + protected FileHandleAdapter(Class type) { + this.type = type; + this.readers = new HashMap<>(); + readers.put(type, new AsyncAssetLoader.ReflectiveReader<>()); + readers.put(InputStream.class, new AsyncAssetLoader.InputStreamReader<>()); + readers.put(byte[].class, new AsyncAssetLoader.ByteArrayReader<>()); + readers.put(ByteBuf.class, new AsyncAssetLoader.ByteBufReader<>()); + } + + @SuppressWarnings("unchecked") + public V adapt(F handle, Class type) { + return (V) readers.get(type).get(this, handle); + } + + public abstract byte[] readBytes(F handle); + public abstract InputStream read(F handle); + public abstract ByteBuf readByteBuf(F handle); } diff --git a/core/src/com/riiablo/assets/GdxFileHandleAdapter.java b/core/src/com/riiablo/assets/GdxFileHandleAdapter.java index 29ab08a7..74a85e28 100644 --- a/core/src/com/riiablo/assets/GdxFileHandleAdapter.java +++ b/core/src/com/riiablo/assets/GdxFileHandleAdapter.java @@ -1,11 +1,16 @@ package com.riiablo.assets; -import io.netty.buffer.ByteBuf; -import java.io.InputStream; - import com.badlogic.gdx.files.FileHandle; -public class GdxFileHandleAdapter implements FileHandleAdapter { +import java.io.InputStream; + +import io.netty.buffer.ByteBuf; + +public final class GdxFileHandleAdapter extends FileHandleAdapter { + public GdxFileHandleAdapter() { + super(FileHandle.class); + } + @Override public byte[] readBytes(FileHandle handle) { return handle.readBytes(); diff --git a/core/src/com/riiablo/assets/MPQFileHandleAdapter.java b/core/src/com/riiablo/assets/MPQFileHandleAdapter.java index 2804f2ba..e6d8b88f 100644 --- a/core/src/com/riiablo/assets/MPQFileHandleAdapter.java +++ b/core/src/com/riiablo/assets/MPQFileHandleAdapter.java @@ -1,11 +1,16 @@ package com.riiablo.assets; -import io.netty.buffer.ByteBuf; -import java.io.InputStream; - import com.riiablo.mpq_bytebuf.MPQFileHandle; -public class MPQFileHandleAdapter implements FileHandleAdapter, AsyncAdapter { +import java.io.InputStream; + +import io.netty.buffer.ByteBuf; + +public final class MPQFileHandleAdapter extends FileHandleAdapter implements AsyncAdapter { + public MPQFileHandleAdapter() { + super(MPQFileHandle.class); + } + @Override public byte[] readBytes(MPQFileHandle handle) { throw new UnsupportedOperationException(); diff --git a/core/src/com/riiablo/assets/loaders/DCCLoader.java b/core/src/com/riiablo/assets/loaders/DCCLoader.java index 2efdc56f..6eccc797 100644 --- a/core/src/com/riiablo/assets/loaders/DCCLoader.java +++ b/core/src/com/riiablo/assets/loaders/DCCLoader.java @@ -1,25 +1,16 @@ package com.riiablo.assets.loaders; -import io.netty.buffer.ByteBuf; - -import com.badlogic.gdx.utils.Array; - import com.riiablo.assets.Asset; import com.riiablo.assets.AssetManager; import com.riiablo.assets.AsyncAssetLoader; import com.riiablo.assets.FileHandleResolver; -import com.riiablo.assets.MPQFileHandleResolver; import com.riiablo.codec.DCC; -import com.riiablo.mpq.MPQFileHandle; -public class DCCLoader extends AsyncAssetLoader { - DCCLoader() { - super(new ByteBufReader()); - } +import io.netty.buffer.ByteBuf; - @Override - public FileHandleResolver resolver() { - return new MPQFileHandleResolver(); +public class DCCLoader extends AsyncAssetLoader { + public DCCLoader(FileHandleResolver resolver) { + super(resolver, ByteBuf.class); } @Override @@ -36,9 +27,4 @@ public class DCCLoader extends AsyncAssetLoader { public DCC loadSync(AssetManager assets, Asset asset, ByteBuf data) { throw new UnsupportedOperationException(); } - - @Override - public Array getDependencies(Asset asset) { - throw new UnsupportedOperationException(); - } } diff --git a/core/src/com/riiablo/assets/loaders/MusicLoader.java b/core/src/com/riiablo/assets/loaders/MusicLoader.java index 77042e7d..7ccf2230 100644 --- a/core/src/com/riiablo/assets/loaders/MusicLoader.java +++ b/core/src/com/riiablo/assets/loaders/MusicLoader.java @@ -1,30 +1,15 @@ package com.riiablo.assets.loaders; -import io.netty.util.AsciiString; - import com.badlogic.gdx.audio.Music; import com.badlogic.gdx.files.FileHandle; -import com.badlogic.gdx.utils.Array; - import com.riiablo.assets.Asset; import com.riiablo.assets.AssetManager; import com.riiablo.assets.AsyncAssetLoader; -import com.riiablo.assets.DelimiterPathTransformer; import com.riiablo.assets.FileHandleResolver; -public class MusicLoader extends AsyncAssetLoader { - MusicLoader() { - super(new ReflectiveReader<>()); - } - - @Override - public FileHandleResolver resolver() { - return new FileHandleResolver(DelimiterPathTransformer.INSTANCE) { - @Override - protected FileHandle resolveTransformed(AsciiString path) { - throw new UnsupportedOperationException(); - } - }; +public class MusicLoader extends AsyncAssetLoader { + MusicLoader(FileHandleResolver resolver) { + super(resolver, FileHandle.class); } @Override @@ -41,9 +26,4 @@ public class MusicLoader extends AsyncAssetLoader public Music loadSync(AssetManager assets, Asset asset, FileHandle data) { throw new UnsupportedOperationException(); } - - @Override - public Array getDependencies(Asset asset) { - throw new UnsupportedOperationException(); - } } diff --git a/core/test/com/riiablo/assets/AssetManagerTest.java b/core/test/com/riiablo/assets/AssetManagerTest.java index 2a1527fe..836418cb 100644 --- a/core/test/com/riiablo/assets/AssetManagerTest.java +++ b/core/test/com/riiablo/assets/AssetManagerTest.java @@ -1,17 +1,16 @@ package com.riiablo.assets; -import org.junit.BeforeClass; -import org.junit.Test; - import com.badlogic.gdx.Gdx; import com.badlogic.gdx.files.FileHandle; - import com.riiablo.RiiabloTest; import com.riiablo.logger.Level; import com.riiablo.logger.LogManager; import com.riiablo.mpq_bytebuf.MPQFileHandle; import com.riiablo.mpq_bytebuf.MPQFileHandleResolver; +import org.junit.BeforeClass; +import org.junit.Test; + public class AssetManagerTest extends RiiabloTest { @BeforeClass public static void before() { @@ -21,7 +20,7 @@ public class AssetManagerTest extends RiiabloTest { @Test public void init() { AssetManager assets = new AssetManager(1); - MPQFileHandleResolver resolver = new MPQFileHandleResolver(Gdx.files.absolute("C:\\diablo")); + MPQFileHandleResolver resolver = new MPQFileHandleResolver(Gdx.files.absolute("C:\\diablo ii")); assets.setAdapter(FileHandle.class, new GdxFileHandleAdapter()); assets.setAdapter(MPQFileHandle.class, new MPQFileHandleAdapter()); assets.dispose();