From 124e3591a5b17e0fd4e50540dd909bed94792f32 Mon Sep 17 00:00:00 2001 From: Juan Linietsky Date: Thu, 21 Jul 2016 10:06:38 -0300 Subject: [PATCH] Some optimizations and limits for extreme zoom in and out in editor, fixes #5820 --- scene/resources/world_2d.cpp | 51 +++++++++++++++---- .../plugins/canvas_item_editor_plugin.cpp | 16 ++++++ 2 files changed, 58 insertions(+), 9 deletions(-) diff --git a/scene/resources/world_2d.cpp b/scene/resources/world_2d.cpp index e96cac170b8..6b329a1a73f 100644 --- a/scene/resources/world_2d.cpp +++ b/scene/resources/world_2d.cpp @@ -235,19 +235,20 @@ struct SpatialIndexer2D { List added; List removed; - for(int i=begin.x;i<=end.x;i++) { + int visible_cells=(end.x-begin.x)*(end.y-begin.y); - for(int j=begin.y;j<=end.y;j++) { + if (visible_cells>10000) { - CellKey ck; - ck.x=i; - ck.y=j; + //well you zoomed out a lot, it's your problem. To avoid freezing in the for loops below, we'll manually check cell by cell - Map::Element *F=cells.find(ck); - if (!F) { + for (Map::Element *F=cells.front();F;F=F->next()) { + + const CellKey &ck=F->key(); + + if (ck.xend.x) + continue; + if (ck.yend.y) continue; - } - //notifiers in cell for (Map::Element *G=F->get().notifiers.front();G;G=G->next()) { @@ -262,6 +263,38 @@ struct SpatialIndexer2D { } } } + + } else { + + //check cells in grid fashion + for(int i=begin.x;i<=end.x;i++) { + + for(int j=begin.y;j<=end.y;j++) { + + CellKey ck; + ck.x=i; + ck.y=j; + + Map::Element *F=cells.find(ck); + if (!F) { + continue; + } + + + //notifiers in cell + for (Map::Element *G=F->get().notifiers.front();G;G=G->next()) { + + Map::Element *H=E->get().notifiers.find(G->key()); + if (!H) { + + H=E->get().notifiers.insert(G->key(),pass); + added.push_back(G->key()); + } else { + H->get()=pass; + } + } + } + } } for (Map::Element *F=E->get().notifiers.front();F;F=F->next()) { diff --git a/tools/editor/plugins/canvas_item_editor_plugin.cpp b/tools/editor/plugins/canvas_item_editor_plugin.cpp index ec5ac8592b8..02a24f8ddbc 100644 --- a/tools/editor/plugins/canvas_item_editor_plugin.cpp +++ b/tools/editor/plugins/canvas_item_editor_plugin.cpp @@ -41,6 +41,11 @@ #include "tools/editor/plugins/animation_player_editor_plugin.h" #include "scene/resources/packed_scene.h" + +#define MIN_ZOOM 0.01 +#define MAX_ZOOM 100 + + class SnapDialog : public ConfirmationDialog { OBJ_TYPE(SnapDialog,ConfirmationDialog); @@ -1062,6 +1067,9 @@ void CanvasItemEditor::_viewport_input_event(const InputEvent& p_event) { if (b.button_index==BUTTON_WHEEL_DOWN) { + if (zoomMAX_ZOOM) + return; + float prev_zoom=zoom; zoom=zoom*(1.0/0.95); { @@ -2526,12 +2537,17 @@ void CanvasItemEditor::_popup_callback(int p_op) { snap_dialog->popup_centered(Size2(220,160)); } break; case ZOOM_IN: { + if (zoom>MAX_ZOOM) + return; zoom=zoom*(1.0/0.5); _update_scroll(0); viewport->update(); return; } break; case ZOOM_OUT: { + if (zoomupdate();