Smarter sector updating.

git-svn-id: https://svn.eduke32.com/eduke32@684 1a8010ca-5511-0410-912e-c29ae57300e0
This commit is contained in:
plagman 2008-04-02 06:58:26 +00:00
parent d50b4726e9
commit 00ae08496a
2 changed files with 117 additions and 33 deletions

View file

@ -70,8 +70,17 @@ typedef struct s_prsector {
// stuff // stuff
float wallsproffset; float wallsproffset;
float floorsproffset; float floorsproffset;
// build sector data
int ceilingz, floorz;
short ceilingstat, floorstat;
short ceilingpicnum, ceilingheinum;
signed char ceilingshade;
char ceilingpal, ceilingxpanning, ceilingypanning;
short floorpicnum, floorheinum;
signed char floorshade;
char floorpal, floorxpanning, floorypanning;
char controlstate; // bit 1: up-to-date, bit 2: geometry invalidated char controlstate; // 1: up to date, 2: just allocated, 3: wall invalidation
char drawingstate; // 0: fcuk, 1: in queue, 2: todraw, 3: drawn char drawingstate; // 0: fcuk, 1: in queue, 2: todraw, 3: drawn
} _prsector; } _prsector;

View file

@ -641,7 +641,7 @@ int polymer_initsector(short sectnum)
if (pr_verbosity >= 2) OSD_Printf("PR : Initalizing sector %i...\n", sectnum); if (pr_verbosity >= 2) OSD_Printf("PR : Initalizing sector %i...\n", sectnum);
sec = &sector[sectnum]; sec = &sector[sectnum];
s = malloc(sizeof(_prsector)); s = calloc(1, sizeof(_prsector));
if (s == NULL) if (s == NULL)
{ {
if (pr_verbosity >= 1) OSD_Printf("PR : Cannot initialize sector %i : malloc failed.\n", sectnum); if (pr_verbosity >= 1) OSD_Printf("PR : Cannot initialize sector %i : malloc failed.\n", sectnum);
@ -657,9 +657,7 @@ int polymer_initsector(short sectnum)
return (0); return (0);
} }
s->floorindices = s->ceilindices = NULL; s->controlstate = 2; // let updatesector know that everything needs to go
s->controlstate = s->drawingstate = 0;
prsectors[sectnum] = s; prsectors[sectnum] = s;
@ -677,8 +675,8 @@ int polymer_updatesector(short sectnum)
int ceilz, florz; int ceilz, florz;
int tex, tey; int tex, tey;
float secangcos, secangsin, scalecoef; float secangcos, secangsin, scalecoef;
int ang, needfloor; int ang, needfloor, wallinvalidate;
short curstat, curpicnum; short curstat, curpicnum, floorpicnum, ceilingpicnum;
char curxpanning, curypanning; char curxpanning, curypanning;
GLfloat* curbuffer; GLfloat* curbuffer;
GLuint *curglpic, *curfbglpic; GLuint *curglpic, *curfbglpic;
@ -686,9 +684,8 @@ int polymer_updatesector(short sectnum)
s = prsectors[sectnum]; s = prsectors[sectnum];
sec = &sector[sectnum]; sec = &sector[sectnum];
wal = &wall[sec->wallptr];
secangcos = secangsin = 0; secangcos = secangsin = 2;
if (s == NULL) if (s == NULL)
{ {
@ -696,38 +693,78 @@ int polymer_updatesector(short sectnum)
return (-1); return (-1);
} }
needfloor = 0; needfloor = wallinvalidate = 0;
if ((sec->floorstat & 64) || (sec->ceilingstat & 64))
{
ang = (getangle(wall[wal->point2].x - wal->x, wall[wal->point2].y - wal->y) + 512) & 2047;
secangcos = (float)(sintable[(ang+512)&2047]) / 16383.0f;
secangsin = (float)(sintable[ang&2047]) / 16383.0f;
}
// geometry // geometry
wal = &wall[sec->wallptr];
i = 0; i = 0;
while (i < sec->wallnum) while (i < sec->wallnum)
{ {
if ((-wal->x != s->verts[(i*3)+2])) if ((-wal->x != s->verts[(i*3)+2]))
{ {
s->verts[(i*3)+2] = s->floorbuffer[(i*5)+2] = s->ceilbuffer[(i*5)+2] = -wal->x; s->verts[(i*3)+2] = s->floorbuffer[(i*5)+2] = s->ceilbuffer[(i*5)+2] = -wal->x;
needfloor = 1; needfloor = wallinvalidate = 1;
} }
if ((wal->y != s->verts[i*3])) if ((wal->y != s->verts[i*3]))
{ {
s->verts[i*3] = s->floorbuffer[i*5] = s->ceilbuffer[i*5] = wal->y; s->verts[i*3] = s->floorbuffer[i*5] = s->ceilbuffer[i*5] = wal->y;
needfloor = 1; needfloor = wallinvalidate = 1;
} }
i++;
wal = &wall[sec->wallptr + i];
}
if ((s->controlstate == 2) ||
(sec->floorz != s->floorz) ||
(sec->ceilingz != s->ceilingz) ||
(sec->floorheinum != s->floorheinum) ||
(sec->ceilingheinum != s->ceilingheinum))
{
wallinvalidate = 1;
wal = &wall[sec->wallptr];
i = 0;
while (i < sec->wallnum)
{
getzsofslope(sectnum, wal->x, wal->y, &ceilz, &florz); getzsofslope(sectnum, wal->x, wal->y, &ceilz, &florz);
s->verts[(i*3)+1] = 0;
s->floorbuffer[(i*5)+1] = -florz; s->floorbuffer[(i*5)+1] = -florz;
s->ceilbuffer[(i*5)+1] = -ceilz; s->ceilbuffer[(i*5)+1] = -ceilz;
i++;
wal = &wall[sec->wallptr + i];
}
s->floorz = sec->floorz;
s->ceilingz = sec->ceilingz;
s->floorheinum = sec->floorheinum;
s->ceilingheinum = sec->ceilingheinum;
}
floorpicnum = sec->floorpicnum;
if (picanm[floorpicnum]&192) floorpicnum += animateoffs(floorpicnum,sectnum);
ceilingpicnum = sec->ceilingpicnum;
if (picanm[ceilingpicnum]&192) ceilingpicnum += animateoffs(ceilingpicnum,sectnum);
if ((s->controlstate != 2) && (!needfloor) &&
(sec->floorstat == s->floorstat) &&
(sec->ceilingstat == s->ceilingstat) &&
(floorpicnum == s->floorpicnum) &&
(ceilingpicnum == s->ceilingpicnum) &&
(sec->floorxpanning == s->floorxpanning) &&
(sec->ceilingxpanning == s->ceilingxpanning) &&
(sec->floorypanning == s->floorypanning) &&
(sec->ceilingypanning == s->ceilingypanning))
goto attributes;
wal = &wall[sec->wallptr];
i = 0;
while (i < sec->wallnum)
{
j = 2; j = 2;
curstat = sec->floorstat; curstat = sec->floorstat;
curbuffer = s->floorbuffer; curbuffer = s->floorbuffer;
curpicnum = sec->floorpicnum; curpicnum = floorpicnum;
curxpanning = sec->floorxpanning; curxpanning = sec->floorxpanning;
curypanning = sec->floorypanning; curypanning = sec->floorypanning;
@ -737,16 +774,23 @@ int polymer_updatesector(short sectnum)
{ {
curstat = sec->ceilingstat; curstat = sec->ceilingstat;
curbuffer = s->ceilbuffer; curbuffer = s->ceilbuffer;
curpicnum = sec->ceilingpicnum; curpicnum = ceilingpicnum;
curxpanning = sec->ceilingxpanning; curxpanning = sec->ceilingxpanning;
curypanning = sec->ceilingypanning; curypanning = sec->ceilingypanning;
} }
if (picanm[curpicnum]&192) curpicnum += animateoffs(curpicnum,sectnum);
if (!waloff[curpicnum]) if (!waloff[curpicnum])
loadtile(curpicnum); loadtile(curpicnum);
if (((sec->floorstat & 64) || (sec->ceilingstat & 64)) &&
((secangcos == 2) && (secangsin == 2)))
{
ang = (getangle(wall[wal->point2].x - wal->x, wall[wal->point2].y - wal->y) + 512) & 2047;
secangcos = (float)(sintable[(ang+512)&2047]) / 16383.0f;
secangsin = (float)(sintable[ang&2047]) / 16383.0f;
}
tex = (curstat & 64) ? ((wal->x - wall[sec->wallptr].x) * secangsin) + ((-wal->y - -wall[sec->wallptr].y) * secangcos) : wal->x; tex = (curstat & 64) ? ((wal->x - wall[sec->wallptr].x) * secangsin) + ((-wal->y - -wall[sec->wallptr].y) * secangcos) : wal->x;
tey = (curstat & 64) ? ((wal->x - wall[sec->wallptr].x) * secangcos) - ((wall[sec->wallptr].y - wal->y) * secangsin) : -wal->y; tey = (curstat & 64) ? ((wal->x - wall[sec->wallptr].x) * secangcos) - ((wall[sec->wallptr].y - wal->y) * secangsin) : -wal->y;
@ -763,13 +807,37 @@ int polymer_updatesector(short sectnum)
j--; j--;
} }
i++;
wal = &wall[sec->wallptr + i];
}
s->floorstat = sec->floorstat;
s->ceilingstat = sec->ceilingstat;
s->floorpicnum = floorpicnum;
s->ceilingpicnum = ceilingpicnum;
s->floorxpanning = sec->floorxpanning;
s->ceilingxpanning = sec->ceilingxpanning;
s->floorypanning = sec->floorypanning;
s->ceilingypanning = sec->ceilingypanning;
attributes:
if ((s->controlstate != 2) &&
(sec->floorshade == s->floorshade) &&
(sec->floorpal == s->floorpal) &&
(floorpicnum == s->floorpicnum) &&
(ceilingpicnum == s->ceilingpicnum))
goto finish;
i = 0;
while (i < sec->wallnum)
{
//attributes //attributes
j = 2; j = 2;
curbuffer = s->floorcolor; curbuffer = s->floorcolor;
curstat = sec->floorshade; curstat = sec->floorshade;
curxpanning = sec->floorpal; curxpanning = sec->floorpal;
curpicnum = sec->floorpicnum; curpicnum = floorpicnum;
curglpic = &s->floorglpic; curglpic = &s->floorglpic;
curfbglpic = &s->floorfbglpic; curfbglpic = &s->floorfbglpic;
@ -780,13 +848,11 @@ int polymer_updatesector(short sectnum)
curbuffer = s->ceilcolor; curbuffer = s->ceilcolor;
curstat = sec->ceilingshade; curstat = sec->ceilingshade;
curxpanning = sec->ceilingpal; curxpanning = sec->ceilingpal;
curpicnum = sec->ceilingpicnum; curpicnum = ceilingpicnum;
curglpic = &s->ceilglpic; curglpic = &s->ceilglpic;
curfbglpic = &s->ceilfbglpic; curfbglpic = &s->ceilfbglpic;
} }
if (picanm[curpicnum]&192) curpicnum += animateoffs(curpicnum,sectnum);
if (!waloff[curpicnum]) if (!waloff[curpicnum])
loadtile(curpicnum); loadtile(curpicnum);
@ -813,12 +879,21 @@ int polymer_updatesector(short sectnum)
} }
i++; i++;
wal = &wall[sec->wallptr + i];
} }
s->floorshade = sec->floorshade;
s->floorpal = sec->floorpal;
s->floorpicnum = floorpicnum;
s->ceilingpicnum = ceilingpicnum;
finish:
if (needfloor) if (needfloor)
polymer_buildfloor(sectnum); polymer_buildfloor(sectnum);
if (wallinvalidate)
s->controlstate = 3;
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);