GL alias model meshes are now doubly protected from corruption and model

mismatch. First, the md4 checksum is stored in the mesh, and the md4 checksum
of the mesh and the model checksum are also stored. If, on loading, either
checksum fails, the model is re-meshed.

include/mdfour.h:
	Add define for MDFOUR_DIGEST_BYTES
source/.gdbinit
	setrom _windowed_mouse 0 so mods don't make debugging difficult
source/model_alias.c:
	pass original model data and size to GL_MakeAliasModelDisplayLists
source/sw_model_alias.c:
	GL_MakeAliasModelDisplayLists take (but ignore) new params
source/gl_mesh.c:
	do md4 checksums on the model and mesh
This commit is contained in:
Bill Currie 2001-01-15 06:50:59 +00:00
parent 7d8fb5901e
commit 26a2d6a3de
5 changed files with 56 additions and 10 deletions

View file

@ -32,6 +32,8 @@
#include "uint32.h" #include "uint32.h"
#define MDFOUR_DIGEST_BYTES 16
struct mdfour { struct mdfour {
uint32 A, B, C, D; uint32 A, B, C, D;
uint32 totalN; uint32 totalN;

View file

@ -1 +1 @@
set args -nocdaudio +set _windowed_mouse 0 +set gl_sky_clip 1 +set show_fps 1 set args -nocdaudio +setrom _windowed_mouse 0 +set gl_sky_clip 1 +set show_fps 1

View file

@ -39,6 +39,7 @@
#include <stdio.h> #include <stdio.h>
#include "console.h" #include "console.h"
#include "mdfour.h"
#include "model.h" #include "model.h"
#include "quakefs.h" #include "quakefs.h"
@ -301,17 +302,22 @@ GL_MakeAliasModelDisplayLists
================ ================
*/ */
void void
GL_MakeAliasModelDisplayLists (model_t *m, aliashdr_t *hdr) GL_MakeAliasModelDisplayLists (model_t *m, aliashdr_t *hdr, void *_m, int _s)
{ {
int i, j; int i, j;
int *cmds; int *cmds;
trivertx_t *verts; trivertx_t *verts;
char cache[MAX_QPATH], fullpath[MAX_OSPATH]; char cache[MAX_QPATH], fullpath[MAX_OSPATH];
QFile *f; QFile *f;
unsigned char model_digest[MDFOUR_DIGEST_BYTES];
unsigned char mesh_digest[MDFOUR_DIGEST_BYTES];
qboolean remesh = true;
aliasmodel = m; aliasmodel = m;
paliashdr = hdr; // (aliashdr_t *)Mod_Extradata (m); paliashdr = hdr; // (aliashdr_t *)Mod_Extradata (m);
mdfour (model_digest, (unsigned char*)_m, _s);
// //
// look for a cached version // look for a cached version
// //
@ -322,12 +328,37 @@ GL_MakeAliasModelDisplayLists (model_t *m, aliashdr_t *hdr)
COM_FOpenFile (cache, &f); COM_FOpenFile (cache, &f);
if (f) { if (f) {
Qread (f, &numcommands, 4); unsigned char d1[MDFOUR_DIGEST_BYTES];
Qread (f, &numorder, 4); unsigned char d2[MDFOUR_DIGEST_BYTES];
Qread (f, &commands, numcommands * sizeof (commands[0])); struct mdfour md;
Qread (f, &vertexorder, numorder * sizeof (vertexorder[0])); int nc;
int no;
memset (d1, 0, sizeof (d1));
memset (d2, 0, sizeof (d2));
Qread (f, &nc, 4);
Qread (f, &no, 4);
Qread (f, &commands, nc * sizeof (commands[0]));
Qread (f, &vertexorder, no * sizeof (vertexorder[0]));
Qread (f, d1, MDFOUR_DIGEST_BYTES);
Qread (f, d2, MDFOUR_DIGEST_BYTES);
Qclose (f); Qclose (f);
} else {
mdfour_begin (&md);
mdfour_update (&md, (unsigned char*)&nc, 4);
mdfour_update (&md, (unsigned char*)&no, 4);
mdfour_update (&md, (unsigned char*)&commands, nc * sizeof (commands[0]));
mdfour_update (&md, (unsigned char*)&vertexorder, no * sizeof (vertexorder[0]));
mdfour_update (&md, d1, MDFOUR_DIGEST_BYTES);
mdfour_result (&md, mesh_digest);
if (memcmp (d2, mesh_digest, MDFOUR_DIGEST_BYTES) == 0 && memcmp (d1, model_digest, MDFOUR_DIGEST_BYTES) == 0) {
remesh = false;
numcommands = nc;
numorder = no;
}
}
if (remesh) {
// //
// build it from scratch // build it from scratch
// //
@ -346,10 +377,23 @@ GL_MakeAliasModelDisplayLists (model_t *m, aliashdr_t *hdr)
} }
if (f) { if (f) {
struct mdfour md;
mdfour_begin (&md);
mdfour_update (&md, (unsigned char*)&numcommands, 4);
mdfour_update (&md, (unsigned char*)&numorder, 4);
mdfour_update (&md, (unsigned char*)&commands, numcommands * sizeof (commands[0]));
mdfour_update (&md, (unsigned char*)&vertexorder,
numorder * sizeof (vertexorder[0]));
mdfour_update (&md, model_digest, MDFOUR_DIGEST_BYTES);
mdfour_result (&md, mesh_digest);
Qwrite (f, &numcommands, 4); Qwrite (f, &numcommands, 4);
Qwrite (f, &numorder, 4); Qwrite (f, &numorder, 4);
Qwrite (f, &commands, numcommands * sizeof (commands[0])); Qwrite (f, &commands, numcommands * sizeof (commands[0]));
Qwrite (f, &vertexorder, numorder * sizeof (vertexorder[0])); Qwrite (f, &vertexorder, numorder * sizeof (vertexorder[0]));
Qwrite (f, model_digest, MDFOUR_DIGEST_BYTES);
Qwrite (f, mesh_digest, MDFOUR_DIGEST_BYTES);
Qclose (f); Qclose (f);
} }
} }

View file

@ -57,7 +57,7 @@ extern model_t *loadmodel;
void *Mod_LoadAllSkins (int numskins, daliasskintype_t *pskintype, void *Mod_LoadAllSkins (int numskins, daliasskintype_t *pskintype,
int *pskinindex); int *pskinindex);
void GL_MakeAliasModelDisplayLists (model_t *m, aliashdr_t *hdr); void GL_MakeAliasModelDisplayLists (model_t *m, aliashdr_t *hdr, void *model, int size);
/* /*
============================================================================== ==============================================================================
@ -254,7 +254,7 @@ Mod_LoadAliasModel (model_t *mod, void *buffer)
// //
// build the draw lists // build the draw lists
// //
GL_MakeAliasModelDisplayLists (mod, pheader); GL_MakeAliasModelDisplayLists (mod, pheader, buffer, com_filesize);
// //
// move the complete, relocatable alias model to the cache // move the complete, relocatable alias model to the cache

View file

@ -169,7 +169,7 @@ Mod_LoadAllSkins (int numskins, daliasskintype_t *pskintype, int *pskinindex)
} }
void void
GL_MakeAliasModelDisplayLists (model_t *m, aliashdr_t *hdr) GL_MakeAliasModelDisplayLists (model_t *m, aliashdr_t *hdr, void *_m, int _s)
{ {
int i, j; int i, j;
stvert_t *pstverts; stvert_t *pstverts;