diff --git a/trview.app.tests/Windows/ViewerTests.cpp b/trview.app.tests/Windows/ViewerTests.cpp index 1b1b9381d..e416f34e4 100644 --- a/trview.app.tests/Windows/ViewerTests.cpp +++ b/trview.app.tests/Windows/ViewerTests.cpp @@ -1089,5 +1089,8 @@ TEST(Viewer, SectorHighlightForwarded) auto viewer = register_test_module().with_ui(std::move(ui_ptr)).with_sector_highlight(std::move(sector_highlight_ptr)).build(); viewer->open(level, ILevel::OpenMode::Full); - ui.on_sector_hover(mock_shared()); + + auto room = mock_shared(); + auto sector = mock_shared()->with_room(room); + ui.on_sector_hover(sector); } diff --git a/trview.app/Elements/ILevel.h b/trview.app/Elements/ILevel.h index f66295663..c3e1cdfed 100644 --- a/trview.app/Elements/ILevel.h +++ b/trview.app/Elements/ILevel.h @@ -77,8 +77,6 @@ namespace trview virtual void render_transparency(const ICamera& camera) = 0; // Returns the room with ID provided virtual std::weak_ptr room(uint32_t id) const = 0; - virtual std::vector room_info() const = 0; - virtual RoomInfo room_info(uint32_t room) const = 0; virtual std::vector> rooms() const = 0; virtual std::optional selected_item() const = 0; virtual std::optional selected_light() const = 0; diff --git a/trview.app/Elements/Level.cpp b/trview.app/Elements/Level.cpp index ed8a2ee0d..95ca8661f 100644 --- a/trview.app/Elements/Level.cpp +++ b/trview.app/Elements/Level.cpp @@ -77,21 +77,6 @@ namespace trview _sampler_state = device->create_sampler_state(sampler_desc); } - std::vector Level::room_info() const - { - std::vector room_infos; - for (const auto& r : _rooms) - { - room_infos.push_back(r->info()); - } - return room_infos; - } - - RoomInfo Level::room_info(uint32_t room) const - { - return _rooms[room]->info(); - } - std::vector Level::level_textures() const { std::vector textures; diff --git a/trview.app/Elements/Level.h b/trview.app/Elements/Level.h index 411b80461..209d676d1 100644 --- a/trview.app/Elements/Level.h +++ b/trview.app/Elements/Level.h @@ -37,8 +37,6 @@ namespace trview const std::shared_ptr& log, const graphics::IBuffer::ConstantSource& buffer_source); virtual ~Level() = default; - virtual std::vector room_info() const override; - virtual RoomInfo room_info(uint32_t room) const override; virtual std::vector level_textures() const override; virtual std::optional selected_item() const override; virtual uint16_t selected_room() const override; diff --git a/trview.app/Mocks/Elements/ILevel.h b/trview.app/Mocks/Elements/ILevel.h index b1b2077bc..d4b9ce01a 100644 --- a/trview.app/Mocks/Elements/ILevel.h +++ b/trview.app/Mocks/Elements/ILevel.h @@ -32,8 +32,6 @@ namespace trview MOCK_METHOD(void, render, (const ICamera&, bool), (override)); MOCK_METHOD(void, render_transparency, (const ICamera&), (override)); MOCK_METHOD(std::weak_ptr, room, (uint32_t), (const, override)); - MOCK_METHOD(std::vector, room_info, (), (const, override)); - MOCK_METHOD(RoomInfo, room_info, (uint32_t), (const, override)); MOCK_METHOD(std::vector>, rooms, (), (const, override)); MOCK_METHOD(std::optional, selected_item, (), (const, override)); MOCK_METHOD(std::optional, selected_light, (), (const, override)); diff --git a/trview.app/UI/MapRenderer.cpp b/trview.app/UI/MapRenderer.cpp index 8588e4a1b..669b83328 100644 --- a/trview.app/UI/MapRenderer.cpp +++ b/trview.app/UI/MapRenderer.cpp @@ -30,7 +30,7 @@ namespace trview void MapRenderer::render() { - if (!_render_target || !_visible) + if (!_render_target || !_visible || !_loaded) { return; } @@ -146,9 +146,19 @@ namespace trview _sprite->render(_texture, p.x, p.y, s.width, s.height, c); } - void - MapRenderer::load(const std::shared_ptr& room) + void MapRenderer::load(const std::shared_ptr& room) { + _tiles.clear(); + _previous_sector.reset(); + on_sector_hover(nullptr); + _force_redraw = true; + + if (!room) + { + _loaded = false; + return; + } + // Set window position and size _columns = room->num_x_sectors(); _rows = room->num_z_sectors(); @@ -156,18 +166,12 @@ namespace trview update_map_position(); update_map_render_target(); - // Load up sectors - _tiles.clear(); - const auto& sectors = room->sectors(); std::for_each(sectors.begin(), sectors.end(), [&] (const auto& sector) { _tiles.emplace_back(sector, get_position(*sector), get_size()); }); - - _previous_sector.reset(); - on_sector_hover(nullptr); } Point MapRenderer::get_position(const ISector& sector) diff --git a/trview.app/UI/ViewerUI.cpp b/trview.app/UI/ViewerUI.cpp index e264ef746..e3d09d34a 100644 --- a/trview.app/UI/ViewerUI.cpp +++ b/trview.app/UI/ViewerUI.cpp @@ -311,6 +311,7 @@ namespace trview { _level = level; _level_info->set_level(name); + _map_renderer->load({}); if (auto new_level = _level.lock()) { _level_info->set_level_version(new_level->version()); diff --git a/trview.app/Windows/Viewer.cpp b/trview.app/Windows/Viewer.cpp index ae1729382..f0221fe1e 100644 --- a/trview.app/Windows/Viewer.cpp +++ b/trview.app/Windows/Viewer.cpp @@ -638,6 +638,13 @@ namespace trview if (open_mode == ILevel::OpenMode::Full || !old_level) { + // Strip the last part of the path away. + const auto filename = new_level->filename(); + auto last_index = std::min(filename.find_last_of('\\'), filename.find_last_of('/')); + auto name = last_index == filename.npos ? filename : filename.substr(std::min(last_index + 1, filename.size())); + _ui->set_level(name, new_level); + window().set_title("trview - " + name); + _camera.reset(); _ui->set_toggle(Options::highlight, false); _ui->set_toggle(Options::flip, false); @@ -661,16 +668,9 @@ namespace trview { _ui->set_selected_room(rooms[new_level->selected_room()].lock()); } - + auto selected_item = new_level->selected_item(); _ui->set_selected_item(selected_item.value_or(0)); - - // Strip the last part of the path away. - const auto filename = new_level->filename(); - auto last_index = std::min(filename.find_last_of('\\'), filename.find_last_of('/')); - auto name = last_index == filename.npos ? filename : filename.substr(std::min(last_index + 1, filename.size())); - _ui->set_level(name, new_level); - window().set_title("trview - " + name); } else if (open_mode == ILevel::OpenMode::Reload && old_level) { @@ -1418,13 +1418,18 @@ namespace trview void Viewer::set_sector_highlight(const std::shared_ptr& sector) { - const auto level = _level.lock(); - if (!level) + if (!sector) { return; } - const auto room_info = level->room_info(level->selected_room()); + const auto room = sector->room().lock(); + if (!room) + { + return; + } + + const auto room_info = room->info(); _sector_highlight->set_sector(sector, Matrix::CreateTranslation(room_info.x / trlevel::Scale_X, 0, room_info.z / trlevel::Scale_Z)); _scene_changed = true;