yaze 0.3.2
Link to the Past ROM Editor
 
Loading...
Searching...
No Matches
sprite_editor.h
Go to the documentation of this file.
1#ifndef YAZE_APP_EDITOR_SPRITE_EDITOR_H
2#define YAZE_APP_EDITOR_SPRITE_EDITOR_H
3
4#include <cstdint>
5#include <map>
6#include <optional>
7#include <string>
8#include <vector>
9
10#include "absl/status/status.h"
11#include "app/editor/editor.h"
16#include "app/gfx/core/bitmap.h"
19#include "rom/rom.h"
24
25namespace yaze {
26namespace editor {
27
28constexpr ImGuiTabItemFlags kSpriteTabFlags =
29 ImGuiTabItemFlags_Trailing | ImGuiTabItemFlags_NoTooltip;
30
31constexpr ImGuiTabBarFlags kSpriteTabBarFlags =
32 ImGuiTabBarFlags_AutoSelectNewTabs | ImGuiTabBarFlags_Reorderable |
33 ImGuiTabBarFlags_FittingPolicyResizeDown |
34 ImGuiTabBarFlags_TabListPopupButton;
35
36constexpr ImGuiTableFlags kSpriteTableFlags =
37 ImGuiTableFlags_Resizable | ImGuiTableFlags_Reorderable |
38 ImGuiTableFlags_Hideable | ImGuiTableFlags_BordersOuter |
39 ImGuiTableFlags_BordersV;
40
49class SpriteEditor : public Editor {
52
53 public:
54 explicit SpriteEditor(Rom* rom = nullptr) : rom_(rom) {
56 }
57
58 void Initialize() override;
59 absl::Status Load() override;
60 absl::Status Update() override;
61 absl::Status Undo() override { return undo_manager_.Undo(); }
62 absl::Status Redo() override { return undo_manager_.Redo(); }
63 absl::Status Cut() override;
64 absl::Status Copy() override;
65 absl::Status Paste() override;
66 absl::Status Find() override { return absl::UnimplementedError("Find"); }
67 absl::Status Save() override;
68
69 void SetDependencies(const EditorDependencies& deps) override;
70 // Catalog failures are panel-local and never block unrelated editor loading.
71 absl::Status ReloadSpriteCatalog();
72 absl::Status OpenCatalogSource(const zelda3::SpriteSourceBinding& binding);
73 const std::optional<zelda3::SpriteCatalog>& sprite_catalog() const {
74 return sprite_catalog_;
75 }
76 const std::optional<zelda3::SpriteSourceDocument>& catalog_source() const {
77 return catalog_source_;
78 }
79
80 absl::Status ImportCatalogDraw(const zelda3::SpriteSourceBinding& binding,
81 const std::string& catalog_key = "");
82 absl::Status OpenSpriteAsset(const std::string& path);
83 absl::Status SaveSpriteAsset(const std::string& path);
84 absl::Status ReloadProjectSpriteAssets();
85 absl::Status CheckCurrentSpriteSource();
86 absl::StatusOr<std::string> ExportCurrentSpriteDraw();
87 absl::Status SetSpriteBehavior(const project::SpriteBehavior& behavior);
88 absl::Status BindOracleBehaviorProfile();
89 absl::StatusOr<std::string> ExportCurrentSpriteBehavior(
90 const std::string& prefix);
91 absl::Status SetSpriteGraphics(
92 const std::array<uint8_t, 8>& sheets,
93 const std::array<project::SpritePaletteBinding, 8>& rows);
95
97 return current_custom_sprite_index_ >= 0 &&
99 static_cast<int>(custom_sprites_.size())
101 : nullptr;
102 }
103
104 void set_rom(Rom* rom) { rom_ = rom; }
105 Rom* rom() const { return rom_; }
106
107 private:
108 std::optional<zsprite::Frame> frame_clipboard_;
113 char behavior_prefix_[65] = "Sprite_CustomBehavior";
115 absl::Status behavior_status_;
117 std::vector<project::SpriteAssetBinding> custom_sprite_bindings_;
118 absl::Status asset_load_status_;
122 bool source_checked_ = false;
123 void DrawSpriteCatalog();
125 std::optional<zelda3::SpriteCatalog> sprite_catalog_;
126 std::optional<zelda3::SpriteSourceDocument> catalog_source_;
127 absl::Status catalog_status_;
131 std::string catalog_path_;
135 ImGuiTextFilter catalog_filter_;
137
138 // ============================================================
139 // Editor-Level Methods
140 // ============================================================
142
143 // ============================================================
144 // Vanilla Sprite Editor Methods
145 // ============================================================
146 void SelectVanillaSprite(int sprite_id);
149 void DrawSpritesList();
150 void DrawSpriteCanvas();
151 void DrawCurrentSheets();
152 void DrawToolset();
153
154 // ============================================================
155 // Custom ZSM Sprite Editor Methods
156 // ============================================================
157 void DrawCustomSprites();
159
160 // File operations
161 void CreateNewZSprite();
162 void LoadZsmFile(const std::string& path);
163 void SaveZsmFile(const std::string& path);
164 void SaveZsmFileAs();
166 const std::string& GetCurrentZsmPath() const;
167 void SetCurrentZsmPath(const std::string& path);
168
169 // Properties panel
172 void DrawStatProperties();
173
174 // Animation panel
175 void DrawAnimationPanel();
177 void DrawFrameEditor();
178 void UpdateAnimationPlayback(float delta_time);
179
180 // User routines panel
182
183 // Canvas rendering
184 void RenderZSpriteFrame(int frame_index);
185 void DrawZSpriteOnCanvas();
186
187 // Graphics pipeline
188 void RefreshSpritePreviewGraphics(bool use_asset_binding);
190 void LoadSpritePalettes(bool use_asset_binding = true);
192
193 // ============================================================
194 // Undo/Redo Helpers
195 // ============================================================
197 void RestoreFromSnapshot(const SpriteSnapshot& snapshot);
200 void MarkSpriteMutated();
201
202 // ============================================================
203 // Vanilla Sprite State
204 // ============================================================
205 ImVector<int> active_sprites_;
208 uint8_t current_sheets_[8] = {0x73, 0x74, 0x79, 0x7A, 0x73, 0x73, 0x73, 0x73};
209 bool sheets_loaded_ = false;
210
211 // OAM Configuration for vanilla sprites
212 struct OAMConfig {
213 uint16_t x = 0;
214 uint16_t y = 0;
215 uint8_t tile = 0;
216 uint8_t palette = 0;
217 uint8_t priority = 0;
218 bool flip_x = false;
219 bool flip_y = false;
220 };
225
226 // ============================================================
227 // Custom ZSM Sprite State
228 // ============================================================
229 std::vector<zsprite::ZSprite> custom_sprites_;
230 std::vector<std::string> custom_sprite_paths_;
232 bool zsm_dirty_ = false;
233
234 // Animation playback state
235 bool animation_playing_ = false;
238 float frame_timer_ = 0.0f;
239 float last_frame_time_ = 0.0f;
240
241 // UI state
244 bool show_tile_grid_ = true;
245
246 // Sprite preview bitmap (rendered from OAM tiles)
249
250 // ============================================================
251 // Graphics Pipeline State
252 // ============================================================
254 std::vector<uint8_t> sprite_gfx_buffer_; // 8BPP combined sheets buffer
255 gfx::PaletteGroup sprite_palettes_; // Loaded sprite palettes
256 bool gfx_buffer_loaded_ = false;
258 std::array<uint8_t, 8> loaded_preview_sheets_{};
259 std::array<uint64_t, 8> loaded_preview_revisions_{};
261
262 // ============================================================
263 // Spriteset-aware preview
264 // ============================================================
265 // Slots 0-3 take the static sprite sheets and slots 4-7 a spriteset's
266 // values + 0x73, as the game loads them (zelda3/sprite/sprite_sheet_slots).
267 void DrawSpritesetPicker();
268 void ApplySpritesetToSheets(int spriteset);
270 absl::Status OpenSelectedOamGraphics();
273 uint16_t preview_room_ = 0;
275 std::optional<gfx::PaletteGroup> room_palette_cache_;
277 std::optional<std::map<int, zelda3::OverworldAreaGfxInfo>> usage_areas_;
278 std::optional<std::map<int, zelda3::RoomGfxInfo>> usage_rooms_;
279 const Rom* usage_rom_ = nullptr;
280 std::string tile_check_key_;
281 std::vector<zelda3::SpriteTileIssue> tile_issues_;
283
284 // ============================================================
285 // Canvas
286 // ============================================================
287 gui::Canvas sprite_canvas_{"SpriteCanvas", ImVec2(0x200, 0x200),
289
290 gui::Canvas graphics_sheet_canvas_{"GraphicsSheetCanvas",
291 ImVec2(0x80 * 2 + 2, 0x40 * 8 + 2),
293
294 // ============================================================
295 // Undo State
296 // ============================================================
300
301 // ============================================================
302 // Common State
303 // ============================================================
304 absl::Status status_;
306};
307
308} // namespace editor
309} // namespace yaze
310
311#endif // YAZE_APP_EDITOR_SPRITE_EDITOR_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
Interface for editor classes.
Definition editor.h:249
UndoManager undo_manager_
Definition editor.h:371
EditorType type_
Definition editor.h:369
Draws sprite OAM tiles to bitmaps for preview rendering.
Allows the user to edit sprites.
absl::Status SetSpriteBehavior(const project::SpriteBehavior &behavior)
friend struct SpriteEditorPreviewTestPeer
ImVector< int > active_sprites_
absl::Status Find() override
absl::Status OpenSpriteAsset(const std::string &path)
void UpdateAnimationPlayback(float delta_time)
const std::optional< zelda3::SpriteCatalog > & sprite_catalog() const
std::vector< project::SpriteAssetBinding > custom_sprite_bindings_
std::vector< zelda3::SpriteTileIssue > tile_issues_
absl::Status OpenSelectedOamGraphics()
std::optional< zelda3::SpriteSourceDocument > catalog_source_
std::optional< zelda3::SpriteCatalog > sprite_catalog_
void ApplySpritesetToSheets(int spriteset)
const zsprite::ZSprite * current_custom_sprite() const
void RefreshSpritePreviewGraphics(bool use_asset_binding)
std::array< uint64_t, 8 > loaded_preview_revisions_
void RenderZSpriteFrame(int frame_index)
absl::Status Paste() override
std::array< uint8_t, 8 > loaded_preview_sheets_
absl::StatusOr< std::string > ExportCurrentSpriteDraw()
void LoadSpritePalettes(bool use_asset_binding=true)
std::optional< zsprite::Frame > frame_clipboard_
absl::Status Update() override
gfx::PaletteGroup sprite_palettes_
void LoadZsmFile(const std::string &path)
absl::Status Redo() override
absl::Status Cut() override
absl::Status ImportCatalogDraw(const zelda3::SpriteSourceBinding &binding, const std::string &catalog_key="")
absl::StatusOr< std::string > ExportCurrentSpriteBehavior(const std::string &prefix)
absl::Status Undo() override
void RenderVanillaSprite(const zelda3::SpriteOamLayout &layout)
absl::Status palette_binding_status_
std::optional< std::map< int, zelda3::RoomGfxInfo > > usage_rooms_
const std::string & GetCurrentZsmPath() const
absl::Status SaveSpriteAsset(const std::string &path)
void RestoreFromSnapshot(const SpriteSnapshot &snapshot)
std::vector< zsprite::ZSprite > custom_sprites_
std::vector< uint8_t > sprite_gfx_buffer_
const std::optional< zelda3::SpriteSourceDocument > & catalog_source() const
const project::SpriteAssetBinding * current_sprite_binding() const
void SetCurrentZsmPath(const std::string &path)
absl::Status Copy() override
void SetDependencies(const EditorDependencies &deps) override
const zelda3::GameData * preview_graphics_owner_
absl::Status Save() override
std::optional< std::map< int, zelda3::OverworldAreaGfxInfo > > usage_areas_
friend class AuthoringSaveWorkflowTestPeer
SpriteSnapshot undo_before_snapshot_
void SaveZsmFile(const std::string &path)
absl::Status catalog_source_status_
SpriteSnapshot CaptureCurrentSpriteSnapshot() const
absl::Status graphics_binding_status_
absl::Status graphics_context_status_
const project::YazeProject * catalog_project_
std::optional< gfx::PaletteGroup > room_palette_cache_
absl::Status OpenCatalogSource(const zelda3::SpriteSourceBinding &binding)
absl::Status Load() override
ImGuiTextFilter catalog_filter_
std::vector< std::string > custom_sprite_paths_
void SelectVanillaSprite(int sprite_id)
SpriteEditor(Rom *rom=nullptr)
const zelda3::SpriteOamLayout * CurrentPreviewLayout() const
absl::Status SetSpriteGraphics(const std::array< uint8_t, 8 > &sheets, const std::array< project::SpritePaletteBinding, 8 > &rows)
absl::Status Redo()
Redo the top action. Returns error if stack is empty.
absl::Status Undo()
Undo the top action. Returns error if stack is empty.
Represents a bitmap image optimized for SNES ROM hacking.
Definition bitmap.h:70
Modern, robust canvas for drawing and manipulating graphics.
Definition canvas.h:64
Which graphics sheets exist, which tables use them, and which 16x16 blocks are free.
constexpr ImGuiTableFlags kSpriteTableFlags
constexpr ImGuiTabItemFlags kSpriteTabFlags
constexpr ImGuiTabBarFlags kSpriteTabBarFlags
Which graphics sheets back sprite OAM tiles 0x000-0x1FF.
Unified dependency container for all editor types.
Definition editor.h:170
Snapshot of a custom ZSprite's editable state for undo/redo.
Represents a group of palettes.
Modern project structure with comprehensive settings consolidation.
Definition project.h:287
Complete OAM layout for a vanilla sprite.