asset details (WIP)

This commit is contained in:
bQUARKz 2026-03-19 09:22:12 +00:00
parent a958052bbf
commit c0051e62cb
Signed by: bquarkz
SSH Key Fingerprint: SHA256:Z7dgqoglWwoK6j6u4QC87OveEq74WOhFN+gitsxtkf8
32 changed files with 35 additions and 135 deletions

View File

@ -3,7 +3,6 @@ package p.packer.dtos;
import p.packer.messages.assets.OutputCodecCatalog;
import p.packer.messages.assets.OutputFormatCatalog;
import java.nio.file.Path;
import java.util.List;
import java.util.Map;
import java.util.Objects;
@ -16,7 +15,6 @@ public record PackerAssetDetailsDTO(
Map<OutputCodecCatalog, List<PackerCodecConfigurationFieldDTO>> codecConfigurationFieldsByCodec,
List<PackerCodecConfigurationFieldDTO> metadataFields,
PackerBankCompositionDetailsDTO bankComposition,
Map<String, List<Path>> inputsByRole,
List<PackerDiagnosticDTO> diagnostics) {
public PackerAssetDetailsDTO {
@ -27,7 +25,6 @@ public record PackerAssetDetailsDTO(
codecConfigurationFieldsByCodec = Map.copyOf(Objects.requireNonNull(codecConfigurationFieldsByCodec, "codecConfigurationFieldsByCodec"));
metadataFields = List.copyOf(Objects.requireNonNull(metadataFields, "metadataFields"));
bankComposition = Objects.requireNonNull(bankComposition, "bankComposition");
inputsByRole = Map.copyOf(Objects.requireNonNull(inputsByRole, "inputsByRole"));
diagnostics = List.copyOf(Objects.requireNonNull(diagnostics, "diagnostics"));
}
}

View File

@ -14,7 +14,6 @@ public record PackerAssetDeclaration(
String assetUuid,
String name,
AssetFamilyCatalog assetFamily,
Map<String, List<String>> inputsByRole,
List<PackerAssetArtifactSelection> artifacts,
OutputFormatCatalog outputFormat,
OutputCodecCatalog outputCodec,
@ -28,7 +27,6 @@ public record PackerAssetDeclaration(
assetUuid = Objects.requireNonNull(assetUuid, "assetUuid").trim();
name = Objects.requireNonNull(name, "name").trim();
assetFamily = Objects.requireNonNull(assetFamily, "assetFamily");
inputsByRole = Map.copyOf(Objects.requireNonNull(inputsByRole, "inputsByRole"));
artifacts = List.copyOf(Objects.requireNonNull(artifacts, "artifacts"));
outputFormat = Objects.requireNonNull(outputFormat, "outputFormat");
outputCodec = Objects.requireNonNull(outputCodec, "outputCodec");

View File

@ -3,7 +3,6 @@ package p.packer.models;
import p.packer.messages.assets.OutputCodecCatalog;
import p.packer.messages.assets.OutputFormatCatalog;
import java.nio.file.Path;
import java.util.List;
import java.util.Map;
import java.util.Objects;
@ -16,7 +15,6 @@ public record PackerAssetDetails(
Map<OutputCodecCatalog, List<PackerCodecConfigurationField>> codecConfigurationFieldsByCodec,
List<PackerCodecConfigurationField> metadataFields,
PackerBankCompositionDetails bankComposition,
Map<String, List<Path>> inputsByRole,
List<PackerDiagnostic> diagnostics) {
public PackerAssetDetails {
@ -27,7 +25,6 @@ public record PackerAssetDetails(
codecConfigurationFieldsByCodec = Map.copyOf(Objects.requireNonNull(codecConfigurationFieldsByCodec, "codecConfigurationFieldsByCodec"));
metadataFields = List.copyOf(Objects.requireNonNull(metadataFields, "metadataFields"));
bankComposition = Objects.requireNonNull(bankComposition, "bankComposition");
inputsByRole = Map.copyOf(Objects.requireNonNull(inputsByRole, "inputsByRole"));
diagnostics = List.copyOf(Objects.requireNonNull(diagnostics, "diagnostics"));
}
}

View File

@ -480,7 +480,6 @@ public final class FileSystemPackerWorkspaceService implements PackerWorkspaceSe
manifest.put("asset_uuid", assetUuid);
manifest.put("name", request.assetName());
manifest.put("type", request.assetFamily().manifestType());
manifest.put("inputs", Map.of());
manifest.put("output", Map.of(
"format", request.outputFormat().manifestValue(),
"codec", request.outputCodec().manifestValue()));
@ -760,8 +759,7 @@ public final class FileSystemPackerWorkspaceService implements PackerWorkspaceSe
}
private void patchManifestArtifacts(ObjectNode manifest, ApplyBankCompositionRequest request) {
final ObjectNode inputsNode = mutableObject(manifest, "inputs");
inputsNode.removeAll();
manifest.remove("inputs");
final var artifactsNode = manifest.putArray("artifacts");
for (int index = 0; index < request.selectedFiles().size(); index += 1) {
@ -799,8 +797,7 @@ public final class FileSystemPackerWorkspaceService implements PackerWorkspaceSe
}
private void clearManifestBankComposition(ObjectNode manifest) {
final ObjectNode inputsNode = mutableObject(manifest, "inputs");
inputsNode.removeAll();
manifest.remove("inputs");
manifest.putArray("artifacts");
}

View File

@ -45,7 +45,7 @@ public final class PackerAssetDeclarationParser {
final var assetUuid = requiredText(root, "asset_uuid", diagnostics, manifestPath);
final var name = requiredText(root, "name", diagnostics, manifestPath);
final var assetFamily = requiredAssetFamily(root, diagnostics, manifestPath);
final var inputsByRole = requiredInputs(root.path("inputs"), diagnostics, manifestPath);
rejectLegacyInputs(root.path("inputs"), diagnostics, manifestPath);
final var artifacts = optionalArtifacts(root.path("artifacts"), diagnostics, manifestPath);
final var outputFormat = requiredOutputFormat(root.path("output"), diagnostics, manifestPath);
final var outputCodec = requiredOutputCodec(root.path("output"), diagnostics, manifestPath);
@ -71,7 +71,6 @@ public final class PackerAssetDeclarationParser {
assetUuid,
name,
assetFamily,
inputsByRole,
artifacts,
outputFormat,
outputCodec,
@ -229,52 +228,19 @@ public final class PackerAssetDeclarationParser {
return Map.copyOf(metadata);
}
private Map<String, List<String>> requiredInputs(
private void rejectLegacyInputs(
final JsonNode node,
final List<PackerDiagnostic> diagnostics,
final Path manifestPath) {
if (!node.isObject()) {
diagnostics.add(missingOrInvalid("inputs", "object of input roles", manifestPath));
return Map.of();
if (node.isMissingNode() || node.isNull()) {
return;
}
final Map<String, List<String>> result = new LinkedHashMap<>();
node.fields().forEachRemaining(entry -> {
if (!entry.getValue().isArray()) {
diagnostics.add(new PackerDiagnostic(
PackerDiagnosticSeverity.ERROR,
PackerDiagnosticCategory.STRUCTURAL,
"Input role '" + entry.getKey() + "' must be an array of relative paths.",
manifestPath,
true));
return;
}
final List<String> values = new ArrayList<>();
entry.getValue().forEach(value -> {
if (!value.isTextual() || value.asText().isBlank()) {
diagnostics.add(new PackerDiagnostic(
PackerDiagnosticSeverity.ERROR,
PackerDiagnosticCategory.STRUCTURAL,
"Input role '" + entry.getKey() + "' must contain only non-blank path strings.",
manifestPath,
true));
return;
}
final String relativePath = value.asText().trim();
if (!isTrustedRelativePath(relativePath)) {
diagnostics.add(new PackerDiagnostic(
PackerDiagnosticSeverity.ERROR,
PackerDiagnosticCategory.STRUCTURAL,
"Input role '" + entry.getKey() + "' contains an untrusted path outside the asset root.",
manifestPath,
true));
return;
}
values.add(relativePath);
});
result.put(entry.getKey(), List.copyOf(values));
});
return Map.copyOf(result);
diagnostics.add(new PackerDiagnostic(
PackerDiagnosticSeverity.ERROR,
PackerDiagnosticCategory.STRUCTURAL,
"Field 'inputs' is no longer supported; use 'artifacts' instead.",
manifestPath,
true));
}
private List<PackerAssetArtifactSelection> optionalArtifacts(

View File

@ -80,7 +80,6 @@ public final class PackerAssetDetailsService {
outputContract.codecConfigurationFieldsByCodec(),
metadataFields(outputContract.metadataFields(), declaration.outputMetadata()),
resolveBankCompositionDetails(runtimeAsset, declaration),
resolveInputs(resolved.assetRoot(), declaration.inputsByRole()),
diagnostics);
return new GetAssetDetailsResult(
diagnostics.stream().anyMatch(PackerDiagnostic::blocking) ? PackerOperationStatus.PARTIAL : PackerOperationStatus.SUCCESS,
@ -120,7 +119,6 @@ public final class PackerAssetDetailsService {
Map.of(OutputCodecCatalog.NONE, List.of()),
List.of(),
PackerBankCompositionDetails.EMPTY,
Map.of(),
diagnostics);
return new GetAssetDetailsResult(
PackerOperationStatus.FAILED,
@ -129,16 +127,6 @@ public final class PackerAssetDetailsService {
PackerReadMessageMapper.toDiagnosticDTOs(diagnostics));
}
private Map<String, List<Path>> resolveInputs(
final Path assetRoot,
final Map<String, List<String>> inputsByRole) {
final Map<String, List<Path>> resolved = new LinkedHashMap<>();
inputsByRole.forEach((role, inputs) -> resolved.put(
role,
inputs.stream().map(input -> assetRoot.resolve(input).toAbsolutePath().normalize()).toList()));
return Map.copyOf(resolved);
}
private PackerBankCompositionDetails resolveBankCompositionDetails(
final PackerRuntimeAsset runtimeAsset,
final PackerAssetDeclaration declaration) {
@ -163,15 +151,10 @@ public final class PackerAssetDetailsService {
}
private List<String> selectedPathsFor(PackerAssetDeclaration declaration) {
if (!declaration.artifacts().isEmpty()) {
return declaration.artifacts().stream()
.sorted(Comparator.comparingInt(PackerAssetArtifactSelection::index))
.map(PackerAssetArtifactSelection::file)
.toList();
}
final List<String> selected = new ArrayList<>();
declaration.inputsByRole().values().forEach(selected::addAll);
return List.copyOf(selected);
return declaration.artifacts().stream()
.sorted(Comparator.comparingInt(PackerAssetArtifactSelection::index))
.map(PackerAssetArtifactSelection::file)
.toList();
}
private Optional<PackerBankCompositionFile> resolveSelectedBankFile(

View File

@ -32,7 +32,6 @@ public final class PackerReadMessageMapper {
toCodecConfigurationFieldsByCodecDTO(details.codecConfigurationFieldsByCodec()),
toCodecConfigurationFieldDTOs(details.metadataFields()),
toBankCompositionDetailsDTO(details.bankComposition()),
details.inputsByRole(),
toDiagnosticDTOs(details.diagnostics()));
}

View File

@ -73,7 +73,6 @@ final class PackerRuntimeAssetMaterializerTest {
"uuid",
"asset",
AssetFamilyCatalog.TILE_BANK,
Map.of(),
List.of(),
OutputFormatCatalog.TILES_INDEXED_V1,
OutputCodecCatalog.NONE,

View File

@ -271,8 +271,7 @@ final class FileSystemPackerWorkspaceServiceTest {
assertTrue(updateResult.success());
final var manifest = MAPPER.readTree(assetRoot.resolve("asset.json").toFile());
assertTrue(manifest.path("inputs").isObject());
assertTrue(manifest.path("inputs").isEmpty());
assertTrue(manifest.path("inputs").isMissingNode());
assertTrue(manifest.path("artifacts").isArray());
assertTrue(manifest.path("artifacts").isEmpty());
@ -304,8 +303,7 @@ final class FileSystemPackerWorkspaceServiceTest {
assertEquals(1, loader.loadCount());
final var manifest = MAPPER.readTree(assetRoot.resolve("asset.json").toFile());
assertTrue(manifest.path("inputs").isObject());
assertTrue(manifest.path("inputs").isEmpty());
assertTrue(manifest.path("inputs").isMissingNode());
assertEquals("cancel.png", manifest.path("artifacts").get(0).path("file").asText());
assertEquals(0, manifest.path("artifacts").get(0).path("index").asInt());
assertEquals("confirm.png", manifest.path("artifacts").get(1).path("file").asText());
@ -497,7 +495,6 @@ final class FileSystemPackerWorkspaceServiceTest {
"asset_uuid": "shared-uuid",
"name": "ui_atlas",
"type": "IMAGE/bank",
"inputs": {},
"output": {
"format": "TILES/indexed_v1",
"codec": "none"
@ -513,7 +510,6 @@ final class FileSystemPackerWorkspaceServiceTest {
"asset_uuid": "shared-uuid",
"name": "ui_clone",
"type": "IMAGE/bank",
"inputs": {},
"output": {
"format": "TILES/indexed_v1",
"codec": "none"

View File

@ -62,7 +62,7 @@ final class PackerAssetDeclarationParserTest {
}
@Test
void rejectsUntrustedInputPaths() throws Exception {
void rejectsLegacyInputsField() throws Exception {
final Path manifest = tempDir.resolve("asset.json");
Files.writeString(manifest, """
{
@ -79,7 +79,7 @@ final class PackerAssetDeclarationParserTest {
final var result = parser.parse(manifest);
assertFalse(result.valid());
assertTrue(result.diagnostics().stream().anyMatch(diagnostic -> diagnostic.message().contains("untrusted path")));
assertTrue(result.diagnostics().stream().anyMatch(diagnostic -> diagnostic.message().contains("no longer supported")));
}
@Test
@ -91,7 +91,6 @@ final class PackerAssetDeclarationParserTest {
"asset_uuid": "uuid-video",
"name": "bad_asset",
"type": "video_bank",
"inputs": { "sprites": ["atlas.png"] },
"output": { "format": "TILES/indexed_v1", "codec": "NONE" },
"preload": { "enabled": true }
}

View File

@ -64,8 +64,8 @@ final class PackerAssetDetailsServiceTest {
final ObjectMapper mapper = new ObjectMapper();
final ObjectNode manifest = (ObjectNode) mapper.readTree(manifestPath.toFile());
final ObjectNode inputs = manifest.putObject("inputs");
inputs.putArray("sprites").add("confirm.png");
final var artifacts = manifest.putArray("artifacts");
artifacts.addObject().put("file", "confirm.png").put("index", 0);
mapper.writerWithDefaultPrettyPrinter().writeValue(manifestPath.toFile(), manifest);
final PackerAssetDetailsService service = service();
@ -81,7 +81,7 @@ final class PackerAssetDetailsServiceTest {
}
@Test
void prefersArtifactsSelectionOrderOverLegacyInputs() throws Exception {
void prefersArtifactsSelectionOrder() throws Exception {
final Path projectRoot = copyFixture("workspaces/managed-basic", tempDir.resolve("managed-artifacts-order"));
final Path assetRoot = projectRoot.resolve("assets/ui/atlas");
final BufferedImage tile = new BufferedImage(16, 16, BufferedImage.TYPE_INT_ARGB);
@ -91,8 +91,6 @@ final class PackerAssetDetailsServiceTest {
final ObjectMapper mapper = new ObjectMapper();
final ObjectNode manifest = (ObjectNode) mapper.readTree(manifestPath.toFile());
final ObjectNode inputs = manifest.putObject("inputs");
inputs.putArray("sprites").add("a.png");
final var artifacts = manifest.putArray("artifacts");
artifacts.addObject().put("file", "b.png").put("index", 0);
artifacts.addObject().put("file", "a.png").put("index", 1);

View File

@ -54,7 +54,6 @@ final class PackerRuntimeRegistryTest {
"asset_uuid": "runtime-refresh-uuid",
"name": "ui_sounds",
"type": "audio.bank",
"inputs": {},
"output": {
"format": "SOUND/bank_v1",
"codec": "none"

View File

@ -3,9 +3,6 @@
"asset_uuid": "future-uuid-1",
"name": "future_asset",
"type": "tile_bank",
"inputs": {
"sprites": ["future.png"]
},
"output": {
"format": "TILES/indexed_v1",
"codec": "NONE"

View File

@ -3,9 +3,6 @@
"asset_uuid": "fixture-uuid-1",
"name": "ui_atlas",
"type": "tile_bank",
"inputs": {
"sprites": ["sprites/confirm.png"]
},
"output": {
"format": "TILES/indexed_v1",
"codec": "NONE"

View File

@ -3,9 +3,6 @@
"asset_uuid": "orphan-uuid-1",
"name": "ui_sounds",
"type": "sound_bank",
"inputs": {
"sources": ["confirm.wav"]
},
"output": {
"format": "SOUND/bank_v1",
"codec": "NONE"

View File

@ -3,9 +3,6 @@
"asset_uuid": "orphan-uuid-2",
"name": "ui_sounds",
"type": "sound_bank",
"inputs": {
"sources": ["confirm.wav"]
},
"output": {
"format": "SOUND/bank_v1",
"codec": "NONE"

View File

@ -3,9 +3,6 @@
"asset_uuid": "uuid-1",
"name": "ui_atlas",
"type": "tile_bank",
"inputs": {
"sprites": ["sprites/confirm.png"]
},
"output": {
"format": "TILES/indexed_v1",
"codec": "NONE"

View File

@ -161,7 +161,6 @@ public enum I18n {
ASSETS_PROGRESS_REFRESHING("assets.progress.refreshing"),
ASSETS_PROGRESS_LOADING_DETAILS("assets.progress.loadingDetails"),
ASSETS_LOGS_TITLE("assets.logs.title"),
ASSETS_INPUTS_EMPTY("assets.inputs.empty"),
ASSETS_DIAGNOSTICS_EMPTY("assets.diagnostics.empty"),
ASSETS_DIAGNOSTICS_DIALOG_TITLE("assets.diagnostics.dialog.title"),
ASSETS_DIAGNOSTICS_DIALOG_SUMMARY("assets.diagnostics.dialog.summary"),

View File

@ -471,7 +471,6 @@ public final class AssetDetailsControl extends VBox implements StudioEventAware
details.codecConfigurationFieldsByCodec(),
details.metadataFields(),
mapBankComposition(details.bankComposition()),
Map.copyOf(details.inputsByRole()),
mergedDiagnostics);
}

View File

@ -5,7 +5,6 @@ import p.packer.dtos.PackerDiagnosticDTO;
import p.packer.messages.assets.OutputCodecCatalog;
import p.packer.messages.assets.OutputFormatCatalog;
import java.nio.file.Path;
import java.util.List;
import java.util.Map;
import java.util.Objects;
@ -19,7 +18,6 @@ public record AssetWorkspaceAssetDetails(
Map<OutputCodecCatalog, List<PackerCodecConfigurationFieldDTO>> codecConfigurationFieldsByCodec,
List<PackerCodecConfigurationFieldDTO> metadataFields,
AssetWorkspaceBankCompositionDetails bankComposition,
Map<String, List<Path>> inputsByRole,
List<PackerDiagnosticDTO> diagnostics) {
public AssetWorkspaceAssetDetails {
@ -31,7 +29,6 @@ public record AssetWorkspaceAssetDetails(
codecConfigurationFieldsByCodec = Map.copyOf(Objects.requireNonNull(codecConfigurationFieldsByCodec, "codecConfigurationFieldsByCodec"));
metadataFields = List.copyOf(Objects.requireNonNull(metadataFields, "metadataFields"));
bankComposition = Objects.requireNonNull(bankComposition, "bankComposition");
inputsByRole = Map.copyOf(Objects.requireNonNull(inputsByRole, "inputsByRole"));
diagnostics = List.copyOf(Objects.requireNonNull(diagnostics, "diagnostics"));
}
}

View File

@ -152,7 +152,6 @@ assets.progress.idle=Assets workspace idle.
assets.progress.refreshing=Refreshing assets...
assets.progress.loadingDetails=Loading selected asset details...
assets.logs.title=Logs
assets.inputs.empty=No previewable inputs are currently declared for this asset.
assets.diagnostics.empty=No diagnostics are currently attached to this asset.
assets.diagnostics.dialog.title=Asset Diagnostics
assets.diagnostics.dialog.summary={0} diagnostics for {1}

View File

@ -60,7 +60,7 @@
"sticky" : false
}, {
"source" : "Assets",
"message" : "Discovered asset: bla",
"message" : "Discovered asset: sound",
"severity" : "INFO",
"sticky" : false
}, {
@ -70,7 +70,7 @@
"sticky" : false
}, {
"source" : "Assets",
"message" : "Discovered asset: ui_atlas",
"message" : "Discovered asset: atlas2",
"severity" : "INFO",
"sticky" : false
}, {
@ -85,12 +85,12 @@
"sticky" : false
}, {
"source" : "Assets",
"message" : "Discovered asset: ui_atlas",
"message" : "Discovered asset: atlas2",
"severity" : "INFO",
"sticky" : false
}, {
"source" : "Assets",
"message" : "Discovered asset: Bigode",
"message" : "Discovered asset: bigode",
"severity" : "INFO",
"sticky" : false
}, {

View File

@ -10,14 +10,14 @@
"last_modified" : 1773571367191,
"fingerprint" : "aa7d241deabcebe29a6096e14eaf16fdc06cf06380c11a507620b00fc7bff094",
"metadata" : {
"palette" : {
"originalArgb8888" : [ -265674 ],
"convertedRgb565" : [ -122 ]
},
"tile" : {
"width" : 16,
"height" : 16,
"paletteIndices" : "AQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAAAAAEBAQEBAQEBAQEBAQAAAAABAQEBAQEBAQEBAQEAAAAAAQEBAQEBAAAAAAAAAAAAAAEBAQEBAQAAAAAAAAAAAAABAQEBAQEAAAAAAAAAAAAAAQEBAQEBAAAAAAAAAAAAAAEBAQEBAQAAAAAAAAABAQEBAQEBAQEAAAAAAAAAAQEBAQEBAAAAAAAAAAAAAAEBAQEBAQAAAAAAAAABAQEBAQEBAQEAAAAAAAAAAQEBAQEBAQEBAAAAAAAAAAEBAQEBAQ=="
},
"palette" : {
"originalArgb8888" : [ -265674 ],
"convertedRgb565" : [ -122 ]
}
},
"diagnostics" : [ ]

View File

@ -3,7 +3,6 @@
"asset_uuid" : "64147d33-e8bf-4272-bb5c-b4c07c0276b3",
"name" : "Bigode",
"type" : "tile_bank",
"inputs" : { },
"output" : {
"format" : "TILES/indexed_v1",
"codec" : "NONE",

View File

@ -3,7 +3,6 @@
"asset_uuid" : "b15b319f-5cab-4254-93ea-d83f4742d204",
"name" : "ui_atlas",
"type" : "tile_bank",
"inputs" : { },
"output" : {
"format" : "TILES/indexed_v1",
"codec" : "NONE",

View File

@ -3,7 +3,6 @@
"asset_uuid" : "f64d3bfe-443d-4703-b62a-face19a32cac",
"name" : "bbb2",
"type" : "tile_bank",
"inputs" : { },
"output" : {
"codec" : "NONE",
"format" : "TILES/indexed_v1"

View File

@ -3,7 +3,6 @@
"asset_uuid" : "4d9847b0-5a23-421f-8b78-bf3909ca2281",
"name" : "one-more-atlas",
"type" : "tile_bank",
"inputs" : { },
"output" : {
"format" : "TILES/indexed_v1",
"codec" : "NONE"

View File

@ -3,7 +3,6 @@
"asset_uuid" : "21953cb8-4101-4790-9e5e-d95f5fbc9b5a",
"name" : "ui_atlas",
"type" : "tile_bank",
"inputs" : { },
"output" : {
"format" : "TILES/indexed_v1",
"codec" : "NONE",

View File

@ -1,4 +1,4 @@
{
"originalArgb8888" : [ -265674 ],
"convertedRgb565" : [ 65414 ]
"convertedRgb565" : [ 65414 ],
"originalArgb8888" : [ -265674 ]
}

View File

@ -1,5 +1,5 @@
{
"height" : 16,
"width" : 16,
"paletteIndices" : [ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1 ],
"width" : 16
"height" : 16
}

View File

@ -3,7 +3,6 @@
"asset_uuid" : "62a81570-8f47-4612-9288-6060e6c9a2e2",
"name" : "one-more-atlas",
"type" : "tile_bank",
"inputs" : { },
"output" : {
"format" : "TILES/indexed_v1",
"codec" : "NONE"

View File

@ -3,7 +3,6 @@
"asset_uuid" : "9a7386e7-6f0e-4e4c-9919-0de71e0b7031",
"name" : "bla",
"type" : "sound_bank",
"inputs" : { },
"output" : {
"format" : "SOUND/v1",
"codec" : "NONE",