yaze 0.3.2
Link to the Past ROM Editor
 
Loading...
Searching...
No Matches
object_tile_editor_panel.h
Go to the documentation of this file.
1#ifndef YAZE_APP_EDITOR_DUNGEON_PANELS_OBJECT_TILE_EDITOR_PANEL_H_
2#define YAZE_APP_EDITOR_DUNGEON_PANELS_OBJECT_TILE_EDITOR_PANEL_H_
3
4#include <array>
5#include <cstdint>
6#include <functional>
7#include <memory>
8#include <optional>
9#include <string>
10#include <utility>
11#include <vector>
12
13#include "absl/status/status.h"
14#include "absl/status/statusor.h"
18#include "app/gfx/core/bitmap.h"
21#include "app/gui/core/icons.h"
22#include "rom/rom.h"
24#include "zelda3/dungeon/room.h"
25
26namespace yaze {
27namespace editor {
28
29struct ObjectTileEditorPanelTestAccess;
30
45 public:
46 using StandardWritePreflightCallback = std::function<absl::Status(
47 const std::vector<std::pair<uint32_t, uint32_t>>&)>;
48 using TilesAppliedCallback = std::function<void()>;
49
51 ~ObjectTileEditorPanel() override;
52
53 std::string GetId() const override { return "dungeon.object_tile_editor"; }
54 std::string GetDisplayName() const override { return "Object Tile Editor"; }
55 std::string GetIcon() const override { return ICON_MD_GRID_ON; }
56 std::string GetEditorCategory() const override { return "Dungeon"; }
57 int GetPriority() const override { return 65; }
58 std::string GetWorkflowGroup() const override { return "Editors"; }
59 float GetPreferredWidth() const override { return 550.0f; }
60 float GetPreferredHeight() const override { return 500.0f; }
61
62 void Draw(bool* p_open) override;
63 void OnClose() override;
64
65 absl::Status OpenForObject(int16_t object_id, int room_id,
66 DungeonRoomStore* rooms);
67 absl::Status OpenForObject(int16_t object_id, int room_id,
68 DungeonRoomStore* rooms,
69 const gfx::PaletteGroup& palette_group);
70 absl::Status OpenForCustomObject(int16_t object_id, int subtype, int room_id,
71 DungeonRoomStore* rooms);
72 absl::Status OpenForCustomObject(int16_t object_id, int subtype, int room_id,
73 DungeonRoomStore* rooms,
74 const gfx::PaletteGroup& palette_group);
75 void Close();
76 bool IsOpen() const { return is_open_; }
77 int current_room_id() const { return current_room_id_; }
78 bool HasUnappliedChanges() const {
80 }
81
83 void SetCurrentPaletteGroupForRoom(int room_id,
84 const gfx::PaletteGroup& group);
85
90
92 on_tiles_applied_ = std::move(callback);
93 }
94
95 private:
96 enum class ActionStatusTone {
97 kNone,
100 kError,
101 };
102
104 void ClearActionStatus();
105 void SetActionStatus(ActionStatusTone tone, std::string message);
106 void ResetTransientState();
107 std::string BuildWindowTitle() const;
109 absl::Status AddFirstTileToEmptyCustomLayout();
110 absl::Status AddCustomTileAt(int rel_x, int rel_y);
111 absl::Status AppendCustomCell(int rel_x, int rel_y, gfx::TileInfo tile_info);
112 // Refuses occupied targets; tiles are never swapped or overwritten.
113 absl::Status MoveSelectedCustomTileTo(int rel_x, int rel_y);
114 // Custom consumer fingerprints exclude draft geometry, so a structural draft
115 // change must not inherit a confirmation given for the previous draft.
118 void RevertCurrentLayout();
121 uint64_t fingerprint = 0;
122
123 bool operator==(const SourceImpactSnapshot&) const = default;
124 };
125 absl::StatusOr<SourceImpactSnapshot> AnalyzeSourceImpactSnapshot() const;
126 absl::StatusOr<int> GetSharedTileDataUsageCount() const;
127 absl::StatusOr<int> GetDisplayedSharedTileDataUsageCount();
128 absl::StatusOr<bool> HasSharedTileDataConflict() const;
130 bool HasRenderableRoomContext() const;
132
133 void DrawTileGrid();
134 void DrawTileGridCanvas();
135 void DrawCustomTileAdder();
136 void DrawSourceSheet();
137 void DrawTileProperties();
138 void DrawActionBar(bool* p_open);
139 void HandleKeyboardShortcuts(bool* p_open);
140 void RequestSafeWindowClose(bool* p_open);
141
142 void RenderObjectPreview();
143 void RenderTile8Atlas();
146 absl::Status WriteBackCurrentLayout();
147
148 // Apply: write back, re-render room, reset modified flags.
149 // If confirm_shared is true and tile data is shared, opens confirmation modal
150 // instead of applying immediately.
151 void ApplyChanges(bool confirm_shared = true);
152
153 // State
156 std::unique_ptr<zelda3::ObjectTileEditor> tile_editor_;
161 uint16_t source_attributes_ = 0;
162
163 // Oracle custom objects draw into a 64x64-tile dungeon buffer.
164 static constexpr int kCustomObjectBufferTiles = 64;
165 int add_tile_x_ = 0;
166 int add_tile_y_ = 0;
167
168 // Last opened or published custom layout. Revert restores it exactly,
169 // including removal of tiles added since then.
171 std::vector<zelda3::ObjectTileLayout::Cell> cells;
174 };
175 std::optional<CustomLayoutBaseline> custom_baseline_;
176
177 // Canvases
178 gui::Canvas tile_grid_canvas_{"##ObjTileGrid", ImVec2(256, 256)};
179 gui::Canvas source_sheet_canvas_{"##ObjTileSource", ImVec2(256, 512)};
180
181 // Bitmaps
184 bool preview_dirty_ = true;
185 bool atlas_dirty_ = true;
187
188 // Shared tile data confirmation
191 std::optional<SourceImpactSnapshot> pending_shared_confirmation_;
192 int shared_tile_data_usage_override_ = -1; // Test seam; production keeps -1.
194 int16_t object_id = -1;
196 uint64_t rom_revision = 0;
197
198 bool operator==(const SourceImpactDisplayCacheKey&) const = default;
199 };
200 std::optional<SourceImpactDisplayCacheKey> source_impact_display_cache_key_;
201 std::optional<absl::StatusOr<int>> source_impact_display_cache_result_;
204
207
208 // Context
212 int16_t current_object_id_ = -1;
215 bool is_open_ = false;
216};
217
218} // namespace editor
219} // namespace yaze
220
221#endif // YAZE_APP_EDITOR_DUNGEON_PANELS_OBJECT_TILE_EDITOR_PANEL_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
Panel for editing the tile8 composition of dungeon objects.
void SetStandardWritePreflightCallback(StandardWritePreflightCallback callback)
absl::StatusOr< SourceImpactSnapshot > AnalyzeSourceImpactSnapshot() const
void ApplyChanges(bool confirm_shared=true)
void SetCurrentPaletteGroup(const gfx::PaletteGroup &group)
absl::Status AppendCustomCell(int rel_x, int rel_y, gfx::TileInfo tile_info)
void SetCurrentPaletteGroupForRoom(int room_id, const gfx::PaletteGroup &group)
absl::Status OpenForCustomObject(int16_t object_id, int subtype, int room_id, DungeonRoomStore *rooms)
int GetPriority() const override
Get display priority for menu ordering.
ObjectTileEditorPanel(gfx::IRenderer *renderer, Rom *rom)
float GetPreferredHeight() const override
Get preferred height for this panel (optional)
std::unique_ptr< zelda3::ObjectTileEditor > tile_editor_
std::optional< CustomLayoutBaseline > custom_baseline_
void OnClose() override
Called when panel is hidden.
void SetTilesAppliedCallback(TilesAppliedCallback callback)
absl::StatusOr< bool > HasSharedTileDataConflict() const
absl::Status AddCustomTileAt(int rel_x, int rel_y)
std::optional< SourceImpactDisplayCacheKey > source_impact_display_cache_key_
float GetPreferredWidth() const override
Get preferred width for this panel (optional)
std::string GetDisplayName() const override
Human-readable name shown in menus and title bars.
std::string GetEditorCategory() const override
Editor category this panel belongs to.
StandardWritePreflightCallback standard_write_preflight_
absl::Status MoveSelectedCustomTileTo(int rel_x, int rel_y)
absl::Status OpenForObject(int16_t object_id, int room_id, DungeonRoomStore *rooms)
std::string GetIcon() const override
Material Design icon for this panel.
std::optional< absl::StatusOr< int > > source_impact_display_cache_result_
void Draw(bool *p_open) override
Draw the panel content.
std::function< absl::Status( const std::vector< std::pair< uint32_t, uint32_t > > &)> StandardWritePreflightCallback
absl::StatusOr< int > GetDisplayedSharedTileDataUsageCount()
std::string GetId() const override
Unique identifier for this panel.
void SetActionStatus(ActionStatusTone tone, std::string message)
std::string GetWorkflowGroup() const override
Optional workflow group for hack-centric actions.
absl::StatusOr< int > GetSharedTileDataUsageCount() const
std::optional< SourceImpactSnapshot > pending_shared_confirmation_
Base interface for all logical window content components.
Represents a bitmap image optimized for SNES ROM hacking.
Definition bitmap.h:70
Defines an abstract interface for all rendering operations.
Definition irenderer.h:60
SNES 16-bit tile metadata container.
Definition snes_tile.h:52
Modern, robust canvas for drawing and manipulating graphics.
Definition canvas.h:64
#define ICON_MD_GRID_ON
Definition icons.h:896
bool operator==(const SourceImpactDisplayCacheKey &) const =default
bool operator==(const SourceImpactSnapshot &) const =default
Represents a group of palettes.
Editable tile8 layout captured from an object's draw trace.