OpenTTD
animated_tile.cpp
Go to the documentation of this file.
1 /*
2  * This file is part of OpenTTD.
3  * OpenTTD is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2.
4  * OpenTTD is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
5  * See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with OpenTTD. If not, see <http://www.gnu.org/licenses/>.
6  */
7 
10 #include "stdafx.h"
11 #include "core/alloc_func.hpp"
12 #include "core/smallvec_type.hpp"
13 #include "tile_cmd.h"
14 #include "viewport_func.h"
15 #include "framerate_type.h"
16 
17 #include "safeguards.h"
18 
20 std::vector<TileIndex> _animated_tiles;
21 
27 {
28  auto to_remove = std::find(_animated_tiles.begin(), _animated_tiles.end(), tile);
29  if (to_remove != _animated_tiles.end()) {
30  /* The order of the remaining elements must stay the same, otherwise the animation loop may miss a tile. */
31  _animated_tiles.erase(to_remove);
32  MarkTileDirtyByTile(tile);
33  }
34 }
35 
42 {
43  MarkTileDirtyByTile(tile);
44  include(_animated_tiles, tile);
45 }
46 
51 {
53 
54  const TileIndex *ti = _animated_tiles.data();
55  while (ti < _animated_tiles.data() + _animated_tiles.size()) {
56  const TileIndex curr = *ti;
57  AnimateTile(curr);
58  /* During the AnimateTile call, DeleteAnimatedTile could have been called,
59  * deleting an element we've already processed and pushing the rest one
60  * slot to the left. We can detect this by checking whether the index
61  * in the current slot has changed - if it has, an element has been deleted,
62  * and we should process the current slot again instead of going forward.
63  * NOTE: this will still break if more than one animated tile is being
64  * deleted during the same AnimateTile call, but no code seems to
65  * be doing this anyway.
66  */
67  if (*ti == curr) ++ti;
68  }
69 }
70 
75 {
76  _animated_tiles.clear();
77 }
void AddAnimatedTile(TileIndex tile)
Add the given tile to the animated tile table (if it does not exist on that table yet)...
Simple vector class that allows allocating an item without the need to copy this->data needlessly...
Types for recording game performance data.
Functions related to (drawing on) viewports.
std::vector< TileIndex > _animated_tiles
The table/list with animated tiles.
Functions related to the allocation of memory.
void DeleteAnimatedTile(TileIndex tile)
Removes the given tile from the animated tile table.
Definition of base types and functions in a cross-platform compatible way.
A number of safeguards to prevent using unsafe methods.
void MarkTileDirtyByTile(TileIndex tile, int bridge_level_offset, int tile_height_override)
Mark a tile given by its index dirty for repaint.
Definition: viewport.cpp:1938
Time spent processing other world features.
uint32 TileIndex
The index/ID of a Tile.
Definition: tile_type.h:78
bool include(std::vector< T > &vec, const T &item)
Helper function to append an item to a vector if it is not already contained Consider using std::set...
void InitializeAnimatedTiles()
Initialize all animated tile variables to some known begin point.
RAII class for measuring multi-step elements of performance.
void AnimateAnimatedTiles()
Animate all tiles in the animated tile list, i.e. call AnimateTile on them.
Generic &#39;commands&#39; that can be performed on all tiles.