1
0
mirror of https://github.com/OpenRCT2/OpenRCT2 synced 2026-01-15 19:13:07 +01:00

implement unloading arbitrary objects

This commit is contained in:
Ted John
2016-07-06 22:31:14 +01:00
parent 488da7942c
commit f59d6b7a00
5 changed files with 89 additions and 35 deletions

View File

@@ -67,16 +67,10 @@ public:
uint8 GetLoadedObjectEntryIndex(const Object * object) override
{
uint8 result = UINT8_MAX;
if (_loadedObjects != nullptr)
size_t index = GetLoadedObjectIndex(object);
if (index != SIZE_MAX)
{
for (size_t i = 0; i < OBJECT_ENTRY_COUNT; i++)
{
if (_loadedObjects[i] == object)
{
get_type_entry_index(i, nullptr, &result);
break;
}
}
get_type_entry_index(index, nullptr, &result);
}
return result;
}
@@ -141,6 +135,36 @@ public:
}
}
void UnloadObjects(const rct_object_entry * entries, size_t count) 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 (size_t i = 0; i < count; i++)
{
const rct_object_entry * entry = &entries[i];
const ObjectRepositoryItem * ori = _objectRepository->FindObject(entry);
if (ori != nullptr)
{
Object * loadedObject = ori->LoadedObject;
size_t index = GetLoadedObjectIndex(loadedObject);
UnloadObject(loadedObject);
_loadedObjects[index] = nullptr;
numObjectsUnloaded++;
}
}
if (numObjectsUnloaded > 0)
{
UpdateLegacyLoadedObjectList();
reset_type_to_ride_entry_index_map();
}
}
void UnloadAll() override
{
if (_loadedObjects != nullptr)
@@ -173,6 +197,23 @@ private:
return -1;
}
size_t GetLoadedObjectIndex(const Object * object)
{
size_t result = SIZE_MAX;
if (_loadedObjects != nullptr)
{
for (size_t i = 0; i < OBJECT_ENTRY_COUNT; i++)
{
if (_loadedObjects[i] == object)
{
result = i;
break;
}
}
}
return result;
}
void SetNewLoadedObjectList(Object * * newLoadedObjects)
{
if (newLoadedObjects == nullptr)
@@ -415,4 +456,10 @@ extern "C"
Object * loadedObject = objectManager->LoadObject(entry);
return (void *)loadedObject;
}
void object_manager_unload_objects(const rct_object_entry * entries, size_t count)
{
IObjectManager * objectManager = GetObjectManager();
objectManager->UnloadObjects(entries, count);
}
}