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> {
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
protected AssetDesc[] dependencies0(AssetDesc<Dt1> asset) {

View File

@ -6,6 +6,13 @@ import com.riiablo.map5.Dt1;
import com.riiablo.mpq_bytebuf.Mpq;
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) {
return new Dt1Params(tileId);
}

View File

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

View File

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