diff --git a/src/features/sirens.cpp b/src/features/sirens.cpp index 0fcfe46..51760de 100755 --- a/src/features/sirens.cpp +++ b/src/features/sirens.cpp @@ -607,22 +607,20 @@ void Sirens::Init() ModelInfoMgr::RegisterMaterialColProvider([](CVehicle *pVeh, RpMaterial *pMat, eMaterialType type) { - if (type == eMaterialType::SirenLight) { - int matIdx = GetSirenIndex(pVeh, pMat); - - if (matIdx != - 1) { - int curState = vehicleData[pVeh]->GetCurrentState(); - auto& state = modelData[pVeh->m_nModelIndex]->States[curState]; - if (state->Materials.contains(matIdx)) { - if (modelData[pVeh->m_nModelIndex]->isImVehFtSiren) { - return MatStateColor{state->Materials[matIdx]->Color, state->Materials[matIdx]->Color}; - } else { - return MatStateColor{state->Materials[matIdx]->Color, DEFAULT_MAT_COL}; - } + int matIdx = GetSirenIndex(pVeh, pMat); + + if (matIdx != - 1) { + int curState = vehicleData[pVeh]->GetCurrentState(); + auto& state = modelData[pVeh->m_nModelIndex]->States[curState]; + if (state->Materials.contains(matIdx)) { + if (modelData[pVeh->m_nModelIndex]->isImVehFtSiren) { + return MatStateColor{state->Materials[matIdx]->Color, state->Materials[matIdx]->Color}; + } else { + return MatStateColor{state->Materials[matIdx]->Color, DEFAULT_MAT_COL}; } } } - return MatStateColor{DEFAULT_MAT_COL, DEFAULT_MAT_COL}; }); + return MatStateColor{DEFAULT_MAT_COL, DEFAULT_MAT_COL}; }, eMaterialType::SirenLight); ModelInfoMgr::RegisterDummy([](CVehicle *vehicle, RwFrame *frame, const std::string_view name2) { diff --git a/src/utils/modelinfomgr.cpp b/src/utils/modelinfomgr.cpp index af43e7f..271c2d4 100755 --- a/src/utils/modelinfomgr.cpp +++ b/src/utils/modelinfomgr.cpp @@ -145,9 +145,9 @@ void ModelInfoMgr::RegisterMaterial(MaterialCallback_t mat) materials.push_back(mat); } -void ModelInfoMgr::RegisterMaterialColProvider(MaterialColProviderCallback_t mat) +void ModelInfoMgr::RegisterMaterialColProvider(MaterialColProviderCallback_t mat, eMaterialType type) { - matColProviders.push_back(mat); + matColProviders[type].push_back(mat); } void ModelInfoMgr::SetupRender(CVehicle *ptr) @@ -179,16 +179,28 @@ struct tRestoreEntry MatStateColor ModelInfoMgr::FetchMaterialCol(CVehicle *pVeh, RpMaterial *pMat, eMaterialType type) { - MatStateColor col = {DEFAULT_MAT_COL, DEFAULT_MAT_COL}; - for (auto &e : matColProviders) + auto CheckProviders = [&](const std::vector &providers) -> MatStateColor { - col = e(pVeh, pMat, type); + for (auto &e : providers) + { + MatStateColor col = e(pVeh, pMat, type); + if (col.on != DEFAULT_MAT_COL || col.off != DEFAULT_MAT_COL) + { + return col; + } + } + return {DEFAULT_MAT_COL, DEFAULT_MAT_COL}; + }; + + if (type >= 0 && type < eMaterialType::TotalMaterial) + { + MatStateColor col = CheckProviders(matColProviders[type]); if (col.on != DEFAULT_MAT_COL || col.off != DEFAULT_MAT_COL) { - break; + return col; } } - return col; + return CheckProviders(matColProviders[eMaterialType::TotalMaterial]); } eMaterialType ModelInfoMgr::FetchMaterialType(CVehicle *pVeh, RpMaterial *pMat) diff --git a/src/utils/modelinfomgr.h b/src/utils/modelinfomgr.h index 07a348c..71bbfc3 100755 --- a/src/utils/modelinfomgr.h +++ b/src/utils/modelinfomgr.h @@ -80,7 +80,7 @@ class ModelInfoMgr private: static inline std::vector dummy; static inline std::vector materials; - static inline std::vector matColProviders; + static inline std::vector matColProviders[eMaterialType::TotalMaterial + 1]; static inline std::vector renders; static inline VehicleExtendedData m_VehData; @@ -102,7 +102,7 @@ class ModelInfoMgr static void Init(); static void RegisterDummy(DummyCallback_t function); static void RegisterMaterial(MaterialCallback_t material); - static void RegisterMaterialColProvider(MaterialColProviderCallback_t material); + static void RegisterMaterialColProvider(MaterialColProviderCallback_t material, eMaterialType type = eMaterialType::TotalMaterial); static void RegisterRender(RenderCallback_t render); static void Reload(CVehicle *pVeh); };