You've already forked godot
mirror of
https://github.com/godotengine/godot.git
synced 2025-11-18 14:21:41 +00:00
Bucket fill will now incrementally process the queue on preview mode
This commit is contained in:
@@ -39,6 +39,14 @@ void TileMapEditor::_notification(int p_what) {
|
|||||||
|
|
||||||
switch (p_what) {
|
switch (p_what) {
|
||||||
|
|
||||||
|
case NOTIFICATION_PROCESS: {
|
||||||
|
|
||||||
|
if (bucket_queue.size() && canvas_item_editor) {
|
||||||
|
canvas_item_editor->update();
|
||||||
|
}
|
||||||
|
|
||||||
|
} break;
|
||||||
|
|
||||||
case NOTIFICATION_ENTER_TREE: {
|
case NOTIFICATION_ENTER_TREE: {
|
||||||
|
|
||||||
transp->set_icon(get_icon("Transpose", "EditorIcons"));
|
transp->set_icon(get_icon("Transpose", "EditorIcons"));
|
||||||
@@ -382,20 +390,26 @@ PoolVector<Vector2> TileMapEditor::_bucket_fill(const Point2i &p_start, bool era
|
|||||||
bucket_cache = PoolVector<Vector2>();
|
bucket_cache = PoolVector<Vector2>();
|
||||||
bucket_cache_tile = prev_id;
|
bucket_cache_tile = prev_id;
|
||||||
bucket_cache_rect = r;
|
bucket_cache_rect = r;
|
||||||
} else {
|
bucket_queue.clear();
|
||||||
return bucket_cache;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
PoolVector<Vector2> points;
|
PoolVector<Vector2> points;
|
||||||
|
int count = 0;
|
||||||
|
int limit = 0;
|
||||||
|
|
||||||
List<Point2i> queue;
|
if (preview) {
|
||||||
queue.push_back(p_start);
|
limit = 1024;
|
||||||
|
} else {
|
||||||
|
bucket_queue.clear();
|
||||||
|
}
|
||||||
|
|
||||||
while (queue.size()) {
|
bucket_queue.push_back(p_start);
|
||||||
|
|
||||||
Point2i n = queue.front()->get();
|
while (bucket_queue.size()) {
|
||||||
queue.pop_front();
|
|
||||||
|
Point2i n = bucket_queue.front()->get();
|
||||||
|
bucket_queue.pop_front();
|
||||||
|
|
||||||
if (!r.has_point(n))
|
if (!r.has_point(n))
|
||||||
continue;
|
continue;
|
||||||
@@ -413,10 +427,15 @@ PoolVector<Vector2> TileMapEditor::_bucket_fill(const Point2i &p_start, bool era
|
|||||||
points.push_back(n);
|
points.push_back(n);
|
||||||
}
|
}
|
||||||
|
|
||||||
queue.push_back(n + Point2i(0, 1));
|
bucket_queue.push_back(Point2i(n.x, n.y + 1));
|
||||||
queue.push_back(n + Point2i(0, -1));
|
bucket_queue.push_back(Point2i(n.x, n.y - 1));
|
||||||
queue.push_back(n + Point2i(1, 0));
|
bucket_queue.push_back(Point2i(n.x + 1, n.y));
|
||||||
queue.push_back(n + Point2i(-1, 0));
|
bucket_queue.push_back(Point2i(n.x - 1, n.y));
|
||||||
|
count++;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (limit > 0 && count >= limit) {
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1648,6 +1667,7 @@ TileMapEditorPlugin::TileMapEditorPlugin(EditorNode *p_node) {
|
|||||||
tile_map_editor = memnew(TileMapEditor(p_node));
|
tile_map_editor = memnew(TileMapEditor(p_node));
|
||||||
add_control_to_container(CONTAINER_CANVAS_EDITOR_SIDE, tile_map_editor);
|
add_control_to_container(CONTAINER_CANVAS_EDITOR_SIDE, tile_map_editor);
|
||||||
tile_map_editor->hide();
|
tile_map_editor->hide();
|
||||||
|
tile_map_editor->set_process(true);
|
||||||
}
|
}
|
||||||
|
|
||||||
TileMapEditorPlugin::~TileMapEditorPlugin() {
|
TileMapEditorPlugin::~TileMapEditorPlugin() {
|
||||||
|
|||||||
@@ -113,6 +113,7 @@ class TileMapEditor : public VBoxContainer {
|
|||||||
Rect2i bucket_cache_rect;
|
Rect2i bucket_cache_rect;
|
||||||
int bucket_cache_tile;
|
int bucket_cache_tile;
|
||||||
PoolVector<Vector2> bucket_cache;
|
PoolVector<Vector2> bucket_cache;
|
||||||
|
List<Point2i> bucket_queue;
|
||||||
|
|
||||||
struct CellOp {
|
struct CellOp {
|
||||||
int idx;
|
int idx;
|
||||||
|
|||||||
Reference in New Issue
Block a user