yaze 0.3.2
Link to the Past ROM Editor
 
Loading...
Searching...
No Matches
dungeon_rendering_helpers.h
Go to the documentation of this file.
1#ifndef YAZE_APP_EDITOR_DUNGEON_DUNGEON_RENDERING_HELPERS_H
2#define YAZE_APP_EDITOR_DUNGEON_DUNGEON_RENDERING_HELPERS_H
3
4#include <algorithm>
5#include <cstdint>
6#include <utility>
7#include <vector>
8
9#include "imgui/imgui.h"
10
11#include <SDL.h>
12#include <array>
13#include <bitset>
14
15namespace yaze::zelda3 {
16class Room;
17struct SpriteOamLayout;
18} // namespace yaze::zelda3
19
20namespace yaze::editor {
21
22enum class TrackDir : uint8_t { North, East, South, West };
23
24constexpr uint8_t kTrackDirNorth = 1 << 0;
25constexpr uint8_t kTrackDirEast = 1 << 1;
26constexpr uint8_t kTrackDirSouth = 1 << 2;
27constexpr uint8_t kTrackDirWest = 1 << 3;
28
30 uint8_t primary = 0;
31 uint8_t secondary = 0;
32};
33
35 public:
39 uint8_t tile, const std::vector<uint16_t>& track_tiles,
40 const std::vector<uint16_t>& track_switches);
41
42 static void DrawTrackArrowHead(ImDrawList* draw_list, const ImVec2& tip,
43 TrackDir dir, float size, ImU32 color);
44 static void DrawTrackDirectionMask(ImDrawList* draw_list, const ImVec2& min,
45 float tile_size, uint8_t mask,
46 ImU32 color);
47
48 static std::pair<int, int> RoomToCanvasCoordinates(int room_x, int room_y);
49
50 // Index 0 is the transparent pixel in sprite previews; BackgroundBuffer
51 // pixels (door previews) use 255 instead and treat index 0 as visible.
52 static constexpr uint8_t kSpritePreviewTransparentIndex = 0;
53 static constexpr uint8_t kBackgroundBufferTransparentIndex = 255;
54
55 // Draws a sprite preview into any ImGui draw list within the given bounding box.
56 static bool DrawSpritePreview(
57 ImDrawList* draw_list, const std::vector<uint8_t>& preview,
58 const SDL_Rect& bounds, const ImVec2& box_min, const ImVec2& box_max,
59 const std::array<SDL_Color, 256>& color_table,
60 uint8_t transparent_index = kSpritePreviewTransparentIndex);
61
62 // Maps a pot item ID (0..27) to its sprite OAM layout and sprite ID, if one exists.
64 uint8_t item_id, uint8_t* out_sprite_id = nullptr);
65
66 // Generates rendered sprite pixels and bounds for a pot item in the context of room gfx.
67 static bool BuildPotItemPreview(uint8_t item_id, const zelda3::Room& room,
68 std::vector<uint8_t>& out_pixels,
69 SDL_Rect& out_bounds);
70
71 // Overlay rendering structures
73 std::array<bool, 256> track_tiles{};
74 std::array<bool, 256> stop_tiles{};
75 std::array<bool, 256> switch_tiles{};
76
77 bool IsEmpty() const {
78 for (int i = 0; i < 256; ++i) {
79 if (track_tiles[i] || stop_tiles[i] || switch_tiles[i])
80 return false;
81 }
82 return true;
83 }
84 };
85
87 uint8_t x, y, tile;
88 };
89
91 bool has_data = false;
92 std::vector<CollisionOverlayEntry> entries;
93 };
94
95 // Overlay rendering methods
96 static void DrawTrackCollisionOverlay(
97 ImDrawList* draw_list, const ImVec2& canvas_pos, float scale,
98 const CollisionOverlayCache& cache, const TrackCollisionConfig& config,
99 bool direction_map_enabled, const std::vector<uint16_t>& track_tile_order,
100 const std::vector<uint16_t>& switch_tile_order, bool show_legend);
101
102 static void DrawCustomCollisionOverlay(ImDrawList* draw_list,
103 const ImVec2& canvas_pos, float scale,
104 const zelda3::Room& room);
105
106 static void DrawWaterFillOverlay(ImDrawList* draw_list,
107 const ImVec2& canvas_pos, float scale,
108 const zelda3::Room& room);
109
110 static void DrawCameraQuadrantOverlay(ImDrawList* draw_list,
111 const ImVec2& canvas_pos, float scale,
112 const zelda3::Room& room);
113
114 static void DrawMinecartSpriteOverlay(
115 ImDrawList* draw_list, const ImVec2& canvas_pos, float scale,
116 const zelda3::Room& room, const std::bitset<256>& minecart_sprite_ids,
117 const TrackCollisionConfig& config);
118
119 static void DrawTrackGapOverlay(ImDrawList* draw_list,
120 const ImVec2& canvas_pos, float scale,
121 const zelda3::Room& room,
122 const CollisionOverlayCache& cache);
123
124 static void DrawTrackRouteOverlay(ImDrawList* draw_list,
125 const ImVec2& canvas_pos, float scale,
126 const CollisionOverlayCache& cache);
127};
128
129} // namespace yaze::editor
130
131#endif // YAZE_APP_EDITOR_DUNGEON_DUNGEON_RENDERING_HELPERS_H
static void DrawCustomCollisionOverlay(ImDrawList *draw_list, const ImVec2 &canvas_pos, float scale, const zelda3::Room &room)
static void DrawTrackGapOverlay(ImDrawList *draw_list, const ImVec2 &canvas_pos, float scale, const zelda3::Room &room, const CollisionOverlayCache &cache)
static constexpr uint8_t kSpritePreviewTransparentIndex
static void DrawTrackCollisionOverlay(ImDrawList *draw_list, const ImVec2 &canvas_pos, float scale, const CollisionOverlayCache &cache, const TrackCollisionConfig &config, bool direction_map_enabled, const std::vector< uint16_t > &track_tile_order, const std::vector< uint16_t > &switch_tile_order, bool show_legend)
static void DrawCameraQuadrantOverlay(ImDrawList *draw_list, const ImVec2 &canvas_pos, float scale, const zelda3::Room &room)
static std::pair< int, int > RoomToCanvasCoordinates(int room_x, int room_y)
static void DrawTrackRouteOverlay(ImDrawList *draw_list, const ImVec2 &canvas_pos, float scale, const CollisionOverlayCache &cache)
static TrackDirectionMasks GetTrackDirectionMasksForTrackIndex(size_t index)
static void DrawMinecartSpriteOverlay(ImDrawList *draw_list, const ImVec2 &canvas_pos, float scale, const zelda3::Room &room, const std::bitset< 256 > &minecart_sprite_ids, const TrackCollisionConfig &config)
static TrackDirectionMasks GetTrackDirectionMasksForSwitchIndex(size_t index)
static void DrawWaterFillOverlay(ImDrawList *draw_list, const ImVec2 &canvas_pos, float scale, const zelda3::Room &room)
static constexpr uint8_t kBackgroundBufferTransparentIndex
static void DrawTrackDirectionMask(ImDrawList *draw_list, const ImVec2 &min, float tile_size, uint8_t mask, ImU32 color)
static bool BuildPotItemPreview(uint8_t item_id, const zelda3::Room &room, std::vector< uint8_t > &out_pixels, SDL_Rect &out_bounds)
static void DrawTrackArrowHead(ImDrawList *draw_list, const ImVec2 &tip, TrackDir dir, float size, ImU32 color)
static TrackDirectionMasks GetTrackDirectionMasksFromConfig(uint8_t tile, const std::vector< uint16_t > &track_tiles, const std::vector< uint16_t > &track_switches)
static bool DrawSpritePreview(ImDrawList *draw_list, const std::vector< uint8_t > &preview, const SDL_Rect &bounds, const ImVec2 &box_min, const ImVec2 &box_max, const std::array< SDL_Color, 256 > &color_table, uint8_t transparent_index=kSpritePreviewTransparentIndex)
static const zelda3::SpriteOamLayout * GetPotItemSpriteLayout(uint8_t item_id, uint8_t *out_sprite_id=nullptr)
Editors are the view controllers for the application.
constexpr uint8_t kTrackDirSouth
constexpr uint8_t kTrackDirEast
constexpr uint8_t kTrackDirNorth
constexpr uint8_t kTrackDirWest
Zelda 3 specific classes and functions.
Complete OAM layout for a vanilla sprite.