mirror of
https://github.com/ZDoom/raze-gles.git
synced 2024-11-11 07:11:39 +00:00
(somewhat) smart wall updating.
git-svn-id: https://svn.eduke32.com/eduke32@685 1a8010ca-5511-0410-912e-c29ae57300e0
This commit is contained in:
parent
00ae08496a
commit
e2a1a89eba
2 changed files with 82 additions and 22 deletions
|
@ -80,8 +80,9 @@ typedef struct s_prsector {
|
||||||
signed char floorshade;
|
signed char floorshade;
|
||||||
char floorpal, floorxpanning, floorypanning;
|
char floorpal, floorxpanning, floorypanning;
|
||||||
|
|
||||||
char controlstate; // 1: up to date, 2: just allocated, 3: wall invalidation
|
char controlstate; // 1: up to date, 2: just allocated
|
||||||
char drawingstate; // 0: fcuk, 1: in queue, 2: todraw, 3: drawn
|
char drawingstate; // 0: fcuk, 1: in queue, 2: todraw, 3: drawn
|
||||||
|
unsigned int invalidid;
|
||||||
} _prsector;
|
} _prsector;
|
||||||
|
|
||||||
typedef struct s_prwall {
|
typedef struct s_prwall {
|
||||||
|
@ -92,9 +93,16 @@ typedef struct s_prwall {
|
||||||
// attributes
|
// attributes
|
||||||
GLfloat wallcolor[4], overcolor[4];
|
GLfloat wallcolor[4], overcolor[4];
|
||||||
GLfloat wallglpic, overglpic, wallfbglpic, overfbglpic;
|
GLfloat wallglpic, overglpic, wallfbglpic, overfbglpic;
|
||||||
|
// build wall data
|
||||||
|
short cstat, nwallcstat;
|
||||||
|
short picnum, overpicnum, nwallpicnum;
|
||||||
|
signed char shade;
|
||||||
|
char pal, xrepeat, yrepeat, xpanning, ypanning;
|
||||||
|
char nwallxpanning, nwallypanning;
|
||||||
|
|
||||||
|
|
||||||
char underover;
|
char underover;
|
||||||
char invalidate;
|
unsigned int invalidid;
|
||||||
char controlstate;
|
char controlstate;
|
||||||
} _prwall;
|
} _prwall;
|
||||||
|
|
||||||
|
|
|
@ -892,9 +892,9 @@ finish:
|
||||||
polymer_buildfloor(sectnum);
|
polymer_buildfloor(sectnum);
|
||||||
|
|
||||||
if (wallinvalidate)
|
if (wallinvalidate)
|
||||||
s->controlstate = 3;
|
s->invalidid++;
|
||||||
else
|
|
||||||
s->controlstate = 1;
|
s->controlstate = 1;
|
||||||
|
|
||||||
if (pr_verbosity >= 3) OSD_Printf("PR : Updated sector %i.\n", sectnum);
|
if (pr_verbosity >= 3) OSD_Printf("PR : Updated sector %i.\n", sectnum);
|
||||||
|
|
||||||
|
@ -1079,15 +1079,14 @@ int polymer_initwall(short wallnum)
|
||||||
|
|
||||||
if (pr_verbosity >= 2) OSD_Printf("PR : Initalizing wall %i...\n", wallnum);
|
if (pr_verbosity >= 2) OSD_Printf("PR : Initalizing wall %i...\n", wallnum);
|
||||||
|
|
||||||
w = malloc(sizeof(_prwall));
|
w = calloc(1, sizeof(_prwall));
|
||||||
if (w == NULL)
|
if (w == NULL)
|
||||||
{
|
{
|
||||||
if (pr_verbosity >= 1) OSD_Printf("PR : Cannot initialize wall %i : malloc failed.\n", wallnum);
|
if (pr_verbosity >= 1) OSD_Printf("PR : Cannot initialize wall %i : malloc failed.\n", wallnum);
|
||||||
return (0);
|
return (0);
|
||||||
}
|
}
|
||||||
|
|
||||||
w->invalidate = w->underover = 0;
|
w->controlstate = 2;
|
||||||
w->wallbuffer = w->overbuffer = w->portal = NULL;
|
|
||||||
|
|
||||||
prwalls[wallnum] = w;
|
prwalls[wallnum] = w;
|
||||||
|
|
||||||
|
@ -1098,7 +1097,7 @@ int polymer_initwall(short wallnum)
|
||||||
|
|
||||||
void polymer_updatewall(short wallnum)
|
void polymer_updatewall(short wallnum)
|
||||||
{
|
{
|
||||||
short nwallnum, nnwallnum, curpicnum;
|
short nwallnum, nnwallnum, curpicnum, wallpicnum, walloverpicnum, nwallpicnum;
|
||||||
char curxpanning, curypanning;
|
char curxpanning, curypanning;
|
||||||
walltype *wal;
|
walltype *wal;
|
||||||
sectortype *sec, *nsec;
|
sectortype *sec, *nsec;
|
||||||
|
@ -1108,15 +1107,76 @@ void polymer_updatewall(short wallnum)
|
||||||
int xref, yref;
|
int xref, yref;
|
||||||
float ypancoef, dist;
|
float ypancoef, dist;
|
||||||
int i;
|
int i;
|
||||||
|
unsigned int invalid;
|
||||||
|
|
||||||
wal = &wall[wallnum];
|
wal = &wall[wallnum];
|
||||||
|
nwallnum = wal->nextwall;
|
||||||
sec = §or[sectorofwall(wallnum)];
|
sec = §or[sectorofwall(wallnum)];
|
||||||
w = prwalls[wallnum];
|
w = prwalls[wallnum];
|
||||||
s = prsectors[sectorofwall(wallnum)];
|
s = prsectors[sectorofwall(wallnum)];
|
||||||
|
invalid = s->invalidid;
|
||||||
|
if (nwallnum != -1)
|
||||||
|
{
|
||||||
|
ns = prsectors[wal->nextsector];
|
||||||
|
invalid += ns->invalidid;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
ns = NULL;
|
||||||
|
|
||||||
if (w->wallbuffer == NULL)
|
if (w->wallbuffer == NULL)
|
||||||
w->wallbuffer = calloc(4, sizeof(GLfloat) * 5);
|
w->wallbuffer = calloc(4, sizeof(GLfloat) * 5);
|
||||||
|
|
||||||
|
wallpicnum = wal->picnum;
|
||||||
|
if (picanm[wallpicnum]&192) wallpicnum += animateoffs(wallpicnum,wallnum+16384);
|
||||||
|
walloverpicnum = wal->overpicnum;
|
||||||
|
if (picanm[walloverpicnum]&192) walloverpicnum += animateoffs(walloverpicnum,wallnum+16384);
|
||||||
|
if (nwallnum != -1)
|
||||||
|
{
|
||||||
|
nwallpicnum = wall[nwallnum].picnum;
|
||||||
|
if (picanm[nwallpicnum]&192) nwallpicnum += animateoffs(nwallpicnum,wallnum+16384);
|
||||||
|
}
|
||||||
|
|
||||||
|
if ((w->controlstate != 2) &&
|
||||||
|
(w->invalidid == invalid) &&
|
||||||
|
(wal->cstat == w->cstat) &&
|
||||||
|
(wallpicnum == w->picnum) &&
|
||||||
|
(wal->pal == w->pal) &&
|
||||||
|
(wal->xpanning == w->xpanning) &&
|
||||||
|
(wal->ypanning == w->ypanning) &&
|
||||||
|
(wal->xrepeat == w->xrepeat) &&
|
||||||
|
(wal->yrepeat == w->yrepeat) &&
|
||||||
|
(walloverpicnum == w->overpicnum) &&
|
||||||
|
(wal->shade == w->shade) &&
|
||||||
|
((nwallnum == -1) ||
|
||||||
|
((nwallpicnum == w->nwallpicnum) &&
|
||||||
|
(wall[nwallnum].xpanning == w->nwallxpanning) &&
|
||||||
|
(wall[nwallnum].ypanning == w->nwallypanning) &&
|
||||||
|
(wall[nwallnum].cstat == w->nwallcstat))))
|
||||||
|
{
|
||||||
|
w->controlstate = 1;
|
||||||
|
return; // screw you guys I'm going home
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
w->invalidid = invalid;
|
||||||
|
w->cstat = wal->cstat;
|
||||||
|
w->picnum = wallpicnum;
|
||||||
|
w->pal = wal->pal;
|
||||||
|
w->xpanning = wal->xpanning;
|
||||||
|
w->ypanning = wal->ypanning;
|
||||||
|
w->xrepeat = wal->xrepeat;
|
||||||
|
w->yrepeat = wal->yrepeat;
|
||||||
|
w->overpicnum = walloverpicnum;
|
||||||
|
w->shade = wal->shade;
|
||||||
|
if (nwallnum != -1)
|
||||||
|
{
|
||||||
|
w->nwallpicnum = nwallpicnum;
|
||||||
|
w->nwallxpanning = wall[nwallnum].xpanning;
|
||||||
|
w->nwallypanning = wall[nwallnum].ypanning;
|
||||||
|
w->nwallcstat = wall[nwallnum].cstat;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
w->underover = 0;
|
w->underover = 0;
|
||||||
|
|
||||||
w->wallcolor[0] = w->wallcolor[1] = w->wallcolor[2] = ((float)(numpalookups-min(max(wal->shade,0),numpalookups)))/((float)numpalookups);
|
w->wallcolor[0] = w->wallcolor[1] = w->wallcolor[2] = ((float)(numpalookups-min(max(wal->shade,0),numpalookups)))/((float)numpalookups);
|
||||||
|
@ -1134,9 +1194,7 @@ void polymer_updatewall(short wallnum)
|
||||||
memcpy(&w->wallbuffer[10], &s->ceilbuffer[(wal->point2 - sec->wallptr) * 5], sizeof(GLfloat) * 3);
|
memcpy(&w->wallbuffer[10], &s->ceilbuffer[(wal->point2 - sec->wallptr) * 5], sizeof(GLfloat) * 3);
|
||||||
memcpy(&w->wallbuffer[15], &s->ceilbuffer[(wallnum - sec->wallptr) * 5], sizeof(GLfloat) * 3);
|
memcpy(&w->wallbuffer[15], &s->ceilbuffer[(wallnum - sec->wallptr) * 5], sizeof(GLfloat) * 3);
|
||||||
|
|
||||||
curpicnum = wal->picnum;
|
curpicnum = wallpicnum;
|
||||||
|
|
||||||
if (picanm[curpicnum]&192) curpicnum += animateoffs(curpicnum,wallnum+16384);
|
|
||||||
|
|
||||||
if (!waloff[curpicnum])
|
if (!waloff[curpicnum])
|
||||||
loadtile(curpicnum);
|
loadtile(curpicnum);
|
||||||
|
@ -1191,10 +1249,8 @@ void polymer_updatewall(short wallnum)
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
nwallnum = wal->nextwall;
|
|
||||||
nnwallnum = wall[nwallnum].point2;
|
nnwallnum = wall[nwallnum].point2;
|
||||||
nsec = §or[wal->nextsector];
|
nsec = §or[wal->nextsector];
|
||||||
ns = prsectors[wal->nextsector];
|
|
||||||
|
|
||||||
if (((s->floorbuffer[((wallnum - sec->wallptr) * 5) + 1] != ns->floorbuffer[((nnwallnum - nsec->wallptr) * 5) + 1]) ||
|
if (((s->floorbuffer[((wallnum - sec->wallptr) * 5) + 1] != ns->floorbuffer[((nnwallnum - nsec->wallptr) * 5) + 1]) ||
|
||||||
(s->floorbuffer[((wal->point2 - sec->wallptr) * 5) + 1] != ns->floorbuffer[((nwallnum - nsec->wallptr) * 5) + 1])) &&
|
(s->floorbuffer[((wal->point2 - sec->wallptr) * 5) + 1] != ns->floorbuffer[((nwallnum - nsec->wallptr) * 5) + 1])) &&
|
||||||
|
@ -1208,19 +1264,17 @@ void polymer_updatewall(short wallnum)
|
||||||
|
|
||||||
if (wal->cstat & 2)
|
if (wal->cstat & 2)
|
||||||
{
|
{
|
||||||
curpicnum = wall[nwallnum].picnum;
|
curpicnum = nwallpicnum;
|
||||||
curxpanning = wall[nwallnum].xpanning;
|
curxpanning = wall[nwallnum].xpanning;
|
||||||
curypanning = wall[nwallnum].ypanning;
|
curypanning = wall[nwallnum].ypanning;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
curpicnum = wal->picnum;
|
curpicnum = wallpicnum;
|
||||||
curxpanning = wal->xpanning;
|
curxpanning = wal->xpanning;
|
||||||
curypanning = wal->ypanning;
|
curypanning = wal->ypanning;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (picanm[curpicnum]&192) curpicnum += animateoffs(curpicnum,wallnum+16384);
|
|
||||||
|
|
||||||
if (!waloff[curpicnum])
|
if (!waloff[curpicnum])
|
||||||
loadtile(curpicnum);
|
loadtile(curpicnum);
|
||||||
|
|
||||||
|
@ -1289,11 +1343,9 @@ void polymer_updatewall(short wallnum)
|
||||||
memcpy(&w->overbuffer[15], &s->ceilbuffer[(wallnum - sec->wallptr) * 5], sizeof(GLfloat) * 3);
|
memcpy(&w->overbuffer[15], &s->ceilbuffer[(wallnum - sec->wallptr) * 5], sizeof(GLfloat) * 3);
|
||||||
|
|
||||||
if ((wal->cstat & 16) || (wal->overpicnum == 0))
|
if ((wal->cstat & 16) || (wal->overpicnum == 0))
|
||||||
curpicnum = wal->picnum;
|
curpicnum = wallpicnum;
|
||||||
else
|
else
|
||||||
curpicnum = wal->picnum;
|
curpicnum = wallpicnum;
|
||||||
|
|
||||||
if (picanm[curpicnum]&192) curpicnum += animateoffs(curpicnum,wallnum+16384);
|
|
||||||
|
|
||||||
if (!waloff[curpicnum])
|
if (!waloff[curpicnum])
|
||||||
loadtile(curpicnum);
|
loadtile(curpicnum);
|
||||||
|
|
Loading…
Reference in a new issue