Add External Texture hack from dquakeplus

Makes .TGA and .PCX loading for models and sprites work finally
This commit is contained in:
Ian 2022-12-21 13:28:34 -05:00
parent 1d1db3ab2a
commit 0a2aa8795a
2 changed files with 37 additions and 27 deletions

View file

@ -2250,7 +2250,12 @@ byte* loadimagepixels (char* filename, qboolean complain, int matchwidth, int ma
FILE *f; FILE *f;
char basename[128], name[132]; char basename[128], name[132];
byte *c; byte *c;
COM_StripExtension(filename, basename); // strip the extension to allow TGA
if (complain == qfalse)
COM_StripExtension(filename, basename); // strip the extension to allow TGA
else
strcpy(basename, filename);
c = (byte*)basename; c = (byte*)basename;
while (*c) while (*c)
{ {
@ -2258,6 +2263,7 @@ byte* loadimagepixels (char* filename, qboolean complain, int matchwidth, int ma
*c = '+'; *c = '+';
c++; c++;
} }
//Try TGA //Try TGA
sprintf (name, "%s.tga", basename); sprintf (name, "%s.tga", basename);
COM_FOpenFile (name, &f); COM_FOpenFile (name, &f);
@ -2269,8 +2275,8 @@ byte* loadimagepixels (char* filename, qboolean complain, int matchwidth, int ma
if (f) if (f)
return LoadPCX (f, matchwidth, matchheight); return LoadPCX (f, matchwidth, matchheight);
if (complain) //if (complain)
Con_Printf ("Couldn't load %s.tga or %s.pcx \n", filename); // Con_Printf ("Couldn't load %s.tga or %s.pcx \n", filename);
return NULL; return NULL;
} }

View file

@ -1624,7 +1624,7 @@ Mod_LoadAllSkins
void *Mod_LoadAllSkins (int numskins, daliasskintype_t *pskintype) void *Mod_LoadAllSkins (int numskins, daliasskintype_t *pskintype)
{ {
int i, j, k; int i, j, k;
char name[32]; char name[32], model[64], model2[64];
int s; int s;
byte *copy; byte *copy;
byte *skin; byte *skin;
@ -1644,35 +1644,30 @@ void *Mod_LoadAllSkins (int numskins, daliasskintype_t *pskintype)
{ {
if (pskintype->type == ALIAS_SKIN_SINGLE) { if (pskintype->type == ALIAS_SKIN_SINGLE) {
Mod_FloodFillSkin( skin, pheader->skinwidth, pheader->skinheight ); Mod_FloodFillSkin( skin, pheader->skinwidth, pheader->skinheight );
COM_StripExtension(loadmodel->name, model);
texels = Hunk_AllocName(s, loadname); texels = Hunk_AllocName(s, loadname);
pheader->texels[i] = texels - (byte *)pheader; pheader->texels[i] = texels - (byte *)pheader;
memcpy (texels, (byte *)(pskintype + 1), s); memcpy (texels, (byte *)(pskintype + 1), s);
//spike - external model textures with dp naming -- eg progs/foo.mdl_0.tga // HACK HACK HACK
//always use the alpha channel for external images. gpus prefer aligned data anyway. sprintf(model2, "%s.mdl_%i", model, i);
char filename[MAX_QPATH];
byte *data;
int fwidth = 0, fheight = 0;
qboolean malloced=false;
q_snprintf (filename, sizeof(filename), "%s_%i", loadmodel->name, i);
data = loadtextureimage(filename, 0, 0, qfalse, qfalse);
if (data) {
pheader->gl_texturenum[i][0] =
GL_LoadTexture (filename, pheader->skinwidth,
pheader->skinheight, (byte *)(pskintype + 1), true, false, 1);
pskintype = (daliasskintype_t *)((byte *)(pskintype+1) + s);
} else {
sprintf (name, "%s_%i", loadmodel->name, i);
pheader->gl_texturenum[i][0] = pheader->gl_texturenum[i][0] =
pheader->gl_texturenum[i][1] = pheader->gl_texturenum[i][1] =
pheader->gl_texturenum[i][2] = pheader->gl_texturenum[i][2] =
pheader->gl_texturenum[i][3] = pheader->gl_texturenum[i][3] = loadtextureimage(model2, 0, 0, qtrue, qtrue);
GL_LoadTexture (name, pheader->skinwidth,
pheader->skinheight, (byte *)(pskintype + 1), true, false, 1); if (pheader->gl_texturenum[i][0] == 0) // did not find a matching TGA...
pskintype = (daliasskintype_t *)((byte *)(pskintype+1) + s); {
sprintf(name, "%s_%i", loadmodel->name, i);
pheader->gl_texturenum[i][0] =
pheader->gl_texturenum[i][1] =
pheader->gl_texturenum[i][2] =
pheader->gl_texturenum[i][3] = GL_LoadTexture (name, pheader->skinwidth,
pheader->skinheight, (byte *)(pskintype + 1), true, false, 1);
} }
pskintype = (daliasskintype_t *)((byte *)(pskintype+1) + s);
} else { } else {
// animating skin group. yuck. // animating skin group. yuck.
pskintype++; pskintype++;
@ -1916,7 +1911,7 @@ void * Mod_LoadSpriteFrame (void * pin, mspriteframe_t **ppframe, int framenum)
int i, width, height, size, origin[2]; int i, width, height, size, origin[2];
unsigned short *ppixout; unsigned short *ppixout;
byte *ppixin; byte *ppixin;
char name[64]; char name[64], sprite[64], sprite2[64];
pinframe = (dspriteframe_t *)pin; pinframe = (dspriteframe_t *)pin;
@ -1940,8 +1935,17 @@ void * Mod_LoadSpriteFrame (void * pin, mspriteframe_t **ppframe, int framenum)
pspriteframe->left = origin[0]; pspriteframe->left = origin[0];
pspriteframe->right = width + origin[0]; pspriteframe->right = width + origin[0];
sprintf (name, "%s_%i", loadmodel->name, framenum); // HACK HACK HACK
pspriteframe->gl_texturenum = GL_LoadTexture (name, width, height, (byte *)(pinframe + 1), true, true, 1); sprintf (name, "%s.spr_%i", loadmodel->name, framenum);
COM_StripExtension(loadmodel->name, sprite);
sprintf(sprite2, "%s.spr_%i", sprite, framenum);
pspriteframe->gl_texturenum = loadtextureimage(sprite2, 0, 0, qtrue, qtrue);
if (pspriteframe->gl_texturenum == 0) // did not find a matching TGA...
{
pspriteframe->gl_texturenum = GL_LoadTexture (name, width, height, (byte *)(pinframe + 1), true, true, 1);
}
return (void *)((byte *)pinframe + sizeof (dspriteframe_t) + size); return (void *)((byte *)pinframe + sizeof (dspriteframe_t) + size);
} }