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:
@@ -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)
|
||||
{
|
||||
|
||||
@@ -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());
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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());
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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
|
||||
{
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user