From d8b81e86787ec19a6d4dc1e92cecb5fb5768fbea Mon Sep 17 00:00:00 2001 From: Bill Currie Date: Mon, 25 Jan 2021 13:31:41 +0900 Subject: [PATCH] [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. --- include/QF/model.h | 11 +++++---- libs/models/alias/gl_mesh.c | 32 ++++++++++++------------- libs/models/alias/glsl_model_alias.c | 6 ++--- libs/models/alias/model_alias.c | 36 ++++++++++------------------ libs/models/alias/sw_model_alias.c | 12 +++++----- 5 files changed, 44 insertions(+), 53 deletions(-) diff --git a/include/QF/model.h b/include/QF/model.h index 8d0129721..703d11227 100644 --- a/include/QF/model.h +++ b/include/QF/model.h @@ -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]; diff --git a/libs/models/alias/gl_mesh.c b/libs/models/alias/gl_mesh.c index 22498ddea..c55225057 100644 --- a/libs/models/alias/gl_mesh.c +++ b/libs/models/alias/gl_mesh.c @@ -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); diff --git a/libs/models/alias/glsl_model_alias.c b/libs/models/alias/glsl_model_alias.c index 215c9d400..cb612e962 100644 --- a/libs/models/alias/glsl_model_alias.c +++ b/libs/models/alias/glsl_model_alias.c @@ -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); diff --git a/libs/models/alias/model_alias.c b/libs/models/alias/model_alias.c index 8a4784b2d..c5018f929 100644 --- a/libs/models/alias/model_alias.c +++ b/libs/models/alias/model_alias.c @@ -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]); } } diff --git a/libs/models/alias/sw_model_alias.c b/libs/models/alias/sw_model_alias.c index b252ad474..e021278a4 100644 --- a/libs/models/alias/sw_model_alias.c +++ b/libs/models/alias/sw_model_alias.c @@ -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++) {