1
0
mirror of https://github.com/OpenRCT2/OpenRCT2 synced 2026-01-15 11:03:00 +01:00

Update loading object images to use inclusive ranges

This commit is contained in:
Ted John
2018-03-28 22:14:25 +01:00
parent 5eeecd82bd
commit 742edd45da

View File

@@ -233,7 +233,7 @@ namespace ObjectJsonHelpers
return objectPath;
}
static std::vector<rct_g1_element> LoadObjectImages(IReadObjectContext * context, const std::string &name, uint32 start, uint32 end)
static std::vector<rct_g1_element> LoadObjectImages(IReadObjectContext * context, const std::string &name, const std::vector<sint32> &range)
{
std::vector<rct_g1_element> result;
auto objectPath = FindLegacyObject(name);
@@ -241,35 +241,41 @@ namespace ObjectJsonHelpers
if (obj != nullptr)
{
auto &imgTable = static_cast<const Object *>(obj)->GetImageTable();
auto numImages = imgTable.GetCount();
auto numImages = (sint32)imgTable.GetCount();
auto images = imgTable.GetImages();
for (uint32 i = start; i < Math::Min(numImages, end); i++)
size_t placeHoldersAdded = 0;
for (auto i : range)
{
auto &objg1 = images[i];
auto length = g1_calculate_data_size(&objg1);
auto g1 = objg1;
g1.offset = (uint8 *)std::malloc(length);
std::memcpy(g1.offset, objg1.offset, length);
result.push_back(g1);
if (i >= 0 && i < numImages)
{
auto &objg1 = images[i];
auto length = g1_calculate_data_size(&objg1);
auto g1 = objg1;
g1.offset = (uint8 *)std::malloc(length);
std::memcpy(g1.offset, objg1.offset, length);
result.push_back(g1);
}
else
{
auto g1 = rct_g1_element{};
result.push_back(g1);
placeHoldersAdded++;
}
}
delete obj;
// Log place holder information
if (placeHoldersAdded > 0)
{
std::string msg = "Adding " + std::to_string(placeHoldersAdded) + " placeholders";
context->LogWarning(OBJECT_ERROR_INVALID_PROPERTY, msg.c_str());
}
}
else
{
std::string msg = "Unable to open '" + objectPath + "'";
context->LogWarning(OBJECT_ERROR_INVALID_PROPERTY, msg.c_str());
}
// Add place holders
auto placeHolders = (size_t)(end - start) - result.size();
if (placeHolders > 0)
{
if (obj != nullptr)
{
std::string msg = "Adding " + std::to_string(placeHolders) + " placeholders";
context->LogWarning(OBJECT_ERROR_INVALID_PROPERTY, msg.c_str());
}
for (size_t i = 0; i < placeHolders; i++)
for (size_t i = 0; i < range.size(); i++)
{
auto g1 = rct_g1_element{};
result.push_back(g1);
@@ -309,21 +315,13 @@ namespace ObjectJsonHelpers
{
auto name = s.substr(14);
auto rangeStart = name.find('[');
auto imgStart = 0;
auto imgEnd = INT16_MAX;
if (rangeStart != std::string::npos)
{
auto rangeString = name.substr(rangeStart);
auto range = ParseRange(name.substr(rangeStart));
name = name.substr(0, rangeStart);
if (range.size() > 0)
{
imgStart = range.front();
imgEnd = range.back();
}
result = LoadObjectImages(context, name, range);
}
return LoadObjectImages(context, name, imgStart, imgEnd);
}
return result;
}