yaze 0.3.2
Link to the Past ROM Editor
 
Loading...
Searching...
No Matches
render_context.h
Go to the documentation of this file.
1#ifndef YAZE_APP_EMU_RENDER_RENDER_CONTEXT_H_
2#define YAZE_APP_EMU_RENDER_RENDER_CONTEXT_H_
3
4#include <cstdint>
5#include <string>
6#include <vector>
7
8namespace yaze {
9namespace emu {
10namespace render {
11
12// Type of entity to render
13enum class RenderTargetType {
14 kDungeonObject, // Single dungeon object (Type 1/2/3)
15 kSprite, // Single sprite entity
16 kFullRoom, // Complete room with objects and sprites
17};
18
19// Request structure for rendering operations
22
23 // Entity identification
24 int entity_id = 0; // Object ID (0x000-0xFFF) or Sprite ID (0x00-0xFF)
25
26 // Position and size (for objects)
27 int x = 0; // X position in tile coordinates (0-63)
28 int y = 0; // Y position in tile coordinates (0-63)
29 int size = 0; // Size parameter for scalable objects
30
31 // Room context
32 int room_id = 0; // Dungeon room ID for graphics/palette context
33 uint8_t blockset = 0; // Graphics blockset override (0 = use room default)
34 uint8_t palette = 0; // Palette override (0 = use room default)
35 uint8_t spriteset = 0; // Spriteset override (0 = use room default)
36
37 // Output dimensions
38 int output_width = 256;
39 int output_height = 256;
40
41 // Use default room context if true (ignores blockset/palette/spriteset)
42 bool use_room_defaults = true;
43};
44
45// Result of a render operation
47 bool success = false;
48 std::string error;
49
50 // Output pixel data (RGBA8888 format)
51 std::vector<uint8_t> rgba_pixels;
52 int width = 0;
53 int height = 0;
54
55 // Debug/diagnostic info
59};
60
61// Save state metadata for ROM compatibility checking
63 uint32_t rom_checksum = 0; // CRC32 of ROM
64 uint8_t rom_region = 0; // 0=US, 1=JP, 2=EU
65 int room_id = 0; // Current room when state was saved
66 uint8_t game_module = 0; // Game state module ($7E:0010)
67 std::string description;
68 uint32_t version = 1; // State format version
69};
70
71// Type of baseline state
72enum class StateType {
73 kRoomLoaded, // Game booted, dungeon room fully loaded
74 kOverworldLoaded, // Game booted, overworld area loaded
75 kBlankCanvas, // Minimal state for custom rendering
76};
77
78// LoROM address conversion helper
79// ALTTP uses LoROM mapping where:
80// - Banks $00-$3F: Address $8000-$FFFF maps to ROM
81// - Each bank contributes 32KB ($8000 bytes)
82// - PC = (bank & 0x7F) * 0x8000 + (addr - 0x8000)
83inline uint32_t SnesToPc(uint32_t snes_addr) {
84 uint8_t bank = (snes_addr >> 16) & 0xFF;
85 uint16_t addr = snes_addr & 0xFFFF;
86 if (addr >= 0x8000) {
87 return (bank & 0x7F) * 0x8000 + (addr - 0x8000);
88 }
89 return snes_addr;
90}
91
92// Convert 8BPP linear tile data to 4BPP SNES planar format
93// Input: 64 bytes per tile (1 byte per pixel, linear row-major order)
94// Output: 32 bytes per tile (4 bitplanes interleaved per SNES 4BPP format)
95inline std::vector<uint8_t> ConvertLinear8bppToPlanar4bpp(
96 const std::vector<uint8_t>& linear_data) {
97 size_t num_tiles = linear_data.size() / 64; // 64 bytes per 8x8 tile
98 std::vector<uint8_t> planar_data(num_tiles * 32); // 32 bytes per tile
99
100 for (size_t tile = 0; tile < num_tiles; ++tile) {
101 const uint8_t* src = linear_data.data() + tile * 64;
102 uint8_t* dst = planar_data.data() + tile * 32;
103
104 for (int row = 0; row < 8; ++row) {
105 uint8_t bp0 = 0, bp1 = 0, bp2 = 0, bp3 = 0;
106
107 for (int col = 0; col < 8; ++col) {
108 uint8_t pixel = src[row * 8 + col] & 0x0F; // Low 4 bits only
109 int bit = 7 - col; // MSB first
110
111 bp0 |= ((pixel >> 0) & 1) << bit;
112 bp1 |= ((pixel >> 1) & 1) << bit;
113 bp2 |= ((pixel >> 2) & 1) << bit;
114 bp3 |= ((pixel >> 3) & 1) << bit;
115 }
116
117 // SNES 4BPP interleaving: bp0,bp1 for rows 0-7 first, then bp2,bp3
118 dst[row * 2] = bp0;
119 dst[row * 2 + 1] = bp1;
120 dst[16 + row * 2] = bp2;
121 dst[16 + row * 2 + 1] = bp3;
122 }
123 }
124
125 return planar_data;
126}
127
128// Key ALTTP ROM addresses (SNES format)
129namespace rom_addresses {
130
131// Object handler tables (bank $01)
132constexpr uint32_t kType1DataTable = 0x018000;
133constexpr uint32_t kType1HandlerTable = 0x018200;
134constexpr uint32_t kType2DataTable = 0x018370;
135constexpr uint32_t kType2HandlerTable = 0x018470;
136constexpr uint32_t kType3DataTable = 0x0184F0;
137constexpr uint32_t kType3HandlerTable = 0x0185F0;
138
139// Tile/graphics data
140constexpr uint32_t kTileData = 0x009B52;
141
142// Palette addresses
143constexpr uint32_t kDungeonMainPalettes = 0x0DD734;
144constexpr uint32_t kSpriteAuxPalettes = 0x0DD308;
145constexpr uint32_t kSpritePalettesLW = 0x0DD218;
146constexpr uint32_t kSpritePalettesDW = 0x0DD290;
147
148// Sprite data
149constexpr uint32_t kSpritePointerTable = 0x04C298;
150constexpr uint32_t kSpriteBlocksetPointer = 0x005B57;
151
152// Room data
153constexpr uint32_t kRoomObjectPointer = 0x00874C;
154constexpr uint32_t kRoomLayoutPointer = 0x00882D;
155
156} // namespace rom_addresses
157
158// Key WRAM addresses
159namespace wram_addresses {
160
161// Tilemap buffers
162constexpr uint32_t kBG1TilemapBuffer = 0x7E2000;
163constexpr uint32_t kBG2TilemapBuffer = 0x7E4000;
164constexpr uint32_t kTilemapBufferSize = 0x2000;
165
166// Game state
167constexpr uint32_t kRoomId = 0x7E00A0;
168constexpr uint32_t kGameModule = 0x7E0010;
169
170// Tilemap indirect pointers (zero page)
171constexpr uint8_t kTilemapPointers[] = {0xBF, 0xC2, 0xC5, 0xC8, 0xCB,
172 0xCE, 0xD1, 0xD4, 0xD7, 0xDA, 0xDD};
173constexpr uint32_t kTilemapRowStride = 0x80; // 64 tiles * 2 bytes
174
175} // namespace wram_addresses
176
177// CRC32 calculation for ROM checksum verification
178// Uses standard CRC32 polynomial 0xEDB88320
179uint32_t CalculateCRC32(const uint8_t* data, size_t size);
180
181} // namespace render
182} // namespace emu
183} // namespace yaze
184
185#endif // YAZE_APP_EMU_RENDER_RENDER_CONTEXT_H_
constexpr uint32_t kRoomObjectPointer
constexpr uint32_t kDungeonMainPalettes
constexpr uint32_t kType3HandlerTable
constexpr uint32_t kType2HandlerTable
constexpr uint32_t kSpriteAuxPalettes
constexpr uint32_t kType1HandlerTable
constexpr uint32_t kSpritePointerTable
constexpr uint32_t kRoomLayoutPointer
constexpr uint32_t kSpriteBlocksetPointer
uint32_t SnesToPc(uint32_t snes_addr)
uint32_t CalculateCRC32(const uint8_t *data, size_t size)
std::vector< uint8_t > ConvertLinear8bppToPlanar4bpp(const std::vector< uint8_t > &linear_data)
std::vector< uint8_t > rgba_pixels