yaze 0.3.2
Link to the Past ROM Editor
 
Loading...
Searching...
No Matches
dungeon_canvas_viewer.h
Go to the documentation of this file.
1#ifndef YAZE_APP_EDITOR_DUNGEON_DUNGEON_CANVAS_VIEWER_H
2#define YAZE_APP_EDITOR_DUNGEON_DUNGEON_CANVAS_VIEWER_H
3
4#include <functional>
5#include <map>
6
7#include "app/editor/editor.h"
12#include "imgui/imgui.h"
13#include "rom/rom.h"
15#include "zelda3/dungeon/room.h"
17#include "zelda3/game_data.h"
18
19namespace yaze {
20namespace editor {
21
25enum class ObjectRenderMode {
26 Manual, // Use ObjectDrawer routines
27 Emulator, // Use SNES emulator
28 Hybrid // Emulator with manual fallback
29};
30
32 public:
37
38 void DrawDungeonCanvas(int room_id);
39 void Draw(int room_id);
40
42 rom_ = ctx.rom;
45 }
46 EditorContext context() const { return {rom_, game_data_}; }
47 void SetRom(Rom* rom) {
48 rom_ = rom;
50 }
51 Rom* rom() const { return rom_; }
54 void SetRenderer(gfx::IRenderer* renderer) { renderer_ = renderer; }
55
56 // Room data access
57 void SetRooms(std::array<zelda3::Room, 0x128>* rooms) { rooms_ = rooms; }
58 bool HasRooms() const { return rooms_ != nullptr; }
59 // Used by overworld editor when double-clicking entrances
60 void set_active_rooms(const ImVector<int>& rooms) { active_rooms_ = rooms; }
62
63 // Palette access
67 void SetCurrentPaletteId(uint64_t id) { current_palette_id_ = id; }
71 void SetRoomNavigationCallback(std::function<void(int)> callback) {
72 room_navigation_callback_ = std::move(callback);
73 }
74 // Callback to swap the current room in-place (for arrow navigation)
75 void SetRoomSwapCallback(std::function<void(int, int)> callback) {
76 room_swap_callback_ = std::move(callback);
77 }
78 void SetShowObjectPanelCallback(std::function<void()> callback) {
79 show_object_panel_callback_ = std::move(callback);
80 }
81 void SetShowSpritePanelCallback(std::function<void()> callback) {
82 show_sprite_panel_callback_ = std::move(callback);
83 }
84 void SetShowItemPanelCallback(std::function<void()> callback) {
85 show_item_panel_callback_ = std::move(callback);
86 }
87
88 // Canvas access
89 gui::Canvas& canvas() { return canvas_; }
90 const gui::Canvas& canvas() const { return canvas_; }
91
92 // Object interaction access
94
98
99 // Enable/disable object interaction mode
100 void SetObjectInteractionEnabled(bool enabled) {
102 }
106
107 // Set and get the object render mode
112
113 // Layer visibility controls (per-room) using RoomLayerManager
114 void SetLayerVisible(int room_id, zelda3::LayerType layer, bool visible) {
115 GetRoomLayerManager(room_id).SetLayerVisible(layer, visible);
116 }
117 bool IsLayerVisible(int room_id, zelda3::LayerType layer) const {
118 auto it = room_layer_managers_.find(room_id);
119 return it != room_layer_managers_.end() ? it->second.IsLayerVisible(layer)
120 : true;
121 }
122
123 // Legacy compatibility - BG1 visibility (combines layout + objects)
124 void SetBG1Visible(int room_id, bool visible) {
125 auto& mgr = GetRoomLayerManager(room_id);
126 mgr.SetLayerVisible(zelda3::LayerType::BG1_Layout, visible);
127 mgr.SetLayerVisible(zelda3::LayerType::BG1_Objects, visible);
128 }
129 void SetBG2Visible(int room_id, bool visible) {
130 auto& mgr = GetRoomLayerManager(room_id);
131 mgr.SetLayerVisible(zelda3::LayerType::BG2_Layout, visible);
132 mgr.SetLayerVisible(zelda3::LayerType::BG2_Objects, visible);
133 }
134 bool IsBG1Visible(int room_id) const {
135 auto it = room_layer_managers_.find(room_id);
136 if (it == room_layer_managers_.end()) return true;
137 return it->second.IsLayerVisible(zelda3::LayerType::BG1_Layout) ||
138 it->second.IsLayerVisible(zelda3::LayerType::BG1_Objects);
139 }
140 bool IsBG2Visible(int room_id) const {
141 auto it = room_layer_managers_.find(room_id);
142 if (it == room_layer_managers_.end()) return true;
143 return it->second.IsLayerVisible(zelda3::LayerType::BG2_Layout) ||
144 it->second.IsLayerVisible(zelda3::LayerType::BG2_Objects);
145 }
146
147 // Layer blend mode controls
148 void SetLayerBlendMode(int room_id, zelda3::LayerType layer,
150 GetRoomLayerManager(room_id).SetLayerBlendMode(layer, mode);
151 }
153 zelda3::LayerType layer) const {
154 auto it = room_layer_managers_.find(room_id);
155 return it != room_layer_managers_.end()
156 ? it->second.GetLayerBlendMode(layer)
158 }
159
160 // Per-object translucency
161 void SetObjectTranslucent(int room_id, size_t object_index, bool translucent,
162 uint8_t alpha = 128) {
163 GetRoomLayerManager(room_id).SetObjectTranslucency(object_index, translucent,
164 alpha);
165 }
166
167 // Layer manager access
169 return room_layer_managers_[room_id];
170 }
172 static zelda3::RoomLayerManager default_manager;
173 auto it = room_layer_managers_.find(room_id);
174 return it != room_layer_managers_.end() ? it->second : default_manager;
175 }
176
177 // Legacy BG2 layer type (mapped to blend mode)
178 void SetBG2LayerType(int room_id, int type) {
179 auto& mgr = GetRoomLayerManager(room_id);
181 switch (type) {
182 case 0:
184 break;
185 case 1:
187 break;
188 case 2:
190 break;
191 case 3:
193 break;
194 case 4:
196 break;
197 default:
199 break;
200 }
201 mgr.SetLayerBlendMode(zelda3::LayerType::BG2_Layout, mode);
202 mgr.SetLayerBlendMode(zelda3::LayerType::BG2_Objects, mode);
203 }
204 int GetBG2LayerType(int room_id) const {
206 switch (mode) {
208 return 0;
210 return 1;
212 return 2;
214 return 3;
216 return 4;
217 }
218 return 0;
219 }
220
221 // Set the object to be placed
223 // Pass palette group first so ghost preview can render correctly
226 }
229 false);
230 }
231
232 // Object manipulation
234
235 // Entity visibility controls
236 void SetSpritesVisible(bool visible) { entity_visibility_.show_sprites = visible; }
238 void SetPotItemsVisible(bool visible) { entity_visibility_.show_pot_items = visible; }
240
241 private:
243 const zelda3::RoomObject& object, int canvas_x,
244 int canvas_y);
245 void RenderSprites(const gui::CanvasRuntime& rt, const zelda3::Room& room);
246 void RenderPotItems(const gui::CanvasRuntime& rt, const zelda3::Room& room);
248 const zelda3::Room& room);
249
250 // Coordinate conversion helpers
251 std::pair<int, int> RoomToCanvasCoordinates(int room_x, int room_y) const;
252 std::pair<int, int> CanvasToRoomCoordinates(int canvas_x, int canvas_y) const;
253 bool IsWithinCanvasBounds(int canvas_x, int canvas_y, int margin = 32) const;
254
255 // Visualization
257 const zelda3::Room& room);
258
259 // Draw semi-transparent overlay on BG2/Layer 1 objects when mask mode is active
261 const zelda3::Room& room);
262
263 // Room graphics management
264 // Load: Read from ROM, Render: Process pixels, Draw: Display on canvas
265 absl::Status LoadAndRenderRoomGraphics(int room_id);
266 void DrawRoomBackgroundLayers(int room_id); // Draw room buffers to canvas
267
268 Rom* rom_ = nullptr;
270 gui::Canvas canvas_{"##DungeonCanvas", ImVec2(0x200, 0x200)};
271 // ObjectRenderer removed - use ObjectDrawer for rendering (production system)
273
274 // Scroll target
275 std::optional<std::pair<int, int>> pending_scroll_target_;
276
277 // Room data
278 std::array<zelda3::Room, 0x128>* rooms_ = nullptr;
279 // Used by overworld editor for double-click entrance → open dungeon room
280 ImVector<int> active_rooms_;
282
283 // Object interaction state
285
286 // Per-room layer managers (4-way visibility, blend modes, per-object translucency)
287 std::map<int, zelda3::RoomLayerManager> room_layer_managers_;
288
289 // Palette data
293 std::function<void(int)> room_navigation_callback_;
294 std::function<void(int, int)> room_swap_callback_; // (old_room_id, new_room_id)
295 std::function<void()> show_object_panel_callback_;
296 std::function<void()> show_sprite_panel_callback_;
297 std::function<void()> show_item_panel_callback_;
298
299 // Object rendering cache
307 std::vector<ObjectRenderCache> object_render_cache_;
308 uint64_t last_palette_hash_ = 0;
309
310 // Debug state flags
314 bool show_layer_info_ = false;
315 bool show_grid_ = false; // Grid off by default for dungeon editor
316 bool show_coordinate_overlay_ = true; // Show camera coordinates on hover
317 int layout_override_ = -1; // -1 for no override
320 ObjectRenderMode::Emulator; // Default to emulator rendering
321
322 // Object outline filtering toggles
324 bool show_type1_objects = true; // Standard objects (0x00-0xFF)
325 bool show_type2_objects = true; // Extended objects (0x100-0x1FF)
326 bool show_type3_objects = true; // Special objects (0xF00-0xFFF)
327 bool show_layer0_objects = true; // Layer 0 (BG1)
328 bool show_layer1_objects = true; // Layer 1 (BG2)
329 bool show_layer2_objects = true; // Layer 2 (BG3)
330 };
332
333 // Entity overlay visibility toggles
335 bool show_sprites = true; // Show sprite entities
336 bool show_pot_items = true; // Show pot item entities
337 bool show_chests = true; // Show chest entities (future)
338 };
340
342
343 // Previous room state for change detection (per-viewer)
346 int prev_layout_ = -1;
348};
349
350} // namespace editor
351} // namespace yaze
352
353#endif
The Rom class is used to load, save, and modify Rom data. This is a generic SNES ROM container and do...
Definition rom.h:24
std::pair< int, int > CanvasToRoomCoordinates(int canvas_x, int canvas_y) const
const zelda3::RoomLayerManager & GetRoomLayerManager(int room_id) const
std::pair< int, int > RoomToCanvasCoordinates(int room_x, int room_y) const
std::optional< std::pair< int, int > > pending_scroll_target_
void SetLayerBlendMode(int room_id, zelda3::LayerType layer, zelda3::LayerBlendMode mode)
void SetEditorSystem(zelda3::DungeonEditorSystem *system)
std::array< zelda3::Room, 0x128 > * rooms_
void RenderPotItems(const gui::CanvasRuntime &rt, const zelda3::Room &room)
absl::Status LoadAndRenderRoomGraphics(int room_id)
void SetObjectTranslucent(int room_id, size_t object_index, bool translucent, uint8_t alpha=128)
void SetShowItemPanelCallback(std::function< void()> callback)
void set_active_rooms(const ImVector< int > &rooms)
void SetRenderer(gfx::IRenderer *renderer)
void SetBG2LayerType(int room_id, int type)
zelda3::GameData * game_data() const
void SetCurrentPaletteGroup(const gfx::PaletteGroup &group)
DungeonObjectInteraction object_interaction_
void SetObjectRenderMode(ObjectRenderMode mode)
DungeonObjectInteraction & object_interaction()
void SetRoomNavigationCallback(std::function< void(int)> callback)
void SetShowSpritePanelCallback(std::function< void()> callback)
void SetPreviewObject(const zelda3::RoomObject &object)
std::function< void()> show_object_panel_callback_
void SetBG1Visible(int room_id, bool visible)
void SetBG2Visible(int room_id, bool visible)
bool IsLayerVisible(int room_id, zelda3::LayerType layer) const
void SetShowObjectPanelCallback(std::function< void()> callback)
void RenderSprites(const gui::CanvasRuntime &rt, const zelda3::Room &room)
zelda3::RoomLayerManager & GetRoomLayerManager(int room_id)
ObjectRenderMode GetObjectRenderMode() const
void DrawMaskHighlights(const gui::CanvasRuntime &rt, const zelda3::Room &room)
void SetRoomSwapCallback(std::function< void(int, int)> callback)
bool IsWithinCanvasBounds(int canvas_x, int canvas_y, int margin=32) const
zelda3::LayerBlendMode GetLayerBlendMode(int room_id, zelda3::LayerType layer) const
std::function< void(int)> room_navigation_callback_
void RenderEntityOverlay(const gui::CanvasRuntime &rt, const zelda3::Room &room)
std::function< void()> show_item_panel_callback_
std::map< int, zelda3::RoomLayerManager > room_layer_managers_
std::vector< ObjectRenderCache > object_render_cache_
void DisplayObjectInfo(const gui::CanvasRuntime &rt, const zelda3::RoomObject &object, int canvas_x, int canvas_y)
std::function< void()> show_sprite_panel_callback_
std::function< void(int, int)> room_swap_callback_
void SetLayerVisible(int room_id, zelda3::LayerType layer, bool visible)
void DrawObjectPositionOutlines(const gui::CanvasRuntime &rt, const zelda3::Room &room)
void SetRooms(std::array< zelda3::Room, 0x128 > *rooms)
const gui::Canvas & canvas() const
void SetGameData(zelda3::GameData *game_data)
Handles object selection, placement, and interaction within the dungeon canvas.
void SetCurrentPaletteGroup(const gfx::PaletteGroup &group)
void SetEditorSystem(zelda3::DungeonEditorSystem *system)
void SetPreviewObject(const zelda3::RoomObject &object, bool loaded)
Represents a bitmap image optimized for SNES ROM hacking.
Definition bitmap.h:67
Defines an abstract interface for all rendering operations.
Definition irenderer.h:40
Modern, robust canvas for drawing and manipulating graphics.
Definition canvas.h:150
Comprehensive dungeon editing system.
RoomLayerManager - Manages layer visibility and compositing.
void SetLayerBlendMode(LayerType layer, LayerBlendMode mode)
void SetLayerVisible(LayerType layer, bool visible)
void SetObjectTranslucency(size_t object_index, bool translucent, uint8_t alpha=128)
ObjectRenderMode
Handles the main dungeon canvas rendering and interaction.
LayerBlendMode
Layer blend modes for compositing.
LayerType
Layer types for the 4-way visibility system.
Lightweight view into the essential runtime context (Rom + GameData)
Definition editor.h:67
zelda3::GameData * game_data
Definition editor.h:69
Represents a group of palettes.