1
0
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:
Marcelo Fernandez
2017-09-24 10:35:55 -03:00
parent 4ac7f5acf9
commit 6f1ac101b8
2 changed files with 32 additions and 11 deletions

View File

@@ -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() {

View File

@@ -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;