yaze 0.3.2
Link to the Past ROM Editor
 
Loading...
Searching...
No Matches
tile_painting_manager.h
Go to the documentation of this file.
1#ifndef YAZE_APP_EDITOR_OVERWORLD_PAINTING_TILE_PAINTING_MANAGER_H
2#define YAZE_APP_EDITOR_OVERWORLD_PAINTING_TILE_PAINTING_MANAGER_H
3
4#include <array>
5#include <functional>
6#include <vector>
7
8#include "absl/status/status.h"
9#include "absl/status/statusor.h"
12#include "app/gfx/core/bitmap.h"
15#include "imgui/imgui.h"
16#include "rom/rom.h"
18
19namespace yaze {
20namespace editor {
21
22class Tile16Editor;
23
30 std::array<gfx::Bitmap, zelda3::kExpandedMapCount>* maps_bmp = nullptr;
32 int* current_tile16 = nullptr;
33 std::vector<int>* selected_tile16_ids = nullptr;
34 int* current_map = nullptr;
35 int* current_world = nullptr;
37 Rom* rom = nullptr;
39};
40
43 std::function<void(int map_id, int world, int x, int y, int old_tile_id)>
45 std::function<void()> finalize_paint_operation;
46 std::function<void(int map_index)> refresh_overworld_map_on_demand;
47 std::function<void()> scroll_blockset_to_current_tile;
49 std::function<void(int tile_id)> request_tile16_selection;
53 std::function<void(int map_id)> select_map_for_editing;
54 // Optional project terrain adapter. Coordinates are world Tile16 cells;
55 // project destinations never enter the legacy ROM/bitmap write path.
56 std::function<bool(int world, int x, int y)> is_project_tile;
57 std::function<absl::StatusOr<uint16_t>(int world, int x, int y)>
59 std::function<absl::Status(const TileBrush&, int x, int y, int width,
60 int height, bool finalize)>
62 std::function<void()> finalize_project_paint;
63 std::function<const gfx::Bitmap*(int map_id)> project_tile_atlas;
64 std::function<int(int world)> allocated_rows;
65};
66
69 int x = 0;
70 int y = 0;
71 uint16_t expected = 0;
72 uint16_t proposed = 0;
73};
74
80 public:
82 const TilePaintingCallbacks& callbacks);
83
86
91
94
96 const TileBrush* selection_brush() const;
97 void SetSelectionBrush(TileBrush brush);
99
102 absl::Status PasteBrush(const TileBrush& brush);
103 absl::Status PlaceBrushAt(const TileBrush& brush, int x, int y) {
105 return PaintPattern(brush, {x, y}, brush.width, brush.height);
106 }
107
111 absl::StatusOr<int> ApplyGuardedCells(
112 int map_id, const std::vector<GuardedTileCell>& cells);
113
115 void RenderUpdatedMapBitmap(const ImVec2& click_position,
116 const std::vector<uint8_t>& tile_data);
117
120
122 void ToggleBrushTool();
123
125 void ActivateFillTool();
126
129 const gfx::Bitmap& map_brush_preview(int map_id) const {
130 return map_brush_previews_.at(map_id);
131 }
132
133 private:
135 int x;
136 int y;
137 };
138 using ChangedMaps = std::array<bool, zelda3::kNumOverworldMaps>;
139
141 int AllocatedRowsForWorld(int world) const;
142 bool IsValidMapGridPosition(int world, int map_x, int map_y) const;
143 bool IsProjectTile(TilePosition position) const;
144 absl::StatusOr<uint16_t> ReadTile(TilePosition position) const;
145 bool IsValidTile(TilePosition position) const;
147 std::vector<std::vector<uint16_t>>& WorldTiles() const;
148 void CaptureSelection();
149 // Draws `brush` at `anchor` with each destination map's own graphics and
150 // palette. `mark_selection` also moves the canvas selection rectangle.
151 void DrawBrushPreview(const TileBrush& brush, TilePosition anchor,
152 bool mark_selection, int alpha);
153 // Pixels of `tile_id` as `map_id` draws it (its own tile16 blockset);
154 // falls back to the shared blockset when that map has none built.
155 std::vector<uint8_t> Tile16PixelsForMap(int map_id, int tile_id) const;
156 absl::Status PaintPattern(const TileBrush& brush, TilePosition anchor,
157 int width, int height, bool finalize = true);
158 bool PaintTile(TilePosition position, int tile_id, ChangedMaps& changed_maps);
159 void RefreshChangedMaps(const ChangedMaps& changed_maps);
160 void RenderMapTile(int map_id, TilePosition position,
161 const std::vector<uint8_t>& tile_data);
162
168 bool gesture_project_ = false;
174 std::array<gfx::Bitmap, zelda3::kNumOverworldMaps> map_brush_previews_;
175};
176
177} // namespace editor
178} // namespace yaze
179
180#endif // YAZE_APP_EDITOR_OVERWORLD_PAINTING_TILE_PAINTING_MANAGER_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:52
ImGui façade for Tile16 editing; domain state lives in Tile16EditSession.
Manages tile painting, fill, selection, and eyedropper operations.
std::vector< uint8_t > Tile16PixelsForMap(int map_id, int tile_id) const
bool IsValidMapGridPosition(int world, int map_x, int map_y) const
bool PaintTile(TilePosition position, int tile_id, ChangedMaps &changed_maps)
void CheckForSelectRectangle()
Draw and create the tile16 IDs that are currently selected.
bool IsValidTile(TilePosition position) const
std::array< gfx::Bitmap, zelda3::kNumOverworldMaps > map_brush_previews_
void CheckForOverworldEdits()
Main entry point: check for tile edits (paint, fill, stamp).
bool IsProjectTile(TilePosition position) const
void RenderUpdatedMapBitmap(const ImVec2 &click_position, const std::vector< uint8_t > &tile_data)
Update bitmap pixels after a single tile paint.
const gfx::Bitmap & map_brush_preview(int map_id) const
bool PickTile16FromHoveredCanvas()
Eyedropper: pick the tile16 under the hovered canvas position.
void RenderMapTile(int map_id, TilePosition position, const std::vector< uint8_t > &tile_data)
void ActivateFillTool()
Toggle FILL_TILE mode on/off.
absl::StatusOr< int > ApplyGuardedCells(int map_id, const std::vector< GuardedTileCell > &cells)
absl::Status PasteBrush(const TileBrush &brush)
absl::Status PlaceBrushAt(const TileBrush &brush, int x, int y)
const TileBrush * selection_brush() const
The captured selection, independent of its source or preview position.
void ToggleBrushTool()
Toggle between DRAW_TILE and MOUSE modes.
void RefreshChangedMaps(const ChangedMaps &changed_maps)
absl::StatusOr< uint16_t > ReadTile(TilePosition position) const
void DrawBrushPreview(const TileBrush &brush, TilePosition anchor, bool mark_selection, int alpha)
absl::Status PaintPattern(const TileBrush &brush, TilePosition anchor, int width, int height, bool finalize=true)
std::vector< std::vector< uint16_t > > & WorldTiles() const
std::array< bool, zelda3::kNumOverworldMaps > ChangedMaps
TilePaintingManager(const TilePaintingDependencies &deps, const TilePaintingCallbacks &callbacks)
Represents a bitmap image optimized for SNES ROM hacking.
Definition bitmap.h:70
uint8_t at(int i) const
Definition bitmap.h:412
Modern, robust canvas for drawing and manipulating graphics.
Definition canvas.h:64
One cell of a guarded stencil, in Tile16 cells local to its map (0..31).
Callbacks for undo integration and map refresh.
std::function< absl::Status(const TileBrush &, int x, int y, int width, int height, bool finalize) paint_project_pattern)
std::function< void(int tile_id)> request_tile16_selection
When set, eyedropper routes here (guarded RequestTileSwitch path).
std::function< absl::StatusOr< uint16_t >(int world, int x, int y)> read_project_tile
std::function< void(int map_index)> refresh_overworld_map_on_demand
std::function< void()> scroll_blockset_to_current_tile
std::function< int(int world)> allocated_rows
std::function< void()> finalize_paint_operation
std::function< void(int map_id)> select_map_for_editing
std::function< bool(int world, int x, int y)> is_project_tile
std::function< const gfx::Bitmap *(int map_id)> project_tile_atlas
std::function< void(int map_id, int world, int x, int y, int old_tile_id)> create_undo_point
Shared state for the tile painting system.
std::array< gfx::Bitmap, zelda3::kExpandedMapCount > * maps_bmp
Tilemap structure for SNES tile-based graphics management.
Definition tilemap.h:118