1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86
|
#include "TileSet.h"
namespace Jazz2::Tiles
{
TileSet::TileSet(StringView path, std::uint16_t tileCount, std::unique_ptr<Texture> textureDiffuse, std::unique_ptr<uint8_t[]> mask, std::uint32_t maskSize, std::unique_ptr<Color[]> captionTile)
: FilePath(path), TextureDiffuse(std::move(textureDiffuse)), _mask(std::move(mask)), _captionTile(std::move(captionTile)),
_isMaskEmpty(), _isMaskFilled(), _isTileFilled()
{
// TilesPerRow is used only for rendering
if (TextureDiffuse != nullptr) {
Vector2i texSize = TextureDiffuse->GetSize();
TilesPerRow = (texSize.X / (DefaultTileSize + 2));
} else {
TilesPerRow = 0;
}
TileCount = tileCount;
_isMaskEmpty.resize(ValueInit, TileCount);
_isMaskFilled.resize(ValueInit, TileCount);
_isTileFilled.resize(ValueInit, TileCount);
std::uint32_t maskMaxTiles = maskSize / (DefaultTileSize * DefaultTileSize);
for (std::uint32_t i = 0; i < tileCount; i++) {
bool maskEmpty = true;
bool maskFilled = true;
if (i < maskMaxTiles) {
auto* maskOffset = &_mask[i * DefaultTileSize * DefaultTileSize];
for (std::int32_t j = 0; j < DefaultTileSize * DefaultTileSize; j++) {
bool masked = (maskOffset[j] > 0);
maskEmpty &= !masked;
maskFilled &= masked;
}
}
if (maskEmpty) {
_isMaskEmpty.set(i);
}
if (maskFilled) {
_isMaskFilled.set(i);
}
// TODO: _isTileFilled is not properly set
if (/*tileFilled ||*/ !maskEmpty) {
_isTileFilled.set(i);
}
}
}
bool TileSet::OverrideTileDiffuse(std::int32_t tileId, StaticArrayView<(DefaultTileSize + 2) * (DefaultTileSize + 2), std::uint32_t> tileDiffuse)
{
if (tileId >= TileCount) {
return false;
}
std::int32_t x = (tileId % TilesPerRow) * (DefaultTileSize + 2);
std::int32_t y = (tileId / TilesPerRow) * (DefaultTileSize + 2);
// TODO: _isTileFilled is not properly set
return TextureDiffuse->LoadFromTexels((std::uint8_t*)tileDiffuse.data(), x, y, DefaultTileSize + 2, DefaultTileSize + 2);
}
bool TileSet::OverrideTileMask(std::int32_t tileId, StaticArrayView<DefaultTileSize * DefaultTileSize, std::uint8_t> tileMask)
{
if (tileId >= TileCount) {
return false;
}
auto* maskOffset = &_mask[tileId * DefaultTileSize * DefaultTileSize];
bool maskEmpty = true;
bool maskFilled = true;
for (std::int32_t j = 0; j < DefaultTileSize * DefaultTileSize; j++) {
maskOffset[j] = tileMask[j];
bool masked = (tileMask[j] > 0);
maskEmpty &= !masked;
maskFilled &= masked;
}
_isMaskEmpty.set(tileId, maskEmpty);
_isMaskFilled.set(tileId, maskFilled);
return true;
}
}
|