Created Dt1Params instance for library ref

Created Dt1Params.library()
Changed Dt1Loader to use Dt1Params.library() in preference to self defined reference
Refactor renamed Dt1Decoder7.readLibHeader -> Dt1Decoder7.readLibraryHeader
Changed MpqViewer Dt1 loader to save reference to Dt1 library and load tiles as-needed
MpqViewer Dt1 will dispose Dt1 library when switching Dt1 libraries
This commit is contained in:
Collin Smith
2024-12-28 19:12:12 -08:00
parent b4c05b569f
commit 8a31ba49c3
4 changed files with 29 additions and 28 deletions

View File

@ -23,7 +23,7 @@ import com.riiablo.map5.Dt1Decoder;
public class Dt1Loader extends AssetLoader<Dt1> { public class Dt1Loader extends AssetLoader<Dt1> {
private static final Logger log = LogManager.getLogger(Dt1Loader.class); private static final Logger log = LogManager.getLogger(Dt1Loader.class);
private static final Dt1Params PARENT_DT1 = Dt1Params.of(-1); private static final Dt1Params PARENT_DT1 = Dt1Params.library();
@Override @Override
protected AssetDesc[] dependencies0(AssetDesc<Dt1> asset) { protected AssetDesc[] dependencies0(AssetDesc<Dt1> asset) {

View File

@ -6,6 +6,13 @@ import com.riiablo.map5.Dt1;
import com.riiablo.mpq_bytebuf.Mpq; import com.riiablo.mpq_bytebuf.Mpq;
public class Dt1Params extends MpqParams<Dt1> { public class Dt1Params extends MpqParams<Dt1> {
private static final int LIBRARY_TILE_ID = -1;
private static final Dt1Params LIBRARY = new Dt1Params(LIBRARY_TILE_ID);
public static Dt1Params library() {
return LIBRARY;
}
public static Dt1Params of(int tileId) { public static Dt1Params of(int tileId) {
return new Dt1Params(tileId); return new Dt1Params(tileId);
} }

View File

@ -70,7 +70,7 @@ public enum Dt1Decoder7 {
} }
public static Dt1 readHeaders(Dt1 dt1, ByteInputStream in) { public static Dt1 readHeaders(Dt1 dt1, ByteInputStream in) {
readLibHeader(dt1, in); readLibraryHeader(dt1, in);
log.trace("dt1: {}", dt1); log.trace("dt1: {}", dt1);
Tile[] tiles = dt1.tiles; Tile[] tiles = dt1.tiles;
for (int i = 0, s = dt1.numTiles; i < s; i++) { for (int i = 0, s = dt1.numTiles; i < s; i++) {
@ -85,7 +85,7 @@ public enum Dt1Decoder7 {
return dt1; return dt1;
} }
public static Dt1 readLibHeader(Dt1 dt1, ByteInputStream in) { public static Dt1 readLibraryHeader(Dt1 dt1, ByteInputStream in) {
assert dt1.version == VERSION : "dt1.version(" + dt1.version + ") != VERSION(" + VERSION + ")"; assert dt1.version == VERSION : "dt1.version(" + dt1.version + ") != VERSION(" + VERSION + ")";
dt1.flags = in.read32(); dt1.flags = in.read32();
in.skipBytes(RESERVED_BYTES); in.skipBytes(RESERVED_BYTES);

View File

@ -2091,24 +2091,22 @@ public class MpqViewer extends Tool {
} else if (extension.equals("DT1")) { } else if (extension.equals("DT1")) {
tileControls.setCollapsed(false); tileControls.setCollapsed(false);
paletteControls.setCollapsed(false); paletteControls.setCollapsed(false);
AssetDesc<Dt1> asset = AssetDesc.of(filename, Dt1.class, Dt1Params.of(0)); final AssetDesc<Dt1> dt1Library = AssetDesc.of(filename, Dt1.class, Dt1Params.library());
AtomicReference<AssetDesc<Dt1>> ref = new AtomicReference<>(asset); AtomicReference<AssetDesc<Dt1>> ref = new AtomicReference<>();
AtomicReference<Dt1> dt1Ref = new AtomicReference<>(); AtomicReference<Dt1> dt1Ref = new AtomicReference<>();
assets.load(asset) assets.load(dt1Library)
.addListener(future -> { .addListener(future -> {
dt1Ref.set((Dt1) future.getNow()); dt1Ref.set((Dt1) future.getNow());
log.debug("Loaded {}", asset); log.debug("Loaded dt1 library {}", dt1Library);
renderer.initialize(); renderer.initialize();
}); });
renderer.setDrawable(new DelegatingDrawable<Drawable>() { renderer.setDrawable(new DelegatingDrawable<Drawable>() {
int tileId = 0; int tileId = -1;
int curTileId = 0;
@Override @Override
protected void initialize() { protected void initialize() {
Dt1 dt1 = dt1Ref.get(); Dt1 dt1 = dt1Ref.get();
dt1Info.setDt1(dt1); dt1Info.setDt1(dt1);
dt1Info.update(tileId);
slTileIndex.setValue(0); slTileIndex.setValue(0);
slTileIndex.setRange(0, dt1.numTiles() - 1); slTileIndex.setRange(0, dt1.numTiles() - 1);
@ -2118,22 +2116,19 @@ public class MpqViewer extends Tool {
@Override @Override
public void dispose() { public void dispose() {
super.dispose(); super.dispose();
assets.unload(ref.get());
log.debug("Unloading {}", ref.get()); log.debug("Unloading {}", ref.get());
} assets.unload(ref.get());
log.debug("Unloading dt1 library {}", dt1Library);
void updateInfo() { assets.unload(dt1Library);
if (tileId < 0) return;
dt1Info.update(tileId);
} }
void updateTile(int t) { void updateTile(int t) {
if (curTileId == t) return; // prevents multiple calls during init if (tileId == t) return; // unnecessary call
log.traceEntry("updateTile(t: {})", t); log.traceEntry("updateTile(t: {})", t);
curTileId = t; tileId = t;
final AssetDesc<Dt1> oldAsset = ref.get(); final AssetDesc<Dt1> oldAsset = ref.get();
assert oldAsset.params(Dt1Params.class).tileId != t; assert oldAsset == null || oldAsset.params(Dt1Params.class).tileId != t;
final AssetDesc<Dt1> asset = AssetDesc.of(oldAsset, oldAsset.params(Dt1Params.class).copy(t)); final AssetDesc<Dt1> asset = AssetDesc.of(dt1Library, dt1Library.params(Dt1Params.class).copy(t));
ref.set(asset); ref.set(asset);
assets.load(asset) assets.load(asset)
.addListener(future -> { .addListener(future -> {
@ -2148,12 +2143,13 @@ public class MpqViewer extends Tool {
return; return;
} }
log.debug("Loaded {}", asset); if (oldAsset != null) {
log.debug("Unloading {}", oldAsset); log.debug("Unloading {}", oldAsset);
assets.unload(oldAsset); assets.unload(oldAsset);
final Dt1 dt1 = (Dt1) future.getNow(); }
dt1Info.setDt1(dt1);
dt1Info.update(tileId); log.debug("Loaded {}", asset);
dt1Info.update(asset.params(Dt1Params.class).tileId);
}); });
} }
@ -2176,9 +2172,7 @@ public class MpqViewer extends Tool {
@Override @Override
protected void changed(ChangeEvent event, Actor actor) { protected void changed(ChangeEvent event, Actor actor) {
if (actor == slTileIndex) { if (actor == slTileIndex) {
tileId = (int) slTileIndex.getValue(); updateTile((int) slTileIndex.getValue());
updateTile(tileId);
updateInfo();
} }
} }