diff --git a/src/client/refresh/files/models.c b/src/client/refresh/files/models.c index 11bb55c2..d9fb1f96 100644 --- a/src/client/refresh/files/models.c +++ b/src/client/refresh/files/models.c @@ -1439,7 +1439,35 @@ Mod_LoadFileWithoutExt(const char *namewe, void **buffer, const char* ext) filesize = ri.FS_LoadFile(newname, buffer); if (filesize > 0) { - return filesize; + int fullsize, filesize_anim; + char *final_buffer = NULL; + void *anim_buffer = NULL; + + Q_strlcpy(newname, namewe, sizeof(newname)); + Q_strlcat(newname, ".md5anim", sizeof(newname)); + filesize_anim = ri.FS_LoadFile(newname, &anim_buffer); + + if (filesize_anim <= 0) + { + return filesize; + } + + fullsize = filesize + filesize_anim + 1; + + /* allocate new buffer, ERR_FATAL on alloc fail */ + final_buffer = ri.FS_AllocFile(fullsize); + + /* copy combined information */ + memcpy(final_buffer, *buffer, filesize); + final_buffer[filesize] = 0; + memcpy(final_buffer + filesize + 1, anim_buffer, filesize_anim); + + /* Remove old buffers */ + ri.FS_FreeFile(anim_buffer); + ri.FS_FreeFile(*buffer); + + *buffer = final_buffer; + return fullsize; } /* Check Heretic2 model */ diff --git a/src/client/vid/header/ref.h b/src/client/vid/header/ref.h index b9c27295..fa29e587 100644 --- a/src/client/vid/header/ref.h +++ b/src/client/vid/header/ref.h @@ -233,6 +233,7 @@ typedef struct // NULL can be passed for buf to just determine existance int (IMPORT *FS_LoadFile) (const char *name, void **buf); void (IMPORT *FS_FreeFile) (void *buf); + void *(IMPORT *FS_AllocFile) (int size); // gamedir will be the current directory that generated // files should be stored to, ie: "f:\quake\id1" diff --git a/src/client/vid/vid.c b/src/client/vid/vid.c index 4ba4c071..8d091ada 100644 --- a/src/client/vid/vid.c +++ b/src/client/vid/vid.c @@ -438,6 +438,7 @@ VID_LoadRenderer(void) ri.FS_FreeFile = FS_FreeFile; ri.FS_Gamedir = FS_Gamedir; ri.FS_LoadFile = FS_LoadFile; + ri.FS_AllocFile = Z_Malloc; ri.GLimp_InitGraphics = GLimp_InitGraphics; ri.GLimp_GetDesktopMode = GLimp_GetDesktopMode; ri.Sys_Error = Com_Error;