mirror of
https://git.code.sf.net/p/quake/quakeforge
synced 2025-06-02 09:31:12 +00:00
Merge sw and sw32 alias frame selection.
I'm leaving GL for later because lerping complicates things. I'll sort it out when I implement lerping in GLSL.
This commit is contained in:
parent
1c480bf75e
commit
72e3a8d507
5 changed files with 49 additions and 82 deletions
|
@ -279,15 +279,9 @@ typedef struct {
|
||||||
} maliasskindesc_t;
|
} maliasskindesc_t;
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
trivertx_t bboxmin;
|
int numframes;
|
||||||
trivertx_t bboxmax;
|
int intervals;
|
||||||
int frame;
|
maliasframedesc_t frames[1];
|
||||||
} maliasgroupframedesc_t;
|
|
||||||
|
|
||||||
typedef struct {
|
|
||||||
int numframes;
|
|
||||||
int intervals;
|
|
||||||
maliasgroupframedesc_t frames[1];
|
|
||||||
} maliasgroup_t;
|
} maliasgroup_t;
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
|
|
|
@ -187,7 +187,8 @@ void R_DrawSolidClippedSubmodelPolygons (model_t *pmodel);
|
||||||
void R_AddPolygonEdges (emitpoint_t *pverts, int numverts, int miplevel);
|
void R_AddPolygonEdges (emitpoint_t *pverts, int numverts, int miplevel);
|
||||||
surf_t *R_GetSurf (void);
|
surf_t *R_GetSurf (void);
|
||||||
void R_AliasDrawModel (alight_t *plighting);
|
void R_AliasDrawModel (alight_t *plighting);
|
||||||
maliasskindesc_t *R_AliasGetSkindesc (int skinnum, aliashdr_t *ahdr);
|
maliasskindesc_t *R_AliasGetSkindesc (int skinnum, aliashdr_t *hdr);
|
||||||
|
maliasframedesc_t *R_AliasGetFramedesc (int framenum, aliashdr_t *hdr);
|
||||||
void R_BeginEdgeFrame (void);
|
void R_BeginEdgeFrame (void);
|
||||||
void R_ScanEdges (void);
|
void R_ScanEdges (void);
|
||||||
void D_DrawSurfaces (void);
|
void D_DrawSurfaces (void);
|
||||||
|
|
|
@ -77,3 +77,41 @@ R_AliasGetSkindesc (int skinnum, aliashdr_t *ahdr)
|
||||||
|
|
||||||
return pskindesc;
|
return pskindesc;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
VISIBLE maliasframedesc_t *
|
||||||
|
R_AliasGetFramedesc (int framenum, aliashdr_t *hdr)
|
||||||
|
{
|
||||||
|
float *intervals;
|
||||||
|
float fullinterval, time, targettime;
|
||||||
|
maliasframedesc_t *frame;
|
||||||
|
maliasgroup_t *group;
|
||||||
|
int numframes;
|
||||||
|
int i;
|
||||||
|
|
||||||
|
if ((framenum >= hdr->mdl.numframes) || (framenum < 0)) {
|
||||||
|
Sys_MaskPrintf (SYS_DEV, "R_AliasSetupFrame: no such frame %d\n",
|
||||||
|
framenum);
|
||||||
|
framenum = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
frame = &hdr->frames[framenum];
|
||||||
|
if (frame->type == ALIAS_SINGLE)
|
||||||
|
return frame;
|
||||||
|
|
||||||
|
group = (maliasgroup_t *) ((byte *) hdr + frame->frame);
|
||||||
|
intervals = (float *) ((byte *) hdr + group->intervals);
|
||||||
|
numframes = group->numframes;
|
||||||
|
fullinterval = intervals[numframes - 1];
|
||||||
|
|
||||||
|
time = r_realtime + currententity->syncbase;
|
||||||
|
|
||||||
|
// when loading in Mod_LoadAliasGroup, we guaranteed all interval values
|
||||||
|
// are positive, so we don't have to worry about division by 0
|
||||||
|
targettime = time - ((int) (time / fullinterval)) * fullinterval;
|
||||||
|
|
||||||
|
for (i = 0; i < (numframes - 1); i++) {
|
||||||
|
if (intervals[i] > targettime)
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
return &group->frames[i];
|
||||||
|
}
|
||||||
|
|
|
@ -613,43 +613,10 @@ R_AliasSetupLighting (alight_t *plighting)
|
||||||
static void
|
static void
|
||||||
R_AliasSetupFrame (void)
|
R_AliasSetupFrame (void)
|
||||||
{
|
{
|
||||||
int frame, numframes, i;
|
maliasframedesc_t *frame;
|
||||||
float fullinterval, targettime, time;
|
|
||||||
float *pintervals;
|
|
||||||
maliasgroup_t *paliasgroup;
|
|
||||||
|
|
||||||
frame = currententity->frame;
|
frame = R_AliasGetFramedesc (currententity->frame, paliashdr);
|
||||||
if ((frame >= pmdl->numframes) || (frame < 0)) {
|
r_apverts = (trivertx_t *) ((byte *) paliashdr + frame->frame);
|
||||||
Sys_MaskPrintf (SYS_DEV, "R_AliasSetupFrame: no such frame %d\n",
|
|
||||||
frame);
|
|
||||||
frame = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (paliashdr->frames[frame].type == ALIAS_SINGLE) {
|
|
||||||
r_apverts = (trivertx_t *)
|
|
||||||
((byte *) paliashdr + paliashdr->frames[frame].frame);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
paliasgroup = (maliasgroup_t *)
|
|
||||||
((byte *) paliashdr + paliashdr->frames[frame].frame);
|
|
||||||
pintervals = (float *) ((byte *) paliashdr + paliasgroup->intervals);
|
|
||||||
numframes = paliasgroup->numframes;
|
|
||||||
fullinterval = pintervals[numframes - 1];
|
|
||||||
|
|
||||||
time = r_realtime + currententity->syncbase;
|
|
||||||
|
|
||||||
// when loading in Mod_LoadAliasGroup, we guaranteed all interval values
|
|
||||||
// are positive, so we don't have to worry about division by 0
|
|
||||||
targettime = time - ((int) (time / fullinterval)) * fullinterval;
|
|
||||||
|
|
||||||
for (i = 0; i < (numframes - 1); i++) {
|
|
||||||
if (pintervals[i] > targettime)
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
r_apverts = (trivertx_t *)
|
|
||||||
((byte *) paliashdr + paliasgroup->frames[i].frame);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -606,43 +606,10 @@ R_AliasSetupLighting (alight_t *plighting)
|
||||||
static void
|
static void
|
||||||
R_AliasSetupFrame (void)
|
R_AliasSetupFrame (void)
|
||||||
{
|
{
|
||||||
int frame;
|
maliasframedesc_t *frame;
|
||||||
int i, numframes;
|
|
||||||
maliasgroup_t *paliasgroup;
|
|
||||||
float *pintervals, fullinterval, targettime, time;
|
|
||||||
|
|
||||||
frame = currententity->frame;
|
frame = R_AliasGetFramedesc (currententity->frame, paliashdr);
|
||||||
if ((frame >= pmdl->numframes) || (frame < 0)) {
|
r_apverts = (trivertx_t *) ((byte *) paliashdr + frame->frame);
|
||||||
Sys_MaskPrintf (SYS_DEV, "R_AliasSetupFrame: no such frame %d\n",
|
|
||||||
frame);
|
|
||||||
frame = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (paliashdr->frames[frame].type == ALIAS_SINGLE) {
|
|
||||||
r_apverts = (trivertx_t *)
|
|
||||||
((byte *) paliashdr + paliashdr->frames[frame].frame);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
paliasgroup = (maliasgroup_t *)
|
|
||||||
((byte *) paliashdr + paliashdr->frames[frame].frame);
|
|
||||||
pintervals = (float *) ((byte *) paliashdr + paliasgroup->intervals);
|
|
||||||
numframes = paliasgroup->numframes;
|
|
||||||
fullinterval = pintervals[numframes - 1];
|
|
||||||
|
|
||||||
time = r_realtime + currententity->syncbase;
|
|
||||||
|
|
||||||
// when loading in Mod_LoadAliasGroup, we guaranteed all interval values
|
|
||||||
// are positive, so we don't have to worry about division by 0
|
|
||||||
targettime = time - ((int) (time / fullinterval)) * fullinterval;
|
|
||||||
|
|
||||||
for (i = 0; i < (numframes - 1); i++) {
|
|
||||||
if (pintervals[i] > targettime)
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
r_apverts = (trivertx_t *)
|
|
||||||
((byte *) paliashdr + paliasgroup->frames[i].frame);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue