70 lines
2.2 KiB
C
70 lines
2.2 KiB
C
/**
|
|
* Copyright (c) 2026 Dominic Masters
|
|
*
|
|
* This software is released under the MIT License.
|
|
* https://opensource.org/licenses/MIT
|
|
*/
|
|
|
|
#include "asset/asset.h"
|
|
#include "assert/assert.h"
|
|
#include "display/texture/tileset.h"
|
|
#include "util/memory.h"
|
|
#include "util/endian.h"
|
|
|
|
errorret_t assetTilesetLoad(assetentire_t entire) {
|
|
assertNotNull(entire.data, "Asset data cannot be null");
|
|
assertNotNull(entire.output, "Asset output cannot be null");
|
|
|
|
assettileset_t *tilesetData = (assettileset_t *)entire.data;
|
|
tileset_t *tileset = (tileset_t *)entire.output;
|
|
|
|
if(
|
|
tilesetData->header[0] != 'D' ||
|
|
tilesetData->header[1] != 'T' ||
|
|
tilesetData->header[2] != 'F'
|
|
) {
|
|
errorThrow("Invalid tileset header");
|
|
}
|
|
|
|
if(tilesetData->version != 0x00) {
|
|
errorThrow("Unsupported tileset version");
|
|
}
|
|
|
|
// Fix endianness
|
|
tilesetData->tileWidth = endianLittleToHost16(tilesetData->tileWidth);
|
|
tilesetData->tileHeight = endianLittleToHost16(tilesetData->tileHeight);
|
|
tilesetData->columnCount = endianLittleToHost16(tilesetData->columnCount);
|
|
tilesetData->rowCount = endianLittleToHost16(tilesetData->rowCount);
|
|
tilesetData->right = endianLittleToHost16(tilesetData->right);
|
|
tilesetData->bottom = endianLittleToHost16(tilesetData->bottom);
|
|
|
|
if(tilesetData->tileWidth == 0) {
|
|
errorThrow("Tile width cannot be 0");
|
|
}
|
|
if(tilesetData->tileHeight == 0) {
|
|
errorThrow("Tile height cannot be 0");
|
|
}
|
|
if(tilesetData->columnCount == 0) {
|
|
errorThrow("Column count cannot be 0");
|
|
}
|
|
if(tilesetData->rowCount == 0) {
|
|
errorThrow("Row count cannot be 0");
|
|
}
|
|
|
|
tilesetData->u0 = endianLittleToHostFloat(tilesetData->u0);
|
|
tilesetData->v0 = endianLittleToHostFloat(tilesetData->v0);
|
|
|
|
if(tilesetData->v0 < 0.0f || tilesetData->v0 > 1.0f) {
|
|
errorThrow("Invalid v0 value in tileset");
|
|
}
|
|
|
|
// Setup tileset
|
|
tileset->tileWidth = tilesetData->tileWidth;
|
|
tileset->tileHeight = tilesetData->tileHeight;
|
|
tileset->tileCount = tilesetData->columnCount * tilesetData->rowCount;
|
|
tileset->columns = tilesetData->columnCount;
|
|
tileset->rows = tilesetData->rowCount;
|
|
tileset->uv[0] = tilesetData->u0;
|
|
tileset->uv[1] = tilesetData->v0;
|
|
errorOk();
|
|
} |