[models] Remove MAXALIASFRAMES

The dynamic array macros made this much easier than last time I looked
at it, especially when it came to figuring out the bad memory accesses
that I seem to remember from my last attempt 9 years ago.
This commit is contained in:
Bill Currie 2021-01-25 13:31:41 +09:00
parent 7a19be7265
commit d8b81e8678
5 changed files with 44 additions and 53 deletions

View file

@ -28,6 +28,7 @@
#ifndef __QF_model_h
#define __QF_model_h
#include "QF/darray.h"
#include "QF/qtypes.h"
#include "QF/bspfile.h"
#include "QF/spritegn.h"
@ -320,11 +321,13 @@ typedef struct {
maliasframedesc_t frames[1];
} aliashdr_t;
#define MAXALIASFRAMES 256
typedef struct stvertset_s DARRAY_TYPE (stvert_t) stvertset_t;
typedef struct mtriangleset_s DARRAY_TYPE (mtriangle_t) mtriangleset_t;
typedef struct trivertxset_s DARRAY_TYPE (trivertx_t *) trivertxset_t;
extern aliashdr_t *pheader;
extern stvert_t *stverts;
extern mtriangle_t *triangles;
extern trivertx_t *poseverts[MAXALIASFRAMES];
extern stvertset_t stverts;
extern mtriangleset_t triangles;
extern trivertxset_t poseverts;
extern int aliasbboxmins[3];
extern int aliasbboxmaxs[3];

View file

