1#ifndef YAZE_APP_EDITOR_TILE16EDITOR_H
2#define YAZE_APP_EDITOR_TILE16EDITOR_H
14#include "absl/status/status.h"
24#include "imgui/imgui.h"
140 std::array<uint8_t, 0x200>& all_tiles_types);
171 bool left_click,
bool right_click);
372 if (palette.
size() >= 256) {
375 "Tile16 editor received complete overworld palette with %zu colors",
378 util::logf(
"Warning: Received incomplete palette with %zu colors",
387 util::logf(
"Failed to load tile8 graphics with new palette: %s",
388 status.message().data());
391 "Successfully loaded tile8 graphics with complete overworld "
396 util::logf(
"Tile16 editor palette coordination complete");
528 "Tile16BlocksetSelector",
606 bool* show_advanced_controls);
The Rom class is used to load, save, and modify Rom data. This is a generic SNES ROM container and do...
Allows the user to view and edit in game palettes.
Popup window to edit Tile16 data.
absl::Status DrawTile8SourcePanel()
absl::Status SaveTile16ToScratchSpace(int slot)
const gfx::SnesPalette * ResolveDisplayPalette() const
Tile16Editor(Rom *rom, gfx::Tilemap *tile16_blockset)
std::map< int, gfx::Tile16 > pending_tile16_changes_
absl::Status LoadLayoutFromScratch(int slot)
zelda3::GameData * game_data() const
void FinalizePendingUndo()
Finalize any pending undo snapshot by capturing current state as "after" and pushing a Tile16EditActi...
std::chrono::steady_clock::time_point last_edit_time_
util::NotifyValue< uint32_t > notify_tile16
void DrawContextMenu()
Draw context menu with editor actions.
absl::Status CyclePalette(bool forward=true)
absl::Status HandleTile16CanvasClick(const ImVec2 &tile_position, bool left_click, bool right_click)
absl::Status ClearTile16()
void HandleKeyboardShortcuts()
std::chrono::steady_clock::time_point last_rom_write_time_
absl::Status FillTile16WithTile8(int tile8_id)
gfx::Tilemap * tile16_blockset_
bool map_blockset_loaded_
bool BitmapHasEncodedPaletteRows(const gfx::Bitmap &bitmap) const
absl::Status CommitAllChanges()
Write all pending changes to ROM and notify parent.
int active_quadrant() const
std::map< int, gfx::Bitmap > pending_tile16_bitmaps_
bool live_preview_enabled_
std::array< Tile16ScratchData, 4 > scratch_space_
void AnalyzeTile8SourceData() const
PaletteEditor palette_editor_
gfx::Tile16 current_tile16_data_
absl::Status SaveTile16ToROM()
Write current tile16 data directly to ROM (bypasses pending system)
void RestoreFromSnapshot(const Tile16Snapshot &snapshot)
Restore editor state from a Tile16Snapshot (used by undo actions).
absl::Status ApplyPaletteToAll(uint8_t palette_id)
int current_tile16() const
void DiscardAllChanges()
Discard all pending changes (revert to ROM state)
int current_palette_group_
int GetActualPaletteSlotForCurrentTile16() const
Get the palette slot for the current tile being edited.
void set_current_palette(int palette)
std::array< uint8_t, 0x200 > all_tiles_types_
UndoManager undo_manager_
absl::Status RegenerateTile16BitmapFromROM()
std::function< void(int)> on_current_tile_changed_
void set_active_quadrant(int quadrant)
absl::Status DiscardChanges()
Discard current tile's changes (single tile)
bool show_palette_settings_
uint8_t palette_normalization_mask_
bool tile8_usage_cache_dirty_
absl::Status PasteTile16FromClipboard()
gui::TileSelectorWidget blockset_selector_
int pending_changes_count() const
Get count of tiles with pending changes.
absl::Status SaveLayoutToScratch(int slot)
bool show_palette_preview_
int last_rom_write_count_
absl::Status LoadTile16FromScratchSpace(int slot)
int GetPaletteSlotForSheet(int sheet_index) const
Get base palette slot for a graphics sheet.
gfx::SnesPalette CreateRemappedPaletteForViewing(const gfx::SnesPalette &source, int target_row) const
Create a remapped palette for viewing with user-selected palette.
int GetActualPaletteSlot(int palette_button, int sheet_index) const
Calculate actual palette slot from button + sheet.
bool show_unsaved_changes_dialog_
absl::Status FlipTile16Horizontal()
gfx::SnesPalette palette_
gfx::Bitmap * tile16_blockset_bmp_
void SetGameData(zelda3::GameData *game_data)
int current_tile8() const
std::vector< zelda3::Tile8PixelData > current_gfx_individual_
void set_edit_mode(Tile16EditMode mode)
absl::Status UpdateTile16Edit()
gfx::SnesPalette overworld_palette_
absl::Status UpdateBlockset()
static constexpr int kTilesPerPage
absl::Status DrawBrushAndTilePaletteControls(bool show_debug_info)
int GetEncodedPaletteRow(uint8_t pixel_value) const
Get the encoded palette row for a pixel value.
static constexpr int kTilesPerRow
void DrawTile8UsageOverlay()
bool auto_normalize_pixels_
void EnableLivePreview(bool enable)
Tile16EditMode edit_mode_
Tile16EditMode edit_mode() const
absl::Status SetCurrentTile(int id)
gfx::Bitmap * current_gfx_bmp_
absl::Status UpdateTile8Palette(int tile8_id)
Update palette for a specific tile8.
zelda3::Tile8UsageIndex tile8_usage_cache_
absl::Status UpdateAsPanel()
Update the editor content without MenuBar (for WindowContent usage)
void ApplyPaletteToCurrentTile16Bitmap()
absl::Status RefreshTile16Blockset()
Tile16ClipboardData clipboard_tile16_
absl::Status ValidateTile16Data()
void DrawManualTile8Inputs()
int pending_tile_switch_target_
const gfx::Bitmap * GetPendingTileBitmap(int tile_id) const
Get preview bitmap for a pending tile (nullptr if not modified)
zelda3::GameData * game_data_
absl::Status RefreshAllPalettes()
Refresh all tile8 palettes after a palette change.
bool HasTile16BlocksetBitmap() const
void DrawPaletteSettings()
Draw palette settings UI.
bool highlight_tile8_usage_
absl::Status ApplyPaletteToQuadrant(int quadrant, uint8_t palette_id)
absl::Status UpdateOverworldTilemap()
Update the overworld tilemap to reflect tile changes.
absl::Status RotateTile16()
gfx::Bitmap preview_tile16_
gui::Canvas tile16_edit_canvas_
absl::Status CommitChangesToBlockset()
Commit pending changes to the blockset atlas.
std::array< LayoutScratch, 4 > layout_scratch_
absl::Status UpdateROMTile16Data()
std::optional< Tile16Snapshot > pending_undo_before_
void DrawStagedStateBar(bool has_pending, bool current_tile_pending, int pending_count)
gui::Canvas blockset_canvas_
gui::Canvas tile8_source_canvas_
bool IsTile16Valid(int tile_id) const
gfx::Tile16 * GetCurrentTile16Data()
void MarkCurrentTileModified()
Mark the current tile as having pending changes.
absl::Status RebuildTile8UsageCache()
bool has_pending_changes() const
Check if any tiles have uncommitted changes.
absl::Status CommitChangesToOverworld()
Single-tile commit: ROM + blockset + parent refresh callback. Prefer CommitAllChanges() from the main...
absl::Status UpdateBlocksetBitmap()
void DiscardCurrentTileChanges()
Discard only the current tile's pending changes.
void RequestTileSwitch(int target_tile_id)
int current_palette() const
void DrawEditorHeaderToggles(bool *show_debug_info, bool *show_advanced_controls)
absl::Status DrawToCurrentTile16(ImVec2 pos, const gfx::Bitmap *source_tile=nullptr)
absl::Status HandleTile8SourceSelection(bool right_clicked)
absl::Status UpdateLivePreview()
absl::Status Initialize(gfx::Bitmap &tile16_blockset_bmp, gfx::Bitmap ¤t_gfx_bmp, std::array< uint8_t, 0x200 > &all_tiles_types)
void CopyTileBitmapToBlockset(int tile_id, const gfx::Bitmap &tile_bitmap)
absl::Status PreviewPaletteChange(uint8_t palette_id)
gfx::Bitmap tile8_preview_bmp_
absl::Status CopyTile16ToClipboard(int tile_id)
absl::Status DrawPrimaryActionControls()
absl::Status ClearScratchSpace(int slot)
int selection_start_tile_
bool is_tile_modified(int tile_id) const
Check if a specific tile has pending changes.
bool HasCurrentGfxBitmap() const
gui::Table tile_edit_table_
std::function< absl::Status()> on_changes_committed_
absl::Status BuildTile16BitmapFromData(const gfx::Tile16 &tile_data, gfx::Bitmap *output_bitmap) const
void DrawEditorHeader(bool show_debug_info)
int GetPaletteBaseForSheet(int sheet_index) const
Get palette base row for a graphics sheet.
int GetSheetIndexForTile8(int tile8_id) const
Determine which graphics sheet contains a tile8.
absl::Status DrawBottomActionRail(bool has_pending, bool current_tile_pending, int pending_count)
absl::Status FlipTile16Vertical()
gfx::Bitmap current_tile16_bmp_
bool has_rom_write_history_
absl::Status PickTile8FromTile16(const ImVec2 &position)
std::vector< int > selected_tiles_
void CopyTile16ToAtlas(int tile_id)
void set_palette(const gfx::SnesPalette &palette)
util::NotifyValue< uint8_t > notify_palette
void set_on_current_tile_changed(std::function< void(int)> callback)
void set_on_changes_committed(std::function< absl::Status()> callback)
Manages undo/redo stacks for a single editor.
Represents a bitmap image optimized for SNES ROM hacking.
Shared graphical context across editors.
Represents a palette of colors for the Super Nintendo Entertainment System (SNES).
Tile composition of four 8x8 tiles.
Modern, robust canvas for drawing and manipulating graphics.
A class to manage a value that can be modified and notify when it changes.
constexpr int kTile16PixelCount
constexpr int kTile8PixelCount
constexpr int kTile16CanvasSize
constexpr int kTilesheetEditorHeight
constexpr int kTile16Size
constexpr int kNumScratchSlots
constexpr int kTile8CanvasHeight
constexpr int kNumPalettes
constexpr int kTilesheetEditorWidth
constexpr int kTilesheetHeight
constexpr int kTilesheetWidth
void logf(const absl::FormatSpec< Args... > &format, Args &&... args)
std::array< std::vector< Tile8UsageHit >, kMaxTile8UsageId > Tile8UsageIndex
std::array< std::array< int, 8 >, 8 > tile_layout
Snapshot of a Tile16's editable state for undo/redo.
Tilemap structure for SNES tile-based graphics management.