From 0376d48cdb89d74a871d55058ba21489a706b295 Mon Sep 17 00:00:00 2001 From: Ted John Date: Tue, 13 Apr 2021 21:46:08 +0100 Subject: [PATCH] Fix object entry stuff --- .../windows/EditorObjectSelection.cpp | 38 +++++++++--------- src/openrct2/EditorObjectSelectionSession.cpp | 39 ++++++++----------- src/openrct2/object/ImageTable.cpp | 2 +- src/openrct2/object/Object.h | 8 ++++ src/openrct2/object/ObjectManager.cpp | 16 +++++--- src/openrct2/object/ObjectManager.h | 5 ++- 6 files changed, 58 insertions(+), 50 deletions(-) diff --git a/src/openrct2-ui/windows/EditorObjectSelection.cpp b/src/openrct2-ui/windows/EditorObjectSelection.cpp index 87d2b563d2..2d02a5fc61 100644 --- a/src/openrct2-ui/windows/EditorObjectSelection.cpp +++ b/src/openrct2-ui/windows/EditorObjectSelection.cpp @@ -394,7 +394,6 @@ rct_window* window_editor_object_selection_open() window->selected_tab = 0; window->selected_list_item = -1; - window->object_entry = nullptr; window->min_width = 600; window->min_height = 400; window->max_width = 1200; @@ -464,7 +463,6 @@ static void window_editor_object_selection_mouseup(rct_window* w, rct_widgetinde visible_list_refresh(w); w->selected_list_item = -1; - w->object_entry = nullptr; w->scrolls[0].v_top = 0; w->Invalidate(); break; @@ -483,7 +481,6 @@ static void window_editor_object_selection_mouseup(rct_window* w, rct_widgetinde visible_list_refresh(w); w->selected_list_item = -1; - w->object_entry = nullptr; w->scrolls[0].v_top = 0; w->frame_no = 0; w->Invalidate(); @@ -702,7 +699,7 @@ static void window_editor_object_selection_scroll_mousedown( flags |= INPUT_FLAG_EDITOR_OBJECT_SELECT; _maxObjectsWasHit = false; - if (!window_editor_object_selection_select_object(0, flags, listItem->entry)) + if (!window_editor_object_selection_select_object(0, flags, listItem->repositoryItem)) { rct_string_id error_title = (flags & INPUT_FLAG_EDITOR_OBJECT_SELECT) ? STR_UNABLE_TO_SELECT_THIS_OBJECT : STR_UNABLE_TO_DE_SELECT_THIS_OBJECT; @@ -749,15 +746,15 @@ static void window_editor_object_selection_scroll_mouseover( if (_loadedObject != nullptr) _loadedObject->Unload(); - if (selectedObject == -1) - { - w->object_entry = nullptr; - } - else + if (selectedObject != -1) { auto listItem = &_listItems[selectedObject]; - w->object_entry = listItem->entry; - _loadedObject = object_repository_load_object(listItem->entry); + auto& objRepository = OpenRCT2::GetContext()->GetObjectRepository(); + _loadedObject = objRepository.LoadObject(listItem->repositoryItem); + if (_loadedObject != nullptr) + { + _loadedObject->Load(); + } } w->Invalidate(); @@ -1134,8 +1131,9 @@ static void window_editor_object_selection_scrollpaint(rct_window* w, rct_drawpi gfx_clear(dpi, paletteIndex); screenCoords.y = 0; - for (const auto& listItem : _listItems) + for (size_t i = 0; i < _listItems.size(); i++) { + const auto& listItem = _listItems[i]; if (screenCoords.y + SCROLLABLE_ROW_HEIGHT >= dpi->y && screenCoords.y <= dpi->y + dpi->height) { // Draw checkbox @@ -1144,7 +1142,7 @@ static void window_editor_object_selection_scrollpaint(rct_window* w, rct_drawpi dpi, { { 2, screenCoords.y }, { 11, screenCoords.y + 10 } }, w->colours[1], INSET_RECT_F_E0); // Highlight background - auto highlighted = listItem.entry == w->object_entry && !(*listItem.flags & OBJECT_SELECTION_FLAG_6); + auto highlighted = i == static_cast(w->selected_list_item) && !(*listItem.flags & OBJECT_SELECTION_FLAG_6); if (highlighted) { auto bottom = screenCoords.y + (SCROLLABLE_ROW_HEIGHT - 1); @@ -1216,7 +1214,6 @@ static void window_editor_object_set_page(rct_window* w, int32_t page) w->selected_tab = page; w->selected_list_item = -1; - w->object_entry = nullptr; w->scrolls[0].v_top = 0; w->frame_no = 0; @@ -1291,26 +1288,27 @@ static void window_editor_object_selection_manage_tracks() */ static void editor_load_selected_objects() { + auto& objManager = OpenRCT2::GetContext()->GetObjectManager(); int32_t numItems = static_cast(object_repository_get_items_count()); const ObjectRepositoryItem* items = object_repository_get_items(); for (int32_t i = 0; i < numItems; i++) { if (_objectSelectionFlags[i] & OBJECT_SELECTION_FLAG_SELECTED) { - const ObjectRepositoryItem* item = &items[i]; - const rct_object_entry* entry = &item->ObjectEntry; - const auto* loadedObject = object_manager_get_loaded_object(ObjectEntryDescriptor(*item)); + const auto* item = &items[i]; + auto descriptor = ObjectEntryDescriptor(*item); + const auto* loadedObject = objManager.GetLoadedObject(descriptor); if (loadedObject == nullptr) { - loadedObject = object_manager_load_object(entry); + loadedObject = objManager.LoadObject(descriptor); if (loadedObject == nullptr) { - log_error("Failed to load entry %.8s", entry->name); + log_error("Failed to load entry %s", std::string(descriptor.GetName()).c_str()); } else if (!(gScreenFlags & SCREEN_FLAGS_EDITOR)) { // Defaults selected items to researched (if in-game) - ObjectType objectType = entry->GetType(); + auto objectType = loadedObject->GetObjectType(); auto entryIndex = object_manager_get_loaded_object_entry_index(loadedObject); if (objectType == ObjectType::Ride) { diff --git a/src/openrct2/EditorObjectSelectionSession.cpp b/src/openrct2/EditorObjectSelectionSession.cpp index 271f1a17cb..9bf836f4b8 100644 --- a/src/openrct2/EditorObjectSelectionSession.cpp +++ b/src/openrct2/EditorObjectSelectionSession.cpp @@ -230,19 +230,19 @@ void setup_in_use_selection_flags() } } - int32_t numObjects = static_cast(object_repository_get_items_count()); - const ObjectRepositoryItem* items = object_repository_get_items(); - for (int32_t i = 0; i < numObjects; i++) + auto numObjects = object_repository_get_items_count(); + const auto* items = object_repository_get_items(); + for (size_t i = 0; i < numObjects; i++) { - uint8_t* selectionFlags = &_objectSelectionFlags[i]; - const ObjectRepositoryItem* item = &items[i]; + auto* selectionFlags = &_objectSelectionFlags[i]; + const auto* item = &items[i]; *selectionFlags &= ~OBJECT_SELECTION_FLAG_IN_USE; - ObjectType entryType; - ObjectEntryIndex entryIndex; - if (find_object_in_entry_group(&item->ObjectEntry, &entryType, &entryIndex)) + if (item->LoadedObject != nullptr) { - auto flags = Editor::GetSelectedObjectFlags(entryType, entryIndex); + auto objectType = item->LoadedObject->GetObjectType(); + auto entryIndex = objectMgr.GetLoadedObjectEntryIndex(item->LoadedObject); + auto flags = Editor::GetSelectedObjectFlags(objectType, entryIndex); if (flags & OBJECT_SELECTION_FLAG_SELECTED) { *selectionFlags |= OBJECT_SELECTION_FLAG_IN_USE | OBJECT_SELECTION_FLAG_SELECTED; @@ -353,16 +353,14 @@ void unload_unselected_objects() { int32_t numItems = static_cast(object_repository_get_items_count()); const ObjectRepositoryItem* items = object_repository_get_items(); - std::vector objectsToUnload; + std::vector objectsToUnload; for (int32_t i = 0; i < numItems; i++) { if (!(_objectSelectionFlags[i] & OBJECT_SELECTION_FLAG_SELECTED)) { - const rct_object_entry* entry = &items[i].ObjectEntry; - - remove_selected_objects_from_research(entry); - objectsToUnload.push_back(*entry); + remove_selected_objects_from_research(&items[i].ObjectEntry); + objectsToUnload.push_back(ObjectEntryDescriptor(items[i])); } } object_manager_unload_objects(objectsToUnload); @@ -408,24 +406,21 @@ static void SelectDesignerObjects() static void ReplaceSelectedWaterPalette(const ObjectRepositoryItem* item) { auto& objectManager = OpenRCT2::GetContext()->GetObjectManager(); - Object* oldPalette = objectManager.GetLoadedObject(ObjectType::Water, 0); - + auto* oldPalette = objectManager.GetLoadedObject(ObjectType::Water, 0); if (oldPalette != nullptr) { - const std::vector oldEntries = { *(oldPalette->GetObjectEntry()) }; + const std::vector oldEntries = { oldPalette->GetDescriptor() }; objectManager.UnloadObjects(oldEntries); } - const rct_object_entry& newPaletteEntry = item->ObjectEntry; - - if (objectManager.GetLoadedObject(ObjectEntryDescriptor(newPaletteEntry)) != nullptr - || objectManager.LoadObject(&newPaletteEntry) != nullptr) + auto newPaletteEntry = ObjectEntryDescriptor(*item); + if (objectManager.GetLoadedObject(newPaletteEntry) != nullptr || objectManager.LoadObject(newPaletteEntry) != nullptr) { load_palette(); } else { - log_error("Failed to load selected palette %.8s", newPaletteEntry.name); + log_error("Failed to load selected palette %s", std::string(newPaletteEntry.GetName()).c_str()); } } diff --git a/src/openrct2/object/ImageTable.cpp b/src/openrct2/object/ImageTable.cpp index 0c70da90cc..736b5e3968 100644 --- a/src/openrct2/object/ImageTable.cpp +++ b/src/openrct2/object/ImageTable.cpp @@ -214,7 +214,7 @@ std::vector> ImageTable::LoadObjectIm // Log place holder information if (placeHoldersAdded > 0) { - std::string msg = "Adding " + std::to_string(placeHoldersAdded) + " placeholders"; + std::string msg = "PAdding " + std::to_string(placeHoldersAdded) + " placeholders"; context->LogWarning(ObjectError::InvalidProperty, msg.c_str()); } } diff --git a/src/openrct2/object/Object.h b/src/openrct2/object/Object.h index 893187861b..c10db62eb2 100644 --- a/src/openrct2/object/Object.h +++ b/src/openrct2/object/Object.h @@ -302,6 +302,14 @@ public: return _isJsonObject; }; + ObjectEntryDescriptor GetDescriptor() const + { + if (_isJsonObject) + return ObjectEntryDescriptor(_identifier); + else + return ObjectEntryDescriptor(_objectEntry); + } + // Legacy data structures std::string_view GetLegacyIdentifier() const { diff --git a/src/openrct2/object/ObjectManager.cpp b/src/openrct2/object/ObjectManager.cpp index 4ac9a5a1e0..ea17132c07 100644 --- a/src/openrct2/object/ObjectManager.cpp +++ b/src/openrct2/object/ObjectManager.cpp @@ -152,6 +152,12 @@ public: return RepositoryItemToObject(ori); } + Object* LoadObject(const ObjectEntryDescriptor& descriptor) override + { + const ObjectRepositoryItem* ori = _objectRepository.FindObject(descriptor); + return RepositoryItemToObject(ori); + } + void LoadObjects(const ObjectList& objectList) override { // Find all the required objects @@ -167,19 +173,19 @@ public: log_verbose("%u / %u new objects loaded", numNewLoadedObjects, requiredObjects.size()); } - void UnloadObjects(const std::vector& entries) override + void UnloadObjects(const std::vector& entries) override { // TODO there are two performance issues here: // - FindObject for every entry which is a dictionary lookup // - GetLoadedObjectIndex for every entry which enumerates _loadedList size_t numObjectsUnloaded = 0; - for (const auto& entry : entries) + for (const auto& descriptor : entries) { - const ObjectRepositoryItem* ori = _objectRepository.FindObject(&entry); + const auto* ori = _objectRepository.FindObject(descriptor); if (ori != nullptr) { - Object* loadedObject = ori->LoadedObject; + auto* loadedObject = ori->LoadedObject; if (loadedObject != nullptr) { UnloadObject(loadedObject); @@ -743,7 +749,7 @@ Object* object_manager_load_object(const rct_object_entry* entry) return loadedObject; } -void object_manager_unload_objects(const std::vector& entries) +void object_manager_unload_objects(const std::vector& entries) { auto& objectManager = OpenRCT2::GetContext()->GetObjectManager(); objectManager.UnloadObjects(entries); diff --git a/src/openrct2/object/ObjectManager.h b/src/openrct2/object/ObjectManager.h index 5a7b744616..1acc0fe3c2 100644 --- a/src/openrct2/object/ObjectManager.h +++ b/src/openrct2/object/ObjectManager.h @@ -34,8 +34,9 @@ struct IObjectManager virtual Object* LoadObject(std::string_view identifier) abstract; virtual Object* LoadObject(const rct_object_entry* entry) abstract; + virtual Object* LoadObject(const ObjectEntryDescriptor& descriptor) abstract; virtual void LoadObjects(const ObjectList& entries) abstract; - virtual void UnloadObjects(const std::vector& entries) abstract; + virtual void UnloadObjects(const std::vector& entries) abstract; virtual void UnloadAll() abstract; virtual void ResetObjects() abstract; @@ -51,6 +52,6 @@ Object* object_manager_get_loaded_object(const ObjectEntryDescriptor& entry); ObjectEntryIndex object_manager_get_loaded_object_entry_index(const Object* loadedObject); ObjectEntryIndex object_manager_get_loaded_object_entry_index(const ObjectEntryDescriptor& entry); Object* object_manager_load_object(const rct_object_entry* entry); -void object_manager_unload_objects(const std::vector& entries); +void object_manager_unload_objects(const std::vector& entries); void object_manager_unload_all_objects(); rct_string_id object_manager_get_source_game_string(const ObjectSourceGame sourceGame);