From d884d2c27f6bd61b4513d06d1d99ca1cd7544387 Mon Sep 17 00:00:00 2001 From: Shpoike Date: Mon, 13 Sep 2021 04:03:27 +0100 Subject: [PATCH] Add support for fullbrights on md5 skins. --- Quake/gl_mesh.c | 73 +++++++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 67 insertions(+), 6 deletions(-) diff --git a/Quake/gl_mesh.c b/Quake/gl_mesh.c index c292203e..96d510b7 100644 --- a/Quake/gl_mesh.c +++ b/Quake/gl_mesh.c @@ -1862,12 +1862,73 @@ void Mod_LoadMD5MeshModel (qmodel_t *mod, const void *buffer) //but we do so anyway, because rerelease compat. for (surf->numskins = 0; surf->numskins < MAX_SKINS; surf->numskins++) { - q_snprintf(texname, sizeof(texname), "progs/%s_%02d_%02d", com_token, surf->numskins, 0); - surf->gltextures[surf->numskins][0] = TexMgr_LoadImage(mod, texname, surf->skinwidth, surf->skinheight, SRC_EXTERNAL, NULL, texname, 0, TEXPREF_ALLOWMISSING|TEXPREF_ALPHA|TEXPREF_NOBRIGHT|TEXPREF_MIPMAP); - if (!surf->gltextures[surf->numskins][0]) - break; - surf->gltextures[surf->numskins][3] = surf->gltextures[surf->numskins][2] = surf->gltextures[surf->numskins][1] = surf->gltextures[surf->numskins][0]; - surf->fbtextures[surf->numskins][0] = surf->fbtextures[surf->numskins][1] = surf->fbtextures[surf->numskins][2] = surf->fbtextures[surf->numskins][3] = NULL; + unsigned int fwidth, fheight, f; + enum srcformat fmt; + qboolean malloced; + void *data; + int mark = Hunk_LowMark (); + for (f = 0; f < countof(surf->gltextures[0]); f++) + { + q_snprintf(texname, sizeof(texname), "progs/%s_%02u_%02u", com_token, surf->numskins, f); + + data = Image_LoadImage (texname, &fwidth, &fheight, &fmt, &malloced); + //now load whatever we found + if (data) //load external image + { + surf->gltextures[surf->numskins][f] = TexMgr_LoadImage (mod, texname, fwidth, fheight, fmt, data, texname, 0, TEXPREF_ALPHA|TEXPREF_NOBRIGHT|TEXPREF_MIPMAP ); + surf->fbtextures[surf->numskins][f] = NULL; + if (fmt == SRC_INDEXED) + { //8bit base texture. use it for fullbrights. + for (j = 0; j < fwidth*fheight; j++) + { + if (((byte*)data)[j] > 223) + { + surf->fbtextures[surf->numskins][f] = TexMgr_LoadImage (mod, va("%s_luma", texname), fwidth, fheight, fmt, data, texname, 0, TEXPREF_ALPHA|TEXPREF_FULLBRIGHT|TEXPREF_MIPMAP ); + break; + } + } + } + else + { //we found a 32bit base texture. + if (!surf->fbtextures[surf->numskins][f]) + { + q_snprintf(texname, sizeof(texname), "progs/%s_%02u_%02u_glow", com_token, surf->numskins, f); + surf->fbtextures[surf->numskins][f] = TexMgr_LoadImage(mod, texname, surf->skinwidth, surf->skinheight, SRC_EXTERNAL, NULL, texname, 0, TEXPREF_ALLOWMISSING|TEXPREF_MIPMAP); + } + if (!surf->fbtextures[surf->numskins][f]) + { + q_snprintf(texname, sizeof(texname), "progs/%s_%02u_%02u_luma", com_token, surf->numskins, f); + surf->fbtextures[surf->numskins][f] = TexMgr_LoadImage(mod, texname, surf->skinwidth, surf->skinheight, SRC_EXTERNAL, NULL, texname, 0, TEXPREF_ALLOWMISSING|TEXPREF_MIPMAP); + } + } + + //now try to load glow/luma image from the same place + if (malloced) + free(data); + Hunk_FreeToLowMark (mark); + } + else + break; + } + if (f == 0) + break; //no images loaded... + + //this stuff is hideous. + if (f < 2) + { + surf->gltextures[surf->numskins][1] = surf->gltextures[surf->numskins][0]; + surf->fbtextures[surf->numskins][1] = surf->fbtextures[surf->numskins][0]; + } + if (f == 3) + Con_Warning("progs/%s_%02u_##: 3 skinframes found...\n", com_token, surf->numskins); + if (f < 4) + { + surf->gltextures[surf->numskins][3] = surf->gltextures[surf->numskins][1]; + surf->gltextures[surf->numskins][2] = surf->gltextures[surf->numskins][0]; + + surf->fbtextures[surf->numskins][3] = surf->fbtextures[surf->numskins][1]; + surf->fbtextures[surf->numskins][2] = surf->fbtextures[surf->numskins][0]; + } } surf->skinwidth = surf->gltextures[0][0]?surf->gltextures[0][0]->width:1; surf->skinheight = surf->gltextures[0][0]?surf->gltextures[0][0]->height:1;