make sure .framegroups can't use poses out of bounds.
git-svn-id: https://svn.code.sf.net/p/fteqw/code/trunk@4661 fc73d0e0-1445-4013-8a0c-d673dee63da5
This commit is contained in:
parent
7cfaa1a6ef
commit
9d97715782
1 changed files with 16 additions and 5 deletions
|
@ -2225,8 +2225,8 @@ void Mod_CompileTriangleNeighbours(galiasinfo_t *galias)
|
||||||
|
|
||||||
typedef struct
|
typedef struct
|
||||||
{
|
{
|
||||||
int firstpose;
|
unsigned int firstpose;
|
||||||
int posecount;
|
unsigned int posecount;
|
||||||
float fps;
|
float fps;
|
||||||
qboolean loop;
|
qboolean loop;
|
||||||
char name[MAX_QPATH];
|
char name[MAX_QPATH];
|
||||||
|
@ -5346,7 +5346,15 @@ qboolean QDECL Mod_LoadPSKModel(model_t *mod, void *buffer, size_t fsize)
|
||||||
animmatrix = (float*)(group+numgroups);
|
animmatrix = (float*)(group+numgroups);
|
||||||
for (j = 0; j < numgroups; j++)
|
for (j = 0; j < numgroups; j++)
|
||||||
{
|
{
|
||||||
//FIXME: bound check
|
/*bound check*/
|
||||||
|
if (frameinfo[j].firstpose+frameinfo[j].posecount > num_animkeys)
|
||||||
|
frameinfo[j].posecount = num_animkeys - frameinfo[j].firstpose;
|
||||||
|
if (frameinfo[j].firstpose >= num_animkeys)
|
||||||
|
{
|
||||||
|
frameinfo[j].firstpose = 0;
|
||||||
|
frameinfo[j].posecount = 1;
|
||||||
|
}
|
||||||
|
|
||||||
group[j].boneofs = animmatrix + 12*num_boneinfo*frameinfo[j].firstpose;
|
group[j].boneofs = animmatrix + 12*num_boneinfo*frameinfo[j].firstpose;
|
||||||
group[j].numposes = frameinfo[j].posecount;
|
group[j].numposes = frameinfo[j].posecount;
|
||||||
if (*frameinfo[j].name)
|
if (*frameinfo[j].name)
|
||||||
|
@ -6277,9 +6285,11 @@ galiasinfo_t *Mod_ParseIQMMeshModel(model_t *mod, char *buffer)
|
||||||
//now generate the animations.
|
//now generate the animations.
|
||||||
for (i = 0; i < numgroups; i++)
|
for (i = 0; i < numgroups; i++)
|
||||||
{
|
{
|
||||||
if ((unsigned)framegroups[i].firstpose >= h->num_frames)
|
if (framegroups[i].firstpose + framegroups[i].posecount > h->num_frames)
|
||||||
|
framegroups[i].posecount = h->num_frames - framegroups[i].firstpose;
|
||||||
|
if (framegroups[i].firstpose >= h->num_frames)
|
||||||
{
|
{
|
||||||
//invalid/basepose
|
//invalid/basepose.
|
||||||
fgroup[i].skeltype = SKEL_ABSOLUTE;
|
fgroup[i].skeltype = SKEL_ABSOLUTE;
|
||||||
fgroup[i].boneofs = oposebase;
|
fgroup[i].boneofs = oposebase;
|
||||||
fgroup[i].numposes = 1;
|
fgroup[i].numposes = 1;
|
||||||
|
@ -6290,6 +6300,7 @@ galiasinfo_t *Mod_ParseIQMMeshModel(model_t *mod, char *buffer)
|
||||||
fgroup[i].boneofs = opose + framegroups[i].firstpose*12*h->num_poses;
|
fgroup[i].boneofs = opose + framegroups[i].firstpose*12*h->num_poses;
|
||||||
fgroup[i].numposes = framegroups[i].posecount;
|
fgroup[i].numposes = framegroups[i].posecount;
|
||||||
}
|
}
|
||||||
|
|
||||||
fgroup[i].loop = framegroups[i].loop;
|
fgroup[i].loop = framegroups[i].loop;
|
||||||
fgroup[i].rate = framegroups[i].fps;
|
fgroup[i].rate = framegroups[i].fps;
|
||||||
Q_strncpyz(fgroup[i].name, framegroups[i].name, sizeof(fgroup[i].name));
|
Q_strncpyz(fgroup[i].name, framegroups[i].name, sizeof(fgroup[i].name));
|
||||||
|
|
Loading…
Reference in a new issue