HL2: attempt to find all the valid texture directories for mdl

This commit is contained in:
Marco Cawthorne 2024-11-22 17:31:52 -08:00
parent 6e57500c15
commit 7c50a8a269

View file

@ -13,6 +13,7 @@
static plugfsfuncs_t *filefuncs; static plugfsfuncs_t *filefuncs;
static plugmodfuncs_t *modfuncs; static plugmodfuncs_t *modfuncs;
static plugfsfuncs_t *fsfuncs;
//Utility functions. silly plugins. //Utility functions. silly plugins.
float Length(const vec3_t v) {return sqrt(DotProduct(v,v));} float Length(const vec3_t v) {return sqrt(DotProduct(v,v));}
@ -422,7 +423,7 @@ static index_t *Mod_HL2_LoadIndexes(hl2parsecontext_t *ctx, unsigned int *idxcou
static qboolean Mod_HL2_LoadVTX(hl2parsecontext_t *ctx, const void *buffer, size_t fsize) static qboolean Mod_HL2_LoadVTX(hl2parsecontext_t *ctx, const void *buffer, size_t fsize)
{ //horribly overcomplicated way to express this stuff. { //horribly overcomplicated way to express this stuff.
const hl2mdlheader_t *mdl = ctx->header; const hl2mdlheader_t *mdl = ctx->header;
size_t totalsurfs = 0, b, s, l, m, t; size_t totalsurfs = 0, b, s, l, m, t, z;
const hl2vtxheader_t *header = buffer; const hl2vtxheader_t *header = buffer;
const hl2vtxbody_t *vbody; const hl2vtxbody_t *vbody;
const hl2vtxsurf_t *vsurf; const hl2vtxsurf_t *vsurf;
@ -473,16 +474,26 @@ static qboolean Mod_HL2_LoadVTX(hl2parsecontext_t *ctx, const void *buffer, size
m = *skinbind++; m = *skinbind++;
if (mdl->texpath_count) if (mdl->texpath_count)
{ {
const hl2mdltexturepath_t *mpath = (const hl2mdltexturepath_t*)((const qbyte*)mdl + mdl->texpath_ofs); for (z = 0; z < mdl->texpath_count; z++) {
Q_strlcpy(skinframe->shadername, (const char*)mdl+mpath->nameofs, sizeof(skinframe->shadername)); char fsTest[MAX_QPATH];
const hl2mdltexturepath_t *mpath = (const hl2mdltexturepath_t*)((const qbyte*)mdl + mdl->texpath_ofs + sizeof(hl2mdltexturepath_t) * z);
Q_strlcpy(skinframe->shadername, (const char*)mdl+mpath->nameofs, sizeof(skinframe->shadername));
Q_strlcat(skinframe->shadername, (const char*)&mtex[m]+mtex[m].nameofs, sizeof(skinframe->shadername));
Q_strlcat(skinframe->shadername, ".vmt", sizeof(skinframe->shadername));
Q_snprintfz(fsTest, sizeof(fsTest), "materials\\%s", skinframe->shadername);
if (fsfuncs->LocateFile(fsTest, FSLF_IFFOUND, NULL)) {
break;
}
}
} }
else else
{ {
modfuncs->StripExtension((const char*)ctx->mod->name, skinframe->shadername, sizeof(skinframe->shadername)); modfuncs->StripExtension((const char*)ctx->mod->name, skinframe->shadername, sizeof(skinframe->shadername));
Q_strlcat(skinframe->shadername, "/", sizeof(skinframe->shadername)); Q_strlcat(skinframe->shadername, "/", sizeof(skinframe->shadername));
Q_strlcat(skinframe->shadername, (const char*)&mtex[m]+mtex[m].nameofs, sizeof(skinframe->shadername));
Q_strlcat(skinframe->shadername, ".vmt", sizeof(skinframe->shadername));
} }
Q_strlcat(skinframe->shadername, (const char*)&mtex[m]+mtex[m].nameofs, sizeof(skinframe->shadername));
Q_strlcat(skinframe->shadername, ".vmt", sizeof(skinframe->shadername));
ns->numframes = 1; //no skingroups... not that kind anyway. ns->numframes = 1; //no skingroups... not that kind anyway.
ns->skinspeed = 10; ns->skinspeed = 10;
@ -1008,6 +1019,7 @@ qboolean MDL_Init(void)
filefuncs = plugfuncs->GetEngineInterface(plugfsfuncs_name, sizeof(*filefuncs)); filefuncs = plugfuncs->GetEngineInterface(plugfsfuncs_name, sizeof(*filefuncs));
modfuncs = plugfuncs->GetEngineInterface(plugmodfuncs_name, sizeof(*modfuncs)); modfuncs = plugfuncs->GetEngineInterface(plugmodfuncs_name, sizeof(*modfuncs));
cmdfuncs = plugfuncs->GetEngineInterface(plugcmdfuncs_name, sizeof(*cmdfuncs)); cmdfuncs = plugfuncs->GetEngineInterface(plugcmdfuncs_name, sizeof(*cmdfuncs));
fsfuncs = plugfuncs->GetEngineInterface(plugfsfuncs_name, sizeof(*fsfuncs));
if (modfuncs && modfuncs->version != MODPLUGFUNCS_VERSION) if (modfuncs && modfuncs->version != MODPLUGFUNCS_VERSION)
modfuncs = NULL; modfuncs = NULL;