yaze 0.3.2
Link to the Past ROM Editor
 
Loading...
Searching...
No Matches
tilemap.h
Go to the documentation of this file.
1#ifndef YAZE_GFX_TILEMAP_H
2#define YAZE_GFX_TILEMAP_H
3
4#include <list>
5#include <memory>
6#include <unordered_map>
7
8#include "absl/container/flat_hash_map.h"
10#include "app/gfx/core/bitmap.h"
12
13namespace yaze {
14namespace gfx {
15
19struct Pair {
20 int x;
21 int y;
22};
23
37struct TileCache {
38 static constexpr size_t MAX_CACHE_SIZE = 1024;
39 // Use unique_ptr to ensure stable Bitmap* pointers across rehashing
40 std::unordered_map<int, std::unique_ptr<Bitmap>> cache_;
41 std::list<int> access_order_;
42
50 Bitmap* GetTile(int tile_id) {
51 auto it = cache_.find(tile_id);
52 if (it != cache_.end()) {
53 // Move to front of access order (most recently used)
54 access_order_.remove(tile_id);
55 access_order_.push_front(tile_id);
56 return it->second.get();
57 }
58 return nullptr;
59 }
60
67 void CacheTile(int tile_id, const Bitmap& bitmap) {
68 if (cache_.size() >= MAX_CACHE_SIZE) {
69 // Remove least recently used tile
70 int lru_tile = access_order_.back();
71 access_order_.pop_back();
72 cache_.erase(lru_tile);
73 }
74
75 cache_[tile_id] = std::make_unique<Bitmap>(bitmap); // Copy, not move
76 access_order_.push_front(tile_id);
77 }
78
82 void Clear() {
83 cache_.clear();
84 access_order_.clear();
85 }
86
91 size_t Size() const { return cache_.size(); }
92};
93
118struct Tilemap {
121 std::vector<std::array<gfx::TileInfo, 4>>
125};
126
127std::vector<uint8_t> FetchTileDataFromGraphicsBuffer(
128 const std::vector<uint8_t>& data, int tile_id, int sheet_offset);
129
130Tilemap CreateTilemap(IRenderer* renderer, std::vector<uint8_t>& data,
131 int width, int height, int tile_size, int num_tiles,
132 SnesPalette& palette);
133
134void UpdateTilemap(IRenderer* renderer, Tilemap& tilemap,
135 const std::vector<uint8_t>& data);
136
137void RenderTile(IRenderer* renderer, Tilemap& tilemap, int tile_id);
138
139void RenderTile16(IRenderer* renderer, Tilemap& tilemap, int tile_id);
140void UpdateTile16(IRenderer* renderer, Tilemap& tilemap, int tile_id);
141
142void ModifyTile16(Tilemap& tilemap, const std::vector<uint8_t>& data,
143 const TileInfo& top_left, const TileInfo& top_right,
144 const TileInfo& bottom_left, const TileInfo& bottom_right,
145 int sheet_offset, int tile_id);
146
147void ComposeTile16(Tilemap& tilemap, const std::vector<uint8_t>& data,
148 const TileInfo& top_left, const TileInfo& top_right,
149 const TileInfo& bottom_left, const TileInfo& bottom_right,
150 int sheet_offset);
151
152std::vector<uint8_t> GetTilemapData(Tilemap& tilemap, int tile_id);
153
163void RenderTilesBatch(IRenderer* renderer, Tilemap& tilemap,
164 const std::vector<int>& tile_ids,
165 const std::vector<std::pair<float, float>>& positions,
166 const std::vector<std::pair<float, float>>& scales = {});
167
168} // namespace gfx
169} // namespace yaze
170
171#endif // YAZE_GFX_TILEMAP_H
Represents a bitmap image optimized for SNES ROM hacking.
Definition bitmap.h:67
Defines an abstract interface for all rendering operations.
Definition irenderer.h:40
Represents a palette of colors for the Super Nintendo Entertainment System (SNES).
SNES 16-bit tile metadata container.
Definition snes_tile.h:50
void RenderTile16(IRenderer *renderer, Tilemap &tilemap, int tile_id)
Definition tilemap.cc:76
void ModifyTile16(Tilemap &tilemap, const std::vector< uint8_t > &data, const TileInfo &top_left, const TileInfo &top_right, const TileInfo &bottom_left, const TileInfo &bottom_right, int sheet_offset, int tile_id)
Definition tilemap.cc:223
void UpdateTilemap(IRenderer *renderer, Tilemap &tilemap, const std::vector< uint8_t > &data)
Definition tilemap.cc:34
void UpdateTile16(IRenderer *renderer, Tilemap &tilemap, int tile_id)
Definition tilemap.cc:115
std::vector< uint8_t > GetTilemapData(Tilemap &tilemap, int tile_id)
Definition tilemap.cc:270
Tilemap CreateTilemap(IRenderer *renderer, std::vector< uint8_t > &data, int width, int height, int tile_size, int num_tiles, SnesPalette &palette)
Definition tilemap.cc:14
void RenderTilesBatch(IRenderer *renderer, Tilemap &tilemap, const std::vector< int > &tile_ids, const std::vector< std::pair< float, float > > &positions, const std::vector< std::pair< float, float > > &scales)
Render multiple tiles using atlas rendering for improved performance.
Definition tilemap.cc:348
std::vector< uint8_t > FetchTileDataFromGraphicsBuffer(const std::vector< uint8_t > &data, int tile_id, int sheet_offset)
Definition tilemap.cc:140
void RenderTile(IRenderer *renderer, Tilemap &tilemap, int tile_id)
Definition tilemap.cc:51
void ComposeTile16(Tilemap &tilemap, const std::vector< uint8_t > &data, const TileInfo &top_left, const TileInfo &top_right, const TileInfo &bottom_left, const TileInfo &bottom_right, int sheet_offset)
Definition tilemap.cc:247
Simple 2D coordinate pair for tilemap dimensions.
Definition tilemap.h:19
int y
Y coordinate or height.
Definition tilemap.h:21
int x
X coordinate or width.
Definition tilemap.h:20
Smart tile cache with LRU eviction for efficient memory management.
Definition tilemap.h:37
size_t Size() const
Get cache statistics.
Definition tilemap.h:91
std::unordered_map< int, std::unique_ptr< Bitmap > > cache_
Definition tilemap.h:40
std::list< int > access_order_
Definition tilemap.h:41
void CacheTile(int tile_id, const Bitmap &bitmap)
Cache a tile bitmap by copying it.
Definition tilemap.h:67
void Clear()
Clear the cache.
Definition tilemap.h:82
Bitmap * GetTile(int tile_id)
Get a cached tile by ID.
Definition tilemap.h:50
static constexpr size_t MAX_CACHE_SIZE
Definition tilemap.h:38
Tilemap structure for SNES tile-based graphics management.
Definition tilemap.h:118
Pair tile_size
Size of individual tiles (8x8 or 16x16)
Definition tilemap.h:123
TileCache tile_cache
Smart tile cache with LRU eviction.
Definition tilemap.h:120
Pair map_size
Size of tilemap in tiles.
Definition tilemap.h:124
Bitmap atlas
Master bitmap containing all tiles.
Definition tilemap.h:119
std::vector< std::array< gfx::TileInfo, 4 > > tile_info
Tile metadata (4 tiles per 16x16)
Definition tilemap.h:122