void GridMap::_update_dirty_map_callback() { if (!awaiting_update) return; for (Map<OctantKey, Octant *>::Element *E = octant_map.front(); E; E = E->next()) { _octant_update(E->key()); } awaiting_update = false; }
void GridMap::_update_octants_callback() { if (!awaiting_update) return; List<OctantKey> to_delete; for (Map<OctantKey, Octant *>::Element *E = octant_map.front(); E; E = E->next()) { 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_back(); } _update_visibility(); awaiting_update = false; }
void GridMap::_notification(int p_what) { switch (p_what) { case NOTIFICATION_ENTER_WORLD: { _update_area_instances(); for (Map<OctantKey, Octant *>::Element *E = octant_map.front(); E; E = E->next()) { //IndexKey ik; //ik.key = E->key().indexkey; _octant_enter_world(E->key()); _octant_update(E->key()); } awaiting_update = false; last_transform = get_global_transform(); } break; case NOTIFICATION_TRANSFORM_CHANGED: { Transform new_xform = get_global_transform(); if (new_xform == last_transform) break; //update run for (Map<OctantKey, Octant *>::Element *E = octant_map.front(); E; E = E->next()) { _octant_transform(E->key()); } last_transform = new_xform; } break; case NOTIFICATION_EXIT_WORLD: { for (Map<OctantKey, Octant *>::Element *E = octant_map.front(); E; E = E->next()) { _octant_exit_world(E->key()); } //_queue_dirty_map(MAP_DIRTY_INSTANCES|MAP_DIRTY_TRANSFORMS); //_update_dirty_map_callback(); //_update_area_instances(); } break; case NOTIFICATION_ENTER_TREE: { Spatial *c = this; while (c) { navigation = c->cast_to<Navigation>(); if (navigation) { break; } c = c->get_parent()->cast_to<Spatial>(); } if (navigation) { for (Map<OctantKey, Octant *>::Element *E = octant_map.front(); E; E = E->next()) { if (navigation) { _octant_enter_tree(E->key()); } } } _queue_dirty_map(); } break; case NOTIFICATION_EXIT_TREE: { for (Map<OctantKey, Octant *>::Element *E = octant_map.front(); E; E = E->next()) { if (navigation) { _octant_clear_navmesh(E->key()); } } navigation = NULL; } break; } }