1
0
mirror of https://github.com/OpenRCT2/OpenRCT2 synced 2026-01-20 05:23:04 +01:00

Fix object entry stuff

This commit is contained in:
Ted John
2021-04-13 21:46:08 +01:00
parent 04e4b160b3
commit 0376d48cdb
6 changed files with 58 additions and 50 deletions

View File

@@ -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<size_t>(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<int32_t>(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)
{

View File

@@ -230,19 +230,19 @@ void setup_in_use_selection_flags()
}
}
int32_t numObjects = static_cast<int32_t>(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<int32_t>(object_repository_get_items_count());
const ObjectRepositoryItem* items = object_repository_get_items();
std::vector<rct_object_entry> objectsToUnload;
std::vector<ObjectEntryDescriptor> 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<rct_object_entry> oldEntries = { *(oldPalette->GetObjectEntry()) };
const std::vector<ObjectEntryDescriptor> 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());
}
}

View File

@@ -214,7 +214,7 @@ std::vector<std::unique_ptr<ImageTable::RequiredImage>> 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());
}
}

View File

@@ -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
{

View File

@@ -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<rct_object_entry>& entries) override
void UnloadObjects(const std::vector<ObjectEntryDescriptor>& 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<rct_object_entry>& entries)
void object_manager_unload_objects(const std::vector<ObjectEntryDescriptor>& entries)
{
auto& objectManager = OpenRCT2::GetContext()->GetObjectManager();
objectManager.UnloadObjects(entries);

View File

@@ -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<rct_object_entry>& entries) abstract;
virtual void UnloadObjects(const std::vector<ObjectEntryDescriptor>& 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<rct_object_entry>& entries);
void object_manager_unload_objects(const std::vector<ObjectEntryDescriptor>& entries);
void object_manager_unload_all_objects();
rct_string_id object_manager_get_source_game_string(const ObjectSourceGame sourceGame);