Skip to content

Commit

Permalink
Added TileLayerWangEdit.generate
Browse files Browse the repository at this point in the history
Returns a bare tile layer for now. Example use in a custom tool:

    mouseMoved: function(x, y, modifiers) {
        let ws = tiled.mapEditor.currentWangSet
        let editor = tiled.activeAsset.currentLayer.wangEdit(ws)
        editor.correctionsEnabled = true
        editor.setCorner(this.tilePosition, tiled.mapEditor.currentWangColorIndex)
        let map = new TileMap()
        map.addLayer(editor.generate())
        this.preview = map
    },
  • Loading branch information
bjorn committed Jun 29, 2023
1 parent cab3ea3 commit 34e89d6
Show file tree
Hide file tree
Showing 5 changed files with 33 additions and 9 deletions.
1 change: 0 additions & 1 deletion src/tiled/editablelayer.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,6 @@
#include "editablegrouplayer.h"
#include "editablemanager.h"
#include "editablemap.h"
#include "scriptmanager.h"

namespace Tiled {

Expand Down
5 changes: 5 additions & 0 deletions src/tiled/editabletilelayer.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,11 @@ EditableTileLayer::EditableTileLayer(const QString &name, QSize size, QObject *p
{
}

EditableTileLayer::EditableTileLayer(std::unique_ptr<TileLayer> tileLayer, QObject *parent)
: EditableLayer(std::move(tileLayer), parent)
{
}

EditableTileLayer::EditableTileLayer(EditableMap *map,
TileLayer *layer,
QObject *parent)
Expand Down
3 changes: 3 additions & 0 deletions src/tiled/editabletilelayer.h
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,9 @@ class EditableTileLayer : public EditableLayer
QSize size = QSize(0, 0),
QObject *parent = nullptr);

explicit EditableTileLayer(std::unique_ptr<TileLayer> tileLayer,
QObject *parent = nullptr);

explicit EditableTileLayer(EditableMap *map,
TileLayer *layer,
QObject *parent = nullptr);
Expand Down
29 changes: 23 additions & 6 deletions src/tiled/tilelayerwangedit.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@
#include "editabletilelayer.h"
#include "maprenderer.h"
#include "scriptmanager.h"
#include "tilelayer.h"

#include <QCoreApplication>

Expand Down Expand Up @@ -85,16 +86,32 @@ void TileLayerWangEdit::setEdge(QPoint pos, WangIndex::Value edge, int color)
}
}

void TileLayerWangEdit::apply()
EditableTileLayer *TileLayerWangEdit::generate()
{
// apply terrain changes
mWangFiller->apply(mChanges, *mTargetLayer->tileLayer());
auto changes = std::make_unique<TileLayer>();
mWangFiller->apply(*changes, *mTargetLayer->tileLayer());

// Determine painted region and normalize the changes layer
auto paintedRegion = changes->region([] (const Cell &cell) { return cell.checked(); });
if (!paintedRegion.isEmpty()) {
auto rect = paintedRegion.boundingRect();
changes->resize(rect.size(), -rect.topLeft());
changes->setPosition(rect.topLeft());
}

return new EditableTileLayer(std::move(changes));
}

void TileLayerWangEdit::apply()
{
// Applying an edit automatically makes it mergeable, so that further
// changes made through the same edit are merged by default.
bool mergeable = std::exchange(mMergeable, true);
mTargetLayer->applyChangesFrom(&mChanges, mergeable);
mChanges.clear();
const bool mergeable = std::exchange(mMergeable, true);

// Apply terrain changes
TileLayer changes;
mWangFiller->apply(changes, *mTargetLayer->tileLayer());
mTargetLayer->applyChangesFrom(&changes, mergeable);
}

} // namespace Tiled
Expand Down
4 changes: 2 additions & 2 deletions src/tiled/tilelayerwangedit.h
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,6 @@

#include "editablewangset.h"
#include "map.h"
#include "tilelayer.h"
#include "wangfiller.h"

#include <QObject>
Expand Down Expand Up @@ -84,6 +83,8 @@ class TileLayerWangEdit : public QObject

EditableTileLayer *target() const;

Q_INVOKABLE Tiled::EditableTileLayer *generate();

public slots:
void setWangIndex(int x, int y, Tiled::WangIndex::Value index, int color);
void setWangIndex(QPoint pos, Tiled::WangIndex::Value index, int color);
Expand All @@ -96,7 +97,6 @@ public slots:

private:
EditableTileLayer *mTargetLayer;
TileLayer mChanges;
bool mMergeable = false;
const Map mMap; // Copy for the configuration
std::unique_ptr<MapRenderer> mRenderer;
Expand Down

0 comments on commit 34e89d6

Please sign in to comment.