3232
3333#include " core/io/marshalls.h"
3434#include " core/math/convex_hull.h"
35+ #include " core/templates/a_hash_map.h"
3536#include " scene/resources/3d/box_shape_3d.h"
3637#include " scene/resources/3d/capsule_shape_3d.h"
3738#include " scene/resources/3d/concave_polygon_shape_3d.h"
@@ -619,7 +620,11 @@ bool GridMap::_octant_update(const OctantKey &p_key) {
619620 * and set said multimesh bounding box to one containing all cells which have this item
620621 */
621622
622- HashMap<int , List<Pair<Transform3D, IndexKey>>> multimesh_items;
623+ struct MultiMeshItemPlacement {
624+ Transform3D transform;
625+ IndexKey index_key;
626+ };
627+ AHashMap<int , LocalVector<MultiMeshItemPlacement>> item_id_to_multimesh_item_placements;
623628
624629 for (const IndexKey &E : g.cells ) {
625630 ERR_CONTINUE (!cell_map.has (E));
@@ -639,14 +644,14 @@ bool GridMap::_octant_update(const OctantKey &p_key) {
639644 xform.basis .scale (Vector3 (cell_scale, cell_scale, cell_scale));
640645 if (baked_meshes.is_empty ()) {
641646 if (mesh_library->get_item_mesh (c.item ).is_valid ()) {
642- if (!multimesh_items .has (c.item )) {
643- multimesh_items [c.item ] = List<Pair<Transform3D, IndexKey> >();
647+ if (!item_id_to_multimesh_item_placements .has (c.item )) {
648+ item_id_to_multimesh_item_placements [c.item ] = LocalVector<MultiMeshItemPlacement >();
644649 }
645650
646- Pair<Transform3D, IndexKey> p;
647- p.first = xform * mesh_library->get_item_mesh_transform (c.item );
648- p.second = E;
649- multimesh_items [c.item ].push_back (p);
651+ MultiMeshItemPlacement p;
652+ p.transform = xform * mesh_library->get_item_mesh_transform (c.item );
653+ p.index_key = E;
654+ item_id_to_multimesh_item_placements [c.item ].push_back (p);
650655 }
651656 }
652657
@@ -717,22 +722,23 @@ bool GridMap::_octant_update(const OctantKey &p_key) {
717722
718723 // update multimeshes, only if not baked
719724 if (baked_meshes.is_empty ()) {
720- for (const KeyValue<int , List<Pair<Transform3D, IndexKey>>> &E : multimesh_items ) {
725+ for (const KeyValue<int , LocalVector<MultiMeshItemPlacement>> &E : item_id_to_multimesh_item_placements ) {
721726 Octant::MultimeshInstance mmi;
722727
723728 RID mm = RS::get_singleton ()->multimesh_create ();
724729 RS::get_singleton ()->multimesh_allocate_data (mm, E.value .size (), RS::MULTIMESH_TRANSFORM_3D);
725730 RS::get_singleton ()->multimesh_set_mesh (mm, mesh_library->get_item_mesh (E.key )->get_rid ());
726731
727732 int idx = 0 ;
728- for (const Pair<Transform3D, IndexKey> &F : E.value ) {
729- RS::get_singleton ()->multimesh_instance_set_transform (mm, idx, F.first );
733+ const LocalVector<MultiMeshItemPlacement> &mm_item_placements = E.value ;
734+ for (const MultiMeshItemPlacement &mm_item_placement : mm_item_placements) {
735+ RS::get_singleton ()->multimesh_instance_set_transform (mm, idx, mm_item_placement.transform );
730736#ifdef TOOLS_ENABLED
731737
732738 Octant::MultimeshInstance::Item it;
733739 it.index = idx;
734- it.transform = F. first ;
735- it.key = F. second ;
740+ it.transform = mm_item_placement. transform ;
741+ it.key = mm_item_placement. index_key ;
736742 mmi.items .push_back (it);
737743#endif
738744
@@ -1089,17 +1095,19 @@ void GridMap::_update_octants_callback() {
10891095 return ;
10901096 }
10911097
1092- List<OctantKey> to_delete;
1098+ LocalVector<OctantKey> to_delete;
1099+ to_delete.reserve (octant_map.size ());
10931100 for (const KeyValue<OctantKey, Octant *> &E : octant_map) {
10941101 if (_octant_update (E.key )) {
10951102 to_delete.push_back (E.key );
10961103 }
10971104 }
10981105
1099- while (to_delete.front ()) {
1100- memdelete (octant_map[to_delete.front ()->get ()]);
1101- octant_map.erase (to_delete.front ()->get ());
1102- to_delete.pop_front ();
1106+ while (!to_delete.is_empty ()) {
1107+ const OctantKey &octantkey = to_delete[0 ];
1108+ memdelete (octant_map[octantkey]);
1109+ octant_map.erase (octantkey);
1110+ to_delete.remove_at_unordered (0 );
11031111 }
11041112
11051113 _update_visibility ();
0 commit comments