void TileMap::set_cell(int p_x,int p_y,int p_tile,bool p_flip_x,bool p_flip_y,bool p_transpose) { PosKey pk(p_x,p_y); Map<PosKey,Cell>::Element *E=tile_map.find(pk); if (!E && p_tile==INVALID_CELL) return; //nothing to do PosKey qk(p_x/_get_quadrant_size(),p_y/_get_quadrant_size()); if (p_tile==INVALID_CELL) { //erase existing tile_map.erase(pk); Map<PosKey,Quadrant>::Element *Q = quadrant_map.find(qk); ERR_FAIL_COND(!Q); Quadrant &q=Q->get(); q.cells.erase(pk); if (q.cells.size()==0) _erase_quadrant(Q); else _make_quadrant_dirty(Q); return; } Map<PosKey,Quadrant>::Element *Q = quadrant_map.find(qk); if (!E) { E=tile_map.insert(pk,Cell()); if (!Q) { Q=_create_quadrant(qk); } Quadrant &q=Q->get(); q.cells.insert(pk); } else { ERR_FAIL_COND(!Q); // quadrant should exist... if (E->get().id==p_tile && E->get().flip_h==p_flip_x && E->get().flip_v==p_flip_y && E->get().transpose==p_transpose) return; //nothing changed } Cell &c = E->get(); c.id=p_tile; c.flip_h=p_flip_x; c.flip_v=p_flip_y; c.transpose=p_transpose; _make_quadrant_dirty(Q); }
void TileMap::_clear_quadrants() { while (quadrant_map.size()) { _erase_quadrant( quadrant_map.front() ); } }