@ -133,7 +133,7 @@ StripLength (int starttri, int startv)
used[starttri] = 2;
last = &triangles[starttri];
last = &triangles.a[starttri];
stripcount = 0;
add_strip (last->vertindex[(startv) % 3], starttri);
@ -145,7 +145,7 @@ StripLength (int starttri, int startv)
// look for a matching triangle
nexttri:
for (j = starttri + 1, check = &triangles[starttri + 1];
for (j = starttri + 1, check = &triangles.a[starttri + 1];
j < pheader->mdl.numtris; j++, check++) {
if (check->facesfront != last->facesfront)
continue;
@ -191,7 +191,7 @@ FanLength (int starttri, int startv)
used[starttri] = 2;
last = &triangles[starttri];
last = &triangles.a[starttri];
stripcount = 0;
add_strip (last->vertindex[(startv) % 3], starttri);
@ -204,7 +204,7 @@ FanLength (int starttri, int startv)
// look for a matching triangle
nexttri:
for (j = starttri + 1, check = &triangles[starttri + 1];
for (j = starttri + 1, check = &triangles.a[starttri + 1];
j < pheader->mdl.numtris; j++, check++) {
if (check->facesfront != last->facesfront)
continue;
@ -304,9 +304,9 @@ BuildTris (void)
add_vertex (k);
// emit s/t coords into the commands stream
s = stverts[k].s;
t = stverts[k].t;
if (!triangles[besttris[0]].facesfront && stverts[k].onseam)
s = stverts.a[k].s;
t = stverts.a[k].t;
if (!triangles.a[besttris[0]].facesfront && stverts.a[k].onseam)
s += pheader->mdl.skinwidth / 2; // on back side
s = (s + 0.5) / pheader->mdl.skinwidth;
t = (t + 0.5) / pheader->mdl.skinheight;
@ -485,9 +485,9 @@ gl_Mod_MakeAliasModelDisplayLists (model_t *m, aliashdr_t *hdr, void *_m,
numorder = 0;
for (i=0; i < pheader->mdl.numtris; i++) {
add_vertex(triangles[i].vertindex[0]);
add_vertex(triangles[i].vertindex[1]);
add_vertex(triangles[i].vertindex[2]);
add_vertex(triangles.a[i].vertindex[0]);
add_vertex(triangles.a[i].vertindex[1]);
add_vertex(triangles.a[i].vertindex[2]);
}
paliashdr->poseverts = numorder;
@ -497,9 +497,9 @@ gl_Mod_MakeAliasModelDisplayLists (model_t *m, aliashdr_t *hdr, void *_m,
float s, t;
int k;
k = vertexorder[i];
s = stverts[k].s;
t = stverts[k].t;
if (!triangles[i/3].facesfront && stverts[k].onseam)
s = stverts.a[k].s;
t = stverts.a[k].t;
if (!triangles.a[i/3].facesfront && stverts.a[k].onseam)
s += pheader->mdl.skinwidth / 2; // on back side
s = (s + 0.5) / pheader->mdl.skinwidth;
t = (t + 0.5) / pheader->mdl.skinheight;
@ -514,7 +514,7 @@ gl_Mod_MakeAliasModelDisplayLists (model_t *m, aliashdr_t *hdr, void *_m,
* sizeof (trivertx16_t));
paliashdr->posedata = (byte *) verts - (byte *) paliashdr;
for (i = 0; i < paliashdr->numposes; i++) {
trivertx_t *pv = poseverts[i];
trivertx_t *pv = poseverts.a[i];
for (j = 0; j < numorder; j++) {
trivertx16_t v;
// convert MD16's split coordinates into something a little
@ -526,7 +526,7 @@ gl_Mod_MakeAliasModelDisplayLists (model_t *m, aliashdr_t *hdr, void *_m,
VectorMultAdd (pv[vertexorder[j] + hdr->mdl.numverts].v,
256, pv[vertexorder[j]].v, v.v);
v.lightnormalindex =
poseverts[i][vertexorder[j]].lightnormalindex;
poseverts.a[i][vertexorder[j]].lightnormalindex;
*verts++ = v;
}
}
@ -537,7 +537,7 @@ gl_Mod_MakeAliasModelDisplayLists (model_t *m, aliashdr_t *hdr, void *_m,
paliashdr->posedata = (byte *) verts - (byte *) paliashdr;
for (i = 0; i < paliashdr->numposes; i++) {
for (j = 0; j < numorder; j++)
*verts++ = poseverts[i][vertexorder[j]];
*verts++ = poseverts.a[i][vertexorder[j]];
}
}
dstring_delete (cache);

View file

@ -147,7 +147,7 @@ glsl_Mod_MakeAliasModelDisplayLists (model_t *m, aliashdr_t *hdr, void *_m,
// copy triangles before editing them
tris = malloc (numtris * sizeof (mtriangle_t));
memcpy (tris, triangles, numtris * sizeof (mtriangle_t));
memcpy (tris, triangles.a, numtris * sizeof (mtriangle_t));
// initialize indexmap to -1 (unduplicated). any other value indicates
// both that the vertex has been duplicated and the index of the
@ -157,7 +157,7 @@ glsl_Mod_MakeAliasModelDisplayLists (model_t *m, aliashdr_t *hdr, void *_m,
// copy stverts. need space for duplicates
st = malloc (2 * numverts * sizeof (stvert_t));
memcpy (st, stverts, numverts * sizeof (stvert_t));
memcpy (st, stverts.a, numverts * sizeof (stvert_t));
// check for onseam verts, and duplicate any that are associated with
// back-facing triangles. the s coordinate is shifted right by half
@ -182,7 +182,7 @@ glsl_Mod_MakeAliasModelDisplayLists (model_t *m, aliashdr_t *hdr, void *_m,
verts = malloc (vertexsize);
for (i = 0, pose = 0; i < hdr->numposes; i++, pose += numverts) {
for (j = 0; j < hdr->mdl.numverts; j++) {
pv = &poseverts[i][j];
pv = &poseverts.a[i][j];
if (extra) {
VectorMultAdd (pv[hdr->mdl.numverts].v, 256, pv->v,
verts[pose + j].vertex);

View file

@ -51,14 +51,12 @@
aliashdr_t *pheader;
stvert_t *stverts;
mtriangle_t *triangles;
int stverts_size = 0;
int triangles_size = 0;
stvertset_t stverts = { 0, 0, 256 };
mtriangleset_t triangles = { 0, 0, 256 };
// a pose is a single set of vertexes. a frame may be an animating
// sequence of poses
trivertx_t *poseverts[MAXALIASFRAMES];
trivertxset_t poseverts = { 0, 0, 256 };;
int posenum = 0;
int aliasbboxmins[3], aliasbboxmaxs[3];
@ -151,7 +149,7 @@ Mod_LoadAliasFrame (void *pin, int *posenum, maliasframedesc_t *frame,
pinframe = (trivertx_t *) (pdaliasframe + 1);
poseverts[(*posenum)] = pinframe;
DARRAY_APPEND (&poseverts, pinframe);
(*posenum)++;
pinframe += pheader->mdl.numverts;
@ -264,30 +262,20 @@ Mod_LoadAliasModel (model_t *mod, void *buffer, cache_allocator_t allocator)
Sys_Error ("model %s has a skin taller than %d", mod->name,
MAX_LBM_HEIGHT);
DARRAY_RESIZE (&poseverts, 0);
pmodel->numverts = LittleLong (pinmodel->numverts);
if (pmodel->numverts <= 0)
Sys_Error ("model %s has no vertices", mod->name);
if (pmodel->numverts > stverts_size) {
stverts = realloc (stverts, pmodel->numverts * sizeof (stvert_t));
if (!stverts)
Sys_Error ("model_alias: out of memory");
stverts_size = pmodel->numverts;
}
DARRAY_RESIZE (&stverts, pmodel->numverts);
pmodel->numtris = LittleLong (pinmodel->numtris);
if (pmodel->numtris <= 0)
Sys_Error ("model %s has no triangles", mod->name);
if (pmodel->numtris > triangles_size) {
triangles = realloc (triangles,
pmodel->numtris * sizeof (mtriangle_t));
if (!triangles)
Sys_Error ("model_alias: out of memory");
triangles_size = pmodel->numtris;
}
DARRAY_RESIZE (&triangles, pmodel->numtris);
pmodel->numframes = LittleLong (pinmodel->numframes);
numframes = pmodel->numframes;
@ -313,19 +301,19 @@ Mod_LoadAliasModel (model_t *mod, void *buffer, cache_allocator_t allocator)
pinstverts = (stvert_t *) pskintype;
for (i = 0; i < pheader->mdl.numverts; i++) {
stverts[i].onseam = LittleLong (pinstverts[i].onseam);
stverts[i].s = LittleLong (pinstverts[i].s);
stverts[i].t = LittleLong (pinstverts[i].t);
stverts.a[i].onseam = LittleLong (pinstverts[i].onseam);
stverts.a[i].s = LittleLong (pinstverts[i].s);
stverts.a[i].t = LittleLong (pinstverts[i].t);
}
// load triangle lists
pintriangles = (dtriangle_t *) &pinstverts[pheader->mdl.numverts];
for (i = 0; i < pheader->mdl.numtris; i++) {
triangles[i].facesfront = LittleLong (pintriangles[i].facesfront);
triangles.a[i].facesfront = LittleLong (pintriangles[i].facesfront);
for (j = 0; j < 3; j++) {
triangles[i].vertindex[j] =
triangles.a[i].vertindex[j] =
LittleLong (pintriangles[i].vertindex[j]);
}
}

View file

@ -79,7 +79,7 @@ process_frame (maliasframedesc_t *frame, int posenum, int extra)
// from the high-order bits (see R_AliasTransformFinalVert16 in
// sw_ralias.c), but in adjacant arrays. This means we can get away with
// just one memcpy as there are no endian issues.
memcpy (frame_verts, poseverts[posenum], size);
memcpy (frame_verts, poseverts.a[posenum], size);
}
void
@ -101,14 +101,14 @@ sw_Mod_MakeAliasModelDisplayLists (model_t *m, aliashdr_t *hdr, void *_m,
hdr->triangles = (byte *) ptri - (byte *) hdr;
for (i = 0; i < numv; i++) {
pstverts[i].onseam = stverts[i].onseam;
pstverts[i].s = stverts[i].s << 16;
pstverts[i].t = stverts[i].t << 16;
pstverts[i].onseam = stverts.a[i].onseam;
pstverts[i].s = stverts.a[i].s << 16;
pstverts[i].t = stverts.a[i].t << 16;
}
for (i = 0; i < numt; i++) {
ptri[i].facesfront = triangles[i].facesfront;
VectorCopy (triangles[i].vertindex, ptri[i].vertindex);
ptri[i].facesfront = triangles.a[i].facesfront;
VectorCopy (triangles.a[i].vertindex, ptri[i].vertindex);
}
for (i = 0; i < pheader->mdl.numframes; i++) {