mirror of
https://git.code.sf.net/p/quake/quakeforge
synced 2025-03-21 09:51:41 +00:00
[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:
parent
7a19be7265
commit
d8b81e8678
5 changed files with 44 additions and 53 deletions
|
@ -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];
|
||||
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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]);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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++) {
|
||||
|
|
Loading…
Reference in a new issue