1
0
mirror of https://github.com/OpenRCT2/OpenRCT2 synced 2026-01-22 14:24:33 +01:00

Parkobj loads rct_gx (#16806)

* allow loading of lgx rct_gx packed images within parkobjs

* add changelog entry

* allow loading of lgx without range
This commit is contained in:
spacek531
2022-03-19 11:02:02 -07:00
committed by GitHub
parent c84da5512c
commit a3700c832a
5 changed files with 103 additions and 1 deletions

View File

@@ -137,6 +137,22 @@ std::vector<std::unique_ptr<ImageTable::RequiredImage>> ImageTable::ParseImages(
result = LoadObjectImages(context, name, range);
}
}
else if (String::StartsWith(s, "$LGX:"))
{
auto name = s.substr(5);
auto rangeStart = name.find('[');
if (rangeStart != std::string::npos)
{
auto rangeString = name.substr(rangeStart);
auto range = ParseRange(name.substr(rangeStart));
name = name.substr(0, rangeStart);
result = LoadImageArchiveImages(context, name, range);
}
else
{
result = LoadImageArchiveImages(context, name);
}
}
else
{
try
@@ -219,6 +235,61 @@ std::vector<std::unique_ptr<ImageTable::RequiredImage>> ImageTable::ParseImages(
return result;
}
std::vector<std::unique_ptr<ImageTable::RequiredImage>> ImageTable::LoadImageArchiveImages(
IReadObjectContext* context, const std::string& path, const std::vector<int32_t>& range)
{
std::vector<std::unique_ptr<RequiredImage>> result;
auto gxRaw = context->GetData(path);
std::optional<rct_gx> gxData = GfxLoadGx(gxRaw);
if (gxData.has_value())
{
// Fix entry data offsets
for (uint32_t i = 0; i < gxData->header.num_entries; i++)
{
gxData->elements[i].offset += reinterpret_cast<uintptr_t>(gxData->data.get());
}
if (range.size() > 0)
{
size_t placeHoldersAdded = 0;
for (auto i : range)
{
if (i >= 0 && (i < static_cast<int32_t>(gxData->header.num_entries)))
{
result.push_back(std::make_unique<RequiredImage>(gxData->elements[i]));
}
else
{
result.push_back(std::make_unique<RequiredImage>());
placeHoldersAdded++;
}
}
// Log place holder information
if (placeHoldersAdded > 0)
{
std::string msg = "Adding " + std::to_string(placeHoldersAdded) + " placeholders";
context->LogWarning(ObjectError::InvalidProperty, msg.c_str());
}
}
else
{
for (int i = 0; i < static_cast<int32_t>(gxData->header.num_entries); i++)
result.push_back(std::make_unique<RequiredImage>(gxData->elements[i]));
}
}
else
{
auto msg = String::StdFormat("Unable to load rct_gx '%s'", path.c_str());
context->LogWarning(ObjectError::BadImageTable, msg.c_str());
for (size_t i = 0; i < range.size(); i++)
{
result.push_back(std::make_unique<RequiredImage>());
}
}
return result;
}
std::vector<std::unique_ptr<ImageTable::RequiredImage>> ImageTable::LoadObjectImages(
IReadObjectContext* context, const std::string& name, const std::vector<int32_t>& range)
{