yaze 0.3.2
Link to the Past ROM Editor
 
Loading...
Searching...
No Matches
tile16_editor.h
Go to the documentation of this file.
1#ifndef YAZE_APP_EDITOR_TILE16EDITOR_H
2#define YAZE_APP_EDITOR_TILE16EDITOR_H
3
4#include <functional>
5#include <string>
6#include <utility>
7#include <vector>
8
9#include "absl/status/status.h"
13#include "app/gfx/core/bitmap.h"
15#include "app/gui/core/input.h"
17#include "imgui/imgui.h"
18#include "rom/rom.h"
19#include "util/notify.h"
20
21namespace yaze {
22namespace zelda3 {
23struct GameData;
24} // namespace zelda3
25
26namespace editor {
27
32 public:
33 Tile16Editor(Rom* rom, gfx::Tilemap* tile16_blockset)
34 : session_(rom, tile16_blockset) {}
35
36 absl::Status Initialize(gfx::Bitmap& tile16_blockset_bmp,
37 gfx::Bitmap& current_gfx_bmp,
38 std::array<uint8_t, 0x200>& all_tiles_types);
39
40 absl::Status Update();
41 absl::Status UpdateAsPanel();
43 std::function<absl::Status(int, int)> callback) {
44 open_graphics_for_quadrant_ = std::move(callback);
45 }
48 return absl::FailedPreconditionError("Graphics editor is unavailable");
49 }
52 }
53 void DrawContextMenu();
54 void DrawTile16Editor();
55 absl::Status UpdateBlockset();
56 void DrawScratchSpace();
57
58 absl::Status DrawToCurrentTile16(ImVec2 pos,
59 const gfx::Bitmap* source_tile = nullptr);
60 absl::Status HandleTile16CanvasClick(const ImVec2& tile_position,
61 bool left_click, bool right_click);
63 const ImVec2& display_position);
64
65 absl::Status UpdateTile16Edit();
66 absl::Status LoadTile8() { return session_.LoadTile8(); }
67 absl::Status SetCurrentTile(int id) { return session_.SetCurrentTile(id); }
68 void RequestTileSwitch(int target_tile_id) {
69 session_.RequestTileSwitch(target_tile_id);
70 }
71
72 absl::Status CopyTile16ToClipboard(int tile_id) {
73 return session_.CopyTile16ToClipboard(tile_id);
74 }
78 absl::Status SaveTile16ToScratchSpace(int slot) {
80 }
81 absl::Status LoadTile16FromScratchSpace(int slot) {
83 }
84 absl::Status ClearScratchSpace(int slot) {
85 return session_.ClearScratchSpace(slot);
86 }
87
88 absl::Status FlipTile16Horizontal() {
90 }
91 absl::Status FlipTile16Vertical() { return session_.FlipTile16Vertical(); }
92 absl::Status RotateTile16() { return session_.RotateTile16(); }
93 absl::Status FillTile16WithTile8(int tile8_id) {
94 return session_.FillTile16WithTile8(tile8_id);
95 }
96 absl::Status ClearTile16() { return session_.ClearTile16(); }
97
98 absl::Status CyclePalette(bool forward = true) {
99 return session_.CyclePalette(forward);
100 }
101 absl::Status ApplyPaletteToAll(uint8_t palette_id) {
102 return session_.ApplyPaletteToAll(palette_id);
103 }
104 absl::Status ApplyPaletteToQuadrant(int quadrant, uint8_t palette_id) {
105 return session_.ApplyPaletteToQuadrant(quadrant, palette_id);
106 }
107 absl::Status PreviewPaletteChange(uint8_t palette_id) {
108 return session_.PreviewPaletteChange(palette_id);
109 }
110
111 void BindDocument(std::vector<gfx::Tile16>* definitions, UndoManager* history,
112 std::function<void()> before_edit = {}) {
113 session_.BindDocument(definitions, history, std::move(before_edit));
114 }
115 absl::Status ReplaceCurrentTile(const gfx::Tile16& data) {
116 return session_.ReplaceCurrentTile(data);
117 }
118 absl::Status Undo() { return session_.Undo(); }
119 absl::Status Redo() { return session_.Redo(); }
120
121 void EnableLivePreview(bool enable) { session_.EnableLivePreview(enable); }
122 absl::Status UpdateLivePreview() { return session_.UpdateLivePreview(); }
123
124 absl::Status ValidateTile16Data() { return session_.ValidateTile16Data(); }
125 bool IsTile16Valid(int tile_id) const {
126 return session_.IsTile16Valid(tile_id);
127 }
128
129 absl::Status SaveTile16ToROM() { return session_.SaveTile16ToROM(); }
130 absl::Status UpdateOverworldTilemap() {
132 }
133 absl::Status CommitChangesToBlockset() {
135 }
138 }
139 absl::Status DiscardChanges() { return session_.DiscardChanges(); }
140
143 bool is_tile_modified(int tile_id) const {
144 return session_.is_tile_modified(tile_id);
145 }
146 const gfx::Bitmap* GetPendingTileBitmap(int tile_id) const {
147 return session_.GetPendingTileBitmap(tile_id);
148 }
149
150 absl::Status CommitAllChanges() { return session_.CommitAllChanges(); }
154
155 absl::Status UpdateTile8Palette(int tile8_id) {
156 return session_.UpdateTile8Palette(tile8_id);
157 }
158 absl::Status RefreshAllPalettes() { return session_.RefreshAllPalettes(); }
159 void DrawPaletteSettings();
160
161 int GetActualPaletteSlot(int palette_button, int sheet_index) const {
162 return session_.GetActualPaletteSlot(palette_button, sheet_index);
163 }
164 int GetSheetIndexForTile8(int tile8_id) const {
165 return session_.GetSheetIndexForTile8(tile8_id);
166 }
171 const gfx::SnesPalette& source, int target_row) const {
172 return session_.CreateRemappedPaletteForViewing(source, target_row);
173 }
174 int GetEncodedPaletteRow(uint8_t pixel_value) const {
175 return session_.GetEncodedPaletteRow(pixel_value);
176 }
177
179 absl::Status RefreshTile16Blockset() {
181 }
188 absl::Status UpdateBlocksetBitmap() {
190 }
191 absl::Status PickTile8FromTile16(const ImVec2& position);
192
194
196 Rom* rom() const { return session_.rom(); }
201
202 void set_palette(const gfx::SnesPalette& palette) {
203 session_.set_palette(palette);
204 }
205
207 std::function<void(const std::vector<Tile16Commit>&)> callback) {
208 session_.set_on_document_changed(std::move(callback));
209 }
211 std::function<absl::Status(const std::vector<Tile16Commit>&)> callback) {
212 session_.set_on_changes_committed(std::move(callback));
213 }
214 void set_on_current_tile_changed(std::function<void(int)> callback) {
215 session_.set_on_current_tile_changed(std::move(callback));
216 }
217
218 int current_palette() const { return session_.current_palette(); }
219 void set_current_palette(int palette) {
221 }
225 int current_tile16() const { return session_.current_tile16(); }
229 int current_tile8() const { return session_.current_tile8(); }
230 int active_quadrant() const { return session_.active_quadrant(); }
231 void set_active_quadrant(int quadrant) {
233 }
236
238
239 absl::Status SaveLayoutToScratch(int slot) {
240 return session_.SaveLayoutToScratch(slot);
241 }
242 absl::Status LoadLayoutFromScratch(int slot);
243
244 private:
247 absl::Status DrawTile16NavigationHeader(int total_tiles);
248 absl::Status DrawTile16EditorWorkbenchColumn(bool show_debug_info,
249 bool show_advanced_controls);
250
251 absl::Status DrawCompactActionStatusRow(bool* show_debug_info,
252 bool* show_advanced_controls);
253 absl::Status DrawBrushAndTilePaletteControls(bool show_debug_info);
254 absl::Status DrawTile8SourcePanel(float preferred_height = 0.0f);
255 absl::Status HandleTile8SourceSelection(bool right_clicked,
256 float display_scale);
257 absl::Status DrawPrimaryActionControls();
258
261
262 std::vector<int> selected_tiles_;
264 bool multi_select_mode_ = false;
265
268
275
276 gui::Canvas tile16_edit_canvas_{"Tile16EditCanvas", ImVec2(64, 64),
282
283 gui::Table tile_edit_table_{"##TileEditTable", 3, ImGuiTableFlags_Borders,
284 ImVec2(0, 0)};
285
287 absl::Status status_;
289 std::function<absl::Status(int, int)> open_graphics_for_quadrant_;
290};
291
292} // namespace editor
293} // namespace yaze
294
295#endif // YAZE_APP_EDITOR_TILE16EDITOR_H
The Rom class is used to load, save, and modify Rom data. This is a generic SNES ROM container and do...
Definition rom.h:49
Allows the user to view and edit in game palettes.
Domain session for Tile16 editing (no ImGui).
int GetActualPaletteSlot(int palette_button, int sheet_index) const
gfx::SnesPalette CreateRemappedPaletteForViewing(const gfx::SnesPalette &source, int target_row) const
void set_on_current_tile_changed(std::function< void(int)> callback)
bool IsTile16Valid(int tile_id) const
zelda3::GameData * game_data() const
void set_palette(const gfx::SnesPalette &palette)
void set_on_document_changed(std::function< void(const std::vector< Tile16Commit > &)> callback)
absl::Status CyclePalette(bool forward=true)
absl::Status ApplyPaletteToAll(uint8_t palette_id)
absl::Status ReplaceCurrentTile(const gfx::Tile16 &data)
void SetGameData(zelda3::GameData *game_data)
absl::Status CopyTile16ToClipboard(int tile_id)
absl::Status PreviewPaletteChange(uint8_t palette_id)
absl::Status SaveLayoutToScratch(int slot)
absl::Status FillTile16WithTile8(int tile8_id)
absl::Status ApplyPaletteToQuadrant(int quadrant, uint8_t palette_id)
absl::Status LoadTile16FromScratchSpace(int slot)
void RequestTileSwitch(int target_tile_id)
absl::Status SaveTile16ToScratchSpace(int slot)
void set_on_changes_committed(std::function< absl::Status(const std::vector< Tile16Commit > &)> callback)
absl::Status UpdateTile8Palette(int tile8_id)
int GetEncodedPaletteRow(uint8_t pixel_value) const
int GetSheetIndexForTile8(int tile8_id) const
const gfx::Bitmap & Tile8PreviewBitmap() const
bool is_tile_modified(int tile_id) const
const gfx::Bitmap * GetPendingTileBitmap(int tile_id) const
void BindDocument(std::vector< gfx::Tile16 > *definitions, UndoManager *history, std::function< void()> before_edit)
void set_edit_mode(Tile16EditMode mode)
absl::Status ClearScratchSpace(int slot)
ImGui façade for Tile16 editing; domain state lives in Tile16EditSession.
absl::Status SaveTile16ToScratchSpace(int slot)
Tile16Editor(Rom *rom, gfx::Tilemap *tile16_blockset)
absl::Status LoadLayoutFromScratch(int slot)
static ImVec2 Tile16PreviewDisplayPixelToTilePosition(const ImVec2 &display_position)
absl::Status DrawTile16EditorWorkbenchColumn(bool show_debug_info, bool show_advanced_controls)
zelda3::GameData * game_data() const
util::NotifyValue< uint32_t > notify_tile16
absl::Status CyclePalette(bool forward=true)
absl::Status HandleTile16CanvasClick(const ImVec2 &tile_position, bool left_click, bool right_click)
absl::Status ReplaceCurrentTile(const gfx::Tile16 &data)
absl::Status FillTile16WithTile8(int tile8_id)
absl::Status CommitAllChanges()
int selected_tile16_for_testing() const
void AnalyzeTile8SourceData() const
absl::Status ApplyPaletteToAll(uint8_t palette_id)
std::function< absl::Status(int, int)> open_graphics_for_quadrant_
int GetActualPaletteSlotForCurrentTile16() const
void set_current_palette(int palette)
absl::Status RegenerateTile16BitmapFromROM()
void set_active_quadrant(int quadrant)
absl::Status HandleTile8SourceSelection(bool right_clicked, float display_scale)
absl::Status PasteTile16FromClipboard()
gui::TileSelectorWidget blockset_selector_
absl::Status SaveLayoutToScratch(int slot)
absl::Status LoadTile16FromScratchSpace(int slot)
gfx::SnesPalette CreateRemappedPaletteForViewing(const gfx::SnesPalette &source, int target_row) const
int GetActualPaletteSlot(int palette_button, int sheet_index) const
absl::Status FlipTile16Horizontal()
void SetGameData(zelda3::GameData *game_data)
void set_edit_mode(Tile16EditMode mode)
absl::Status OpenGraphicsForActiveQuadrant()
absl::Status DrawBrushAndTilePaletteControls(bool show_debug_info)
int GetEncodedPaletteRow(uint8_t pixel_value) const
void EnableLivePreview(bool enable)
absl::Status DrawTile8SourcePanel(float preferred_height=0.0f)
Tile16EditMode edit_mode() const
absl::Status SetCurrentTile(int id)
absl::Status UpdateTile8Palette(int tile8_id)
absl::Status RefreshTile16Blockset()
absl::Status ValidateTile16Data()
void BindDocument(std::vector< gfx::Tile16 > *definitions, UndoManager *history, std::function< void()> before_edit={})
const gfx::Bitmap * GetPendingTileBitmap(int tile_id) const
absl::Status RefreshAllPalettes()
void SetOpenGraphicsForQuadrant(std::function< absl::Status(int, int)> callback)
absl::Status ApplyPaletteToQuadrant(int quadrant, uint8_t palette_id)
void set_on_changes_committed(std::function< absl::Status(const std::vector< Tile16Commit > &)> callback)
absl::Status UpdateOverworldTilemap()
absl::Status DrawTile16NavigationHeader(int total_tiles)
absl::Status CommitChangesToBlockset()
absl::Status UpdateROMTile16Data()
void set_on_document_changed(std::function< void(const std::vector< Tile16Commit > &)> callback)
bool IsTile16Valid(int tile_id) const
gfx::Tile16 * GetCurrentTile16Data()
absl::Status DrawCompactActionStatusRow(bool *show_debug_info, bool *show_advanced_controls)
absl::Status CommitChangesToOverworld()
absl::Status UpdateBlocksetBitmap()
void RequestTileSwitch(int target_tile_id)
absl::Status DrawToCurrentTile16(ImVec2 pos, const gfx::Bitmap *source_tile=nullptr)
absl::Status UpdateLivePreview()
absl::Status Initialize(gfx::Bitmap &tile16_blockset_bmp, gfx::Bitmap &current_gfx_bmp, std::array< uint8_t, 0x200 > &all_tiles_types)
absl::Status PreviewPaletteChange(uint8_t palette_id)
absl::Status CopyTile16ToClipboard(int tile_id)
const gfx::Bitmap & Tile8PreviewBitmapForTesting() const
absl::Status ClearScratchSpace(int slot)
bool is_tile_modified(int tile_id) const
int GetSheetIndexForTile8(int tile8_id) const
absl::Status FlipTile16Vertical()
Tile16EditSession session_
absl::Status PickTile8FromTile16(const ImVec2 &position)
std::vector< int > selected_tiles_
void set_palette(const gfx::SnesPalette &palette)
util::NotifyValue< uint8_t > notify_palette
void set_on_current_tile_changed(std::function< void(int)> callback)
Manages undo/redo stacks for a single editor.
Represents a bitmap image optimized for SNES ROM hacking.
Definition bitmap.h:70
Shared graphical context across editors.
Represents a palette of colors for the Super Nintendo Entertainment System (SNES).
Tile composition of four 8x8 tiles.
Definition snes_tile.h:142
Modern, robust canvas for drawing and manipulating graphics.
Definition canvas.h:64
Reusable tile selector built on top of Canvas.
A class to manage a value that can be modified and notify when it changes.
Definition notify.h:13
constexpr int kTilesheetEditorHeight
constexpr int kTilesheetEditorWidth
constexpr int kTilesheetHeight
Definition snes_tile.h:17
constexpr int kTilesheetWidth
Definition snes_tile.h:16
Tilemap structure for SNES tile-based graphics management.
Definition tilemap.h:118