|
38 | 38 | namespace Tiled { |
39 | 39 |
|
40 | 40 | Tileset::Tileset(QString name, int tileWidth, int tileHeight, |
41 | | - int tileSpacing, int margin) |
| 41 | + int tileSpacing, int margin, bool isAtlas) |
42 | 42 | : Object(TilesetType) |
43 | 43 | , mName(std::move(name)) |
44 | 44 | , mTileWidth(tileWidth) |
45 | 45 | , mTileHeight(tileHeight) |
46 | 46 | , mTileSpacing(tileSpacing) |
47 | 47 | , mMargin(margin) |
48 | 48 | , mGridSize(tileWidth, tileHeight) |
| 49 | + , mAtlas(isAtlas) |
49 | 50 | { |
50 | 51 | Q_ASSERT(tileSpacing >= 0); |
51 | 52 | Q_ASSERT(margin >= 0); |
@@ -245,48 +246,58 @@ bool Tileset::loadImage() |
245 | 246 | return initializeTilesetTiles(); |
246 | 247 | } |
247 | 248 |
|
248 | | -bool Tileset::initializeTilesetTiles() |
| 249 | +bool Tileset::initializeTilesetTiles(bool forceGeneration) |
249 | 250 | { |
250 | 251 | if (mImage.isNull() || mTileWidth <= 0 || mTileHeight <= 0) |
251 | 252 | return false; |
252 | 253 |
|
253 | 254 | if (mImageReference.transparentColor.isValid()) |
254 | 255 | mImage.setMask(mImage.createMaskFromColor(mImageReference.transparentColor)); |
255 | 256 |
|
256 | | - QVector<QRect> tileRects; |
257 | | - |
258 | | - for (int y = mMargin; y <= mImage.height() - mTileHeight; y += mTileHeight + mTileSpacing) |
259 | | - for (int x = mMargin; x <= mImage.width() - mTileWidth; x += mTileWidth + mTileSpacing) |
260 | | - tileRects.append(QRect(x, y, mTileWidth, mTileHeight)); |
261 | | - |
262 | | - for (int tileNum = 0; tileNum < tileRects.size(); ++tileNum) { |
263 | | - auto it = mTilesById.find(tileNum); |
264 | | - if (it != mTilesById.end()) { |
265 | | - it.value()->setImage(QPixmap()); // make sure it uses the tileset's image |
266 | | - it.value()->setImageRect(tileRects.at(tileNum)); |
267 | | - } else { |
268 | | - auto tile = new Tile(tileNum, this); |
269 | | - tile->setImageRect(tileRects.at(tileNum)); |
270 | | - mTilesById.insert(tileNum, tile); |
271 | | - mTiles.insert(tileNum, tile); |
272 | | - } |
| 257 | + bool needsRectGeneration = true; |
| 258 | + if (isAtlas()) { |
| 259 | + needsRectGeneration = forceGeneration; |
273 | 260 | } |
274 | 261 |
|
275 | | - QPixmap blank; |
| 262 | + if (needsRectGeneration) { |
| 263 | + QVector<QRect> tileRects; |
| 264 | + |
| 265 | + for (int y = mMargin; y <= mImage.height() - mTileHeight; y += mTileHeight + mTileSpacing) |
| 266 | + for (int x = mMargin; x <= mImage.width() - mTileWidth; x += mTileWidth + mTileSpacing) |
| 267 | + tileRects.append(QRect(x, y, mTileWidth, mTileHeight)); |
| 268 | + |
| 269 | + for (int tileNum = 0; tileNum < tileRects.size(); ++tileNum) { |
| 270 | + auto it = mTilesById.find(tileNum); |
| 271 | + if (it != mTilesById.end()) { |
| 272 | + it.value()->setImage(QPixmap()); // make sure it uses the tileset's image |
| 273 | + it.value()->setImageRect(tileRects.at(tileNum)); |
| 274 | + } else { |
| 275 | + auto tile = new Tile(tileNum, this); |
| 276 | + tile->setImageRect(tileRects.at(tileNum)); |
| 277 | + mTilesById.insert(tileNum, tile); |
| 278 | + mTiles.insert(tileNum, tile); |
| 279 | + } |
| 280 | + } |
276 | 281 |
|
277 | | - // Blank out any remaining tiles to avoid confusion (todo: could be more clear) |
278 | | - for (Tile *tile : std::as_const(mTiles)) { |
279 | | - if (tile->id() >= tileRects.size()) { |
280 | | - if (blank.isNull()) { |
281 | | - blank = QPixmap(mTileWidth, mTileHeight); |
282 | | - blank.fill(); |
| 282 | + QPixmap blank; |
| 283 | + |
| 284 | + // Blank out any remaining tiles to avoid confusion (todo: could be more clear) |
| 285 | + if (!isAtlas()) { |
| 286 | + for (Tile *tile : std::as_const(mTiles)) { |
| 287 | + if (tile->id() >= tileRects.size()) { |
| 288 | + if (blank.isNull()) { |
| 289 | + blank = QPixmap(mTileWidth, mTileHeight); |
| 290 | + blank.fill(); |
| 291 | + } |
| 292 | + tile->setImage(blank); |
| 293 | + tile->setImageRect(QRect(0, 0, mTileWidth, mTileHeight)); |
| 294 | + } |
283 | 295 | } |
284 | | - tile->setImage(blank); |
285 | | - tile->setImageRect(QRect(0, 0, mTileWidth, mTileHeight)); |
286 | 296 | } |
287 | 297 | } |
288 | 298 |
|
289 | | - mNextTileId = std::max<int>(mNextTileId, tileRects.size()); |
| 299 | + for (Tile *tile : std::as_const(mTiles)) |
| 300 | + mNextTileId = std::max(mNextTileId, tile->id() + 1); |
290 | 301 |
|
291 | 302 | mImageReference.size = mImage.size(); |
292 | 303 | mColumnCount = columnCountForWidth(mImageReference.size.width()); |
@@ -554,6 +565,9 @@ void Tileset::setTileImageRect(Tile *tile, const QRect &imageRect) |
554 | 565 |
|
555 | 566 | void Tileset::maybeUpdateTileSize(QSize previousTileSize, QSize newTileSize) |
556 | 567 | { |
| 568 | + if (isAtlas()) |
| 569 | + return; |
| 570 | + |
557 | 571 | if (previousTileSize == newTileSize) |
558 | 572 | return; |
559 | 573 |
|
@@ -681,6 +695,9 @@ SharedTileset Tileset::clone() const |
681 | 695 | */ |
682 | 696 | void Tileset::updateTileSize() |
683 | 697 | { |
| 698 | + if (isAtlas()) |
| 699 | + return; |
| 700 | + |
684 | 701 | int maxWidth = 0; |
685 | 702 | int maxHeight = 0; |
686 | 703 | for (Tile *tile : std::as_const(mTiles)) { |
|
0 commit comments