mirror of
https://github.com/ZDoom/raze-gles.git
synced 2025-02-04 21:00:58 +00:00
Smarter sector updating.
git-svn-id: https://svn.eduke32.com/eduke32@684 1a8010ca-5511-0410-912e-c29ae57300e0
This commit is contained in:
parent
d50b4726e9
commit
00ae08496a
2 changed files with 117 additions and 33 deletions
|
@ -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;
|
||||||
|
|
||||||
|
|
|
@ -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 = §or[sectnum];
|
sec = §or[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 = §or[sectnum];
|
sec = §or[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);
|
||||||
|
|
Loading…
Reference in a new issue