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
43 public:
44 using StandardWritePreflightCallback = std::function<absl::Status(
45 const std::vector<std::pair<uint32_t, uint32_t>>&)>;
46 using StandardTilesAppliedCallback = std::function<void()>;
47
49
50 std::string GetId() const override { return "dungeon.object_tile_editor"; }
51 std::string GetDisplayName() const override { return "Object Tile Editor"; }
52 std::string GetIcon() const override { return ICON_MD_GRID_ON; }
53 std::string GetEditorCategory() const override { return "Dungeon"; }
54 int GetPriority() const override { return 65; }
55 float GetPreferredWidth() const override { return 550.0f; }
56 float GetPreferredHeight() const override { return 500.0f; }
57
58 void Draw(bool* p_open) override;
59 void OnClose() override;
60
61 absl::Status OpenForObject(int16_t object_id, int room_id,
62 DungeonRoomStore* rooms);
63 absl::Status OpenForObject(int16_t object_id, int room_id,
64 DungeonRoomStore* rooms,
65 const gfx::PaletteGroup& palette_group);
66 absl::Status OpenForNewObject(int width, int height,
67 const std::string& filename, int16_t object_id,
68 int room_id, DungeonRoomStore* rooms);
69 void Close();
70 bool IsOpen() const { return is_open_; }
71 bool HasUnappliedChanges() const {
73 }
74
76 void SetCurrentPaletteGroupForRoom(int room_id,
77 const gfx::PaletteGroup& group);
78
79 // Callback fired on first successful save of a new object
81 std::function<void(int, const std::string&)> cb) {
82 on_object_created_ = std::move(cb);
83 }
84
89
93
94 private:
95 enum class ActionStatusTone {
96 kNone,
99 kError,
100 };
101
103 void ClearActionStatus();
104 void SetActionStatus(ActionStatusTone tone, std::string message);
105 void ResetTransientState();
106 std::string BuildWindowTitle() const;
110 uint64_t fingerprint = 0;
111
112 bool operator==(const SourceImpactSnapshot&) const = default;
113 };
114 absl::StatusOr<SourceImpactSnapshot> AnalyzeSourceImpactSnapshot() const;
115 absl::StatusOr<int> GetSharedTileDataUsageCount() const;
116 absl::StatusOr<int> GetDisplayedSharedTileDataUsageCount();
117 absl::StatusOr<bool> HasSharedTileDataConflict() const;
119 bool HasRenderableRoomContext() const;
121
122 void DrawTileGrid();
123 void DrawSourceSheet();
124 void DrawTileProperties();
125 void DrawActionBar(bool* p_open);
126 void HandleKeyboardShortcuts(bool* p_open);
127 void RequestSafeWindowClose(bool* p_open);
128
129 void RenderObjectPreview();
130 void RenderTile8Atlas();
132 absl::Status WriteBackCurrentLayout();
133
134 // Apply: write back, re-render room, reset modified flags.
135 // If confirm_shared is true and tile data is shared, opens confirmation modal
136 // instead of applying immediately.
137 void ApplyChanges(bool confirm_shared = true);
138
139 // State
141 std::unique_ptr<zelda3::ObjectTileEditor> tile_editor_;
146
147 // Canvases
148 gui::Canvas tile_grid_canvas_{"##ObjTileGrid", ImVec2(256, 256)};
149 gui::Canvas source_sheet_canvas_{"##ObjTileSource", ImVec2(256, 512)};
150
151 // Bitmaps
154 bool preview_dirty_ = true;
155 bool atlas_dirty_ = true;
156
157 // Shared tile data confirmation
160 std::optional<SourceImpactSnapshot> pending_shared_confirmation_;
161 int shared_tile_data_usage_override_ = -1; // Test seam; production keeps -1.
163 int16_t object_id = -1;
165 uint64_t rom_revision = 0;
166
167 bool operator==(const SourceImpactDisplayCacheKey&) const = default;
168 };
169 std::optional<SourceImpactDisplayCacheKey> source_impact_display_cache_key_;
170 std::optional<absl::StatusOr<int>> source_impact_display_cache_result_;
173
174 // New object creation state
175 bool is_new_object_ = false;
176 std::function<void(int, const std::string&)> on_object_created_;
179
180 // Context
184 int16_t current_object_id_ = -1;
187 bool is_open_ = false;
188};
189
190} // namespace editor
191} // namespace yaze
192
193#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:28
Panel for editing the tile8 composition of dungeon objects.
void SetStandardWritePreflightCallback(StandardWritePreflightCallback callback)
StandardTilesAppliedCallback on_standard_tiles_applied_
absl::StatusOr< SourceImpactSnapshot > AnalyzeSourceImpactSnapshot() const
void ApplyChanges(bool confirm_shared=true)
void SetCurrentPaletteGroup(const gfx::PaletteGroup &group)
void SetCurrentPaletteGroupForRoom(int room_id, const gfx::PaletteGroup &group)
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)
void SetObjectCreatedCallback(std::function< void(int, const std::string &)> cb)
std::unique_ptr< zelda3::ObjectTileEditor > tile_editor_
std::function< void(int, const std::string &) on_object_created_)
void OnClose() override
Called when panel is hidden.
absl::StatusOr< bool > HasSharedTileDataConflict() const
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 OpenForNewObject(int width, int height, const std::string &filename, int16_t object_id, int room_id, DungeonRoomStore *rooms)
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()
void SetStandardTilesAppliedCallback(StandardTilesAppliedCallback callback)
std::string GetId() const override
Unique identifier for this panel.
void SetActionStatus(ActionStatusTone tone, std::string message)
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:67
Defines an abstract interface for all rendering operations.
Definition irenderer.h:60
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.