Fix custom materials

This commit is contained in:
Federico Cecchetto 2022-03-17 23:56:15 +01:00
parent cea4d720be
commit f6fd11d662
2 changed files with 14 additions and 15 deletions

View File

@ -27,6 +27,8 @@ namespace materials
std::unordered_map<std::string, std::string> images; std::unordered_map<std::string, std::string> images;
}; };
char constant_table[0x20] = {};
utils::concurrency::container<material_data_t> material_data; utils::concurrency::container<material_data_t> material_data;
game::GfxImage* setup_image(game::GfxImage* image, const utils::image& raw_image) game::GfxImage* setup_image(game::GfxImage* image, const utils::image& raw_image)
@ -57,6 +59,7 @@ namespace materials
std::memcpy(texture_table, white->textureTable, sizeof(game::MaterialTextureDef)); std::memcpy(texture_table, white->textureTable, sizeof(game::MaterialTextureDef));
std::memcpy(image, white->textureTable->u.image, sizeof(game::GfxImage)); std::memcpy(image, white->textureTable->u.image, sizeof(game::GfxImage));
material->constantTable = &constant_table;
material->name = utils::memory::get_allocator()->duplicate_string(name); material->name = utils::memory::get_allocator()->duplicate_string(name);
image->name = material->name; image->name = material->name;
@ -85,6 +88,7 @@ namespace materials
&& !utils::io::read_file(utils::string::va("h1-mod/materials/%s.png", name.data()), &data) && !utils::io::read_file(utils::string::va("h1-mod/materials/%s.png", name.data()), &data)
&& !utils::io::read_file(utils::string::va("data/materials/%s.png", name.data()), &data)) && !utils::io::read_file(utils::string::va("data/materials/%s.png", name.data()), &data))
{ {
data_.materials[name] = nullptr;
return nullptr; return nullptr;
} }
@ -124,24 +128,14 @@ namespace materials
return result; return result;
} }
bool db_material_streaming_fail_stub(game::Material* material) int db_material_streaming_fail_stub(game::Material* material)
{ {
const auto found = material_data.access<bool>([material](material_data_t& data_) if (material->constantTable == &constant_table)
{ {
if (data_.materials.find(material->name) != data_.materials.end()) return 0;
{
return true;
} }
return false; return db_material_streaming_fail_hook.invoke<int>(material);
});
if (found)
{
return false;
}
return db_material_streaming_fail_hook.invoke<bool>(material);
} }
} }

View File

@ -1175,7 +1175,12 @@ namespace game
const char* name; const char* name;
char __pad0[0x118]; char __pad0[0x118];
char textureCount; char textureCount;
char __pad1[7]; char constantCount;
char stateBitsCount;
char stateFlags;
char cameraRegion;
char materialType;
char assetFlags;
MaterialTechniqueSet* techniqueSet; MaterialTechniqueSet* techniqueSet;
MaterialTextureDef* textureTable; MaterialTextureDef* textureTable;
void* constantTable; void* constantTable;