mirror of
https://github.com/open-goal/jak-project
synced 2026-06-14 14:28:25 -04:00
decompiler: add texture merging feature (#3083)
This commit is contained in:
@@ -99,6 +99,36 @@ void TextureDB::add_index_texture(u32 tpage,
|
||||
}
|
||||
}
|
||||
|
||||
void TextureDB::merge_textures(const fs::path& base_path) {
|
||||
for (auto& tex : textures) {
|
||||
fs::path full_path = base_path / tpage_names.at(tex.second.page) / (tex.second.name + ".png");
|
||||
if (fs::exists(full_path)) {
|
||||
lg::info("Merging {}", full_path.string().c_str());
|
||||
int w, h;
|
||||
auto merge_data = stbi_load(full_path.string().c_str(), &w, &h, 0, 4); // rgba channels
|
||||
if (!merge_data) {
|
||||
lg::warn("failed to load PNG file: {}", full_path.string().c_str());
|
||||
continue;
|
||||
} else if (w != tex.second.w || h != tex.second.h) {
|
||||
lg::warn("merge texture does not match the same dimensions: {}, {} != {} || {} != {}",
|
||||
full_path.string().c_str(), w, tex.second.w, h, tex.second.h);
|
||||
stbi_image_free(merge_data);
|
||||
continue;
|
||||
}
|
||||
// Merge any non-transparent pixels into the existing texture
|
||||
for (int i = 0; i < w * h * 4; i += 4) {
|
||||
const auto merge_pixel_a = merge_data[i + 3];
|
||||
if (merge_pixel_a != 0) {
|
||||
u32 merge_pixel;
|
||||
memcpy(&merge_pixel, &merge_data[i], sizeof(u32));
|
||||
tex.second.rgba_bytes.at(i / 4) = merge_pixel;
|
||||
}
|
||||
}
|
||||
stbi_image_free(merge_data);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void TextureDB::replace_textures(const fs::path& path) {
|
||||
fs::path base_path(path);
|
||||
for (auto& tex : textures) {
|
||||
|
||||
Reference in New Issue
Block a user