yaze 0.3.2
Link to the Past ROM Editor
 
Loading...
Searching...
No Matches
dungeon_editor_v2_render_context.cc
Go to the documentation of this file.
2
3#include <chrono>
4#include <memory>
5#include <utility>
6
9#include "core/project.h"
10#include "core/rom_settings.h"
11#include "util/log.h"
14#include "zelda3/dungeon/room.h"
15
16namespace yaze::editor {
17
18std::vector<DungeonRenderEntranceCandidate>
20 std::vector<DungeonRenderEntranceCandidate> candidates;
21 candidates.reserve(entrances_.size());
22 for (int slot = 0; slot < zelda3::kNumDungeonSpawnPoints; ++slot) {
23 const auto& spawn = spawn_points_[slot];
24 if (spawn.spawn_id() != slot) {
25 continue;
26 }
27 candidates.push_back({
28 .slot = slot,
29 .room_id = spawn.room_id,
30 .main_gfx = spawn.main_gfx,
31 });
32 }
33 for (int slot = zelda3::kNumDungeonSpawnPoints;
34 slot < static_cast<int>(entrances_.size()); ++slot) {
35 const auto& entrance = entrances_[slot];
36 candidates.push_back({
37 .slot = slot,
38 .room_id = entrance.room_,
39 .main_gfx = entrance.blockset_,
40 });
41 }
42 return candidates;
43}
44
46 const {
48 return nullptr;
49 }
52 std::chrono::seconds(0)) != std::future_status::ready) {
53 return nullptr;
54 }
58 if (census.ok()) {
59 dungeon_render_context_census_ = std::move(census).value();
61 } else {
64 std::string(census.status().message());
65 LOG_WARN("DungeonEditorV2", "Render-context census failed: %s",
67 }
68 } else {
70 }
71 }
72 if (dungeon_render_context_census_.has_value()) {
74 }
76 return nullptr;
77 }
80 if (rom_ == nullptr || !rom_->is_loaded()) {
81 dungeon_render_context_census_error_ = "ROM is not loaded";
82 return nullptr;
83 }
84 if (dependencies_.project == nullptr ||
86 return nullptr;
87 }
88
89 // Capture while this session owns the runtime context. The worker must not
90 // consult another session's assets or settings after a tab switch/teardown.
91 // Registry construction reads the initial feature mode on this thread.
93 auto custom_objects =
95 core::FeatureFlags::get().kEnableCustomObjects);
96 auto addresses = core::RomSettings::Get().address_overrides();
97 auto rom_copy = std::make_shared<Rom>(*rom_);
98 core::ProjectRegistry project_registry =
105 std::launch::async,
106 [rom_copy, project_registry = std::move(project_registry),
107 manifest = std::move(manifest),
108 custom_objects = std::move(custom_objects),
109 addresses = std::move(addresses),
110 stop_token = dungeon_render_context_census_stop_.get_token()]() mutable {
111 zelda3::RoomCensusOptions options;
112 options.stop_token = stop_token;
113 options.project = &project_registry;
114 options.manifest = &manifest;
115 options.custom_objects = &custom_objects;
116 options.address_overrides = &addresses;
117 return zelda3::ComputeRoomCensus(rom_copy.get(), options);
118 });
119 return nullptr;
120}
121
132
134 int room_id) const {
135 uint8_t room_header_blockset = 0xFF;
136 if (room_id >= 0 && room_id < static_cast<int>(rooms_.size())) {
137 if (const auto* room = rooms_.GetIfMaterialized(room_id)) {
138 room_header_blockset = room->blockset();
139 } else if (rom_ != nullptr && rom_->is_loaded()) {
140 room_header_blockset =
142 }
143 }
144 const auto candidates = BuildDungeonRenderEntranceCandidates();
145 zelda3::RoomDefaultEntrance default_entrance;
146 if (game_data_ != nullptr && room_id >= 0 &&
147 room_id < static_cast<int>(game_data_->room_default_entrances.size())) {
148 default_entrance = game_data_->room_default_entrances[room_id];
149 if (default_entrance.main_blockset >=
151 default_entrance = {};
152 }
153 }
154 const auto* dungeon = dungeon_project_labels::FindDungeonForRoom(
155 dependencies_.project, room_id);
158 room_header_blockset, dungeon ? nullptr : GetDungeonRenderContextCensus(),
159 candidates, default_entrance, dungeon);
160}
161
162} // namespace yaze::editor
bool is_loaded() const
Definition rom.h:187
static Flags & get()
Definition features.h:119
Loads and queries the hack manifest JSON for yaze-ASM integration.
const ProjectRegistry & project_registry() const
bool loaded() const
Check if the manifest has been loaded.
const RomAddressOverrides & address_overrides() const
static RomSettings & Get()
std::optional< zelda3::RoomCensus > dungeon_render_context_census_
DungeonRenderContext ResolveDungeonRenderContextForRoom(int room_id) const
std::array< zelda3::RoomEntrance, zelda3::kNumDungeonEntranceSlots > entrances_
std::vector< DungeonRenderEntranceCandidate > BuildDungeonRenderEntranceCandidates() const
RoomMatrixContent * room_matrix_panel_
std::array< zelda3::DungeonSpawnPoint, zelda3::kNumDungeonSpawnPoints > spawn_points_
const zelda3::RoomCensus * GetDungeonRenderContextCensus() const
std::future< absl::StatusOr< zelda3::RoomCensus > > dungeon_render_context_census_pending_
util::StopSource dungeon_render_context_census_stop_
zelda3::Room * GetIfMaterialized(int room_id)
EditorDependencies dependencies_
Definition editor.h:370
RoomMatrixCensusOverlay & census_overlay()
StopToken get_token() const noexcept
Definition stop_token.h:38
bool request_stop() noexcept
Definition stop_token.h:40
CustomObjectRenderSnapshot CaptureRenderSnapshot(bool enabled)
static CustomObjectManager & Get()
static DrawRoutineRegistry & Get()
uint8_t blockset() const
Definition room.h:1015
#define LOG_WARN(category, format,...)
Definition log.h:138
const core::DungeonEntry * FindDungeonForRoom(const project::YazeProject *project, int room_id, size_t *dungeon_index=nullptr)
Editors are the view controllers for the application.
DungeonRenderContext ResolveDungeonRenderContext(int room_id, int selected_entrance_slot, uint8_t room_header_blockset, const zelda3::RoomCensus *census, std::span< const DungeonRenderEntranceCandidate > entrances, zelda3::RoomDefaultEntrance default_entrance, const core::DungeonEntry *project_dungeon)
Room LoadRoomHeaderFromRom(Rom *rom, int room_id)
Definition room.cc:680
constexpr int kNumDungeonSpawnPoints
Project-level registry data loaded from the Oracle planning outputs.
project::YazeProject * project
Definition editor.h:174
core::HackManifest hack_manifest
Definition project.h:360
std::vector< RoomDefaultEntrance > room_default_entrances
Definition game_data.h:118
std::array< std::array< uint8_t, 8 >, kNumMainBlocksets > main_blockset_ids
Definition game_data.h:97