From 4c0c1547fd812fe9127ec1410fdd9c9e280f40f4 Mon Sep 17 00:00:00 2001 From: Caner Karaca Date: Sun, 20 Sep 2026 02:21:04 +0300 Subject: [PATCH] fix(dirtfx): blend IVF vehicle grunge textures towards white with full opacity --- src/features/dirtfx.cpp | 30 ++++++++++++++++++++---------- 1 file changed, 20 insertions(+), 10 deletions(-) diff --git a/src/features/dirtfx.cpp b/src/features/dirtfx.cpp index 7d0f5490..cd582977 100755 --- a/src/features/dirtfx.cpp +++ b/src/features/dirtfx.cpp @@ -103,9 +103,9 @@ void DirtFx::ShutdownHook() { for (int i = 0; i < 16; i++) { - if (ms_aDirtTextures_2[i]) RwTextureDestroy(ms_aDirtTextures_2[i]); - if (ms_aDirtTextures_3[i]) RwTextureDestroy(ms_aDirtTextures_3[i]); - if (ms_aDirtTextures_4[i]) RwTextureDestroy(ms_aDirtTextures_4[i]); // RwTextureDestroy(ms_aDirtTextures_5[i]); + if (ms_aDirtTextures_2[i]) { RwTextureDestroy(ms_aDirtTextures_2[i]); ms_aDirtTextures_2[i] = nullptr; } + if (ms_aDirtTextures_3[i]) { RwTextureDestroy(ms_aDirtTextures_3[i]); ms_aDirtTextures_3[i] = nullptr; } + if (ms_aDirtTextures_4[i]) { RwTextureDestroy(ms_aDirtTextures_4[i]); ms_aDirtTextures_4[i] = nullptr; } } } @@ -160,34 +160,44 @@ void DirtFx::InitialiseBlendTextureSingle(const char *CleanName, const char *Dir void DirtFx::InitialiseDirtTextureSingle(const char *name, RwTexture **dirtTextureArray) { RwTexture *pTex = TextureMgr::Get(name); - if (!pTex) + if (!pTex || !pTex->raster) { return; } pTex->filterAddressing = rwFILTERLINEAR; + const int width = pTex->raster->width; + const int height = pTex->raster->height; + for (int texid = 0; texid < 16; texid++) { dirtTextureArray[texid] = CClothesBuilder::CopyTexture(pTex); + if (!dirtTextureArray[texid]) + { + continue; + } + RwTextureSetName(dirtTextureArray[texid], name); - int alpha = 255 - texid * 15; + dirtTextureArray[texid]->filterAddressing = rwFILTERLINEAR; + + float factor = static_cast(texid) / 15.0f; RwRaster *dirtRaster = dirtTextureArray[texid]->raster; RwUInt8 *pixelsRaw = RwRasterLock(dirtRaster, 0, rwRASTERLOCKWRITE); if (!pixelsRaw) { - return; + continue; } - const int width = pTex->raster->width; - const int height = pTex->raster->height; RwRGBA *pixels = reinterpret_cast(pixelsRaw); - for (int y = 0; y < height; ++y) { for (int x = 0; x < width; ++x) { RwRGBA &pixel = pixels[y * width + x]; - pixel.alpha = alpha; + pixel.red = static_cast(255 - static_cast((255 - pixel.red) * factor)); + pixel.green = static_cast(255 - static_cast((255 - pixel.green) * factor)); + pixel.blue = static_cast(255 - static_cast((255 - pixel.blue) * factor)); + pixel.alpha = 255; } } RwRasterUnlock(dirtRaster);