From 09dc14de80dd8e37c4ab23dba40275cc9a50357b Mon Sep 17 00:00:00 2001 From: Benjamin Trotter Date: Thu, 13 Jul 2017 15:17:03 -0600 Subject: [PATCH] Progress on Wang tile functionality (#1638) * Enabled wang filling for BucketFillTool (#1455) and StampBrush * Added view on all possible wang IDs and allow assigning them to tiles --- src/libtiled/mapreader.cpp | 8 +- src/libtiled/mapwriter.cpp | 3 +- src/libtiled/wangset.cpp | 239 ++++++++++++- src/libtiled/wangset.h | 91 +++-- src/tiled/bucketfilltool.cpp | 104 +++++- src/tiled/bucketfilltool.h | 12 + src/tiled/changetilewangid.cpp | 113 +++++++ src/tiled/changetilewangid.h | 76 +++++ src/tiled/changewangsetdata.cpp | 61 ++++ src/tiled/changewangsetdata.h | 5 + src/tiled/images/24x24/wangtile.png | Bin 0 -> 20414 bytes src/tiled/images/32x32/wangtile.png | Bin 0 -> 20726 bytes src/tiled/mapeditor.cpp | 20 ++ src/tiled/mapeditor.h | 3 + src/tiled/propertybrowser.cpp | 6 +- src/tiled/stampactions.cpp | 12 +- src/tiled/stampactions.h | 4 +- src/tiled/stampbrush.cpp | 100 +++++- src/tiled/stampbrush.h | 8 + src/tiled/tiled.pro | 6 + src/tiled/tiled.qbs | 6 + src/tiled/tiled.qrc | 2 + src/tiled/tileseteditor.cpp | 26 +- src/tiled/tileseteditor.h | 5 +- src/tiled/tilesetview.cpp | 507 ++++++++++++++++++++++++++-- src/tiled/tilesetview.h | 19 +- src/tiled/tilesetwangsetmodel.h | 3 +- src/tiled/undocommands.h | 1 + src/tiled/wangdock.cpp | 87 ++++- src/tiled/wangdock.h | 19 +- src/tiled/wangtemplatemodel.cpp | 129 +++++++ src/tiled/wangtemplatemodel.h | 66 ++++ src/tiled/wangtemplateview.cpp | 401 ++++++++++++++++++++++ src/tiled/wangtemplateview.h | 69 ++++ tests/wangtiles/2CornerWangSet.jpg | Bin 0 -> 40119 bytes tests/wangtiles/PathAndObjects.png | Bin 0 -> 188670 bytes tests/wangtiles/ReallyWangy.tsx | 48 +++ tests/wangtiles/testWangSet.tsx | 24 ++ 38 files changed, 2153 insertions(+), 130 deletions(-) create mode 100644 src/tiled/changetilewangid.cpp create mode 100644 src/tiled/changetilewangid.h create mode 100644 src/tiled/images/24x24/wangtile.png create mode 100644 src/tiled/images/32x32/wangtile.png create mode 100644 src/tiled/wangtemplatemodel.cpp create mode 100644 src/tiled/wangtemplatemodel.h create mode 100644 src/tiled/wangtemplateview.cpp create mode 100644 src/tiled/wangtemplateview.h create mode 100644 tests/wangtiles/2CornerWangSet.jpg create mode 100644 tests/wangtiles/PathAndObjects.png create mode 100644 tests/wangtiles/ReallyWangy.tsx create mode 100644 tests/wangtiles/testWangSet.tsx diff --git a/src/libtiled/mapreader.cpp b/src/libtiled/mapreader.cpp index bbd2a23f5d..78ddb57827 100644 --- a/src/libtiled/mapreader.cpp +++ b/src/libtiled/mapreader.cpp @@ -590,7 +590,13 @@ void MapReaderPrivate::readTilesetWangSets(Tileset &tileset) } else if (xml.name() == QLatin1String("wangtile")) { const QXmlStreamAttributes tileAtts = xml.attributes(); int tileId = tileAtts.value(QLatin1String("tileid")).toInt(); - unsigned wangId = tileAtts.value(QLatin1String("wangid")).toUInt(); + unsigned wangId = tileAtts.value(QLatin1String("wangid")).toUInt(nullptr, 16); + + if (!wangSet->wangIdIsValid(wangId)) { + xml.raiseError(QLatin1String("Invalid wangId given for tileId: ") + QString::number(tileId)); + return; + } + bool fH = tileAtts.value(QLatin1String("hflip")).toInt(); bool fV = tileAtts.value(QLatin1String("vflip")).toInt(); bool fA = tileAtts.value(QLatin1String("dflip")).toInt(); diff --git a/src/libtiled/mapwriter.cpp b/src/libtiled/mapwriter.cpp index 4a68d9275d..4cf64e6646 100644 --- a/src/libtiled/mapwriter.cpp +++ b/src/libtiled/mapwriter.cpp @@ -440,7 +440,8 @@ void MapWriterPrivate::writeTileset(QXmlStreamWriter &w, const Tileset &tileset, for (const WangTile &wangTile : ws->wangTiles()) { w.writeStartElement(QLatin1String("wangtile")); w.writeAttribute(QLatin1String("tileid"), QString::number(wangTile.tile()->id())); - w.writeAttribute(QLatin1String("wangid"), QString::number(wangTile.wangId())); + w.writeAttribute(QLatin1String("wangid"), + QLatin1String("0x") + QString::number(wangTile.wangId(), 16)); if (wangTile.flippedHorizontally()) w.writeAttribute(QLatin1String("hflip"), QString::number(1)); diff --git a/src/libtiled/wangset.cpp b/src/libtiled/wangset.cpp index 71092fd7fd..d9a74c97d9 100644 --- a/src/libtiled/wangset.cpp +++ b/src/libtiled/wangset.cpp @@ -29,6 +29,7 @@ #include "wangset.h" #include +#include using namespace Tiled; @@ -48,6 +49,91 @@ unsigned wangTileToTileInfo(const WangTile &wangTile) | (wangTile.flippedAntiDiagonally() << 27); } +int WangId::edgeColor(int index) const +{ + int shift = (index * 8); + + int color = (mId >> shift) & 0xf; + + return color; +} + +int WangId::cornerColor(int index) const +{ + int shift = (index * 8) + 4; + + int color = (mId >> shift) & 0xf; + + return color; +} + +void WangId::setEdgeColor(int index, unsigned value) +{ + value = value & 0xf; + mId &= ~(0xf << (index * 8)); + mId |= value << (index * 8); +} + +void WangId::setCornerColor(int index, unsigned value) +{ + value = value & 0xf; + mId &= ~(0xf << (index * 8 + 4)); + mId |= value << (index * 8 + 4); +} + +bool WangId::hasEdgeWildCards() const +{ + for (int i = 0; i < 4; ++i) { + if (!edgeColor(i)) + return true; + } + + return false; +} + +bool WangId::hasCornerWildCards() const +{ + for (int i = 0; i < 4; ++i) { + if (!cornerColor(i)) + return true; + } + + return false; +} + +void WangId::rotate(int rotations) +{ + if (rotations < 0) + rotations = 4 + (rotations % 4); + else + rotations %= 4; + + unsigned rotated = mId << rotations*8; + rotated = rotated | (mId >> ((4 - rotations) * 8)); + + mId = rotated; +} + +void WangId::flipHorizontally() +{ + WangId newWangId = mId; + + newWangId.setEdgeColor(1, edgeColor(3)); + newWangId.setEdgeColor(3, edgeColor(1)); + + for (int i = 0; i < 4; ++i) { + newWangId.setCornerColor(i, cornerColor(3-i)); + } + + mId = newWangId; +} + +void WangId::flipVertically() +{ + flipHorizontally(); + rotate(2); +} + void WangTile::translate(int map[]) { int mask = (mFlippedHorizontally << 2) @@ -64,6 +150,7 @@ void WangTile::translate(int map[]) void WangTile::rotateRight() { int map[] = {5, 4, 1, 0, 7, 6, 3, 2}; + mWangId.rotate(1); translate(map); } @@ -71,6 +158,7 @@ void WangTile::rotateRight() void WangTile::rotateLeft() { int map[] = {3, 2, 7, 6, 1, 0, 5, 4}; + mWangId.rotate(3); translate(map); } @@ -78,6 +166,7 @@ void WangTile::rotateLeft() void WangTile::flipHorizontally() { int map[] = {4, 3, 6, 1, 0, 7, 2, 5}; + mWangId.flipHorizontally(); translate(map); } @@ -85,6 +174,7 @@ void WangTile::flipHorizontally() void WangTile::flipVertically() { int map[] = {2, 5, 0, 7, 6, 1, 4, 3}; + mWangId.flipVertically(); translate(map); } @@ -116,22 +206,52 @@ WangSet::WangSet(Tileset *tileset, { } -void WangSet::addTile(Tile *tile, WangId wangId) +QList WangSet::tilesChangedOnSetEdgeColors(int newEdgeColors) +{ + QList tiles; + + int previousEdgeColors = mEdgeColors; + mEdgeColors = newEdgeColors; + + for (auto i = mTileInfoToWangId.cbegin(); i != mTileInfoToWangId.cend(); ++i) { + if (!wangIdIsValid(i.value())) { + int tileId = i.key() & 0x1fffffff; + tiles.append(mTileset->tileAt(tileId)); + } + } + + mEdgeColors = previousEdgeColors; + + return tiles; +} + +QList WangSet::tilesChangedOnSetCornerColors(int newCornerColors) { - Q_ASSERT(tile->tileset() == mTileset); - Q_ASSERT(wangIdIsValid(wangId)); + QList tiles; + + int previousCornerColors = mCornerColors; + mCornerColors = newCornerColors; - mWangIdToWangTile.insert(wangId, WangTile(tile, wangId)); - mTileInfoToWangId.insert(tile->id(), wangId); + for (auto i = mTileInfoToWangId.cbegin(); i != mTileInfoToWangId.cend(); ++i) { + if (!wangIdIsValid(i.value())) { + int tileId = i.key() & 0x1fffffff; + tiles.append(mTileset->tileAt(tileId)); + } + } + + mCornerColors = previousCornerColors; + + return tiles; } -void WangSet::addCell(const Cell &cell, WangId wangId) +void WangSet::addTile(Tile *tile, WangId wangId) { - Q_ASSERT(cell.tileset() == mTileset); - Q_ASSERT(wangIdIsValid(wangId)); + addWangTile(WangTile(tile, wangId)); +} - mWangIdToWangTile.insert(wangId, WangTile(cell, wangId)); - mTileInfoToWangId.insert(cellToTileInfo(cell), wangId); +void WangSet::addCell(const Cell &cell, WangId wangId) +{ + addWangTile(WangTile(cell, wangId)); } void WangSet::addWangTile(const WangTile &wangTile) @@ -139,10 +259,43 @@ void WangSet::addWangTile(const WangTile &wangTile) Q_ASSERT(wangTile.tile()->tileset() == mTileset); Q_ASSERT(wangIdIsValid(wangTile.wangId())); + if (WangId previousWangId = mTileInfoToWangId.value(wangTileToTileInfo(wangTile))) { + if (wangTile.wangId() == 0) { + removeWangTile(wangTile); + return; + } + if (previousWangId == wangTile.wangId()) + return; + removeWangTile(wangTile); + } + + if (wangTile.wangId() == 0) + return; + mWangIdToWangTile.insert(wangTile.wangId(), wangTile); mTileInfoToWangId.insert(wangTileToTileInfo(wangTile), wangTile.wangId()); } +void WangSet::removeTile(Tile *tile) +{ + removeWangTile(WangTile(tile, 0)); +} + +void WangSet::removeCell(const Cell &cell) +{ + removeWangTile(WangTile(cell, 0)); +} + +void WangSet::removeWangTile(const WangTile &wangTile) +{ + WangId wangId = mTileInfoToWangId.take(wangTileToTileInfo(wangTile)); + + WangTile w = wangTile; + w.setWangId(wangId); + + mWangIdToWangTile.remove(wangId, w); +} + WangTile WangSet::findMatchingWangTile(WangId wangId) const { auto potentials = findMatchingWangTiles(wangId); @@ -165,7 +318,7 @@ QList WangSet::findMatchingWangTiles(WangId wangId) const //Stores the space of a wild card, followed by how many colors that space can have. QVector wildCards; - if (mEdgeColors > 0) { + if (mEdgeColors > 1) { for (int i = 0; i < 4; ++i) { if (!wangId.edgeColor(i)) { WangWildCard w; @@ -177,7 +330,7 @@ QList WangSet::findMatchingWangTiles(WangId wangId) const } } - if (mCornerColors > 0) { + if (mCornerColors > 1) { for (int i = 0; i < 4; ++i) { if (!wangId.cornerColor(i)) { WangWildCard w; @@ -209,12 +362,12 @@ QList WangSet::findMatchingWangTiles(WangId wangId) const WangWildCard top = stack.pop(); top.colorCount -= 1; - if (top.colorCount > 0) + if (top.colorCount >= 0) stack.push(top); } else { WangWildCard top = stack.pop(); top.colorCount -= 1; - if (top.colorCount > 0) { + if (top.colorCount >= 0) { stack.push(top); for (int i = stack.size(); i < max; ++i) @@ -238,12 +391,12 @@ WangId WangSet::wangIdFromSurrounding(WangId surroundingWangIds[]) const { unsigned id = 0; - if (mEdgeColors > 0) { + if (mEdgeColors > 1) { for (int i = 0; i < 4; ++i) id |= (surroundingWangIds[i*2].edgeColor((2 + i) % 4)) << (i*8); } - if (mCornerColors > 0) { + if (mCornerColors > 1) { for (int i = 0; i < 4; ++i) { int color = surroundingWangIds[i*2 + 1].cornerColor((2 + i) % 4); @@ -267,9 +420,20 @@ WangId WangSet::wangIdFromSurrounding(const Cell surroundingCells[]) const for (int i = 0; i < 8; ++i) wangIds[i] = wangIdOfCell(surroundingCells[i]); - WangId wangId = wangIdFromSurrounding(wangIds); + return wangIdFromSurrounding(wangIds); +} - return wangId; +QList WangSet::tilesWithWangId() const +{ + if (!mTileset) + return QList(); + + QList tiles; + + for (WangTile wangTile : mWangIdToWangTile) + tiles.append(wangTile.tile()); + + return tiles; } WangId WangSet::wangIdOfTile(const Tile *tile) const @@ -288,11 +452,50 @@ bool WangSet::wangIdIsValid(WangId wangId) const if (wangId.edgeColor(i) > mEdgeColors || wangId.cornerColor(i) > mCornerColors) return false; + + if (mEdgeColors <= 1) + if (wangId.edgeColor(i)) + return false; + + if (mCornerColors <= 1) + if (wangId.cornerColor(i)) + return false; } return true; } +bool WangSet::wangIdIsUsed(WangId wangId) const +{ + return mWangIdToWangTile.contains(wangId); +} + +WangId WangSet::templateWangIdAt(unsigned n) const +{ + unsigned wangId = 0; + //number of permutations of a corner and edge together. + int cornerEdgePermutations = mEdgeColors * mCornerColors; + + for (int i = 7; i >= 0; --i) { + //this is the number of permutations possible bellow this point in the wangId + int belowPermutations = qPow(cornerEdgePermutations, i/2) * ((i&1)? mEdgeColors : 1); + int value = n / belowPermutations; + n -= value * belowPermutations; + + wangId |= value << i * 4; + } + + //before this is like a base 10 range (0 - 9) where we want (1 - 10) for each digit + wangId += 0x11111111; + //If edges/corners don't have variations then those spots should be wild. + if (mEdgeColors <= 1) + wangId &= 0xf0f0f0f0; + if (mCornerColors <= 1) + wangId &= 0x0f0f0f0f; + + return wangId; +} + WangSet *WangSet::clone(Tileset *tileset) const { WangSet *c = new WangSet(tileset, mEdgeColors, mCornerColors, mName, mImageTileId); diff --git a/src/libtiled/wangset.h b/src/libtiled/wangset.h index df9907fb37..b0a4724e63 100644 --- a/src/libtiled/wangset.h +++ b/src/libtiled/wangset.h @@ -38,7 +38,7 @@ namespace Tiled { -class WangId +class TILEDSHARED_EXPORT WangId { public: @@ -54,6 +54,16 @@ class WangId int edgeColor(int index) const; int cornerColor(int index) const; + void setEdgeColor(int index, unsigned value); + void setCornerColor(int index, unsigned value); + + /* Returns true if one or more edges are zero + * */ + bool hasEdgeWildCards() const; + /* Returns true if one or more corners are zero + * */ + bool hasCornerWildCards() const; + /* Rotates the wang Id clockwise by (90 * rotations) degrees. * Meaning with one rotation, the top edge becomes the right edge, * and the top right corner, becomes the top bottom. @@ -72,37 +82,6 @@ class WangId unsigned mId; }; -inline int WangId::edgeColor(int index) const -{ - int shift = (index * 8); - - int color = (mId >> shift) & 0xf; - - return color; -} - -inline int WangId::cornerColor(int index) const -{ - int shift = (index * 8) + 4; - - int color = (mId >> shift) & 0xf; - - return color; -} - -inline void WangId::rotate(int rotations) -{ - if (rotations < 0) - rotations = 4 + (rotations % 4); - else - rotations %= 4; - - unsigned rotated = mId << rotations*8; - rotated = rotated | (mId >> ((4 - rotations) * 8)); - - mId = rotated; -} - //Class for holding info about rotation and flipping. class TILEDSHARED_EXPORT WangTile { @@ -135,6 +114,7 @@ class TILEDSHARED_EXPORT WangTile Tile *tile() const { return mTile; } WangId wangId() const { return mWangId; } + void setWangId(WangId wangId) { mWangId = wangId; } bool flippedHorizontally() const { return mFlippedHorizontally; } bool flippedVertically() const { return mFlippedVertically; } @@ -151,6 +131,13 @@ class TILEDSHARED_EXPORT WangTile Cell makeCell() const; + bool operator== (const WangTile &other) const + { return mTile == other.mTile + && mWangId == other.mWangId + && mFlippedHorizontally == other.mFlippedHorizontally + && mFlippedVertically == other.mFlippedVertically + && mFlippedAntiDiagonally == other.flippedAntiDiagonally(); } + private: //performs a translation (either flipping or rotating) based on a one to one //map of size 8 (from 0 - 7) @@ -188,17 +175,31 @@ class TILEDSHARED_EXPORT WangSet : public Object int edgeColors() const { return mEdgeColors; } int cornerColors() const { return mCornerColors; } + + /* Sets the edge/corner color count + * This can make wangIds already in the set invalid, so should only be used from + * ChangeWangSet(Edges/Corners) + * */ void setEdgeColors(int n) { mEdgeColors = n; } void setCornerColors(int n) { mCornerColors = n; } - /* Adds a tile to the wang set with a given wangId + QList tilesChangedOnSetEdgeColors(int newEdgeColors); + QList tilesChangedOnSetCornerColors(int newCornerColors); + + /* Adds a wangtile to the wang set with a given wangId + * If the given WangTile is already in the set with a + * different wangId, then that reference is removed, and + * replaced with the new wangId. If the wangId provided is zero + * then the wangTile is removed if already in the set. * */ void addTile(Tile *tile, WangId wangId); - void addCell(const Cell &cell, WangId wangId); - void addWangTile(const WangTile &wangTile); + void removeTile(Tile *tile); + void removeCell(const Cell &cell); + void removeWangTile(const WangTile &wangTile); + /* Finds a tile whos WangId matches with the one provided, * where zeros in the id are treated as wild cards, and can be * any color. @@ -234,6 +235,10 @@ class TILEDSHARED_EXPORT WangSet : public Object * */ WangId wangIdFromSurrounding(const Cell surroundingCells[]) const; + /* Returns a list of all the tiles with a wangId. + * */ + QList tilesWithWangId() const; + /* Returns the wangId of a given Tile. * */ WangId wangIdOfTile(const Tile *tile) const; @@ -244,6 +249,21 @@ class TILEDSHARED_EXPORT WangSet : public Object * */ bool wangIdIsValid(WangId wangId) const; + /* Returns whether the given wangId is assigned to a WangTile. + * If edge count of this set is <= 1, then edges are ignored + * Same for corners. + * */ + bool wangIdIsUsed(WangId wangId) const; + + /* Returns the nth wangId starting at 0x11111111 + * and, when C is the number of corners, + * and E is the number of edges, + * ending at 0xCECECECE + * + * Note this does NOT include wildcards (no zeros) + * */ + WangId templateWangIdAt(unsigned n) const; + /* Returns a clone of this wangset * */ WangSet *clone(Tileset *tileset) const; @@ -264,3 +284,4 @@ class TILEDSHARED_EXPORT WangSet : public Object } // namespace Tiled Q_DECLARE_METATYPE(Tiled::WangSet*) +Q_DECLARE_METATYPE(Tiled::WangId) diff --git a/src/tiled/bucketfilltool.cpp b/src/tiled/bucketfilltool.cpp index 42696fde58..6b364b9918 100644 --- a/src/tiled/bucketfilltool.cpp +++ b/src/tiled/bucketfilltool.cpp @@ -31,6 +31,7 @@ #include "mapdocument.h" #include "painttilelayer.h" #include "stampactions.h" +#include "wangset.h" #include #include @@ -48,10 +49,13 @@ BucketFillTool::BucketFillTool(QObject *parent) , mIsActive(false) , mLastShiftStatus(false) , mIsRandom(false) + , mIsWangFill(false) + , mWangSet(nullptr) , mLastRandomStatus(false) , mStampActions(new StampActions(this)) { connect(mStampActions->random(), &QAction::toggled, this, &BucketFillTool::randomChanged); + connect(mStampActions->wangFill(), &QAction::toggled, this, &BucketFillTool::wangFillChanged); connect(mStampActions->flipHorizontal(), &QAction::triggered, [this]() { emit stampChanged(mStamp.flipped(FlipHorizontally)); }); @@ -104,8 +108,8 @@ static void fillWithStamp(TileLayer &layer, void BucketFillTool::tilePositionChanged(const QPoint &tilePos) { - // Skip filling if the stamp is empty - if (mStamp.isEmpty()) + // Skip filling if the stamp is empty and not in wangFill mode + if (mStamp.isEmpty() && !mIsWangFill) return; // Make sure that a tile layer is selected @@ -119,7 +123,7 @@ void BucketFillTool::tilePositionChanged(const QPoint &tilePos) TilePainter regionComputer(mapDocument(), tileLayer); // If the stamp is a single tile, ignore it when making the region - if (!shiftPressed && mStamp.variations().size() == 1) { + if (!shiftPressed && !mIsWangFill && mStamp.variations().size() == 1) { const TileStampVariation &variation = mStamp.variations().first(); TileLayer *stampLayer = variation.tileLayer(); if (stampLayer->size() == QSize(1, 1) && @@ -180,15 +184,18 @@ void BucketFillTool::tilePositionChanged(const QPoint &tilePos) } // Paint the new overlay - if (!mIsRandom) { + if (mIsRandom) { + randomFill(*mFillOverlay, mFillRegion); + fillRegionChanged = true; + } else if (mIsWangFill) { + wangFill(*mFillOverlay, *tileLayer, mFillRegion); + fillRegionChanged = true; + } else { if (fillRegionChanged || mStamp.variations().size() > 1) { fillWithStamp(*mFillOverlay, mStamp, mFillRegion.translated(-mFillOverlay->position())); fillRegionChanged = true; } - } else { - randomFill(*mFillOverlay, mFillRegion); - fillRegionChanged = true; } if (fillRegionChanged) { @@ -282,7 +289,7 @@ void BucketFillTool::setStamp(const TileStamp &stamp) void BucketFillTool::populateToolBar(QToolBar *toolBar) { - mStampActions->populateToolBar(toolBar, mIsRandom); + mStampActions->populateToolBar(toolBar, mIsRandom, mIsWangFill); } void BucketFillTool::clearOverlay() @@ -338,6 +345,11 @@ void BucketFillTool::setRandom(bool value) mIsRandom = value; updateRandomListAndMissingTilesets(); + if (mIsRandom) { + mIsWangFill = false; + mStampActions->wangFill()->setChecked(false); + } + // Don't need to recalculate fill region if there was no fill region if (!mFillOverlay) return; @@ -345,21 +357,91 @@ void BucketFillTool::setRandom(bool value) tilePositionChanged(tilePosition()); } +void BucketFillTool::setWangFill(bool value) +{ + if (mIsWangFill == value) + return; + + mIsWangFill = value; + + if (mIsWangFill) { + mIsRandom = false; + mStampActions->random()->setChecked(false); + } + + if (!mFillOverlay) + return; + + tilePositionChanged(tilePosition()); +} + void BucketFillTool::randomFill(TileLayer &tileLayer, const QRegion ®ion) const { if (region.isEmpty() || mRandomCellPicker.isEmpty()) return; for (const QRect &rect : region.translated(-tileLayer.position()).rects()) { - for (int _x = rect.left(); _x <= rect.right(); ++_x) { - for (int _y = rect.top(); _y <= rect.bottom(); ++_y) { - tileLayer.setCell(_x, _y, + for (int y = rect.top(); y <= rect.bottom(); ++y) { + for (int x = rect.left(); x <= rect.right(); ++x) { + tileLayer.setCell(x, y, mRandomCellPicker.pick()); } } } } +//Helper function which gets a cell from the front or background tilelayer based on x and y +//All positions are given relative to the front (and assumes back.pos = 0,0) +//If outside fillRegion, then a cell is given from back (if it has one) +static const Cell &adjacentCell(const TileLayer &back, const TileLayer &front, const QRegion &fillRegion, int x, int y) +{ + if (!fillRegion.contains(QPoint(x + front.x(), y + front.y())) && back.contains(x + front.x(), y + front.y())) { + return back.cellAt(x + front.x(), y + front.y()); + } else if (front.contains(x, y)) { + return front.cellAt(x, y); + } else { + static const Cell cell; + return cell; + } +} + +void BucketFillTool::wangFill(TileLayer &tileLayerToFill, + const TileLayer &backgroundTileLayer, + const QRegion ®ion) const +{ + if (region.isEmpty() || !mWangSet) + return; + + for (const QRect &rect : region.translated(-tileLayerToFill.position()).rects()) { + for (int y = rect.top(); y <= rect.bottom(); ++y) { + for (int x = rect.left(); x <= rect.right(); ++x) { + tileLayerToFill.setCell(x, y, Cell()); + } + } + } + + Cell surroundingCells[8]; + + for (const QRect &rect : region.translated(-tileLayerToFill.position()).rects()) { + for (int y = rect.top(); y <= rect.bottom(); ++y) { + for (int x = rect.left(); x <= rect.right(); ++x) { + //gathering the Cells around the current point. + surroundingCells[0] = adjacentCell(backgroundTileLayer, tileLayerToFill, region, x , y - 1); + surroundingCells[1] = adjacentCell(backgroundTileLayer, tileLayerToFill, region, x + 1, y - 1); + surroundingCells[2] = adjacentCell(backgroundTileLayer, tileLayerToFill, region, x + 1, y ); + surroundingCells[3] = adjacentCell(backgroundTileLayer, tileLayerToFill, region, x + 1, y + 1); + surroundingCells[4] = adjacentCell(backgroundTileLayer, tileLayerToFill, region, x , y + 1); + surroundingCells[5] = adjacentCell(backgroundTileLayer, tileLayerToFill, region, x - 1, y + 1); + surroundingCells[6] = adjacentCell(backgroundTileLayer, tileLayerToFill, region, x - 1, y ); + surroundingCells[7] = adjacentCell(backgroundTileLayer, tileLayerToFill, region, x - 1, y - 1); + + WangId wangId = mWangSet->wangIdFromSurrounding(surroundingCells); + tileLayerToFill.setCell(x, y, mWangSet->findMatchingCell(wangId)); + } + } + } +} + void BucketFillTool::updateRandomListAndMissingTilesets() { mRandomCellPicker.clear(); diff --git a/src/tiled/bucketfilltool.h b/src/tiled/bucketfilltool.h index 915d285c2e..0a500fab15 100644 --- a/src/tiled/bucketfilltool.h +++ b/src/tiled/bucketfilltool.h @@ -28,6 +28,9 @@ #include "tilestamp.h" namespace Tiled { + +class WangSet; + namespace Internal { class MapDocument; @@ -69,12 +72,16 @@ class BucketFillTool : public AbstractTileTool public slots: void setRandom(bool value); + void setWangFill(bool value); + void setWangSet(const WangSet *wangSet) { mWangSet = wangSet; } signals: void stampChanged(const TileStamp &stamp); void randomChanged(bool value); + void wangFillChanged(bool value); + protected: void tilePositionChanged(const QPoint &tilePos) override; @@ -101,6 +108,9 @@ private slots: */ bool mIsRandom; + bool mIsWangFill; + const WangSet *mWangSet; + /** * Contains the value of mIsRandom at that time, when the latest call of * tilePositionChanged() took place. @@ -122,6 +132,8 @@ private slots: */ void randomFill(TileLayer &tileLayer, const QRegion ®ion) const; + void wangFill(TileLayer &tileLayerToFill, const TileLayer &backgroundTileLayer, const QRegion ®ion) const; + StampActions *mStampActions; }; diff --git a/src/tiled/changetilewangid.cpp b/src/tiled/changetilewangid.cpp new file mode 100644 index 0000000000..ab7d3e75a2 --- /dev/null +++ b/src/tiled/changetilewangid.cpp @@ -0,0 +1,113 @@ +/* + * changetilewangid.cpp + * Copyright 2017, Benjamin Trotter + * + * This file is part of Tiled. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the Free + * Software Foundation; either version 2 of the License, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program. If not, see . + */ + +#include "changetilewangid.h" + +#include "tilesetdocument.h" +#include "tile.h" + +#include + +using namespace Tiled; +using namespace Internal; + +ChangeTileWangId::ChangeTileWangId() + : mTilesetDocument(nullptr) + , mWangSet(nullptr) + , mMergeable(false) +{ + setText(QCoreApplication::translate("Undo Commands", "Change Tile WangId")); +} + +ChangeTileWangId::ChangeTileWangId(TilesetDocument *tilesetDocument, WangSet *wangSet, Tile *tile, WangId wangId) + : mTilesetDocument(tilesetDocument) + , mWangSet(wangSet) + , mMergeable(true) +{ + Q_ASSERT(mWangSet); + setText(QCoreApplication::translate("Undo Commands", "Change Tile WangId")); + mChanges.append(WangIdChange(mWangSet->wangIdOfTile(tile), wangId, tile)); +} + +ChangeTileWangId::ChangeTileWangId(TilesetDocument *tilesetDocument, + WangSet *wangSet, + const QVector &changes, + QUndoCommand *parent) + : QUndoCommand(parent) + , mTilesetDocument(tilesetDocument) + , mWangSet(wangSet) + , mChanges(changes) + , mMergeable(true) +{ + setText(QCoreApplication::translate("Undo Commands", "Change Tile WangId")); +} + +void ChangeTileWangId::undo() +{ + if (mChanges.isEmpty()) + return; + + QList changedTiles; + + const auto& changes = mChanges; + for (const WangIdChange &wangIdChange : changes) { + changedTiles.append(wangIdChange.tile); + + mWangSet->addTile(wangIdChange.tile, wangIdChange.from); + } + + emit mTilesetDocument->tileWangSetChanged(changedTiles); +} + +void ChangeTileWangId::redo() +{ + if (mChanges.isEmpty()) + return; + + QList changedTiles; + + const auto& changes = mChanges; + for (const WangIdChange &wangIdChange : changes) { + changedTiles.append(wangIdChange.tile); + + mWangSet->addTile(wangIdChange.tile, wangIdChange.to); + } + + emit mTilesetDocument->tileWangSetChanged(changedTiles); +} + +bool ChangeTileWangId::mergeWith(const QUndoCommand *other) +{ + if (!mMergeable) + return false; + + const ChangeTileWangId *o = static_cast(other); + if (o->mTilesetDocument && !(mTilesetDocument == o->mTilesetDocument && + mWangSet == o->mWangSet)) + return false; + + //suboptimal, could use a map to remove any unnessesary changes if the same tile has + //multiple changes. + mChanges += o->mChanges; + + mMergeable = o->mMergeable; + + return true; +} diff --git a/src/tiled/changetilewangid.h b/src/tiled/changetilewangid.h new file mode 100644 index 0000000000..d9a78ab1fd --- /dev/null +++ b/src/tiled/changetilewangid.h @@ -0,0 +1,76 @@ +/* + * changetilewangid.h + * Copyright 2017, Benjamin Trotter + * + * This file is part of Tiled. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the Free + * Software Foundation; either version 2 of the License, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program. If not, see . + */ + +#pragma once + +#include "wangset.h" +#include "undocommands.h" + +#include + +namespace Tiled { +namespace Internal { + +class TilesetDocument; + +class ChangeTileWangId : public QUndoCommand +{ +public: + struct WangIdChange { + WangIdChange(WangId from, WangId to, Tile *tile) + : from(from) + , to(to) + , tile(tile) + {} + + WangIdChange() + :from(0) + , to(0) + , tile(nullptr) + {} + + WangId from; + WangId to; + Tile *tile; + }; + + ChangeTileWangId(); + + ChangeTileWangId(TilesetDocument *tilesetDocument, WangSet *wangSet, Tile *tile, WangId wangId); + + ChangeTileWangId(TilesetDocument *tilesetDocument, + WangSet *wangSet, + const QVector &changes, + QUndoCommand *parent = nullptr); + + void undo() override; + void redo() override; + int id() const override { return Cmd_ChangeTileWangId; } + bool mergeWith(const QUndoCommand *other) override; + +private: + TilesetDocument *mTilesetDocument; + WangSet *mWangSet; + QVector mChanges; + bool mMergeable; +}; + +} +} diff --git a/src/tiled/changewangsetdata.cpp b/src/tiled/changewangsetdata.cpp index 1a7e167e02..0f01b84f28 100644 --- a/src/tiled/changewangsetdata.cpp +++ b/src/tiled/changewangsetdata.cpp @@ -31,6 +31,7 @@ #include "tileset.h" #include "tilesetdocument.h" #include "tilesetwangsetmodel.h" +#include "changetilewangid.h" #include @@ -42,21 +43,51 @@ ChangeWangSetEdges::ChangeWangSetEdges(TilesetDocument *tilesetDocument, int newValue) : QUndoCommand(QCoreApplication::translate("Undo Commands", "Change Wang Set edge count")) + + , mTilesetDocument(tilesetDocument) , mWangSetModel(tilesetDocument->wangSetModel()) , mIndex(index) , mOldValue(tilesetDocument->tileset()->wangSet(index)->edgeColors()) , mNewValue(newValue) { + //when edge size changes, all tiles with wangIds need to be updated. + WangSet *wangSet = mTilesetDocument->tileset()->wangSet(index); + Q_ASSERT(wangSet); + mAffectedTiles = wangSet->tilesWithWangId(); + + if (mNewValue < mOldValue) { + //when the size is reduced, some wang assignments can be lost. + const QList &changedTiles = wangSet->tilesChangedOnSetEdgeColors(mNewValue); + + if (!changedTiles.isEmpty()) { + QVector changes; + + for (Tile *tile : changedTiles) + changes.append(ChangeTileWangId::WangIdChange(wangSet->wangIdOfTile(tile), 0, tile)); + + new ChangeTileWangId(mTilesetDocument, wangSet, changes, this); + } + } } void ChangeWangSetEdges::undo() { mWangSetModel->setWangSetEdges(mIndex, mOldValue); + + if (!mAffectedTiles.isEmpty()) + emit mTilesetDocument->tileWangSetChanged(mAffectedTiles); + + QUndoCommand::undo(); } void ChangeWangSetEdges::redo() { mWangSetModel->setWangSetEdges(mIndex, mNewValue); + + if (!mAffectedTiles.isEmpty()) + emit mTilesetDocument->tileWangSetChanged(mAffectedTiles); + + QUndoCommand::redo(); } ChangeWangSetCorners::ChangeWangSetCorners(TilesetDocument *tilesetDocument, @@ -64,21 +95,51 @@ ChangeWangSetCorners::ChangeWangSetCorners(TilesetDocument *tilesetDocument, int newValue) : QUndoCommand(QCoreApplication::translate("Undo Commands", "Change Wang Set corner count")) + , mTilesetDocument(tilesetDocument) , mWangSetModel(tilesetDocument->wangSetModel()) , mIndex(index) , mOldValue(tilesetDocument->tileset()->wangSet(index)->cornerColors()) , mNewValue(newValue) { + //when corner size changes, all tiles with wangIds need to be updated. + WangSet *wangSet = mTilesetDocument->tileset()->wangSet(index); + Q_ASSERT(wangSet); + mAffectedTiles = wangSet->tilesWithWangId(); + + if (mNewValue < mOldValue) { + //when the size is reduced, some wang assignments can be lost. + const QList &changedTiles = wangSet->tilesChangedOnSetCornerColors(mNewValue); + + if (!changedTiles.isEmpty()) { + QVector changes; + + for (Tile *tile : changedTiles) + changes.append(ChangeTileWangId::WangIdChange(wangSet->wangIdOfTile(tile), 0, tile)); + + new ChangeTileWangId(mTilesetDocument, wangSet, changes, this); + } + } + } void ChangeWangSetCorners::undo() { mWangSetModel->setWangSetCorners(mIndex, mOldValue); + + if (!mAffectedTiles.isEmpty()) + emit mTilesetDocument->tileWangSetChanged(mAffectedTiles); + + QUndoCommand::undo(); } void ChangeWangSetCorners::redo() { mWangSetModel->setWangSetCorners(mIndex, mNewValue); + + if (!mAffectedTiles.isEmpty()) + emit mTilesetDocument->tileWangSetChanged(mAffectedTiles); + + QUndoCommand::redo(); } SetWangSetImage::SetWangSetImage(TilesetDocument *tilesetDocument, int index, int tileId) diff --git a/src/tiled/changewangsetdata.h b/src/tiled/changewangsetdata.h index ce3f70d2e5..beeb047323 100644 --- a/src/tiled/changewangsetdata.h +++ b/src/tiled/changewangsetdata.h @@ -32,6 +32,7 @@ namespace Tiled { class Tileset; +class Tile; namespace Internal { @@ -49,10 +50,12 @@ class ChangeWangSetEdges : public QUndoCommand void redo() override; private: + TilesetDocument *mTilesetDocument; TilesetWangSetModel *mWangSetModel; int mIndex; int mOldValue; int mNewValue; + QList mAffectedTiles; }; class ChangeWangSetCorners : public QUndoCommand @@ -66,10 +69,12 @@ class ChangeWangSetCorners : public QUndoCommand void redo() override; private: + TilesetDocument *mTilesetDocument; TilesetWangSetModel *mWangSetModel; int mIndex; int mOldValue; int mNewValue; + QList mAffectedTiles; }; class SetWangSetImage : public QUndoCommand diff --git a/src/tiled/images/24x24/wangtile.png b/src/tiled/images/24x24/wangtile.png new file mode 100644 index 0000000000000000000000000000000000000000..3a66385ff46778f19af9f233357136e456ddb8ee GIT binary patch literal 20414 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 Bkoy1t literal 0 HcmV?d00001 diff --git a/src/tiled/mapeditor.cpp b/src/tiled/mapeditor.cpp index 02321eda74..769b567ce4 100644 --- a/src/tiled/mapeditor.cpp +++ b/src/tiled/mapeditor.cpp @@ -68,6 +68,8 @@ #include "toolmanager.h" #include "treeviewcombobox.h" #include "undodock.h" +#include "wangdock.h" +#include "wangset.h" #include "zoomable.h" #include @@ -132,6 +134,7 @@ MapEditor::MapEditor(QObject *parent) , mObjectsDock(new ObjectsDock(mMainWindow)) , mTilesetDock(new TilesetDock(mMainWindow)) , mTerrainDock(new TerrainDock(mMainWindow)) + , mWangDock(new WangDock(mMainWindow)) , mMiniMapDock(new MiniMapDock(mMainWindow)) , mLayerComboBox(new TreeViewComboBox) , mUncheckableProxyModel(new UncheckableItemsModel(this)) @@ -200,6 +203,7 @@ MapEditor::MapEditor(QObject *parent) mMainWindow->addDockWidget(Qt::RightDockWidgetArea, mObjectsDock); mMainWindow->addDockWidget(Qt::RightDockWidgetArea, mMiniMapDock); mMainWindow->addDockWidget(Qt::RightDockWidgetArea, mTerrainDock); + mMainWindow->addDockWidget(Qt::RightDockWidgetArea, mWangDock); mMainWindow->addDockWidget(Qt::RightDockWidgetArea, mTilesetDock); mMainWindow->addDockWidget(Qt::LeftDockWidgetArea, mTileStampsDock); @@ -207,6 +211,7 @@ MapEditor::MapEditor(QObject *parent) mMainWindow->tabifyDockWidget(mMiniMapDock, mObjectsDock); mMainWindow->tabifyDockWidget(mObjectsDock, mLayerDock); mMainWindow->tabifyDockWidget(mTerrainDock, mTilesetDock); + mMainWindow->tabifyDockWidget(mWangDock, mTilesetDock); // These dock widgets may not be immediately useful to many people, so // they are hidden by default. @@ -235,6 +240,8 @@ MapEditor::MapEditor(QObject *parent) connect(mBucketFillTool, &BucketFillTool::stampChanged, this, &MapEditor::setStamp); connect(mStampBrush, &StampBrush::randomChanged, this, &MapEditor::setRandom); connect(mBucketFillTool, &BucketFillTool::randomChanged, this, &MapEditor::setRandom); + connect(mStampBrush, &StampBrush::wangFillChanged, this, &MapEditor::setWangFill); + connect(mBucketFillTool, &BucketFillTool::wangFillChanged, this, &MapEditor::setWangFill); connect(mTerrainDock, &TerrainDock::currentTerrainChanged, mTerrainBrush, &TerrainBrush::setTerrain); @@ -243,6 +250,11 @@ MapEditor::MapEditor(QObject *parent) connect(mTerrainBrush, &TerrainBrush::terrainCaptured, mTerrainDock, &TerrainDock::setCurrentTerrain); + connect(mWangDock, &WangDock::currentWangSetChanged, + mBucketFillTool, &BucketFillTool::setWangSet); + connect(mWangDock, &WangDock::currentWangSetChanged, + mStampBrush, &StampBrush::setWangSet); + connect(mTileStampsDock, SIGNAL(setStamp(TileStamp)), this, SLOT(setStamp(TileStamp))); @@ -364,6 +376,7 @@ void MapEditor::setCurrentDocument(Document *document) mObjectsDock->setMapDocument(mapDocument); mTilesetDock->setMapDocument(mapDocument); mTerrainDock->setDocument(mapDocument); + mWangDock->setDocument(mapDocument); mMiniMapDock->setMapDocument(mapDocument); if (mapDocument) { @@ -437,6 +450,7 @@ QList MapEditor::dockWidgets() const mObjectsDock, mTilesetDock, mTerrainDock, + mWangDock, mMiniMapDock, mTileStampsDock }; @@ -619,6 +633,12 @@ void MapEditor::setRandom(bool value) mBucketFillTool->setRandom(value); } +void MapEditor::setWangFill(bool value) +{ + mStampBrush->setWangFill(value); + mBucketFillTool->setWangFill(value); +} + /** * Sets the current stamp, which is used by both the stamp brush and the bucket * fill tool. diff --git a/src/tiled/mapeditor.h b/src/tiled/mapeditor.h index 163ab426dd..29fb7dd869 100644 --- a/src/tiled/mapeditor.h +++ b/src/tiled/mapeditor.h @@ -63,6 +63,7 @@ class ToolManager; class TreeViewComboBox; class UncheckableItemsModel; class UndoDock; +class WangDock; class Zoomable; class MapEditor : public Editor @@ -109,6 +110,7 @@ public slots: void flip(FlipDirection direction); void rotate(RotateDirection direction); void setRandom(bool value); + void setWangFill(bool value); void setStamp(const TileStamp &stamp); void selectTerrainBrush(); @@ -148,6 +150,7 @@ private slots: ObjectsDock *mObjectsDock; TilesetDock *mTilesetDock; TerrainDock *mTerrainDock; + WangDock *mWangDock; MiniMapDock* mMiniMapDock; QDockWidget *mTileStampsDock; diff --git a/src/tiled/propertybrowser.cpp b/src/tiled/propertybrowser.cpp index 6449b97d53..ea8981920d 100644 --- a/src/tiled/propertybrowser.cpp +++ b/src/tiled/propertybrowser.cpp @@ -857,8 +857,10 @@ void PropertyBrowser::addWangSetProperties() QtVariantProperty *edgeProperty = addProperty(EdgeCountProperty, QVariant::Int, tr("Edge Count"), groupProperty); QtVariantProperty *cornerProperty = addProperty(CornerCountProperty, QVariant::Int, tr("Corner Count"), groupProperty); - edgeProperty->setAttribute(QLatin1String("minimum"), 0); - cornerProperty->setAttribute(QLatin1String("minimum"), 0); + edgeProperty->setAttribute(QLatin1String("minimum"), 1); + edgeProperty->setAttribute(QLatin1String("maximum"), 15); + cornerProperty->setAttribute(QLatin1String("minimum"), 1); + cornerProperty->setAttribute(QLatin1String("maximum"), 15); nameProperty->setEnabled(mTilesetDocument); edgeProperty->setEnabled(mTilesetDocument); diff --git a/src/tiled/stampactions.cpp b/src/tiled/stampactions.cpp index 9e78aa7fea..ab99b13dd2 100644 --- a/src/tiled/stampactions.cpp +++ b/src/tiled/stampactions.cpp @@ -29,12 +29,14 @@ using namespace Tiled::Internal; StampActions::StampActions(QObject *parent) : QObject(parent) { QIcon diceIcon(QLatin1String(":images/24x24/dice.png")); + QIcon wangIcon(QLatin1String(":images/24x24/wangtile.png")); QIcon flipHorizontalIcon(QLatin1String(":images/24x24/flip-horizontal.png")); QIcon flipVerticalIcon(QLatin1String(":images/24x24/flip-vertical.png")); QIcon rotateLeftIcon(QLatin1String(":images/24x24/rotate-left.png")); QIcon rotateRightIcon(QLatin1String(":images/24x24/rotate-right.png")); diceIcon.addFile(QLatin1String(":images/32x32/dice.png")); + wangIcon.addFile(QLatin1String(":images/32x32/wangtile.png")); flipHorizontalIcon.addFile(QLatin1String(":images/32x32/flip-horizontal.png")); flipVerticalIcon.addFile(QLatin1String(":images/32x32/flip-vertical.png")); rotateLeftIcon.addFile(QLatin1String(":images/32x32/rotate-left.png")); @@ -46,6 +48,11 @@ StampActions::StampActions(QObject *parent) : QObject(parent) mRandom->setToolTip(tr("Random Mode")); mRandom->setShortcut(QKeySequence(tr("D"))); + mWangFill = new QAction(this); + mWangFill->setIcon(wangIcon); + mWangFill->setCheckable(true); + mWangFill->setToolTip(tr("Wang Fill Mode")); + mFlipHorizontal = new QAction(this); mFlipHorizontal->setIcon(flipHorizontalIcon); @@ -68,6 +75,7 @@ StampActions::~StampActions() void StampActions::languageChanged() { mRandom->setToolTip(tr("Random Mode")); + mWangFill->setToolTip(tr("Wang Fill Mode")); mFlipHorizontal->setToolTip(tr("Flip Horizontally")); mFlipVertical->setToolTip(tr("Flip Vertically")); mRotateLeft->setToolTip(tr("Rotate Left")); @@ -80,10 +88,12 @@ void StampActions::languageChanged() mRotateRight->setShortcut(QKeySequence(tr("Z"))); } -void StampActions::populateToolBar(QToolBar *toolBar, bool isRandom) +void StampActions::populateToolBar(QToolBar *toolBar, bool isRandom, bool isWangFill) { mRandom->setChecked(isRandom); + mWangFill->setChecked(isWangFill); toolBar->addAction(mRandom); + toolBar->addAction(mWangFill); toolBar->addAction(mFlipHorizontal); toolBar->addAction(mFlipVertical); toolBar->addAction(mRotateLeft); diff --git a/src/tiled/stampactions.h b/src/tiled/stampactions.h index d784a83fe0..94ca3f612c 100644 --- a/src/tiled/stampactions.h +++ b/src/tiled/stampactions.h @@ -38,9 +38,10 @@ class StampActions : public QObject void languageChanged(); - void populateToolBar(QToolBar *toolBar, bool isRandom); + void populateToolBar(QToolBar *toolBar, bool isRandom, bool isWangFill); QAction *random() const { return mRandom; } + QAction *wangFill() const { return mWangFill; } QAction *flipHorizontal() const { return mFlipHorizontal; } QAction *flipVertical() const { return mFlipVertical; } QAction *rotateLeft() const { return mRotateLeft; } @@ -48,6 +49,7 @@ class StampActions : public QObject private: QAction *mRandom; + QAction *mWangFill; QAction *mFlipHorizontal; QAction *mFlipVertical; QAction *mRotateLeft; diff --git a/src/tiled/stampbrush.cpp b/src/tiled/stampbrush.cpp index 930a85acd6..ae5d9ff829 100644 --- a/src/tiled/stampbrush.cpp +++ b/src/tiled/stampbrush.cpp @@ -31,6 +31,7 @@ #include "stampactions.h" #include "tile.h" #include "tilestamp.h" +#include "wangset.h" #include #include @@ -48,9 +49,12 @@ StampBrush::StampBrush(QObject *parent) parent) , mBrushBehavior(Free) , mIsRandom(false) + , mIsWangFill(false) + , mWangSet(nullptr) , mStampActions(new StampActions(this)) { connect(mStampActions->random(), &QAction::toggled, this, &StampBrush::randomChanged); + connect(mStampActions->wangFill(), &QAction::toggled, this, &StampBrush::wangFillChanged); connect(mStampActions->flipHorizontal(), &QAction::triggered, [this]() { emit stampChanged(mStamp.flipped(FlipHorizontally)); }); @@ -153,7 +157,7 @@ void StampBrush::mouseReleased(QGraphicsSceneMouseEvent *event) void StampBrush::modifiersChanged(Qt::KeyboardModifiers modifiers) { - if (mStamp.isEmpty()) + if (mStamp.isEmpty() && !mIsWangFill) return; if (modifiers & Qt::ShiftModifier) { @@ -235,7 +239,7 @@ void StampBrush::setStamp(const TileStamp &stamp) void StampBrush::populateToolBar(QToolBar *toolBar) { - mStampActions->populateToolBar(toolBar, mIsRandom); + mStampActions->populateToolBar(toolBar, mIsRandom, mIsWangFill); } void StampBrush::beginPaint() @@ -372,6 +376,21 @@ struct PaintOperation { TileLayer *stamp; }; +//Helper function which gets a cell from the front or background tilelayer based on x and y +//All positions are given relative to the front (and assumes back.pos = 0,0) +//If outside fillRegion, then a cell is given from back (if it has one) +static const Cell &adjacentCell(const TileLayer &back, const TileLayer &front, const QRegion &fillRegion, int x, int y) +{ + if (!fillRegion.contains(QPoint(x + front.x(), y + front.y())) && back.contains(x + front.x(), y + front.y())) { + return back.cellAt(x + front.x(), y + front.y()); + } else if (front.contains(x, y)) { + return front.cellAt(x, y); + } else { + static const Cell cell; + return cell; + } +} + /** * Draws the preview layer. * It tries to put at all given points a stamp of the current stamp at the @@ -384,7 +403,7 @@ void StampBrush::drawPreviewLayer(const QVector &list) { mPreviewLayer.clear(); - if (mStamp.isEmpty()) + if (mStamp.isEmpty() && !mIsWangFill) return; if (mIsRandom) { @@ -407,6 +426,59 @@ void StampBrush::drawPreviewLayer(const QVector &list) cell); } + mPreviewLayer = preview; + } else if (mIsWangFill) { + if (!mWangSet) + return; + + const TileLayer *tileLayer = currentTileLayer(); + if (!tileLayer) + return; + + QRegion paintedRegion; + for (const QPoint p : list) + paintedRegion += QRect(p, QSize(1, 1)); + + QRect bounds = paintedRegion.boundingRect(); + SharedTileLayer preview(new TileLayer(QString(), + bounds.x(), bounds.y(), + bounds.width(), bounds.height())); + + Cell surroundingCells[8]; + + for (const QPoint p : list) { + surroundingCells[0] = adjacentCell(*tileLayer, *preview.data(), paintedRegion, + p.x() - bounds.left(), + p.y() - bounds.top() - 1); + surroundingCells[1] = adjacentCell(*tileLayer, *preview.data(), paintedRegion, + p.x() - bounds.left() + 1, + p.y() - bounds.top() - 1); + surroundingCells[2] = adjacentCell(*tileLayer, *preview.data(), paintedRegion, + p.x() - bounds.left() + 1, + p.y() - bounds.top()); + surroundingCells[3] = adjacentCell(*tileLayer, *preview.data(), paintedRegion, + p.x() - bounds.left() + 1, + p.y() - bounds.top() + 1); + surroundingCells[4] = adjacentCell(*tileLayer, *preview.data(), paintedRegion, + p.x() - bounds.left(), + p.y() - bounds.top() + 1); + surroundingCells[5] = adjacentCell(*tileLayer, *preview.data(), paintedRegion, + p.x() - bounds.left() - 1, + p.y() - bounds.top() + 1); + surroundingCells[6] = adjacentCell(*tileLayer, *preview.data(), paintedRegion, + p.x() - bounds.left() - 1, + p.y() - bounds.top()); + surroundingCells[7] = adjacentCell(*tileLayer, *preview.data(), paintedRegion, + p.x() - bounds.left() - 1, + p.y() - bounds.top() - 1); + + WangId wangId = mWangSet->wangIdFromSurrounding(surroundingCells); + + preview->setCell(p.x() - bounds.left(), + p.y() - bounds.top(), + mWangSet->findMatchingCell(wangId)); + } + mPreviewLayer = preview; } else { mMissingTilesets.clear(); @@ -524,7 +596,7 @@ void StampBrush::updatePreview(QPoint tilePos) if (mBrushBehavior == Capture) { mPreviewLayer.clear(); tileRegion = capturedArea(); - } else if (mStamp.isEmpty()) { + } else if (mStamp.isEmpty() && !mIsWangFill) { mPreviewLayer.clear(); tileRegion = QRect(tilePos, QSize(1, 1)); } else { @@ -564,6 +636,26 @@ void StampBrush::setRandom(bool value) mIsRandom = value; + if (mIsRandom) { + mIsWangFill = false; + mStampActions->wangFill()->setChecked(false); + } + updateRandomList(); updatePreview(); } + +void StampBrush::setWangFill(bool value) +{ + if (mIsWangFill == value) + return; + + mIsWangFill = value; + + if (mIsWangFill) { + mIsRandom = false; + mStampActions->random()->setChecked(false); + } + + updatePreview(); +} diff --git a/src/tiled/stampbrush.h b/src/tiled/stampbrush.h index b846f77bd6..93c13f8717 100644 --- a/src/tiled/stampbrush.h +++ b/src/tiled/stampbrush.h @@ -29,6 +29,7 @@ namespace Tiled { class Tile; +class WangSet; namespace Internal { @@ -69,6 +70,8 @@ class StampBrush : public AbstractTileTool public slots: void setRandom(bool value); + void setWangFill(bool value); + void setWangSet(const WangSet *wangSet) { mWangSet = wangSet; } signals: /** @@ -80,6 +83,8 @@ public slots: void randomChanged(bool value); + void wangFillChanged(bool value); + protected: void tilePositionChanged(const QPoint &tilePos) override; @@ -142,6 +147,9 @@ public slots: bool mIsRandom; RandomPicker mRandomCellPicker; + bool mIsWangFill; + const WangSet *mWangSet; + void updateRandomList(); StampActions *mStampActions; diff --git a/src/tiled/tiled.pro b/src/tiled/tiled.pro index 347a94c466..273e847a47 100644 --- a/src/tiled/tiled.pro +++ b/src/tiled/tiled.pro @@ -110,6 +110,7 @@ SOURCES += aboutdialog.cpp \ changetileobjectgroup.cpp \ changetileprobability.cpp \ changetileterrain.cpp \ + changetilewangid.cpp \ changewangsetdata.cpp \ clickablelabel.cpp \ clipboardmanager.cpp \ @@ -249,6 +250,8 @@ SOURCES += aboutdialog.cpp \ wangsetview.cpp \ wangsetmodel.cpp \ wangdock.cpp \ + wangtemplateview.cpp \ + wangtemplatemodel.cpp \ zoomable.cpp HEADERS += aboutdialog.h \ @@ -288,6 +291,7 @@ HEADERS += aboutdialog.h \ changetileobjectgroup.h \ changetileprobability.h \ changetileterrain.h \ + changetilewangid.h \ changewangsetdata.h \ clickablelabel.h \ clipboardmanager.h \ @@ -432,6 +436,8 @@ HEADERS += aboutdialog.h \ wangsetview.h \ wangsetmodel.h \ wangdock.h \ + wangtemplateview.h \ + wangtemplatemodel.h \ zoomable.h FORMS += aboutdialog.ui \ diff --git a/src/tiled/tiled.qbs b/src/tiled/tiled.qbs index ad50be6c13..f820289635 100644 --- a/src/tiled/tiled.qbs +++ b/src/tiled/tiled.qbs @@ -132,6 +132,8 @@ QtGuiApplication { "changetileprobability.h", "changetileterrain.cpp", "changetileterrain.h", + "changetilewangid.cpp", + "changetilewangid.h", "changewangsetdata.cpp", "changewangsetdata.h", "clipboardmanager.cpp", @@ -428,6 +430,10 @@ QtGuiApplication { "wangsetmodel.h", "wangsetview.cpp", "wangsetview.h", + "wangtemplatemodel.cpp", + "wangtemplatemodel.h", + "wangtemplateview.cpp", + "wangtemplateview.h", "zoomable.cpp", "zoomable.h", ] diff --git a/src/tiled/tiled.qrc b/src/tiled/tiled.qrc index 3273f2834d..ae44b24b22 100644 --- a/src/tiled/tiled.qrc +++ b/src/tiled/tiled.qrc @@ -128,5 +128,7 @@ images/48x48/tile-collision-editor.png images/48x48/insert-text.png images/48x48/insert-image.png + images/24x24/wangtile.png + images/32x32/wangtile.png diff --git a/src/tiled/tileseteditor.cpp b/src/tiled/tileseteditor.cpp index 32021601ed..489d6e76b1 100644 --- a/src/tiled/tileseteditor.cpp +++ b/src/tiled/tileseteditor.cpp @@ -47,7 +47,6 @@ #include "undodock.h" #include "utils.h" #include "wangdock.h" -#include "wangset.h" #include "zoomable.h" #include @@ -204,7 +203,7 @@ TilesetEditor::TilesetEditor(QObject *parent) editTerrain->setIconVisibleInMenu(false); editCollision->setIcon(QIcon(QLatin1String(":images/48x48/tile-collision-editor.png"))); editCollision->setIconVisibleInMenu(false); - editWang->setIcon(QIcon(QLatin1String(":images/24x24/terrain.png"))); + editWang->setIcon(QIcon(QLatin1String(":images/24x24/wangtile.png"))); editWang->setIconVisibleInMenu(false); Utils::setThemeIcon(mAddTiles, "add"); @@ -237,6 +236,7 @@ TilesetEditor::TilesetEditor(QObject *parent) connect(mTerrainDock, &TerrainDock::removeTerrainTypeRequested, this, &TilesetEditor::removeTerrainType); connect(mWangDock, &WangDock::currentWangSetChanged, this, &TilesetEditor::currentWangSetChanged); + connect(mWangDock, &WangDock::currentWangIdChanged, this, &TilesetEditor::currentWangIdChanged); connect(mWangDock, &WangDock::addWangSetRequested, this, &TilesetEditor::addWangSet); connect(mWangDock, &WangDock::removeWangSetRequested, this, &TilesetEditor::removeWangSet); @@ -301,6 +301,8 @@ void TilesetEditor::addDocument(Document *document) connect(tilesetDocument, &TilesetDocument::tileTerrainChanged, tilesetModel, &TilesetModel::tilesChanged); + connect(tilesetDocument, &TilesetDocument::tileWangSetChanged, + tilesetModel, &TilesetModel::tilesChanged); connect(tilesetDocument, &TilesetDocument::tileImageSourceChanged, tilesetModel, &TilesetModel::tileChanged); connect(tilesetDocument, &TilesetDocument::tileAnimationChanged, @@ -313,6 +315,8 @@ void TilesetEditor::addDocument(Document *document) connect(view, &TilesetView::terrainImageSelected, this, &TilesetEditor::setTerrainImage); connect(view, &TilesetView::wangSetImageSelected, this, &TilesetEditor::setWangSetImage); + connect(view, &TilesetView::wangIdUsedChanged, mWangDock, &WangDock::onWangIdUsedChanged); + connect(view, &TilesetView::activeWangIdChanged, mWangDock, &WangDock::onActiveWangIdChanged); QItemSelectionModel *s = view->selectionModel(); connect(s, &QItemSelectionModel::selectionChanged, this, &TilesetEditor::selectionChanged); @@ -861,14 +865,22 @@ void TilesetEditor::removeTerrainType() undoStack->endMacro(); } -void TilesetEditor::currentWangSetChanged(const WangSet *wangSet) +void TilesetEditor::currentWangSetChanged(WangSet *wangSet) +{ + TilesetView *view = currentTilesetView(); + if (!view) + return; + + view->setWangSet(wangSet); +} + +void TilesetEditor::currentWangIdChanged(WangId wangId) { TilesetView *view = currentTilesetView(); if (!view) return; - if (wangSet) - view->setWangSet(wangSet); + view->setWangId(wangId); } void TilesetEditor::addWangSet() @@ -877,8 +889,8 @@ void TilesetEditor::addWangSet() if (!tileset) return; - //2 and 0 are default values for number of edges and corners TODO define this some where better? - WangSet *wangSet = new WangSet(tileset, 2, 0, QString(), -1); + //2 and 1 are default values for number of edges and corners TODO define this some where better? + WangSet *wangSet = new WangSet(tileset, 2, 1, QString(), -1); wangSet->setName(tr("New Wang Set")); mCurrentTilesetDocument->undoStack()->push(new AddWangSet(mCurrentTilesetDocument, diff --git a/src/tiled/tileseteditor.h b/src/tiled/tileseteditor.h index 72d934ef75..7ba5e2dfaa 100644 --- a/src/tiled/tileseteditor.h +++ b/src/tiled/tileseteditor.h @@ -22,6 +22,7 @@ #include "clipboardmanager.h" #include "editor.h" +#include "wangset.h" #include @@ -36,7 +37,6 @@ namespace Tiled { class Terrain; class Tile; class Tileset; -class WangSet; namespace Internal { @@ -116,7 +116,8 @@ private slots: void removeTerrainType(); void setTerrainImage(Tile *tile); - void currentWangSetChanged(const WangSet *wangSet); + void currentWangSetChanged(WangSet *wangSet); + void currentWangIdChanged(WangId wangId); void addWangSet(); void removeWangSet(); void setWangSetImage(Tile *tile); diff --git a/src/tiled/tilesetview.cpp b/src/tiled/tilesetview.cpp index 412989111d..fe920d0a8e 100644 --- a/src/tiled/tilesetview.cpp +++ b/src/tiled/tilesetview.cpp @@ -21,6 +21,7 @@ #include "tilesetview.h" #include "changetileterrain.h" +#include "changetilewangid.h" #include "map.h" #include "preferences.h" #include "stylehelper.h" @@ -30,7 +31,6 @@ #include "tilesetdocument.h" #include "tilesetmodel.h" #include "utils.h" -#include "wangset.h" #include "zoomable.h" #include @@ -241,6 +241,286 @@ static QTransform tilesetGridTransform(const Tileset &tileset, QPoint tileCenter return transform; } +static void setWangStyle(QPainter *painter, int index, int max) +{ + float hue = (float) (index-1) / max; + QColor c = QColor::fromHsvF(hue, 1, 1); + + painter->setBrush(QColor(c.red(), c.green(), c.blue(), 200)); + setCosmeticPen(painter, c, 2); +} + +static void paintWangOverlay(QPainter *painter, + WangId wangId, + int edges, + int corners, + const QRect &rect) +{ + painter->save(); + painter->setClipRect(rect); + painter->setRenderHint(QPainter::Antialiasing); + + //arbitrary fraction, could be made constant. + int thicknessW = rect.width()/6; + int thicknessH = rect.height()/6; + + if (edges > 1) { + if (corners > 1) { + QRect wRect; + int edge; + + //top + edge = wangId.edgeColor(0); + if (edge > 0) { + setWangStyle(painter, edge, edges); + + wRect = QRect(QPoint(rect.left() + rect.width()/3, rect.top()), + QPoint(rect.right() - rect.width()/3, rect.top() + thicknessH)); + painter->drawRect(wRect); + } + + //right + edge = wangId.edgeColor(1); + if (edge > 0) { + setWangStyle(painter, edge, edges); + + wRect = QRect(QPoint(rect.right() - thicknessW, rect.top() + rect.height()/3), + QPoint(rect.right(), rect.bottom() - rect.height()/3)); + painter->drawRect(wRect); + } + + //bottom + edge = wangId.edgeColor(2); + if (edge > 0) { + setWangStyle(painter, edge, edges); + + wRect = QRect(QPoint(rect.left() + rect.width()/3, rect.bottom() - thicknessH), + QPoint(rect.right() - rect.width()/3, rect.bottom())); + painter->drawRect(wRect); + } + + //left + edge = wangId.edgeColor(3); + if (edge > 0) { + setWangStyle(painter, edge, edges); + + wRect = QRect(QPoint(rect.left(), rect.top() + rect.height()/3), + QPoint(rect.left() + thicknessW, rect.bottom() - rect.height()/3)); + painter->drawRect(wRect); + } + } else { + int edge; + + //top + edge = wangId.edgeColor(0); + if (edge > 0) { + setWangStyle(painter, edge, edges); + + const QPoint points[] = { + rect.topLeft(), + rect.topRight(), + rect.topRight() + QPoint(-thicknessW, thicknessH), + rect.topLeft() + QPoint(thicknessW, thicknessH) + }; + + painter->drawPolygon(points, 4); + } + + //right + edge = wangId.edgeColor(1); + if (edge > 0) { + setWangStyle(painter, edge, edges); + + const QPoint points[] = { + rect.topRight(), + rect.bottomRight(), + rect.bottomRight() + QPoint(-thicknessW, -thicknessH), + rect.topRight() + QPoint(-thicknessW, thicknessH) + }; + + painter->drawPolygon(points, 4); + } + + //bottom + edge = wangId.edgeColor(2); + if (edge > 0) { + setWangStyle(painter, edge, edges); + + const QPoint points[] = { + rect.bottomRight(), + rect.bottomLeft(), + rect.bottomLeft() + QPoint(thicknessW, -thicknessH), + rect.bottomRight() + QPoint(-thicknessW, -thicknessH) + }; + + painter->drawPolygon(points, 4); + } + + //left + edge = wangId.edgeColor(3); + if (edge > 0) { + setWangStyle(painter, edge, edges); + + const QPoint points[] = { + rect.topLeft(), + rect.bottomLeft(), + rect.bottomLeft() + QPoint(thicknessW, -thicknessH), + rect.topLeft() + QPoint(thicknessW, thicknessH) + }; + + painter->drawPolygon(points, 4); + } + } + } + + if (corners > 1) { + if (edges > 1) { + int corner; + + //top right + corner = wangId.cornerColor(0); + if (corner > 0) { + setWangStyle(painter, corner, corners); + + const QPoint points[] = { + rect.topRight(), + QPoint(rect.right(), rect.top() + rect.height()/3), + QPoint(rect.right() - thicknessW, rect.top() + rect.height()/3), + rect.topRight() + QPoint(-thicknessW, thicknessH), + QPoint(rect.right() - rect.width()/3, rect.top() + thicknessH), + QPoint(rect.right() - rect.width()/3, rect.top()) + }; + + painter->drawPolygon(points, 6); + } + + //bottom right + corner = wangId.cornerColor(1); + if (corner > 0) { + setWangStyle(painter, corner, corners); + + const QPoint points[] = { + rect.bottomRight(), + QPoint(rect.right(), rect.bottom() - rect.height()/3), + QPoint(rect.right() - thicknessW, rect.bottom() - rect.height()/3), + rect.bottomRight() + QPoint(-thicknessW, -thicknessH), + QPoint(rect.right() - rect.width()/3, rect.bottom() - thicknessH), + QPoint(rect.right() - rect.width()/3, rect.bottom()) + }; + + painter->drawPolygon(points, 6); + } + + //bottom left + corner = wangId.cornerColor(2); + if (corner > 0) { + setWangStyle(painter, corner, corners); + + const QPoint points[] = { + rect.bottomLeft(), + QPoint(rect.left(), rect.bottom() - rect.height()/3), + QPoint(rect.left() + thicknessW, rect.bottom() - rect.height()/3), + rect.bottomLeft() + QPoint(thicknessW, -thicknessH), + QPoint(rect.left() + rect.width()/3, rect.bottom() - thicknessH), + QPoint(rect.left() + rect.width()/3, rect.bottom()), + }; + + painter->drawPolygon(points, 6); + } + + //top left + corner = wangId.cornerColor(3); + if (corner > 0) { + setWangStyle(painter, corner, corners); + + const QPoint points[] = { + rect.topLeft(), + QPoint(rect.left(), rect.top() + rect.height()/3), + QPoint(rect.left() + thicknessW, rect.top() + rect.height()/3), + rect.topLeft() + QPoint(thicknessW, thicknessH), + QPoint(rect.left() + rect.width()/3, rect.top() + thicknessH), + QPoint(rect.left() + rect.width()/3, rect.top()) + }; + + painter->drawPolygon(points, 6); + } + } else { + QPolygon qPoly; + int corner; + + //top right + corner = wangId.cornerColor(0); + if (corner > 0) { + setWangStyle(painter, corner, corners); + + const QPoint points[] = { + rect.topRight(), + QPoint(rect.right(), rect.center().y()), + QPoint(rect.right() - thicknessW, rect.center().y()), + rect.topRight() + QPoint(-thicknessW, thicknessH), + QPoint(rect.center().x(), rect.top() + thicknessH), + QPoint(rect.center().x(), rect.top()) + }; + + painter->drawPolygon(points, 6); + } + + //bottom right + corner = wangId.cornerColor(1); + if (corner > 0) { + setWangStyle(painter, corner, corners); + + const QPoint points[] = { + rect.bottomRight(), + QPoint(rect.right(), rect.center().y()), + QPoint(rect.right() - thicknessW, rect.center().y()), + rect.bottomRight() + QPoint(-thicknessW, -thicknessH), + QPoint(rect.center().x(), rect.bottom() - thicknessH), + QPoint(rect.center().x(), rect.bottom()), + }; + + painter->drawPolygon(points, 6); + } + + //top left + corner = wangId.cornerColor(3); + if (corner > 0) { + setWangStyle(painter, corner, corners); + + const QPoint points[] = { + rect.topLeft(), + QPoint(rect.left(), rect.center().y()), + QPoint(rect.left() + thicknessW, rect.center().y()), + rect.topLeft() + QPoint(thicknessW, thicknessH), + QPoint(rect.center().x(), rect.top() + thicknessH), + QPoint(rect.center().x(), rect.top()) + }; + + painter->drawPolygon(points, 6); + } + + //bottom left + corner = wangId.cornerColor(2); + if (corner > 0) { + setWangStyle(painter, corner, corners); + + const QPoint points[] = { + rect.bottomLeft(), + QPoint(rect.left(), rect.center().y()), + QPoint(rect.left() + thicknessW, rect.center().y()), + rect.bottomLeft() + QPoint(thicknessW, -thicknessH), + QPoint(rect.center().x(), rect.bottom() - thicknessH), + QPoint(rect.center().x(), rect.bottom()) + }; + + painter->drawPolygon(points, 6); + } + } + } + + painter->restore(); +} + void TileDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const @@ -360,6 +640,25 @@ void TileDelegate::paint(QPainter *painter, painter->restore(); } + + if (mTilesetView->isEditWangSet()) { + if (const WangSet *wangSet = mTilesetView->wangSet()) { + paintWangOverlay(painter, wangSet->wangIdOfTile(tile), + wangSet->edgeColors(), + wangSet->cornerColors(), + targetRect); + + if (mTilesetView->hoveredIndex() == index) { + qreal opacity = painter->opacity(); + painter->setOpacity(0.9); + paintWangOverlay(painter, mTilesetView->wangId(), + wangSet->edgeColors(), + wangSet->cornerColors(), + targetRect); + painter->setOpacity(opacity); + } + } + } } QSize TileDelegate::sizeHint(const QStyleOptionViewItem & /* option */, @@ -399,10 +698,14 @@ TilesetView::TilesetView(QWidget *parent) , mTilesetDocument(nullptr) , mMarkAnimatedTiles(true) , mEditTerrain(false) + , mEditWangSet(false) , mEraseTerrain(false) , mTerrain(nullptr) + , mWangSet(nullptr) + , mWangId(0) , mHoveredCorner(0) , mTerrainChanged(false) + , mWangIdChanged(false) , mHandScrolling(false) , mImageMissingIcon(QStringLiteral("://images/32x32/image-missing.png")) { @@ -528,6 +831,38 @@ void TilesetView::keyPressEvent(QKeyEvent *event) mZoomable->resetZoom(); return; } + + if (mEditWangSet && !(event->modifiers() & Qt::ControlModifier)) { + + if (event->key() == Qt::Key_Z) { + if (event->modifiers() & Qt::ShiftModifier) + mWangId.rotate(-1); + else + mWangId.rotate(1); + + if (mHoveredIndex.isValid()) + update(mHoveredIndex); + + return; + } + if (event->key() == Qt::Key_X) { + mWangId.flipHorizontally(); + + if (mHoveredIndex.isValid()) + update(mHoveredIndex); + + return; + } + if (event->key() == Qt::Key_Y) { + mWangId.flipVertically(); + + if (mHoveredIndex.isValid()) + update(mHoveredIndex); + + return; + } + } + return QTableView::keyPressEvent(event); } @@ -543,7 +878,12 @@ void TilesetView::setEditTerrain(bool enabled) void TilesetView::setEditWangSet(bool enabled) { + if (mEditWangSet == enabled) + return; + mEditWangSet = enabled; + setMouseTracking(true); + viewport()->update(); } /** @@ -565,9 +905,28 @@ void TilesetView::setTerrain(const Terrain *terrain) viewport()->update(); } -void TilesetView::setWangSet(const WangSet *wangSet) +void TilesetView::setWangSet(WangSet *wangSet) { + if (mWangSet == wangSet) + return; + mWangSet = wangSet; + + if (mEditWangSet) + viewport()->update(); +} + +void TilesetView::setWangId(WangId wangId) +{ + if (!mWangSet || wangId == mWangId) + return; + + Q_ASSERT(mWangSet->wangIdIsValid(wangId)); + + mWangId = wangId; + + if (mEditWangSet && hoveredIndex().isValid()) + update(hoveredIndex()); } QIcon TilesetView::imageMissingIcon() const @@ -583,13 +942,21 @@ void TilesetView::mousePressEvent(QMouseEvent *event) return; } - if (!mEditTerrain) { - QTableView::mousePressEvent(event); + if (mEditTerrain) { + if (event->button() == Qt::LeftButton) + applyTerrain(); + return; } - if (event->button() == Qt::LeftButton) - applyTerrain(); + if (mEditWangSet) { + if (event->button() == Qt::LeftButton) + applyWangId(); + + return; + } + + QTableView::mousePressEvent(event); } void TilesetView::mouseMoveEvent(QMouseEvent *event) @@ -609,40 +976,55 @@ void TilesetView::mouseMoveEvent(QMouseEvent *event) return; } - if (!mEditTerrain) { - QTableView::mouseMoveEvent(event); - return; - } + if (mEditTerrain || mEditWangSet) { + if (mEditWangSet && mWangSet) { + if (!mWangSet->wangIdIsValid(mWangId)) + emit activeWangIdChanged(0); + } - const QPoint pos = event->pos(); - const QModelIndex hoveredIndex = indexAt(pos); - int hoveredCorner = 0; + const QPoint pos = event->pos(); + const QModelIndex hoveredIndex = indexAt(pos); + const QModelIndex previousHoveredIndex = mHoveredIndex; + mHoveredIndex = hoveredIndex; + int previousHoverCorner = mHoveredCorner; - if (hoveredIndex.isValid()) { - const QPoint center = visualRect(hoveredIndex).center(); + if (mEditTerrain) { + int hoveredCorner = 0; - const auto t = tilesetGridTransform(*tilesetDocument()->tileset(), center); - const auto mappedPos = t.inverted().map(pos); + if (mHoveredIndex.isValid()) { + const QPoint center = visualRect(hoveredIndex).center(); - if (mappedPos.x() > center.x()) - hoveredCorner += 1; - if (mappedPos.y() > center.y()) - hoveredCorner += 2; - } + const auto t = tilesetGridTransform(*tilesetDocument()->tileset(), center); + const auto mappedPos = t.inverted().map(pos); - if (mHoveredIndex != hoveredIndex || mHoveredCorner != hoveredCorner) { - const QModelIndex previousHoveredIndex = mHoveredIndex; - mHoveredIndex = hoveredIndex; - mHoveredCorner = hoveredCorner; + if (mappedPos.x() > center.x()) + hoveredCorner += 1; + if (mappedPos.y() > center.y()) + hoveredCorner += 2; - if (previousHoveredIndex.isValid()) - update(previousHoveredIndex); - if (previousHoveredIndex != mHoveredIndex && mHoveredIndex.isValid()) - update(mHoveredIndex); + mHoveredCorner = hoveredCorner; + } + } + + if (previousHoveredIndex != mHoveredIndex) { + if (previousHoveredIndex.isValid()) + update(previousHoveredIndex); + if (mHoveredIndex.isValid()) + update(mHoveredIndex); + } else if (previousHoverCorner != mHoveredCorner) { + if (mHoveredIndex.isValid()) + update(mHoveredIndex); + } + + if (mEditTerrain && (event->buttons() & Qt::LeftButton)) + applyTerrain(); + if (mEditWangSet && (event->buttons() & Qt::LeftButton)) + applyWangId(); + + return; } - if (event->buttons() & Qt::LeftButton) - applyTerrain(); + QTableView::mouseMoveEvent(event); } void TilesetView::mouseReleaseEvent(QMouseEvent *event) @@ -652,13 +1034,30 @@ void TilesetView::mouseReleaseEvent(QMouseEvent *event) return; } - if (!mEditTerrain) { - QTableView::mouseReleaseEvent(event); + if (mEditTerrain) { + if (event->button() == Qt::LeftButton) + finishTerrainChange(); + + return; + } + + if (mEditWangSet) { + if (event->button() == Qt::LeftButton) + finishWangIdChange(); + return; } - if (event->button() == Qt::LeftButton) - finishTerrainChange(); + QTableView::mouseReleaseEvent(event); + return; +} + +void TilesetView::enterEvent(QEvent *event) +{ + if (mEditWangSet) + setFocus(); + + QTableView::enterEvent(event); } void TilesetView::leaveEvent(QEvent *event) @@ -869,6 +1268,42 @@ void TilesetView::finishTerrainChange() mTerrainChanged = false; } +void TilesetView::applyWangId() +{ + if (!mHoveredIndex.isValid() || !mWangSet) + return; + + Tile *tile = tilesetModel()->tileAt(mHoveredIndex); + if (!tile) + return; + + WangId previousWangId = mWangSet->wangIdOfTile(tile); + + if (previousWangId == mWangId) + return; + + bool wasUnused = !mWangSet->wangIdIsUsed(mWangId); + + QUndoCommand *command = new ChangeTileWangId(mTilesetDocument, mWangSet, tile, mWangId); + mTilesetDocument->undoStack()->push(command); + mWangIdChanged = true; + + if (!mWangSet->wangIdIsUsed(previousWangId)) + emit wangIdUsedChanged(previousWangId); + + if (wasUnused) + emit wangIdUsedChanged(mWangId); +} + +void TilesetView::finishWangIdChange() +{ + if (!mWangIdChanged) + return; + + mTilesetDocument->undoStack()->push(new ChangeTileWangId); + mWangIdChanged = false; +} + Tile *TilesetView::currentTile() const { const TilesetModel *model = tilesetModel(); diff --git a/src/tiled/tilesetview.h b/src/tiled/tilesetview.h index e2ded6253d..cefae7a6ce 100644 --- a/src/tiled/tilesetview.h +++ b/src/tiled/tilesetview.h @@ -21,13 +21,13 @@ #pragma once #include "tilesetmodel.h" +#include "wangset.h" #include namespace Tiled { class Terrain; -class WangSet; namespace Internal { @@ -92,8 +92,8 @@ class TilesetView : public QTableView */ void setEditTerrain(bool enabled); - bool isEditWangSet() const { return mEditWangSet; } void setEditWangSet(bool enabled); + bool isEditWangSet() const { return mEditWangSet; } /** * Sets whether terrain editing is in "erase" mode. @@ -109,7 +109,11 @@ class TilesetView : public QTableView */ void setTerrain(const Terrain *terrain); - void setWangSet(const WangSet *wangSet); + const WangSet *wangSet() const { return mWangSet; } + void setWangSet(WangSet *wangSet); + + WangId wangId() const { return mWangId; } + void setWangId(WangId wangId); QModelIndex hoveredIndex() const { return mHoveredIndex; } int hoveredCorner() const { return mHoveredCorner; } @@ -122,6 +126,8 @@ class TilesetView : public QTableView void createNewTerrain(Tile *tile); void terrainImageSelected(Tile *tile); void wangSetImageSelected(Tile *tile); + void activeWangIdChanged(WangId wangId); + void wangIdUsedChanged(WangId wangId); void swapTilesRequested(Tile *tileA, Tile *tileB); void changeSelectedMapObjectsTileRequested(Tile *tile); @@ -131,6 +137,7 @@ class TilesetView : public QTableView void mousePressEvent(QMouseEvent *event) override; void mouseMoveEvent(QMouseEvent *event) override; void mouseReleaseEvent(QMouseEvent *event) override; + void enterEvent(QEvent *) override; void leaveEvent(QEvent *) override; void wheelEvent(QWheelEvent *event) override; void contextMenuEvent(QContextMenuEvent *event) override; @@ -149,6 +156,8 @@ private slots: private: void applyTerrain(); void finishTerrainChange(); + void applyWangId(); + void finishWangIdChange(); Tile *currentTile() const; void setHandScrolling(bool handScrolling); @@ -161,10 +170,12 @@ private slots: bool mEditWangSet; bool mEraseTerrain; const Terrain *mTerrain; - const WangSet *mWangSet; + WangSet *mWangSet; + WangId mWangId; QModelIndex mHoveredIndex; int mHoveredCorner; bool mTerrainChanged; + bool mWangIdChanged; bool mHandScrolling; QPoint mLastMousePos; diff --git a/src/tiled/tilesetwangsetmodel.h b/src/tiled/tilesetwangsetmodel.h index d32ea80c92..9ac0c56b02 100644 --- a/src/tiled/tilesetwangsetmodel.h +++ b/src/tiled/tilesetwangsetmodel.h @@ -78,7 +78,8 @@ class TilesetWangSetModel : public QAbstractListModel void wangSetRemoved(WangSet *wangSet); /** - * Emitted when either the name or the image of a terrain changed. + * Emitted when either the name, image, edgeCount, or corner count + * of a wangSet changed. */ void wangSetChanged(Tileset *tileset, int index); diff --git a/src/tiled/undocommands.h b/src/tiled/undocommands.h index d0b0efc4ad..1dd5a08438 100644 --- a/src/tiled/undocommands.h +++ b/src/tiled/undocommands.h @@ -30,5 +30,6 @@ enum UndoCommands { Cmd_ChangeLayerOffset, Cmd_ChangeLayerOpacity, Cmd_ChangeTileTerrain, + Cmd_ChangeTileWangId, Cmd_ChangeTilesetTileOffset }; diff --git a/src/tiled/wangdock.cpp b/src/tiled/wangdock.cpp index f7f2c34774..0981b0b361 100644 --- a/src/tiled/wangdock.cpp +++ b/src/tiled/wangdock.cpp @@ -18,10 +18,12 @@ * this program. If not, see . */ -#include "wangset.h" #include "wangdock.h" + #include "wangsetview.h" #include "wangsetmodel.h" +#include "wangtemplateview.h" +#include "wangtemplatemodel.h" #include "documentmanager.h" #include "map.h" #include "mapdocument.h" @@ -99,9 +101,11 @@ WangDock::WangDock(QWidget *parent) , mRemoveWangSet(new QAction(this)) , mDocument(nullptr) , mCurrentWangSet(nullptr) + , mCurrentWangId(0) , mTilesetDocumentFilterModel(new TilesetDocumentsFilterModel(this)) , mWangSetModel(new WangSetModel(mTilesetDocumentFilterModel, this)) , mProxyModel(new WangSetFilterModel(this)) + , mWangTemplateModel(new WangTemplateModel(nullptr, this)) , mInitializing(false) { setObjectName(QLatin1String("WangSetDock")); @@ -131,13 +135,32 @@ WangDock::WangDock(QWidget *parent) mToolBar->addAction(mAddWangSet); mToolBar->addAction(mRemoveWangSet); + mWangTemplateView = new WangTemplateView(w); + mWangTemplateView->setModel(mWangTemplateModel); + mWangTemplateView->setVisible(false); + + connect(mWangTemplateView->selectionModel(), &QItemSelectionModel::currentChanged, + this, &WangDock::refreshCurrentWangId); + + mEraseWangIdsButton = new QPushButton(this); + mEraseWangIdsButton->setIconSize(Utils::smallIconSize()); + mEraseWangIdsButton->setIcon(QIcon(QLatin1String(":images/22x22/stock-tool-eraser.png"))); + mEraseWangIdsButton->setCheckable(true); + mEraseWangIdsButton->setAutoExclusive(true); + mEraseWangIdsButton->setChecked(mCurrentWangId == 0); + + connect(mEraseWangIdsButton, &QPushButton::clicked, + this, &WangDock::eraseWangIdsButtonClicked); + QHBoxLayout *horizontal = new QHBoxLayout; + horizontal->addWidget(mEraseWangIdsButton); horizontal->addSpacerItem(new QSpacerItem(0, 0, QSizePolicy::MinimumExpanding)); horizontal->addWidget(mToolBar); QVBoxLayout *vertical = new QVBoxLayout(w); vertical->setMargin(0); vertical->addWidget(mWangSetView); + vertical->addWidget(mWangTemplateView); vertical->addLayout(horizontal); connect(mAddWangSet, &QAction::triggered, @@ -174,7 +197,9 @@ void WangDock::setDocument(Document *document) setCurrentWangSet((firstWangSet(mapDocument))); + mWangTemplateView->setVisible(false); mToolBar->setVisible(false); + mEraseWangIdsButton->setVisible(false); } else if (auto tilesetDocument = qobject_cast(document)) { TilesetWangSetModel *wangSetModel = tilesetDocument->wangSetModel(); @@ -185,10 +210,15 @@ void WangDock::setDocument(Document *document) setCurrentWangSet(firstWangSet(tilesetDocument)); + connect(wangSetModel, &TilesetWangSetModel::wangSetChanged, + mWangTemplateModel, &WangTemplateModel::wangSetChanged); + + mWangTemplateView->setVisible(true); mToolBar->setVisible(true); + mEraseWangIdsButton->setVisible(true); /* - * Removing a wangset usually changes the selected terrain without the + * Removing a wangset usually changes the selected wangset without the * selection changing rows, so we can't rely on the currentRowChanged * signal. */ @@ -228,6 +258,15 @@ void WangDock::changeEvent(QEvent *event) } } +void WangDock::eraseWangIdsButtonClicked() +{ + mCurrentWangId = 0; + mEraseWangIdsButton->setChecked(true); + mWangTemplateView->selectionModel()->clearCurrentIndex(); + mWangTemplateView->selectionModel()->clearSelection(); + emit currentWangIdChanged(mCurrentWangId); +} + void WangDock::refreshCurrentWangSet() { QItemSelectionModel *selectionModel = mWangSetView->selectionModel(); @@ -235,6 +274,21 @@ void WangDock::refreshCurrentWangSet() setCurrentWangSet(wangSet); } +void WangDock::refreshCurrentWangId() +{ + QItemSelectionModel *selectionModel = mWangTemplateView->selectionModel(); + WangId wangId = mWangTemplateModel->wangIdAt(selectionModel->currentIndex()); + + if (mCurrentWangId == wangId) + return; + + mCurrentWangId = wangId; + + mEraseWangIdsButton->setChecked(!mCurrentWangId); + + emit currentWangIdChanged(mCurrentWangId); +} + void WangDock::indexPressed(const QModelIndex &index) { if (WangSet *wangSet = mWangSetView->wangSetAt(index)) @@ -257,8 +311,14 @@ void WangDock::setCurrentWangSet(WangSet *wangSet) mCurrentWangSet = wangSet; + //start off with no wangId selected + mCurrentWangId = 0; + mEraseWangIdsButton->setChecked(true); + mWangTemplateView->selectionModel()->clearSelection(); + if (wangSet) { mWangSetView->setCurrentIndex(wangSetIndex(wangSet)); + mWangTemplateModel->setWangSet(wangSet); } else { mWangSetView->selectionModel()->clearCurrentIndex(); mWangSetView->selectionModel()->clearSelection(); @@ -277,6 +337,7 @@ void WangDock::retranslateUi() { setWindowTitle(tr("Wang Sets")); + mEraseWangIdsButton->setText(tr("Erase WangIds")); mAddWangSet->setText(tr("Add Wang Set")); mRemoveWangSet->setText(tr("Remove Wang Set")); } @@ -292,3 +353,25 @@ QModelIndex WangDock::wangSetIndex(WangSet *wangSet) const return mProxyModel->mapFromSource(sourceIndex); } + +void WangDock::onWangIdUsedChanged(WangId wangId) +{ + const QModelIndex &index = mWangTemplateModel->wangIdIndex(wangId); + + if (index.isValid()) + mWangTemplateView->update(index); +} + +void WangDock::onActiveWangIdChanged(WangId wangId) +{ + const QModelIndex &index = mWangTemplateModel->wangIdIndex(wangId); + if (!index.isValid()) { + eraseWangIdsButtonClicked(); + return; + } + + QItemSelectionModel *selectionModel = mWangTemplateView->selectionModel(); + + //this emits current changed, and thus updates the wangId and such. + selectionModel->setCurrentIndex(index, QItemSelectionModel::SelectCurrent); +} diff --git a/src/tiled/wangdock.h b/src/tiled/wangdock.h index b60fd89c18..a83aa9dc44 100644 --- a/src/tiled/wangdock.h +++ b/src/tiled/wangdock.h @@ -23,20 +23,21 @@ #include #include +#include "wangset.h" + class QModelIndex; class QPushButton; class QToolBar; namespace Tiled { - -class WangSet; - namespace Internal { class Document; class WangSetFilterModel; class WangSetView; class WangSetModel; +class WangTemplateView; +class WangTemplateModel; class TilesetDocument; class TilesetDocumentsFilterModel; @@ -51,23 +52,29 @@ class WangDock : public QDockWidget void setDocument(Document *document); WangSet *currentWangSet() const { return mCurrentWangSet; } + WangId currentWangId() const { return mCurrentWangId; } void editWangSetName(WangSet *wangSet); signals: - void currentWangSetChanged(const WangSet *WangSet); + void currentWangSetChanged(WangSet *wangSet); + void currentWangIdChanged(WangId wangId); void addWangSetRequested(); void removeWangSetRequested(); public slots: void setCurrentWangSet(WangSet *wangSet); + void onActiveWangIdChanged(WangId wangId); + void onWangIdUsedChanged(WangId wangId); protected: void changeEvent(QEvent *event) override; private slots: + void eraseWangIdsButtonClicked(); void refreshCurrentWangSet(); + void refreshCurrentWangId(); void indexPressed(const QModelIndex &index); void expandRows(const QModelIndex &parent, int first, int last); @@ -82,10 +89,14 @@ private slots: Document *mDocument; WangSetView *mWangSetView; + QPushButton *mEraseWangIdsButton; WangSet *mCurrentWangSet; + WangId mCurrentWangId; TilesetDocumentsFilterModel *mTilesetDocumentFilterModel; WangSetModel *mWangSetModel; WangSetFilterModel *mProxyModel; + WangTemplateView *mWangTemplateView; + WangTemplateModel *mWangTemplateModel; bool mInitializing; }; diff --git a/src/tiled/wangtemplatemodel.cpp b/src/tiled/wangtemplatemodel.cpp new file mode 100644 index 0000000000..aa049bd7c7 --- /dev/null +++ b/src/tiled/wangtemplatemodel.cpp @@ -0,0 +1,129 @@ +/* + * wangtemplatemodel.cpp + * Copyright 2017, Benjamin Trotter + * + * This file is part of Tiled. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the Free + * Software Foundation; either version 2 of the License, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program. If not, see . + */ + +#include "wangtemplatemodel.h" + +#include + +using namespace Tiled; +using namespace Internal; + +WangTemplateModel::WangTemplateModel(WangSet *wangSet, QObject *parent) + : QAbstractListModel(parent) + , mWangSet(wangSet) +{ +} + +int WangTemplateModel::rowCount(const QModelIndex &parent) const +{ + if (parent.isValid()) + return 0; + + if (mWangSet) { + int rows = mWangSet->edgeColors() * mWangSet->cornerColors(); + rows *= rows; + rows *= rows; + rows &= ~(1<<31); + + //arbitrary large cap on how many rows can be displayed. + //could eventually be moved to pagination... + return std::min(rows, 0xffff); + } else { + return 0; + } +} + +QVariant WangTemplateModel::data(const QModelIndex &index, int role) const +{ + if (role == WangIdRole) + return QVariant::fromValue(wangIdAt(index)); + + return QVariant(); +} + +WangId WangTemplateModel::wangIdAt(const QModelIndex &index) const +{ + if (!index.isValid()) + return 0; + + const int idIndex = index.row(); + + if (WangSet *set = wangSet()) + if (idIndex < rowCount()) + return set->templateWangIdAt(idIndex); + + return 0; +} + +QModelIndex WangTemplateModel::wangIdIndex(WangId wangId) const +{ + if (!mWangSet) + return QModelIndex(); + + Q_ASSERT(mWangSet->wangIdIsValid(wangId)); + + int edges = mWangSet->edgeColors(); + int corners = mWangSet->cornerColors(); + + //as this is a model of template tiles, a valid wangId can't have wildcards + if (edges > 1) { + if (wangId.hasEdgeWildCards()) + return QModelIndex(); + + wangId = wangId - 0x01010101; + } + if (corners > 1) { + if (wangId.hasCornerWildCards()) + return QModelIndex(); + + wangId = wangId - 0x10101010; + } + + int row = 0; + int cornerEdgePermutations = edges * corners; + + for (int i = 0; i < 8; ++i) { + int belowPermutations = qPow(cornerEdgePermutations, i/2) * ((i&1)? edges : 1); + if (i&1) + row += wangId.cornerColor(i/2) * belowPermutations; + else + row += wangId.edgeColor(i/2) * belowPermutations; + } + + return index(row, 0); +} + +void WangTemplateModel::setWangSet(WangSet *wangSet) +{ + beginResetModel(); + mWangSet = wangSet; + endResetModel(); +} + +void WangTemplateModel::resetModel() +{ + beginResetModel(); + endResetModel(); +} + +void WangTemplateModel::wangSetChanged() +{ + resetModel(); +} diff --git a/src/tiled/wangtemplatemodel.h b/src/tiled/wangtemplatemodel.h new file mode 100644 index 0000000000..096f976832 --- /dev/null +++ b/src/tiled/wangtemplatemodel.h @@ -0,0 +1,66 @@ +/* + * wangtemplatemodel.h + * Copyright 2017, Benjamin Trotter + * + * This file is part of Tiled. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the Free + * Software Foundation; either version 2 of the License, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program. If not, see . + */ + +#pragma once + +#include "wangset.h" + +#include + +namespace Tiled { + +namespace Internal { + +/** + * A model for getting the info for a wang set template of a given WangSet + */ +class WangTemplateModel : public QAbstractListModel +{ + Q_OBJECT + +public: + enum UserRoles { + WangIdRole = Qt::UserRole + }; + + WangTemplateModel(WangSet *wangSet, QObject *parent = nullptr); + + int rowCount(const QModelIndex &parent = QModelIndex()) const override; + + QVariant data(const QModelIndex &index, int role) const override; + + WangId wangIdAt(const QModelIndex &index) const; + + QModelIndex wangIdIndex(WangId wangId) const; + + WangSet *wangSet() const { return mWangSet; } + void setWangSet(WangSet *wangSet); + + void resetModel(); + +public slots: + void wangSetChanged(); + +private: + WangSet *mWangSet; +}; + +} // namespace Internal +} // namespace Tiled diff --git a/src/tiled/wangtemplateview.cpp b/src/tiled/wangtemplateview.cpp new file mode 100644 index 0000000000..ca3c7a35b2 --- /dev/null +++ b/src/tiled/wangtemplateview.cpp @@ -0,0 +1,401 @@ +/* + * wangtemplateview.cpp + * Copyright 2017, Benjamin Trotter + * + * This file is part of Tiled. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the Free + * Software Foundation; either version 2 of the License, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program. If not, see . + */ + +#include "wangtemplateview.h" + +#include "stylehelper.h" +#include "utils.h" +#include "wangtemplatemodel.h" +#include "wangset.h" +#include "zoomable.h" + +#include +#include +#include +#include +#include +#include +#include +#include + +using namespace Tiled; +using namespace Internal; + +namespace { +/* The delegate for drawing the wang tile templates + * */ +class WangTemplateDelegate : public QAbstractItemDelegate +{ +public: + WangTemplateDelegate(WangTemplateView *wangtemplateView, QObject *parent = nullptr) + : QAbstractItemDelegate(parent) + , mWangTemplateView(wangtemplateView) + { } + + void paint(QPainter *painter, + const QStyleOptionViewItem &option, + const QModelIndex &index) const override; + + QSize sizeHint(const QStyleOptionViewItem &option, const QModelIndex &index) const override; + +private: + WangTemplateView *mWangTemplateView; +}; + +//returns a color on the rainbow! 0 = red +static QColor getColor(int color, int max) +{ + if (color == 0) + return QColor(0,0,0,0); + float hue = ((float)color-1)/(float)max; + return QColor::fromHsvF(hue,1,1); +} + +static void paintTemplateTile(QPainter *painter, + WangId wangId, + int edgeCount, + int cornerCount, + const QRect &rect) +{ + painter->save(); + + QRect centeredRect = rect.translated(-rect.center()); + centeredRect.adjust(2,2,-2,-2); + + painter->translate(rect.center()); + painter->setClipRect(centeredRect); + painter->setRenderHint(QPainter::Antialiasing); + + painter->setBrush(Qt::red); + painter->setPen(QPen(Qt::gray, 1)); + + //paints corners + if (cornerCount > 1) { + QPolygon p; + + if (edgeCount > 1) { + //top right + p.append(QPoint(centeredRect.right()/3, centeredRect.top()/3)); + p.append(QPoint(centeredRect.right()/3, centeredRect.top())); + p.append(centeredRect.topRight()); + p.append(QPoint(centeredRect.right(), centeredRect.top()/3)); + + painter->setBrush(getColor(wangId.cornerColor(0), cornerCount)); + painter->drawPolygon(p); + p.clear(); + //bot right + p.append(QPoint(centeredRect.right()/3, centeredRect.bottom()/3)); + p.append(QPoint(centeredRect.right()/3, centeredRect.bottom())); + p.append(centeredRect.bottomRight()); + p.append(QPoint(centeredRect.right(), centeredRect.bottom()/3)); + + painter->setBrush(getColor(wangId.cornerColor(1), cornerCount)); + painter->drawPolygon(p); + p.clear(); + //bot left + p.append(QPoint(centeredRect.left()/3, centeredRect.bottom()/3)); + p.append(QPoint(centeredRect.left()/3, centeredRect.bottom())); + p.append(centeredRect.bottomLeft()); + p.append(QPoint(centeredRect.left(), centeredRect.bottom()/3)); + + painter->setBrush(getColor(wangId.cornerColor(2), cornerCount)); + painter->drawPolygon(p); + p.clear(); + //top left + p.append(QPoint(centeredRect.left()/3, centeredRect.top()/3)); + p.append(QPoint(centeredRect.left()/3, centeredRect.top())); + p.append(centeredRect.topLeft()); + p.append(QPoint(centeredRect.left(), centeredRect.top()/3)); + + painter->setBrush(getColor(wangId.cornerColor(3), cornerCount)); + painter->drawPolygon(p); + } else { + //top right + p.append(QPoint(0, 0)); + p.append(QPoint(0, centeredRect.top())); + p.append(centeredRect.topRight()); + p.append(QPoint(centeredRect.right(), 0)); + + painter->setBrush(getColor(wangId.cornerColor(0), cornerCount)); + painter->drawPolygon(p); + p.clear(); + //bottom right + p.append(QPoint(0, 0)); + p.append(QPoint(0, centeredRect.bottom())); + p.append(centeredRect.bottomRight()); + p.append(QPoint(centeredRect.right(), 0)); + + painter->setBrush(getColor(wangId.cornerColor(1), cornerCount)); + painter->drawPolygon(p); + p.clear(); + //bottom left + p.append(QPoint(0, 0)); + p.append(QPoint(0, centeredRect.bottom())); + p.append(centeredRect.bottomLeft()); + p.append(QPoint(centeredRect.left(), 0)); + + painter->setBrush(getColor(wangId.cornerColor(2), cornerCount)); + painter->drawPolygon(p); + p.clear(); + //top left + p.append(QPoint(0, 0)); + p.append(QPoint(0, centeredRect.top())); + p.append(centeredRect.topLeft()); + p.append(QPoint(centeredRect.left(), 0)); + + painter->setBrush(getColor(wangId.cornerColor(3), cornerCount)); + painter->drawPolygon(p); + p.clear(); + } + } + + //paints edges + if (edgeCount > 1) { + QPolygon p; + + if (cornerCount > 1) { + //top + p.append(QPoint(0, 0)); + p.append(QPoint(centeredRect.left()/3, centeredRect.top()/3)); + p.append(QPoint(centeredRect.left()/3, centeredRect.top())); + p.append(QPoint(centeredRect.right()/3, centeredRect.top())); + p.append(QPoint(centeredRect.right()/3, centeredRect.top()/3)); + + painter->setBrush(getColor(wangId.edgeColor(0), edgeCount)); + painter->drawPolygon(p); + p.clear(); + + //right + p.append(QPoint(0, 0)); + p.append(QPoint(centeredRect.right()/3, centeredRect.top()/3)); + p.append(QPoint(centeredRect.right(), centeredRect.top()/3)); + p.append(QPoint(centeredRect.right(), centeredRect.bottom()/3)); + p.append(QPoint(centeredRect.right()/3, centeredRect.bottom()/3)); + + painter->setBrush(getColor(wangId.edgeColor(1), edgeCount)); + painter->drawPolygon(p); + p.clear(); + //bottom + p.append(QPoint(0, 0)); + p.append(QPoint(centeredRect.right()/3, centeredRect.bottom()/3)); + p.append(QPoint(centeredRect.right()/3, centeredRect.bottom())); + p.append(QPoint(centeredRect.left()/3, centeredRect.bottom())); + p.append(QPoint(centeredRect.left()/3, centeredRect.bottom()/3)); + + painter->setBrush(getColor(wangId.edgeColor(2), edgeCount)); + painter->drawPolygon(p); + p.clear(); + //left + p.append(QPoint(0, 0)); + p.append(QPoint(centeredRect.left()/3, centeredRect.top()/3)); + p.append(QPoint(centeredRect.left(), centeredRect.top()/3)); + p.append(QPoint(centeredRect.left(), centeredRect.bottom()/3)); + p.append(QPoint(centeredRect.left()/3, centeredRect.bottom()/3)); + + painter->setBrush(getColor(wangId.edgeColor(3), edgeCount)); + painter->drawPolygon(p); + } else { + //top + p.append(QPoint(0, 0)); + p.append(centeredRect.topLeft()); + p.append(centeredRect.topRight()); + + painter->setBrush(getColor(wangId.edgeColor(0), edgeCount)); + painter->drawPolygon(p); + p.clear(); + //right + p.append(QPoint(0, 0)); + p.append(centeredRect.bottomRight()); + p.append(centeredRect.topRight()); + + painter->setBrush(getColor(wangId.edgeColor(1), edgeCount)); + painter->drawPolygon(p); + p.clear(); + //bottom + p.append(QPoint(0, 0)); + p.append(centeredRect.bottomRight()); + p.append(centeredRect.bottomLeft()); + + painter->setBrush(getColor(wangId.edgeColor(2), edgeCount)); + painter->drawPolygon(p); + p.clear(); + //left + p.append(QPoint(0, 0)); + p.append(centeredRect.topLeft()); + p.append(centeredRect.bottomLeft()); + + painter->setBrush(getColor(wangId.edgeColor(3), edgeCount)); + painter->drawPolygon(p); + } + } else if (cornerCount <= 1) { + painter->drawRect(centeredRect); + } + + painter->restore(); +} + +void WangTemplateDelegate::paint(QPainter *painter, + const QStyleOptionViewItem &option, + const QModelIndex &index) const +{ + const WangTemplateModel *model = static_cast(index.model()); + const WangId wangId = model->wangIdAt(index); + if(wangId == 0) + return; + + if (WangSet *wangSet = mWangTemplateView->wangSet()) + paintTemplateTile(painter, wangId, + wangSet->edgeColors(), + wangSet->cornerColors(), + option.rect); + else + paintTemplateTile(painter, wangId, 1, 1, option.rect); + + //Highlight currently selected tile. + if (mWangTemplateView->currentIndex() == index) { + QColor high = option.palette.highlight().color(); + painter->setBrush(QColor(high.red(), high.green(), high.blue(), 100)); + painter->setPen(Qt::NoPen); + painter->drawRect(option.rect); + } + + //Shade tile if used already + if (mWangTemplateView->wangIdIsUsed(wangId)) { + painter->setBrush(QColor(0,0,0,100)); + painter->setPen(Qt::NoPen); + painter->drawRect(option.rect.adjusted(2,2,-2,-2)); + } +} + +QSize WangTemplateDelegate::sizeHint(const QStyleOptionViewItem &option, const QModelIndex &index) const +{ + Q_UNUSED(option); + Q_UNUSED(index); + + // + return QSize(32 * mWangTemplateView->scale(), + 32 * mWangTemplateView->scale()); +} + +} // anonymous namespace + +WangTemplateView::WangTemplateView(QWidget *parent) + : QListView(parent) + , mZoomable(new Zoomable(this)) +{ + setWrapping(true); + setFlow(QListView::LeftToRight); + setResizeMode(QListView::Adjust); + setSelectionMode(QAbstractItemView::SingleSelection); + setVerticalScrollMode(QAbstractItemView::ScrollPerPixel); + setItemDelegate(new WangTemplateDelegate(this, this)); + setUniformItemSizes(true); + + connect(mZoomable, &Zoomable::scaleChanged, + this, &WangTemplateView::adjustScale); + + connect(StyleHelper::instance(), &StyleHelper::styleApplied, + this, &WangTemplateView::updateBackgroundColor); +} + +qreal WangTemplateView::scale() const +{ + return mZoomable->scale(); +} + +void WangTemplateView::updateBackgroundColor() +{ + QColor base = QApplication::palette().dark().color(); + + QPalette p = palette(); + p.setColor(QPalette::Base, base); + setPalette(p); +} + +WangSet *WangTemplateView::wangSet() const +{ + WangTemplateModel *model = wangTemplateModel(); + if (model) + return model->wangSet(); + else + return nullptr; +} + +bool WangTemplateView::wangIdIsUsed(WangId wangId) const +{ + if (WangSet *set = wangSet()) + return set->wangIdIsUsed(wangId); + + return false; +} + +bool WangTemplateView::event(QEvent *event) +{ + if (event->type() == QEvent::Gesture) { + QGestureEvent *gestureEvent = static_cast(event); + if (QGesture *gesture = gestureEvent->gesture(Qt::PinchGesture)) + mZoomable->handlePinchGesture(static_cast(gesture)); + } else if (event->type() == QEvent::ShortcutOverride) { + auto keyEvent = static_cast(event); + if (Utils::isZoomInShortcut(keyEvent) || + Utils::isZoomOutShortcut(keyEvent) || + Utils::isResetZoomShortcut(keyEvent)) { + event->accept(); + return true; + } + } + + return QListView::event(event); +} + +void WangTemplateView::keyPressEvent(QKeyEvent *event) +{ + if (Utils::isZoomInShortcut(event)) { + mZoomable->zoomIn(); + return; + } + if (Utils::isZoomOutShortcut(event)) { + mZoomable->zoomOut(); + return; + } + if (Utils::isResetZoomShortcut(event)) { + mZoomable->resetZoom(); + return; + } + return QListView::keyPressEvent(event); +} + +void WangTemplateView::wheelEvent(QWheelEvent *event) +{ + if (event->modifiers() & Qt::ControlModifier && + event->orientation() == Qt::Vertical) + { + mZoomable->handleWheelDelta(event->delta()); + return; + } + + QListView::wheelEvent(event); +} + +void WangTemplateView::adjustScale() +{ + if (WangTemplateModel *model = wangTemplateModel()) + model->resetModel(); +} diff --git a/src/tiled/wangtemplateview.h b/src/tiled/wangtemplateview.h new file mode 100644 index 0000000000..6c7bde37ce --- /dev/null +++ b/src/tiled/wangtemplateview.h @@ -0,0 +1,69 @@ +/* + * wangtemplateview.h + * Copyright 2017, Benjamin Trotter + * + * This file is part of Tiled. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the Free + * Software Foundation; either version 2 of the License, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program. If not, see . + */ + +#pragma once + +#include "wangtemplatemodel.h" + +#include + +namespace Tiled { + +class WangSet; +class WangId; + +namespace Internal { + +class Zoomable; + +class WangTemplateView : public QListView +{ + Q_OBJECT + +public: + WangTemplateView(QWidget *parent = nullptr); + + Zoomable *zoomable() const { return mZoomable; } + + qreal scale() const; + + void updateBackgroundColor(); + + WangTemplateModel *wangTemplateModel() const + { return static_cast(model()); } + + WangSet *wangSet() const; + + bool wangIdIsUsed(WangId wangId) const; + +protected: + bool event(QEvent *e) override; + void keyPressEvent(QKeyEvent *event) override; + void wheelEvent(QWheelEvent *event) override; + +private slots: + void adjustScale(); + +private: + Zoomable *mZoomable; +}; + +} +} diff --git a/tests/wangtiles/2CornerWangSet.jpg b/tests/wangtiles/2CornerWangSet.jpg new file mode 100644 index 0000000000000000000000000000000000000000..87a853509a17463096e87655d9ace0c65980c142 GIT binary patch literal 40119 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

BzbKc~(~0o#56)+*DTw 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в`(drlNj3f@|CcU5J5YEX+>nLt&L9 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%0DTlW?*yPF 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 O0000 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tests/wangtiles/testWangSet.tsx b/tests/wangtiles/testWangSet.tsx new file mode 100644 index 0000000000..dfa946519f --- /dev/null +++ b/tests/wangtiles/testWangSet.tsx @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + + + + + + + +