diff --git a/modules/gridmap/editor/grid_map_editor_plugin.cpp b/modules/gridmap/editor/grid_map_editor_plugin.cpp index 8b934d6e942..546dae61838 100644 --- a/modules/gridmap/editor/grid_map_editor_plugin.cpp +++ b/modules/gridmap/editor/grid_map_editor_plugin.cpp @@ -815,8 +815,8 @@ EditorPlugin::AfterGUIInput GridMapEditor::forward_spatial_input_event(Camera3D for (const SetItem &si : set_items) { undo_redo->add_do_method(node, "set_cell_item", si.position, si.new_value, si.new_orientation); } - for (List::Element *E = set_items.back(); E; E = E->prev()) { - const SetItem &si = E->get(); + for (uint32_t i = set_items.size(); i > 0; i--) { + const SetItem &si = set_items[i - 1]; undo_redo->add_undo_method(node, "set_cell_item", si.position, si.old_value, si.old_orientation); } @@ -1387,6 +1387,8 @@ GridMapEditor::GridMapEditor() { toolbar->add_child(mode_buttons); mode_buttons_group.instantiate(); + viewport_shortcut_buttons.reserve(12); + transform_mode_button = memnew(Button); transform_mode_button->set_theme_type_variation(SceneStringName(FlatButton)); transform_mode_button->set_toggle_mode(true); diff --git a/modules/gridmap/editor/grid_map_editor_plugin.h b/modules/gridmap/editor/grid_map_editor_plugin.h index be42650f152..5323b10ca62 100644 --- a/modules/gridmap/editor/grid_map_editor_plugin.h +++ b/modules/gridmap/editor/grid_map_editor_plugin.h @@ -74,7 +74,7 @@ class GridMapEditor : public VBoxContainer { double accumulated_floor_delta = 0.0; HBoxContainer *toolbar = nullptr; - List viewport_shortcut_buttons; + TightLocalVector viewport_shortcut_buttons; Ref mode_buttons_group; // mode Button *transform_mode_button = nullptr; @@ -110,7 +110,7 @@ class GridMapEditor : public VBoxContainer { int old_orientation = 0; }; - List set_items; + LocalVector set_items; GridMap *node = nullptr; Ref mesh_library = nullptr; @@ -139,7 +139,7 @@ class GridMapEditor : public VBoxContainer { RID instance; }; - List clipboard_items; + LocalVector clipboard_items; Color default_color; Color erase_color; diff --git a/modules/gridmap/grid_map.cpp b/modules/gridmap/grid_map.cpp index 1509ebb5183..291e2990fd7 100644 --- a/modules/gridmap/grid_map.cpp +++ b/modules/gridmap/grid_map.cpp @@ -32,6 +32,7 @@ #include "core/io/marshalls.h" #include "core/math/convex_hull.h" +#include "core/templates/a_hash_map.h" #include "scene/resources/3d/box_shape_3d.h" #include "scene/resources/3d/capsule_shape_3d.h" #include "scene/resources/3d/concave_polygon_shape_3d.h" @@ -644,7 +645,11 @@ bool GridMap::_octant_update(const OctantKey &p_key) { * and set said multimesh bounding box to one containing all cells which have this item */ - HashMap>> multimesh_items; + struct MultiMeshItemPlacement { + Transform3D transform; + IndexKey index_key; + }; + AHashMap> item_id_to_multimesh_item_placements; RID scenario; #ifndef NAVIGATION_3D_DISABLED @@ -676,14 +681,14 @@ bool GridMap::_octant_update(const OctantKey &p_key) { xform.basis.scale(Vector3(cell_scale, cell_scale, cell_scale)); if (baked_meshes.is_empty()) { if (mesh_library->get_item_mesh(c.item).is_valid()) { - if (!multimesh_items.has(c.item)) { - multimesh_items[c.item] = List>(); + if (!item_id_to_multimesh_item_placements.has(c.item)) { + item_id_to_multimesh_item_placements[c.item] = LocalVector(); } - Pair p; - p.first = xform * mesh_library->get_item_mesh_transform(c.item); - p.second = E; - multimesh_items[c.item].push_back(p); + MultiMeshItemPlacement p; + p.transform = xform * mesh_library->get_item_mesh_transform(c.item); + p.index_key = E; + item_id_to_multimesh_item_placements[c.item].push_back(p); } } @@ -754,7 +759,7 @@ bool GridMap::_octant_update(const OctantKey &p_key) { //update multimeshes, only if not baked if (baked_meshes.is_empty()) { - for (const KeyValue>> &E : multimesh_items) { + for (const KeyValue> &E : item_id_to_multimesh_item_placements) { Octant::MultimeshInstance mmi; RID mm = RS::get_singleton()->multimesh_create(); @@ -762,14 +767,15 @@ bool GridMap::_octant_update(const OctantKey &p_key) { RS::get_singleton()->multimesh_set_mesh(mm, mesh_library->get_item_mesh(E.key)->get_rid()); int idx = 0; - for (const Pair &F : E.value) { - RS::get_singleton()->multimesh_instance_set_transform(mm, idx, F.first); + const LocalVector &mm_item_placements = E.value; + for (const MultiMeshItemPlacement &mm_item_placement : mm_item_placements) { + RS::get_singleton()->multimesh_instance_set_transform(mm, idx, mm_item_placement.transform); #ifdef TOOLS_ENABLED Octant::MultimeshInstance::Item it; it.index = idx; - it.transform = F.first; - it.key = F.second; + it.transform = mm_item_placement.transform; + it.key = mm_item_placement.index_key; mmi.items.push_back(it); #endif @@ -1131,17 +1137,19 @@ void GridMap::_update_octants_callback() { return; } - List to_delete; + LocalVector to_delete; + to_delete.reserve(octant_map.size()); for (const KeyValue &E : octant_map) { if (_octant_update(E.key)) { to_delete.push_back(E.key); } } - while (to_delete.front()) { - memdelete(octant_map[to_delete.front()->get()]); - octant_map.erase(to_delete.front()->get()); - to_delete.pop_front(); + while (!to_delete.is_empty()) { + const OctantKey &octantkey = to_delete[0]; + memdelete(octant_map[octantkey]); + octant_map.erase(octantkey); + to_delete.remove_at_unordered(0); } _update_visibility();