packer (WIP)

This commit is contained in:
bQUARKz 2026-03-20 06:35:33 +00:00
parent 96643282af
commit 7558128215
Signed by: bquarkz
SSH Key Fingerprint: SHA256:Z7dgqoglWwoK6j6u4QC87OveEq74WOhFN+gitsxtkf8
19 changed files with 1058 additions and 860 deletions

View File

@ -14,6 +14,7 @@ public record PackerAssetDetailsDTO(
List<OutputCodecCatalog> availableOutputCodecs,
Map<OutputCodecCatalog, List<PackerCodecConfigurationFieldDTO>> codecConfigurationFieldsByCodec,
List<PackerCodecConfigurationFieldDTO> metadataFields,
Map<String, Object> outputPipeline,
PackerBankCompositionDetailsDTO bankComposition,
List<Map<String, Object>> pipelinePalettes,
List<PackerDiagnosticDTO> diagnostics) {
@ -25,6 +26,7 @@ public record PackerAssetDetailsDTO(
availableOutputCodecs = List.copyOf(Objects.requireNonNull(availableOutputCodecs, "availableOutputCodecs"));
codecConfigurationFieldsByCodec = Map.copyOf(Objects.requireNonNull(codecConfigurationFieldsByCodec, "codecConfigurationFieldsByCodec"));
metadataFields = List.copyOf(Objects.requireNonNull(metadataFields, "metadataFields"));
outputPipeline = Map.copyOf(Objects.requireNonNull(outputPipeline, "outputPipeline"));
bankComposition = Objects.requireNonNull(bankComposition, "bankComposition");
pipelinePalettes = List.copyOf(Objects.requireNonNull(pipelinePalettes, "pipelinePalettes"));
diagnostics = List.copyOf(Objects.requireNonNull(diagnostics, "diagnostics"));

View File

@ -1,32 +1,35 @@
package p.packer.dtos;
import p.packer.messages.assets.AssetFamilyCatalog;
import p.packer.messages.assets.OutputFormatCatalog;
import java.util.Map;
import java.util.Objects;
public record PackerPackSummaryAssetDTO(
int assetId,
String assetName,
AssetFamilyCatalog assetFamily,
int minArtifactCount,
int maxArtifactCount,
int artifactCount,
OutputFormatCatalog outputFormat,
Map<String, String> outputMetadata,
Map<String, Object> outputPipeline,
long lastModified) {
public PackerPackSummaryAssetDTO {
if (assetId < 0) {
throw new IllegalArgumentException("assetId must not be negative");
}
assetName = java.util.Objects.requireNonNull(assetName, "assetName").trim();
assetFamily = java.util.Objects.requireNonNullElse(assetFamily, AssetFamilyCatalog.UNKNOWN);
assetName = Objects.requireNonNull(assetName, "assetName").trim();
assetFamily = Objects.requireNonNullElse(assetFamily, AssetFamilyCatalog.UNKNOWN);
outputFormat = Objects.requireNonNullElse(outputFormat, OutputFormatCatalog.UNKNOWN);
outputMetadata = Map.copyOf(Objects.requireNonNull(outputMetadata, "outputMetadata"));
outputPipeline = Map.copyOf(Objects.requireNonNull(outputPipeline, "outputPipeline"));
if (assetName.isBlank()) {
throw new IllegalArgumentException("assetName must not be blank");
}
if (minArtifactCount < 0) {
throw new IllegalArgumentException("minArtifactCount must not be negative");
}
if (maxArtifactCount < 0) {
throw new IllegalArgumentException("maxArtifactCount must not be negative");
}
if (minArtifactCount > maxArtifactCount) {
throw new IllegalArgumentException("minArtifactCount must not be greater than maxArtifactCount");
if (artifactCount < 0) {
throw new IllegalArgumentException("artifactCount must not be negative");
}
if (lastModified < 0L) {
throw new IllegalArgumentException("lastModified must not be negative");

View File

@ -14,6 +14,7 @@ public record PackerAssetDetails(
List<OutputCodecCatalog> availableOutputCodecs,
Map<OutputCodecCatalog, List<PackerCodecConfigurationField>> codecConfigurationFieldsByCodec,
List<PackerCodecConfigurationField> metadataFields,
Map<String, Object> outputPipeline,
PackerBankCompositionDetails bankComposition,
List<Map<String, Object>> pipelinePalettes,
List<PackerDiagnostic> diagnostics) {
@ -25,6 +26,7 @@ public record PackerAssetDetails(
availableOutputCodecs = List.copyOf(Objects.requireNonNull(availableOutputCodecs, "availableOutputCodecs"));
codecConfigurationFieldsByCodec = Map.copyOf(Objects.requireNonNull(codecConfigurationFieldsByCodec, "codecConfigurationFieldsByCodec"));
metadataFields = List.copyOf(Objects.requireNonNull(metadataFields, "metadataFields"));
outputPipeline = Map.copyOf(Objects.requireNonNull(outputPipeline, "outputPipeline"));
bankComposition = Objects.requireNonNull(bankComposition, "bankComposition");
pipelinePalettes = List.copyOf(Objects.requireNonNull(pipelinePalettes, "pipelinePalettes"));
diagnostics = List.copyOf(Objects.requireNonNull(diagnostics, "diagnostics"));

View File

@ -681,14 +681,14 @@ public final class FileSystemPackerWorkspaceService implements PackerWorkspaceSe
final AssetFamilyCatalog assetFamily = declaration != null
? declaration.assetFamily()
: AssetFamilyCatalog.UNKNOWN;
final int minArtifactCount = declaration != null ? declaration.artifacts().size() : 0;
final int maxArtifactCount = runtimeAsset.walkProjection().buildCandidateFiles().size();
return new PackerPackSummaryAssetDTO(
registryEntry.assetId(),
assetName,
assetFamily,
minArtifactCount,
maxArtifactCount,
declaration != null ? declaration.artifacts().size() : 0,
declaration != null ? declaration.outputFormat() : OutputFormatCatalog.UNKNOWN,
declaration != null ? declaration.outputMetadata() : Map.of(),
declaration != null ? PackerReadMessageMapper.normalizeMetadata(declaration.outputPipelineMetadata()) : Map.of(),
0L);
}

View File

@ -82,6 +82,7 @@ public final class PackerAssetDetailsService {
outputContract.availableCodecs(),
outputContract.codecConfigurationFieldsByCodec(),
metadataFields(outputContract.metadataFields(), declaration.outputMetadata()),
PackerReadMessageMapper.normalizeMetadata(declaration.outputPipelineMetadata()),
resolveBankCompositionDetails(snapshot, runtimeAsset, declaration),
resolvePipelinePalettes(declaration),
diagnostics);
@ -122,6 +123,7 @@ public final class PackerAssetDetailsService {
List.of(OutputCodecCatalog.NONE),
Map.of(OutputCodecCatalog.NONE, List.of()),
List.of(),
Map.of(),
PackerBankCompositionDetails.EMPTY,
List.of(),
diagnostics);

View File

@ -1,5 +1,6 @@
package p.packer.services;
import com.fasterxml.jackson.databind.JsonNode;
import p.packer.dtos.*;
import p.packer.messages.assets.OutputCodecCatalog;
import p.packer.models.*;
@ -31,11 +32,20 @@ public final class PackerReadMessageMapper {
details.availableOutputCodecs(),
toCodecConfigurationFieldsByCodecDTO(details.codecConfigurationFieldsByCodec()),
toCodecConfigurationFieldDTOs(details.metadataFields()),
normalizeMetadata(details.outputPipeline()),
toBankCompositionDetailsDTO(details.bankComposition()),
details.pipelinePalettes().stream().map(PackerReadMessageMapper::normalizeMetadata).toList(),
toDiagnosticDTOs(details.diagnostics()));
}
public static Map<String, Object> normalizeMetadata(Map<String, ?> metadata) {
return metadata.entrySet().stream().collect(Collectors.toMap(
Map.Entry::getKey,
entry -> normalizeMetadataValue(entry.getValue()),
(left, right) -> left,
java.util.LinkedHashMap::new));
}
private static PackerBankCompositionDetailsDTO toBankCompositionDetailsDTO(PackerBankCompositionDetails details) {
return new PackerBankCompositionDetailsDTO(
details.availableFiles().stream().map(PackerReadMessageMapper::toBankCompositionFileDTO).toList(),
@ -53,14 +63,6 @@ public final class PackerReadMessageMapper {
normalizeMetadata(file.metadata()));
}
private static Map<String, Object> normalizeMetadata(Map<String, Object> metadata) {
return metadata.entrySet().stream().collect(Collectors.toMap(
Map.Entry::getKey,
entry -> normalizeMetadataValue(entry.getValue()),
(left, right) -> left,
java.util.LinkedHashMap::new));
}
private static Object normalizeMetadataValue(Object value) {
if (value == null
|| value instanceof String
@ -68,6 +70,34 @@ public final class PackerReadMessageMapper {
|| value instanceof Boolean) {
return value;
}
if (value instanceof JsonNode jsonNode) {
if (jsonNode.isObject()) {
final java.util.LinkedHashMap<String, Object> normalized = new java.util.LinkedHashMap<>();
jsonNode.fields().forEachRemaining(entry -> normalized.put(entry.getKey(), normalizeMetadataValue(entry.getValue())));
return Map.copyOf(normalized);
}
if (jsonNode.isArray()) {
final java.util.List<Object> normalized = new java.util.ArrayList<>();
jsonNode.forEach(item -> normalized.add(normalizeMetadataValue(item)));
return List.copyOf(normalized);
}
if (jsonNode.isTextual()) {
return jsonNode.asText();
}
if (jsonNode.isIntegralNumber()) {
return jsonNode.longValue();
}
if (jsonNode.isFloatingPointNumber()) {
return jsonNode.doubleValue();
}
if (jsonNode.isBoolean()) {
return jsonNode.booleanValue();
}
if (jsonNode.isNull()) {
return null;
}
return jsonNode.toString();
}
if (value instanceof PackerTileIndexedV1 tile) {
final List<Integer> paletteIndices = new java.util.ArrayList<>(tile.paletteIndices().length);
for (byte paletteIndex : tile.paletteIndices()) {

View File

@ -118,25 +118,28 @@ final class FileSystemPackerWorkspaceServiceTest {
}
@Test
void packSummaryProjectsMinAndMaxArtifactCounts() throws Exception {
void packSummaryProjectsArtifactCountAndOutputMetadata() throws Exception {
final Path projectRoot = copyFixture("workspaces/managed-basic", tempDir.resolve("pack-summary-artifacts"));
final Path assetRoot = projectRoot.resolve("assets/ui/atlas");
writeTilePng(assetRoot.resolve("confirm.png"), 16);
writeTilePng(assetRoot.resolve("cancel.png"), 16);
final Path manifestPath = assetRoot.resolve("asset.json");
final ObjectNode manifest = (ObjectNode) MAPPER.readTree(manifestPath.toFile());
final var artifacts = manifest.putArray("artifacts");
artifacts.addObject().put("file", "confirm.png").put("index", 0);
final ObjectNode output = (ObjectNode) manifest.path("output");
final ObjectNode metadata = output.putObject("metadata");
metadata.put("tile_size", "16x16");
output.putObject("pipeline").putObject("samples").putObject("1").put("offset", 0).put("length", 64);
MAPPER.writerWithDefaultPrettyPrinter().writeValue(manifestPath.toFile(), manifest);
final FileSystemPackerWorkspaceService service = service();
service.listAssets(new ListAssetsRequest(project(projectRoot), true));
final var result = service.getPackWorkspaceSummary(new PackWorkspaceSummaryRequest(project(projectRoot)));
assertEquals(PackerOperationStatus.SUCCESS, result.status());
assertEquals(1, result.packSummary().assets().size());
assertEquals(1, result.packSummary().assets().getFirst().minArtifactCount());
assertEquals(2, result.packSummary().assets().getFirst().maxArtifactCount());
assertEquals(1, result.packSummary().assets().getFirst().artifactCount());
assertEquals(OutputFormatCatalog.TILES_INDEXED_V1, result.packSummary().assets().getFirst().outputFormat());
assertEquals("16x16", result.packSummary().assets().getFirst().outputMetadata().get("tile_size"));
assertEquals(64L, ((Map<?, ?>) ((Map<?, ?>) result.packSummary().assets().getFirst().outputPipeline().get("samples")).get("1")).get("length"));
assertEquals(0L, result.packSummary().assets().getFirst().lastModified());
}

View File

@ -555,6 +555,7 @@ public final class AssetDetailsControl extends VBox implements StudioEventAware
details.availableOutputCodecs(),
details.codecConfigurationFieldsByCodec(),
details.metadataFields(),
details.outputPipeline(),
mapBankComposition(details.bankComposition()),
details.pipelinePalettes(),
mergedDiagnostics);

View File

@ -0,0 +1,116 @@
package p.studio.workspaces.assets.details.bank;
import p.packer.messages.assets.AssetFamilyCatalog;
import p.studio.controls.banks.StudioAssetCapacitySeverity;
import java.util.Map;
import java.util.Objects;
public final class AssetBankCapacityService {
private static final int TILE_ATLAS_SIZE_PX = 256;
private static final long SOUND_BANK_MAX_BYTES = 1024L * 1024L;
public AssetDetailsBankCompositionCapacityState evaluate(
AssetFamilyCatalog assetFamily,
int artifactCount,
Map<String, String> outputMetadata,
Map<String, Object> outputPipeline,
long usedBytes) {
final AssetFamilyCatalog safeFamily = Objects.requireNonNullElse(assetFamily, AssetFamilyCatalog.UNKNOWN);
final Map<String, String> safeMetadata = Map.copyOf(Objects.requireNonNull(outputMetadata, "outputMetadata"));
final Map<String, Object> safePipeline = Map.copyOf(Objects.requireNonNull(outputPipeline, "outputPipeline"));
return switch (safeFamily) {
case TILE_BANK -> evaluateTileBank(artifactCount, safeMetadata);
case SOUND_BANK -> evaluateSoundBank(resolveSoundBankUsedBytes(safePipeline, usedBytes));
case UNKNOWN -> new AssetDetailsBankCompositionCapacityState(
0.0d,
StudioAssetCapacitySeverity.GREEN,
false,
artifactCount + " selected",
"");
};
}
public int maxArtifactsForTileBank(Map<String, String> outputMetadata) {
final String tileSizeValue = Objects.requireNonNull(outputMetadata, "outputMetadata")
.getOrDefault("tile_size", "16x16");
return switch (tileSizeValue) {
case "8x8" -> slotsForTileSize(8);
case "32x32" -> slotsForTileSize(32);
default -> slotsForTileSize(16);
};
}
private AssetDetailsBankCompositionCapacityState evaluateTileBank(
int artifactCount,
Map<String, String> outputMetadata) {
final int maxSlots = maxArtifactsForTileBank(outputMetadata);
final int safeArtifactCount = Math.max(0, artifactCount);
final double progress = maxSlots <= 0 ? 0.0d : (double) safeArtifactCount / (double) maxSlots;
final boolean blocked = safeArtifactCount >= maxSlots;
return new AssetDetailsBankCompositionCapacityState(
progress,
severityFor(progress),
blocked,
safeArtifactCount + " / " + maxSlots,
blocked ? "Tile bank slot capacity reached." : "");
}
private AssetDetailsBankCompositionCapacityState evaluateSoundBank(long usedBytes) {
final long safeUsedBytes = Math.max(0L, usedBytes);
final double progress = (double) safeUsedBytes / (double) SOUND_BANK_MAX_BYTES;
final boolean blocked = safeUsedBytes >= SOUND_BANK_MAX_BYTES;
return new AssetDetailsBankCompositionCapacityState(
progress,
severityFor(progress),
blocked,
safeUsedBytes + " / " + SOUND_BANK_MAX_BYTES + " bytes",
blocked ? "Sound bank byte capacity reached." : "");
}
private long resolveSoundBankUsedBytes(Map<String, Object> outputPipeline, long fallbackUsedBytes) {
final Object samplesNode = outputPipeline.get("samples");
if (!(samplesNode instanceof Map<?, ?> samples)) {
return Math.max(0L, fallbackUsedBytes);
}
long maxEndExclusive = 0L;
for (Object sampleValue : samples.values()) {
if (!(sampleValue instanceof Map<?, ?> sampleMetadata)) {
continue;
}
final long offset = longValue(sampleMetadata.get("offset"));
final long length = Math.max(longValue(sampleMetadata.get("len")), longValue(sampleMetadata.get("length")));
maxEndExclusive = Math.max(maxEndExclusive, Math.max(0L, offset) + Math.max(0L, length));
}
return Math.max(maxEndExclusive, Math.max(0L, fallbackUsedBytes));
}
private long longValue(Object value) {
if (value instanceof Number number) {
return number.longValue();
}
if (value instanceof String text) {
try {
return Long.parseLong(text.trim());
} catch (NumberFormatException ignored) {
return 0L;
}
}
return 0L;
}
private static int slotsForTileSize(int tileSize) {
final int tilesPerAxis = Math.max(1, TILE_ATLAS_SIZE_PX / tileSize);
return tilesPerAxis * tilesPerAxis;
}
private StudioAssetCapacitySeverity severityFor(double progress) {
if (progress >= 0.95d) {
return StudioAssetCapacitySeverity.RED;
}
if (progress >= 0.65d) {
return StudioAssetCapacitySeverity.ORANGE;
}
return StudioAssetCapacitySeverity.GREEN;
}
}

View File

@ -1,12 +1,14 @@
package p.studio.workspaces.assets.details.bank;
import p.packer.messages.assets.AssetFamilyCatalog;
import p.studio.controls.banks.StudioAssetCapacitySeverity;
import p.studio.workspaces.assets.messages.AssetWorkspaceBankCompositionFile;
import java.util.List;
import java.util.Map;
final class AssetDetailsFallbackBankCompositionFamilySupport extends AssetDetailsAbstractBankCompositionFamilySupport {
private final AssetBankCapacityService capacityService = new AssetBankCapacityService();
@Override
public boolean supports(AssetFamilyCatalog assetFamily) {
return true;
@ -22,11 +24,11 @@ final class AssetDetailsFallbackBankCompositionFamilySupport extends AssetDetail
@Override
public AssetDetailsBankCompositionCapacityState evaluate(AssetDetailsBankCompositionDraft draft) {
return new AssetDetailsBankCompositionCapacityState(
0.0d,
StudioAssetCapacitySeverity.GREEN,
false,
draft.selectedFiles().size() + " selected",
"");
return capacityService.evaluate(
AssetFamilyCatalog.UNKNOWN,
draft.selectedFiles().size(),
Map.of(),
Map.of(),
0L);
}
}

View File

@ -1,14 +1,23 @@
package p.studio.workspaces.assets.details.bank;
import p.packer.messages.assets.AssetFamilyCatalog;
import p.studio.controls.banks.StudioAssetCapacitySeverity;
import p.studio.workspaces.assets.messages.AssetWorkspaceBankCompositionFile;
import java.util.List;
import java.util.Map;
final class AssetDetailsSoundBankCompositionFamilySupport extends AssetDetailsAbstractBankCompositionFamilySupport {
private static final long MAX_BYTES = 1024L * 1024L;
private final AssetBankCapacityService capacityService = new AssetBankCapacityService();
private Map<String, Object> outputPipeline = Map.of();
@Override
public AssetDetailsBankCompositionDraft createDraft(p.studio.workspaces.assets.messages.AssetWorkspaceAssetDetails details) {
outputPipeline = details.outputPipeline();
return super.createDraft(details);
}
@Override
public boolean supports(AssetFamilyCatalog assetFamily) {
return assetFamily == AssetFamilyCatalog.SOUND_BANK;
@ -25,28 +34,15 @@ final class AssetDetailsSoundBankCompositionFamilySupport extends AssetDetailsAb
@Override
public AssetDetailsBankCompositionCapacityState evaluate(AssetDetailsBankCompositionDraft draft) {
final long usedBytes = selectedBytes(draft.selectedFiles());
final double progress = (double) usedBytes / (double) MAX_BYTES;
final boolean blocked = usedBytes >= MAX_BYTES;
return new AssetDetailsBankCompositionCapacityState(
progress,
severityFor(progress),
blocked,
usedBytes + " / " + MAX_BYTES + " bytes",
blocked ? "Sound bank byte capacity reached." : "");
return capacityService.evaluate(
AssetFamilyCatalog.SOUND_BANK,
draft.selectedFiles().size(),
Map.of(),
outputPipeline,
selectedBytes(draft.selectedFiles()));
}
private long selectedBytes(List<AssetWorkspaceBankCompositionFile> files) {
return files.stream().mapToLong(AssetWorkspaceBankCompositionFile::size).sum();
}
private StudioAssetCapacitySeverity severityFor(double progress) {
if (progress >= 0.95d) {
return StudioAssetCapacitySeverity.RED;
}
if (progress >= 0.65d) {
return StudioAssetCapacitySeverity.ORANGE;
}
return StudioAssetCapacitySeverity.GREEN;
}
}

View File

@ -1,16 +1,17 @@
package p.studio.workspaces.assets.details.bank;
import p.packer.messages.assets.AssetFamilyCatalog;
import p.studio.controls.banks.StudioAssetCapacitySeverity;
import p.studio.workspaces.assets.messages.AssetWorkspaceAssetDetails;
import p.studio.workspaces.assets.messages.AssetWorkspaceBankCompositionFile;
import java.util.List;
import java.util.Map;
final class AssetDetailsTileBankCompositionFamilySupport extends AssetDetailsAbstractBankCompositionFamilySupport {
private static final int ATLAS_SIZE_PX = 256;
private final AssetBankCapacityService capacityService = new AssetBankCapacityService();
private int maxSlots = slotsForTileSize(16);
private int maxSlots = capacityService.maxArtifactsForTileBank(Map.of());
private Map<String, String> outputMetadata = Map.of();
@Override
public boolean supports(AssetFamilyCatalog assetFamily) {
@ -19,7 +20,8 @@ final class AssetDetailsTileBankCompositionFamilySupport extends AssetDetailsAbs
@Override
public AssetDetailsBankCompositionDraft createDraft(AssetWorkspaceAssetDetails details) {
maxSlots = computeMaxSlots(details);
outputMetadata = metadataMap(details);
maxSlots = capacityService.maxArtifactsForTileBank(outputMetadata);
return super.createDraft(details);
}
@ -33,42 +35,20 @@ final class AssetDetailsTileBankCompositionFamilySupport extends AssetDetailsAbs
@Override
public AssetDetailsBankCompositionCapacityState evaluate(AssetDetailsBankCompositionDraft draft) {
final int used = draft.selectedFiles().size();
final double progress = maxSlots <= 0 ? 0.0d : (double) used / (double) maxSlots;
final boolean blocked = used >= maxSlots;
return new AssetDetailsBankCompositionCapacityState(
progress,
severityFor(progress),
blocked,
used + " / " + maxSlots,
blocked ? "Tile bank slot capacity reached." : "");
return capacityService.evaluate(
AssetFamilyCatalog.TILE_BANK,
draft.selectedFiles().size(),
outputMetadata,
Map.of(),
0L);
}
private int computeMaxSlots(AssetWorkspaceAssetDetails details) {
final String tileSizeValue = details.metadataFields().stream()
private Map<String, String> metadataMap(AssetWorkspaceAssetDetails details) {
final String tileSize = details.metadataFields().stream()
.filter(field -> field.key().equals("tile_size"))
.map(field -> field.value())
.findFirst()
.orElse("16x16");
return switch (tileSizeValue) {
case "8x8" -> slotsForTileSize(8);
case "32x32" -> slotsForTileSize(32);
default -> slotsForTileSize(16);
};
}
private static int slotsForTileSize(int tileSize) {
final int tilesPerAxis = Math.max(1, ATLAS_SIZE_PX / tileSize);
return tilesPerAxis * tilesPerAxis;
}
private StudioAssetCapacitySeverity severityFor(double progress) {
if (progress >= 0.95d) {
return StudioAssetCapacitySeverity.RED;
}
if (progress >= 0.65d) {
return StudioAssetCapacitySeverity.ORANGE;
}
return StudioAssetCapacitySeverity.GREEN;
return Map.of("tile_size", tileSize);
}
}

View File

@ -17,6 +17,7 @@ public record AssetWorkspaceAssetDetails(
List<OutputCodecCatalog> availableOutputCodecs,
Map<OutputCodecCatalog, List<PackerCodecConfigurationFieldDTO>> codecConfigurationFieldsByCodec,
List<PackerCodecConfigurationFieldDTO> metadataFields,
Map<String, Object> outputPipeline,
AssetWorkspaceBankCompositionDetails bankComposition,
List<Map<String, Object>> pipelinePalettes,
List<PackerDiagnosticDTO> diagnostics) {
@ -29,6 +30,7 @@ public record AssetWorkspaceAssetDetails(
availableOutputCodecs = List.copyOf(Objects.requireNonNull(availableOutputCodecs, "availableOutputCodecs"));
codecConfigurationFieldsByCodec = Map.copyOf(Objects.requireNonNull(codecConfigurationFieldsByCodec, "codecConfigurationFieldsByCodec"));
metadataFields = List.copyOf(Objects.requireNonNull(metadataFields, "metadataFields"));
outputPipeline = Map.copyOf(Objects.requireNonNull(outputPipeline, "outputPipeline"));
bankComposition = Objects.requireNonNull(bankComposition, "bankComposition");
pipelinePalettes = List.copyOf(Objects.requireNonNull(pipelinePalettes, "pipelinePalettes"));
diagnostics = List.copyOf(Objects.requireNonNull(diagnostics, "diagnostics"));

View File

@ -6,6 +6,9 @@ import javafx.geometry.Pos;
import javafx.scene.Node;
import javafx.scene.Scene;
import javafx.scene.control.*;
import javafx.scene.control.OverrunStyle;
import javafx.scene.layout.ColumnConstraints;
import javafx.scene.layout.GridPane;
import javafx.scene.layout.HBox;
import javafx.scene.layout.Priority;
import javafx.scene.layout.VBox;
@ -28,6 +31,8 @@ import p.studio.Container;
import p.studio.projects.ProjectReference;
import p.studio.utilities.i18n.I18n;
import p.studio.workspaces.assets.details.AssetDetailsUiSupport;
import p.studio.workspaces.assets.details.bank.AssetBankCapacityService;
import p.studio.workspaces.assets.details.bank.AssetDetailsBankCompositionCapacityState;
import java.util.List;
import java.util.Objects;
@ -53,6 +58,7 @@ public final class PackWorkspaceWizard {
private final Button packButton = new Button();
private final Button closeButton = new Button();
private final Button copyFailuresButton = new Button();
private final AssetBankCapacityService bankCapacityService = new AssetBankCapacityService();
private Phase phase = Phase.DEEP_SYNC_INTRO;
private boolean deepSyncRunning;
@ -208,38 +214,86 @@ public final class PackWorkspaceWizard {
return AssetDetailsUiSupport.createSectionMessage(
Container.i18n().text(I18n.ASSETS_PACK_WIZARD_VALIDATION_EMPTY));
}
final Accordion accordion = new Accordion();
final VBox assets = new VBox(10);
for (PackerPackSummaryAssetDTO asset : summaryResult.packSummary().assets()) {
accordion.getPanes().add(createSummaryPane(asset));
assets.getChildren().add(createSummaryRow(asset));
}
VBox.setVgrow(accordion, Priority.ALWAYS);
return accordion;
final ScrollPane scrollPane = new ScrollPane(assets);
scrollPane.setFitToWidth(true);
scrollPane.setHbarPolicy(ScrollPane.ScrollBarPolicy.NEVER);
VBox.setVgrow(scrollPane, Priority.ALWAYS);
return scrollPane;
}
private TitledPane createSummaryPane(PackerPackSummaryAssetDTO asset) {
final VBox content = new VBox(8);
content.getChildren().addAll(
AssetDetailsUiSupport.createKeyValueRow(
Container.i18n().text(I18n.ASSETS_LABEL_ASSET_ID),
Integer.toString(asset.assetId())),
AssetDetailsUiSupport.createKeyValueRow(
Container.i18n().text(I18n.ASSETS_LABEL_NAME),
asset.assetName()),
AssetDetailsUiSupport.createKeyValueRow(
Container.i18n().text(I18n.ASSETS_LABEL_TYPE),
AssetDetailsUiSupport.typeLabel(asset.assetFamily())),
AssetDetailsUiSupport.createKeyValueRow(
Container.i18n().text(I18n.ASSETS_PACK_WIZARD_LABEL_MIN_ARTIFACTS),
Integer.toString(asset.minArtifactCount())),
AssetDetailsUiSupport.createKeyValueRow(
Container.i18n().text(I18n.ASSETS_PACK_WIZARD_LABEL_MAX_ARTIFACTS),
Integer.toString(asset.maxArtifactCount())),
AssetDetailsUiSupport.createKeyValueRow(
Container.i18n().text(I18n.ASSETS_PACK_WIZARD_LABEL_LAST_MODIFIED),
Long.toString(asset.lastModified())));
final TitledPane pane = new TitledPane(asset.assetName(), content);
pane.setExpanded(false);
return pane;
private Node createSummaryRow(PackerPackSummaryAssetDTO asset) {
final Label assetName = new Label(truncate(asset.assetName(), 50));
assetName.getStyleClass().add("assets-details-value");
assetName.setTextOverrun(OverrunStyle.ELLIPSIS);
assetName.setMaxWidth(Double.MAX_VALUE);
final Label assetIdChip = AssetDetailsUiSupport.createChip(
"assets-details-chip-generic",
"#" + asset.assetId());
final Label familyChip = AssetDetailsUiSupport.createChip(
AssetDetailsUiSupport.typeChipTone(asset.assetFamily()),
AssetDetailsUiSupport.typeLabel(asset.assetFamily()));
final AssetDetailsBankCompositionCapacityState capacityState = summaryCapacityState(asset);
final ProgressBar capacityBar = new ProgressBar(capacityState.progress());
capacityBar.setMaxWidth(Double.MAX_VALUE);
applyCapacityTone(capacityBar, capacityState);
final GridPane row = new GridPane();
row.setHgap(12);
row.setVgap(0);
row.setAlignment(Pos.CENTER_LEFT);
row.getStyleClass().add("studio-card");
row.setMaxWidth(Double.MAX_VALUE);
final ColumnConstraints idColumn = new ColumnConstraints();
idColumn.setPercentWidth(12);
final ColumnConstraints nameColumn = new ColumnConstraints();
nameColumn.setPercentWidth(38);
final ColumnConstraints familyColumn = new ColumnConstraints();
familyColumn.setPercentWidth(15);
final ColumnConstraints barColumn = new ColumnConstraints();
barColumn.setPercentWidth(35);
barColumn.setHgrow(Priority.ALWAYS);
row.getColumnConstraints().setAll(idColumn, nameColumn, familyColumn, barColumn);
row.add(assetIdChip, 0, 0);
row.add(assetName, 1, 0);
row.add(familyChip, 2, 0);
row.add(capacityBar, 3, 0);
GridPane.setHgrow(assetName, Priority.ALWAYS);
GridPane.setHgrow(capacityBar, Priority.ALWAYS);
return row;
}
private AssetDetailsBankCompositionCapacityState summaryCapacityState(PackerPackSummaryAssetDTO asset) {
return bankCapacityService.evaluate(
asset.assetFamily(),
asset.artifactCount(),
asset.outputMetadata(),
asset.outputPipeline(),
0L);
}
private void applyCapacityTone(ProgressBar capacityBar, AssetDetailsBankCompositionCapacityState state) {
capacityBar.setStyle(switch (state.severity()) {
case GREEN -> "-fx-accent: #2f9e44;";
case ORANGE -> "-fx-accent: #f08c00;";
case RED -> "-fx-accent: #e03131;";
});
}
private String truncate(String value, int maxChars) {
if (value == null || value.length() <= maxChars) {
return value;
}
if (maxChars <= 1) {
return value.substring(0, Math.max(0, maxChars));
}
return value.substring(0, Math.max(0, maxChars - 3)) + "...";
}
private void renderValidationPhase() {

View File

@ -108,6 +108,7 @@ final class AssetDetailsBankCompositionCoordinatorTest {
List.of(OutputCodecCatalog.NONE),
Map.of(OutputCodecCatalog.NONE, List.of()),
List.of(new PackerCodecConfigurationFieldDTO("tile_size", "Tile Size", PackerCodecConfigurationFieldType.TEXT, tileSize, true, List.of())),
Map.of(),
new AssetWorkspaceBankCompositionDetails(
files("tile", fileCount, 1024L),
List.of(),
@ -125,6 +126,9 @@ final class AssetDetailsBankCompositionCoordinatorTest {
List.of(OutputCodecCatalog.NONE),
Map.of(OutputCodecCatalog.NONE, List.of()),
List.of(),
Map.of("samples", Map.of(
"1", Map.of("offset", 0L, "length", firstSize),
"2", Map.of("offset", firstSize, "length", secondSize))),
new AssetWorkspaceBankCompositionDetails(
List.of(
new AssetWorkspaceBankCompositionFile("a.wav", "a.wav", firstSize, 1L, null, Map.of()),

View File

@ -90,6 +90,7 @@ final class AssetDetailsPaletteOverhaulingCoordinatorTest {
List.of(OutputCodecCatalog.NONE),
Map.of(OutputCodecCatalog.NONE, List.of()),
List.of(),
Map.of(),
new AssetWorkspaceBankCompositionDetails(availableFiles, selectedFiles, 0L),
selectedFiles.stream().map(file -> (Map<String, Object>) file.metadata().get("palette")).toList(),
List.of());

View File

@ -1,4 +1,459 @@
[ {
"source" : "Assets",
"message" : "Asset scan diagnostics updated.",
"severity" : "INFO",
"sticky" : false
}, {
"source" : "Assets",
"message" : "Discovered asset: bla",
"severity" : "INFO",
"sticky" : false
}, {
"source" : "Assets",
"message" : "Discovered asset: one-more-atlas",
"severity" : "INFO",
"sticky" : false
}, {
"source" : "Assets",
"message" : "Discovered asset: ui_atlas",
"severity" : "INFO",
"sticky" : false
}, {
"source" : "Assets",
"message" : "Discovered asset: one-more-atlas",
"severity" : "INFO",
"sticky" : false
}, {
"source" : "Assets",
"message" : "Discovered asset: bbb2",
"severity" : "INFO",
"sticky" : false
}, {
"source" : "Assets",
"message" : "Discovered asset: ui_atlas",
"severity" : "INFO",
"sticky" : false
}, {
"source" : "Assets",
"message" : "Discovered asset: Bigode",
"severity" : "INFO",
"sticky" : false
}, {
"source" : "Assets",
"message" : "7 assets loaded",
"severity" : "SUCCESS",
"sticky" : false
}, {
"source" : "Assets",
"message" : "Asset scan diagnostics updated.",
"severity" : "INFO",
"sticky" : false
}, {
"source" : "Assets",
"message" : "Discovered asset: bla",
"severity" : "INFO",
"sticky" : false
}, {
"source" : "Assets",
"message" : "Discovered asset: one-more-atlas",
"severity" : "INFO",
"sticky" : false
}, {
"source" : "Assets",
"message" : "Discovered asset: ui_atlas",
"severity" : "INFO",
"sticky" : false
}, {
"source" : "Assets",
"message" : "Discovered asset: one-more-atlas",
"severity" : "INFO",
"sticky" : false
}, {
"source" : "Assets",
"message" : "Discovered asset: bbb2",
"severity" : "INFO",
"sticky" : false
}, {
"source" : "Assets",
"message" : "Discovered asset: ui_atlas",
"severity" : "INFO",
"sticky" : false
}, {
"source" : "Assets",
"message" : "Discovered asset: Bigode",
"severity" : "INFO",
"sticky" : false
}, {
"source" : "Assets",
"message" : "Asset scan started",
"severity" : "INFO",
"sticky" : false
}, {
"source" : "Assets",
"message" : "Asset scan diagnostics updated.",
"severity" : "INFO",
"sticky" : false
}, {
"source" : "Assets",
"message" : "Discovered asset: bla",
"severity" : "INFO",
"sticky" : false
}, {
"source" : "Assets",
"message" : "Discovered asset: one-more-atlas",
"severity" : "INFO",
"sticky" : false
}, {
"source" : "Assets",
"message" : "Discovered asset: ui_atlas",
"severity" : "INFO",
"sticky" : false
}, {
"source" : "Assets",
"message" : "Discovered asset: one-more-atlas",
"severity" : "INFO",
"sticky" : false
}, {
"source" : "Assets",
"message" : "Discovered asset: bbb2",
"severity" : "INFO",
"sticky" : false
}, {
"source" : "Assets",
"message" : "Discovered asset: ui_atlas",
"severity" : "INFO",
"sticky" : false
}, {
"source" : "Assets",
"message" : "Discovered asset: Bigode",
"severity" : "INFO",
"sticky" : false
}, {
"source" : "Assets",
"message" : "7 assets loaded",
"severity" : "SUCCESS",
"sticky" : false
}, {
"source" : "Assets",
"message" : "Asset scan diagnostics updated.",
"severity" : "INFO",
"sticky" : false
}, {
"source" : "Assets",
"message" : "Discovered asset: bla",
"severity" : "INFO",
"sticky" : false
}, {
"source" : "Assets",
"message" : "Discovered asset: one-more-atlas",
"severity" : "INFO",
"sticky" : false
}, {
"source" : "Assets",
"message" : "Discovered asset: ui_atlas",
"severity" : "INFO",
"sticky" : false
}, {
"source" : "Assets",
"message" : "Discovered asset: one-more-atlas",
"severity" : "INFO",
"sticky" : false
}, {
"source" : "Assets",
"message" : "Discovered asset: bbb2",
"severity" : "INFO",
"sticky" : false
}, {
"source" : "Assets",
"message" : "Discovered asset: ui_atlas",
"severity" : "INFO",
"sticky" : false
}, {
"source" : "Assets",
"message" : "Discovered asset: Bigode",
"severity" : "INFO",
"sticky" : false
}, {
"source" : "Assets",
"message" : "Asset scan started",
"severity" : "INFO",
"sticky" : false
}, {
"source" : "Assets",
"message" : "Included asset in build: ui/sound",
"severity" : "SUCCESS",
"sticky" : false
}, {
"source" : "Assets",
"message" : "Asset scan diagnostics updated.",
"severity" : "INFO",
"sticky" : false
}, {
"source" : "Assets",
"message" : "Discovered asset: bla",
"severity" : "INFO",
"sticky" : false
}, {
"source" : "Assets",
"message" : "Discovered asset: one-more-atlas",
"severity" : "INFO",
"sticky" : false
}, {
"source" : "Assets",
"message" : "Discovered asset: ui_atlas",
"severity" : "INFO",
"sticky" : false
}, {
"source" : "Assets",
"message" : "Discovered asset: one-more-atlas",
"severity" : "INFO",
"sticky" : false
}, {
"source" : "Assets",
"message" : "Discovered asset: bbb2",
"severity" : "INFO",
"sticky" : false
}, {
"source" : "Assets",
"message" : "Discovered asset: ui_atlas",
"severity" : "INFO",
"sticky" : false
}, {
"source" : "Assets",
"message" : "Discovered asset: Bigode",
"severity" : "INFO",
"sticky" : false
}, {
"source" : "Assets",
"message" : "7 assets loaded",
"severity" : "SUCCESS",
"sticky" : false
}, {
"source" : "Assets",
"message" : "Asset scan diagnostics updated.",
"severity" : "INFO",
"sticky" : false
}, {
"source" : "Assets",
"message" : "Discovered asset: bla",
"severity" : "INFO",
"sticky" : false
}, {
"source" : "Assets",
"message" : "Discovered asset: one-more-atlas",
"severity" : "INFO",
"sticky" : false
}, {
"source" : "Assets",
"message" : "Discovered asset: ui_atlas",
"severity" : "INFO",
"sticky" : false
}, {
"source" : "Assets",
"message" : "Discovered asset: one-more-atlas",
"severity" : "INFO",
"sticky" : false
}, {
"source" : "Assets",
"message" : "Discovered asset: bbb2",
"severity" : "INFO",
"sticky" : false
}, {
"source" : "Assets",
"message" : "Discovered asset: ui_atlas",
"severity" : "INFO",
"sticky" : false
}, {
"source" : "Assets",
"message" : "Discovered asset: Bigode",
"severity" : "INFO",
"sticky" : false
}, {
"source" : "Assets",
"message" : "Asset scan started",
"severity" : "INFO",
"sticky" : false
}, {
"source" : "Assets",
"message" : "Asset scan diagnostics updated.",
"severity" : "INFO",
"sticky" : false
}, {
"source" : "Assets",
"message" : "Discovered asset: bla",
"severity" : "INFO",
"sticky" : false
}, {
"source" : "Assets",
"message" : "Discovered asset: one-more-atlas",
"severity" : "INFO",
"sticky" : false
}, {
"source" : "Assets",
"message" : "Discovered asset: ui_atlas",
"severity" : "INFO",
"sticky" : false
}, {
"source" : "Assets",
"message" : "Discovered asset: one-more-atlas",
"severity" : "INFO",
"sticky" : false
}, {
"source" : "Assets",
"message" : "Discovered asset: bbb2",
"severity" : "INFO",
"sticky" : false
}, {
"source" : "Assets",
"message" : "Discovered asset: ui_atlas",
"severity" : "INFO",
"sticky" : false
}, {
"source" : "Assets",
"message" : "Discovered asset: Bigode",
"severity" : "INFO",
"sticky" : false
}, {
"source" : "Assets",
"message" : "7 assets loaded",
"severity" : "SUCCESS",
"sticky" : false
}, {
"source" : "Assets",
"message" : "Asset scan diagnostics updated.",
"severity" : "INFO",
"sticky" : false
}, {
"source" : "Assets",
"message" : "Discovered asset: bla",
"severity" : "INFO",
"sticky" : false
}, {
"source" : "Assets",
"message" : "Discovered asset: one-more-atlas",
"severity" : "INFO",
"sticky" : false
}, {
"source" : "Assets",
"message" : "Discovered asset: ui_atlas",
"severity" : "INFO",
"sticky" : false
}, {
"source" : "Assets",
"message" : "Discovered asset: one-more-atlas",
"severity" : "INFO",
"sticky" : false
}, {
"source" : "Assets",
"message" : "Discovered asset: bbb2",
"severity" : "INFO",
"sticky" : false
}, {
"source" : "Assets",
"message" : "Discovered asset: ui_atlas",
"severity" : "INFO",
"sticky" : false
}, {
"source" : "Assets",
"message" : "Discovered asset: Bigode",
"severity" : "INFO",
"sticky" : false
}, {
"source" : "Assets",
"message" : "Asset scan started",
"severity" : "INFO",
"sticky" : false
}, {
"source" : "Assets",
"message" : "Asset scan diagnostics updated.",
"severity" : "INFO",
"sticky" : false
}, {
"source" : "Assets",
"message" : "Discovered asset: bla",
"severity" : "INFO",
"sticky" : false
}, {
"source" : "Assets",
"message" : "Discovered asset: one-more-atlas",
"severity" : "INFO",
"sticky" : false
}, {
"source" : "Assets",
"message" : "Discovered asset: ui_atlas",
"severity" : "INFO",
"sticky" : false
}, {
"source" : "Assets",
"message" : "Discovered asset: one-more-atlas",
"severity" : "INFO",
"sticky" : false
}, {
"source" : "Assets",
"message" : "Discovered asset: bbb2",
"severity" : "INFO",
"sticky" : false
}, {
"source" : "Assets",
"message" : "Discovered asset: ui_atlas",
"severity" : "INFO",
"sticky" : false
}, {
"source" : "Assets",
"message" : "Discovered asset: Bigode",
"severity" : "INFO",
"sticky" : false
}, {
"source" : "Assets",
"message" : "7 assets loaded",
"severity" : "SUCCESS",
"sticky" : false
}, {
"source" : "Assets",
"message" : "Asset scan diagnostics updated.",
"severity" : "INFO",
"sticky" : false
}, {
"source" : "Assets",
"message" : "Discovered asset: bla",
"severity" : "INFO",
"sticky" : false
}, {
"source" : "Assets",
"message" : "Discovered asset: one-more-atlas",
"severity" : "INFO",
"sticky" : false
}, {
"source" : "Assets",
"message" : "Discovered asset: ui_atlas",
"severity" : "INFO",
"sticky" : false
}, {
"source" : "Assets",
"message" : "Discovered asset: one-more-atlas",
"severity" : "INFO",
"sticky" : false
}, {
"source" : "Assets",
"message" : "Discovered asset: bbb2",
"severity" : "INFO",
"sticky" : false
}, {
"source" : "Assets",
"message" : "Discovered asset: ui_atlas",
"severity" : "INFO",
"sticky" : false
}, {
"source" : "Assets",
"message" : "Discovered asset: Bigode",
"severity" : "INFO",
"sticky" : false
}, {
"source" : "Assets",
"message" : "Asset scan started",
"severity" : "INFO",
"sticky" : false
}, {
"source" : "Assets",
"message" : "7 assets loaded",
"severity" : "SUCCESS",
@ -2043,459 +2498,4 @@
"message" : "Discovered asset: bla",
"severity" : "INFO",
"sticky" : false
}, {
"source" : "Assets",
"message" : "Discovered asset: one-more-atlas",
"severity" : "INFO",
"sticky" : false
}, {
"source" : "Assets",
"message" : "Discovered asset: ui_atlas",
"severity" : "INFO",
"sticky" : false
}, {
"source" : "Assets",
"message" : "Discovered asset: one-more-atlas",
"severity" : "INFO",
"sticky" : false
}, {
"source" : "Assets",
"message" : "Discovered asset: bbb2",
"severity" : "INFO",
"sticky" : false
}, {
"source" : "Assets",
"message" : "Discovered asset: ui_atlas",
"severity" : "INFO",
"sticky" : false
}, {
"source" : "Assets",
"message" : "Discovered asset: Bigode",
"severity" : "INFO",
"sticky" : false
}, {
"source" : "Assets",
"message" : "Asset scan started",
"severity" : "INFO",
"sticky" : false
}, {
"source" : "Assets",
"message" : "7 assets loaded",
"severity" : "SUCCESS",
"sticky" : false
}, {
"source" : "Assets",
"message" : "Asset scan diagnostics updated.",
"severity" : "INFO",
"sticky" : false
}, {
"source" : "Assets",
"message" : "Discovered asset: bla",
"severity" : "INFO",
"sticky" : false
}, {
"source" : "Assets",
"message" : "Discovered asset: one-more-atlas",
"severity" : "INFO",
"sticky" : false
}, {
"source" : "Assets",
"message" : "Discovered asset: ui_atlas",
"severity" : "INFO",
"sticky" : false
}, {
"source" : "Assets",
"message" : "Discovered asset: one-more-atlas",
"severity" : "INFO",
"sticky" : false
}, {
"source" : "Assets",
"message" : "Discovered asset: bbb2",
"severity" : "INFO",
"sticky" : false
}, {
"source" : "Assets",
"message" : "Discovered asset: ui_atlas",
"severity" : "INFO",
"sticky" : false
}, {
"source" : "Assets",
"message" : "Discovered asset: Bigode",
"severity" : "INFO",
"sticky" : false
}, {
"source" : "Assets",
"message" : "Asset scan started",
"severity" : "INFO",
"sticky" : false
}, {
"source" : "Assets",
"message" : "7 assets loaded",
"severity" : "SUCCESS",
"sticky" : false
}, {
"source" : "Assets",
"message" : "Asset scan diagnostics updated.",
"severity" : "INFO",
"sticky" : false
}, {
"source" : "Assets",
"message" : "Discovered asset: bla",
"severity" : "INFO",
"sticky" : false
}, {
"source" : "Assets",
"message" : "Discovered asset: one-more-atlas",
"severity" : "INFO",
"sticky" : false
}, {
"source" : "Assets",
"message" : "Discovered asset: ui_atlas",
"severity" : "INFO",
"sticky" : false
}, {
"source" : "Assets",
"message" : "Discovered asset: one-more-atlas",
"severity" : "INFO",
"sticky" : false
}, {
"source" : "Assets",
"message" : "Discovered asset: bbb2",
"severity" : "INFO",
"sticky" : false
}, {
"source" : "Assets",
"message" : "Discovered asset: ui_atlas",
"severity" : "INFO",
"sticky" : false
}, {
"source" : "Assets",
"message" : "Discovered asset: Bigode",
"severity" : "INFO",
"sticky" : false
}, {
"source" : "Assets",
"message" : "Asset scan started",
"severity" : "INFO",
"sticky" : false
}, {
"source" : "Assets",
"message" : "7 assets loaded",
"severity" : "SUCCESS",
"sticky" : false
}, {
"source" : "Assets",
"message" : "Asset scan diagnostics updated.",
"severity" : "INFO",
"sticky" : false
}, {
"source" : "Assets",
"message" : "Discovered asset: bla",
"severity" : "INFO",
"sticky" : false
}, {
"source" : "Assets",
"message" : "Discovered asset: one-more-atlas",
"severity" : "INFO",
"sticky" : false
}, {
"source" : "Assets",
"message" : "Discovered asset: ui_atlas",
"severity" : "INFO",
"sticky" : false
}, {
"source" : "Assets",
"message" : "Discovered asset: one-more-atlas",
"severity" : "INFO",
"sticky" : false
}, {
"source" : "Assets",
"message" : "Discovered asset: bbb2",
"severity" : "INFO",
"sticky" : false
}, {
"source" : "Assets",
"message" : "Discovered asset: ui_atlas",
"severity" : "INFO",
"sticky" : false
}, {
"source" : "Assets",
"message" : "Discovered asset: Bigode",
"severity" : "INFO",
"sticky" : false
}, {
"source" : "Assets",
"message" : "Asset scan started",
"severity" : "INFO",
"sticky" : false
}, {
"source" : "Assets",
"message" : "7 assets loaded",
"severity" : "SUCCESS",
"sticky" : false
}, {
"source" : "Assets",
"message" : "Asset scan diagnostics updated.",
"severity" : "INFO",
"sticky" : false
}, {
"source" : "Assets",
"message" : "Discovered asset: bla",
"severity" : "INFO",
"sticky" : false
}, {
"source" : "Assets",
"message" : "Discovered asset: one-more-atlas",
"severity" : "INFO",
"sticky" : false
}, {
"source" : "Assets",
"message" : "Discovered asset: ui_atlas",
"severity" : "INFO",
"sticky" : false
}, {
"source" : "Assets",
"message" : "Discovered asset: one-more-atlas",
"severity" : "INFO",
"sticky" : false
}, {
"source" : "Assets",
"message" : "Discovered asset: bbb2",
"severity" : "INFO",
"sticky" : false
}, {
"source" : "Assets",
"message" : "Discovered asset: ui_atlas",
"severity" : "INFO",
"sticky" : false
}, {
"source" : "Assets",
"message" : "Discovered asset: Bigode",
"severity" : "INFO",
"sticky" : false
}, {
"source" : "Assets",
"message" : "Asset scan started",
"severity" : "INFO",
"sticky" : false
}, {
"source" : "Assets",
"message" : "7 assets loaded",
"severity" : "SUCCESS",
"sticky" : false
}, {
"source" : "Assets",
"message" : "Asset scan diagnostics updated.",
"severity" : "INFO",
"sticky" : false
}, {
"source" : "Assets",
"message" : "Discovered asset: bla",
"severity" : "INFO",
"sticky" : false
}, {
"source" : "Assets",
"message" : "Discovered asset: one-more-atlas",
"severity" : "INFO",
"sticky" : false
}, {
"source" : "Assets",
"message" : "Discovered asset: ui_atlas",
"severity" : "INFO",
"sticky" : false
}, {
"source" : "Assets",
"message" : "Discovered asset: one-more-atlas",
"severity" : "INFO",
"sticky" : false
}, {
"source" : "Assets",
"message" : "Discovered asset: bbb2",
"severity" : "INFO",
"sticky" : false
}, {
"source" : "Assets",
"message" : "Discovered asset: ui_atlas",
"severity" : "INFO",
"sticky" : false
}, {
"source" : "Assets",
"message" : "Discovered asset: Bigode",
"severity" : "INFO",
"sticky" : false
}, {
"source" : "Assets",
"message" : "Asset scan started",
"severity" : "INFO",
"sticky" : false
}, {
"source" : "Assets",
"message" : "7 assets loaded",
"severity" : "SUCCESS",
"sticky" : false
}, {
"source" : "Assets",
"message" : "Asset scan diagnostics updated.",
"severity" : "INFO",
"sticky" : false
}, {
"source" : "Assets",
"message" : "Discovered asset: bla",
"severity" : "INFO",
"sticky" : false
}, {
"source" : "Assets",
"message" : "Discovered asset: one-more-atlas",
"severity" : "INFO",
"sticky" : false
}, {
"source" : "Assets",
"message" : "Discovered asset: ui_atlas",
"severity" : "INFO",
"sticky" : false
}, {
"source" : "Assets",
"message" : "Discovered asset: one-more-atlas",
"severity" : "INFO",
"sticky" : false
}, {
"source" : "Assets",
"message" : "Discovered asset: bbb2",
"severity" : "INFO",
"sticky" : false
}, {
"source" : "Assets",
"message" : "Discovered asset: ui_atlas",
"severity" : "INFO",
"sticky" : false
}, {
"source" : "Assets",
"message" : "Discovered asset: Bigode",
"severity" : "INFO",
"sticky" : false
}, {
"source" : "Assets",
"message" : "Asset scan started",
"severity" : "INFO",
"sticky" : false
}, {
"source" : "Assets",
"message" : "7 assets loaded",
"severity" : "SUCCESS",
"sticky" : false
}, {
"source" : "Assets",
"message" : "Asset scan diagnostics updated.",
"severity" : "INFO",
"sticky" : false
}, {
"source" : "Assets",
"message" : "Discovered asset: bla",
"severity" : "INFO",
"sticky" : false
}, {
"source" : "Assets",
"message" : "Discovered asset: one-more-atlas",
"severity" : "INFO",
"sticky" : false
}, {
"source" : "Assets",
"message" : "Discovered asset: ui_atlas",
"severity" : "INFO",
"sticky" : false
}, {
"source" : "Assets",
"message" : "Discovered asset: one-more-atlas",
"severity" : "INFO",
"sticky" : false
}, {
"source" : "Assets",
"message" : "Discovered asset: bbb2",
"severity" : "INFO",
"sticky" : false
}, {
"source" : "Assets",
"message" : "Discovered asset: ui_atlas",
"severity" : "INFO",
"sticky" : false
}, {
"source" : "Assets",
"message" : "Discovered asset: Bigode",
"severity" : "INFO",
"sticky" : false
}, {
"source" : "Assets",
"message" : "Asset scan started",
"severity" : "INFO",
"sticky" : false
}, {
"source" : "Assets",
"message" : "Excluded asset in build: recovered/one-more-atlas",
"severity" : "SUCCESS",
"sticky" : false
}, {
"source" : "Assets",
"message" : "7 assets loaded",
"severity" : "SUCCESS",
"sticky" : false
}, {
"source" : "Assets",
"message" : "Asset scan diagnostics updated.",
"severity" : "INFO",
"sticky" : false
}, {
"source" : "Assets",
"message" : "Discovered asset: bla",
"severity" : "INFO",
"sticky" : false
}, {
"source" : "Assets",
"message" : "Discovered asset: one-more-atlas",
"severity" : "INFO",
"sticky" : false
}, {
"source" : "Assets",
"message" : "Discovered asset: ui_atlas",
"severity" : "INFO",
"sticky" : false
}, {
"source" : "Assets",
"message" : "Discovered asset: one-more-atlas",
"severity" : "INFO",
"sticky" : false
}, {
"source" : "Assets",
"message" : "Discovered asset: bbb2",
"severity" : "INFO",
"sticky" : false
}, {
"source" : "Assets",
"message" : "Discovered asset: ui_atlas",
"severity" : "INFO",
"sticky" : false
}, {
"source" : "Assets",
"message" : "Discovered asset: Bigode",
"severity" : "INFO",
"sticky" : false
}, {
"source" : "Assets",
"message" : "Asset scan started",
"severity" : "INFO",
"sticky" : false
}, {
"source" : "Assets",
"message" : "Excluded asset in build: recovered/bbb2",
"severity" : "SUCCESS",
"sticky" : false
}, {
"source" : "Assets",
"message" : "7 assets loaded",
"severity" : "SUCCESS",
"sticky" : false
}, {
"source" : "Assets",
"message" : "Asset scan diagnostics updated.",
"severity" : "INFO",
"sticky" : false
} ]

File diff suppressed because it is too large Load Diff

View File

@ -15,7 +15,7 @@
"asset_id" : 8,
"asset_uuid" : "9a7386e7-6f0e-4e4c-9919-0de71e0b7031",
"root" : "ui/sound",
"included_in_build" : false
"included_in_build" : true
}, {
"asset_id" : 11,
"asset_uuid" : "64147d33-e8bf-4272-bb5c-b4c07c0276b3",