fix tile bank capacity meter atlas sizing

This commit is contained in:
bQUARKz 2026-03-19 07:08:07 +00:00
parent 2fa604e308
commit a7710be847
Signed by: bquarkz
SSH Key Fingerprint: SHA256:Z7dgqoglWwoK6j6u4QC87OveEq74WOhFN+gitsxtkf8
2 changed files with 51 additions and 6 deletions

View File

@ -8,7 +8,9 @@ import p.studio.workspaces.assets.messages.AssetWorkspaceBankCompositionFile;
import java.util.List; import java.util.List;
final class AssetDetailsTileBankCompositionFamilySupport extends AssetDetailsAbstractBankCompositionFamilySupport { final class AssetDetailsTileBankCompositionFamilySupport extends AssetDetailsAbstractBankCompositionFamilySupport {
private int maxSlots = 64; private static final int ATLAS_SIZE_PX = 256;
private int maxSlots = slotsForTileSize(16);
@Override @Override
public boolean supports(AssetFamilyCatalog assetFamily) { public boolean supports(AssetFamilyCatalog assetFamily) {
@ -48,12 +50,16 @@ final class AssetDetailsTileBankCompositionFamilySupport extends AssetDetailsAbs
.map(field -> field.value()) .map(field -> field.value())
.findFirst() .findFirst()
.orElse("16x16"); .orElse("16x16");
final int tileSize = switch (tileSizeValue) { return switch (tileSizeValue) {
case "8x8" -> 8; case "8x8" -> slotsForTileSize(8);
case "32x32" -> 32; case "32x32" -> slotsForTileSize(32);
default -> 16; default -> slotsForTileSize(16);
}; };
return Math.max(1, (256 / tileSize) * (256 / tileSize)); }
private static int slotsForTileSize(int tileSize) {
final int tilesPerAxis = Math.max(1, ATLAS_SIZE_PX / tileSize);
return tilesPerAxis * tilesPerAxis;
} }
private StudioAssetCapacitySeverity severityFor(double progress) { private StudioAssetCapacitySeverity severityFor(double progress) {

View File

@ -28,6 +28,45 @@ final class AssetDetailsBankCompositionCoordinatorTest {
assertTrue(coordinator.viewModel().capacityState().blocked()); assertTrue(coordinator.viewModel().capacityState().blocked());
} }
@Test
void tileFamilyUsesAtlasCapacityFor8x8Tiles() {
final AssetDetailsBankCompositionCoordinator coordinator = new AssetDetailsBankCompositionCoordinator();
coordinator.replaceDetails(tileDetails("8x8", 1_100));
coordinator.beginEdit();
coordinator.moveToSelected(coordinator.viewModel().availableFiles());
assertEquals(1_024, coordinator.viewModel().selectedFiles().size());
assertEquals("1024 / 1024", coordinator.viewModel().capacityState().labelText());
assertTrue(coordinator.viewModel().capacityState().blocked());
}
@Test
void tileFamilyUsesAtlasCapacityFor16x16Tiles() {
final AssetDetailsBankCompositionCoordinator coordinator = new AssetDetailsBankCompositionCoordinator();
coordinator.replaceDetails(tileDetails("16x16", 300));
coordinator.beginEdit();
coordinator.moveToSelected(coordinator.viewModel().availableFiles());
assertEquals(256, coordinator.viewModel().selectedFiles().size());
assertEquals("256 / 256", coordinator.viewModel().capacityState().labelText());
assertTrue(coordinator.viewModel().capacityState().blocked());
}
@Test
void tileFamilyUsesAtlasCapacityFor32x32Tiles() {
final AssetDetailsBankCompositionCoordinator coordinator = new AssetDetailsBankCompositionCoordinator();
coordinator.replaceDetails(tileDetails("32x32", 100));
coordinator.beginEdit();
coordinator.moveToSelected(coordinator.viewModel().availableFiles());
assertEquals(64, coordinator.viewModel().selectedFiles().size());
assertEquals("64 / 64", coordinator.viewModel().capacityState().labelText());
assertTrue(coordinator.viewModel().capacityState().blocked());
}
@Test @Test
void soundFamilyBlocksSelectionAfterByteCapacity() { void soundFamilyBlocksSelectionAfterByteCapacity() {
final AssetDetailsBankCompositionCoordinator coordinator = new AssetDetailsBankCompositionCoordinator(); final AssetDetailsBankCompositionCoordinator coordinator = new AssetDetailsBankCompositionCoordinator();