mirror of
https://github.com/ZDoom/raze-gles.git
synced 2025-01-11 18:50:46 +00:00
Polymer performance improvement and some game related bug fixes. Improves Polymer framerate by about 25% in most cases and fixes problems causing Duke Caribbean doors to malfunction.
git-svn-id: https://svn.eduke32.com/eduke32@1676 1a8010ca-5511-0410-912e-c29ae57300e0
This commit is contained in:
parent
ceb217dec8
commit
e1649ec722
7 changed files with 315 additions and 203 deletions
|
@ -242,6 +242,11 @@ typedef struct s_prwall {
|
||||||
} flags;
|
} flags;
|
||||||
} _prwall;
|
} _prwall;
|
||||||
|
|
||||||
|
typedef struct s_prsprite {
|
||||||
|
_prplane plane;
|
||||||
|
uint32_t crc;
|
||||||
|
} _prsprite;
|
||||||
|
|
||||||
typedef struct s_prmirror {
|
typedef struct s_prmirror {
|
||||||
_prplane *plane;
|
_prplane *plane;
|
||||||
int16_t sectnum;
|
int16_t sectnum;
|
||||||
|
@ -296,12 +301,13 @@ static void polymer_drawwall(int16_t sectnum, int16_t wallnum);
|
||||||
// HSR
|
// HSR
|
||||||
static void polymer_computeplane(_prplane* p);
|
static void polymer_computeplane(_prplane* p);
|
||||||
static inline void polymer_crossproduct(GLfloat* in_a, GLfloat* in_b, GLfloat* out);
|
static inline void polymer_crossproduct(GLfloat* in_a, GLfloat* in_b, GLfloat* out);
|
||||||
static inline void polymer_transformpoint(float* inpos, float* pos, float* matrix);
|
static inline void polymer_transformpoint(const float* inpos, float* pos, float* matrix);
|
||||||
static inline void polymer_normalize(float* vec);
|
static inline void polymer_normalize(float* vec);
|
||||||
static inline void polymer_pokesector(int16_t sectnum);
|
static inline void polymer_pokesector(int16_t sectnum);
|
||||||
static void polymer_extractfrustum(GLfloat* modelview, GLfloat* projection, float* frustum);
|
static void polymer_extractfrustum(GLfloat* modelview, GLfloat* projection, float* frustum);
|
||||||
static inline int32_t polymer_planeinfrustum(_prplane *plane, float* frustum);
|
static inline int32_t polymer_planeinfrustum(_prplane *plane, float* frustum);
|
||||||
static inline void polymer_scansprites(int16_t sectnum, spritetype* tsprite, int32_t* spritesortcnt);
|
static inline void polymer_scansprites(int16_t sectnum, spritetype* tsprite, int32_t* spritesortcnt);
|
||||||
|
static inline void polymer_updatesprite(int32_t snum);
|
||||||
// SKIES
|
// SKIES
|
||||||
static void polymer_getsky(void);
|
static void polymer_getsky(void);
|
||||||
static void polymer_drawsky(int16_t tilenum, char palnum, int8_t shade);
|
static void polymer_drawsky(int16_t tilenum, char palnum, int8_t shade);
|
||||||
|
@ -314,7 +320,7 @@ static void polymer_drawmdsprite(spritetype *tspr);
|
||||||
static void polymer_loadmodelvbos(md3model_t* m);
|
static void polymer_loadmodelvbos(md3model_t* m);
|
||||||
// MATERIALS
|
// MATERIALS
|
||||||
static void polymer_getscratchmaterial(_prmaterial* material);
|
static void polymer_getscratchmaterial(_prmaterial* material);
|
||||||
static void polymer_getbuildmaterial(_prmaterial* material, int16_t tilenum, char pal, int8_t shade);
|
static void polymer_getbuildmaterial(_prmaterial* material, int16_t tilenum, char pal, int8_t shade, int32_t cmeth);
|
||||||
static int32_t polymer_bindmaterial(_prmaterial material, int16_t* lights, int lightcount);
|
static int32_t polymer_bindmaterial(_prmaterial material, int16_t* lights, int lightcount);
|
||||||
static void polymer_unbindmaterial(int32_t programbits);
|
static void polymer_unbindmaterial(int32_t programbits);
|
||||||
static void polymer_compileprogram(int32_t programbits);
|
static void polymer_compileprogram(int32_t programbits);
|
||||||
|
|
|
@ -6081,22 +6081,16 @@ void drawmasks(void)
|
||||||
{
|
{
|
||||||
killsprite:
|
killsprite:
|
||||||
spritesortcnt--; //Delete face sprite if on wrong side!
|
spritesortcnt--; //Delete face sprite if on wrong side!
|
||||||
if (i != spritesortcnt)
|
if (i == spritesortcnt) continue;
|
||||||
{
|
tspriteptr[i] = tspriteptr[spritesortcnt];
|
||||||
tspriteptr[i] = tspriteptr[spritesortcnt];
|
spritesx[i] = spritesx[spritesortcnt];
|
||||||
spritesx[i] = spritesx[spritesortcnt];
|
spritesy[i] = spritesy[spritesortcnt];
|
||||||
spritesy[i] = spritesy[spritesortcnt];
|
|
||||||
}
|
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
spritesy[i] = yp;
|
spritesy[i] = yp;
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef USE_OPENGL
|
|
||||||
// if (rendmode < 3)
|
|
||||||
#endif
|
|
||||||
{
|
{
|
||||||
|
|
||||||
gap = 1; while (gap < spritesortcnt) gap = (gap<<1)+1;
|
gap = 1; while (gap < spritesortcnt) gap = (gap<<1)+1;
|
||||||
for (gap>>=1; gap>0; gap>>=1) //Sort sprite list
|
for (gap>>=1; gap>0; gap>>=1) //Sort sprite list
|
||||||
for (i=0; i<spritesortcnt-gap; i++)
|
for (i=0; i<spritesortcnt-gap; i++)
|
||||||
|
@ -6171,9 +6165,6 @@ killsprite:
|
||||||
drawline256(xs+65536,ys-65536,xs-65536,ys+65536,31);
|
drawline256(xs+65536,ys-65536,xs-65536,ys+65536,31);
|
||||||
}*/
|
}*/
|
||||||
|
|
||||||
#if defined(USE_OPENGL) && defined(POLYMOST)
|
|
||||||
// if (rendmode < 3)
|
|
||||||
#endif
|
|
||||||
{
|
{
|
||||||
#if defined(USE_OPENGL) && defined(POLYMOST)
|
#if defined(USE_OPENGL) && defined(POLYMOST)
|
||||||
curpolygonoffset = 0;
|
curpolygonoffset = 0;
|
||||||
|
@ -6654,6 +6645,7 @@ int32_t loadboard(char *filename, char fromwhere, int32_t *daposx, int32_t *dapo
|
||||||
initprintf(OSD_ERROR "Map error: sprite #%d(%d,%d) with illegal sector(%d). Map is corrupt!\n",i,sprite[i].x,sprite[i].y,sprite[i].sectnum);
|
initprintf(OSD_ERROR "Map error: sprite #%d(%d,%d) with illegal sector(%d). Map is corrupt!\n",i,sprite[i].x,sprite[i].y,sprite[i].sectnum);
|
||||||
updatesector(sprite[i].x, sprite[i].y, &sprite[i].sectnum);
|
updatesector(sprite[i].x, sprite[i].y, &sprite[i].sectnum);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (sprite[i].picnum<0||sprite[i].picnum>=MAXTILES)
|
if (sprite[i].picnum<0||sprite[i].picnum>=MAXTILES)
|
||||||
{
|
{
|
||||||
initprintf(OSD_ERROR "Map error: sprite #%d(%d,%d) with illegal picnum(%d). Map is corrupt!\n",i,sprite[i].x,sprite[i].y,sprite[i].picnum);
|
initprintf(OSD_ERROR "Map error: sprite #%d(%d,%d) with illegal picnum(%d). Map is corrupt!\n",i,sprite[i].x,sprite[i].y,sprite[i].picnum);
|
||||||
|
@ -6675,31 +6667,26 @@ int32_t loadboard(char *filename, char fromwhere, int32_t *daposx, int32_t *dapo
|
||||||
|
|
||||||
if (sect == -1)
|
if (sect == -1)
|
||||||
{
|
{
|
||||||
updatesector(sprite[k].x+1, sprite[k].y+1, §);
|
int32_t ii, jj;
|
||||||
|
|
||||||
if (sect == -1)
|
for (ii=32; ii >= 0; ii--)
|
||||||
{
|
{
|
||||||
updatesector(sprite[k].x-1, sprite[k].y-1, §);
|
for (jj=32; jj >= 0; jj--)
|
||||||
|
|
||||||
if (sect == -1)
|
|
||||||
{
|
{
|
||||||
updatesector(sprite[k].x+1, sprite[k].y-1, §);
|
updatesector(sprite[k].x+ii-16, sprite[k].y+jj-16, §);
|
||||||
|
if (sect != -1) break;
|
||||||
if (sect == -1)
|
|
||||||
{
|
|
||||||
updatesector(sprite[k].x-1, sprite[k].y+1, §);
|
|
||||||
|
|
||||||
/* fuck it, the sprite is clearly not legitimately in any sector at this point
|
|
||||||
so let's queue it up for deletion */
|
|
||||||
if (sect == -1)
|
|
||||||
dq[dnum++] = k;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
if (sect != -1) break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* fuck it, the sprite is clearly not legitimately in any sector at this point
|
||||||
|
so let's queue it up for deletion */
|
||||||
|
if (sect == -1)
|
||||||
|
dq[dnum++] = k;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
while (--dnum > -1)
|
while (dnum--)
|
||||||
{
|
{
|
||||||
initprintf(OSD_ERROR "Map error: removing sprite #%d(%d,%d) in null space. Map is corrupt!\n",dq[dnum],sprite[dq[dnum]].x,sprite[dq[dnum]].y);
|
initprintf(OSD_ERROR "Map error: removing sprite #%d(%d,%d) in null space. Map is corrupt!\n",dq[dnum],sprite[dq[dnum]].x,sprite[dq[dnum]].y);
|
||||||
deletesprite(dq[dnum]);
|
deletesprite(dq[dnum]);
|
||||||
|
|
|
@ -5,6 +5,7 @@
|
||||||
#define POLYMER_C
|
#define POLYMER_C
|
||||||
#include "polymer.h"
|
#include "polymer.h"
|
||||||
#include "engine_priv.h"
|
#include "engine_priv.h"
|
||||||
|
#include "crc32.h"
|
||||||
|
|
||||||
// CVARS
|
// CVARS
|
||||||
int32_t pr_lighting = 1;
|
int32_t pr_lighting = 1;
|
||||||
|
@ -40,11 +41,10 @@ GLenum modelvbousage = GL_STATIC_DRAW_ARB;
|
||||||
// BUILD DATA
|
// BUILD DATA
|
||||||
_prsector *prsectors[MAXSECTORS];
|
_prsector *prsectors[MAXSECTORS];
|
||||||
_prwall *prwalls[MAXWALLS];
|
_prwall *prwalls[MAXWALLS];
|
||||||
|
_prsprite *prsprites[MAXSPRITES];
|
||||||
_prplane spriteplane;
|
|
||||||
_prmaterial mdspritematerial;
|
_prmaterial mdspritematerial;
|
||||||
|
|
||||||
static GLfloat vertsprite[4 * 5] =
|
static const GLfloat vertsprite[4 * 5] =
|
||||||
{
|
{
|
||||||
-0.5f, 0.0f, 0.0f,
|
-0.5f, 0.0f, 0.0f,
|
||||||
0.0f, 1.0f,
|
0.0f, 1.0f,
|
||||||
|
@ -56,7 +56,7 @@ static GLfloat vertsprite[4 * 5] =
|
||||||
0.0f, 0.0f,
|
0.0f, 0.0f,
|
||||||
};
|
};
|
||||||
|
|
||||||
static GLfloat horizsprite[4 * 5] =
|
static const GLfloat horizsprite[4 * 5] =
|
||||||
{
|
{
|
||||||
-0.5f, 0.0f, 0.5f,
|
-0.5f, 0.0f, 0.5f,
|
||||||
0.0f, 0.0f,
|
0.0f, 0.0f,
|
||||||
|
@ -68,7 +68,7 @@ static GLfloat horizsprite[4 * 5] =
|
||||||
0.0f, 1.0f,
|
0.0f, 1.0f,
|
||||||
};
|
};
|
||||||
|
|
||||||
static GLfloat skyboxdata[4 * 5 * 6] =
|
static const GLfloat skyboxdata[4 * 5 * 6] =
|
||||||
{
|
{
|
||||||
// -ZY
|
// -ZY
|
||||||
-0.5f, -0.5f, 0.5f,
|
-0.5f, -0.5f, 0.5f,
|
||||||
|
@ -142,7 +142,7 @@ int32_t lightcount;
|
||||||
int32_t curlight;
|
int32_t curlight;
|
||||||
#pragma pack(pop)
|
#pragma pack(pop)
|
||||||
|
|
||||||
static GLfloat shadowBias[] =
|
static const GLfloat shadowBias[] =
|
||||||
{
|
{
|
||||||
0.5, 0.0, 0.0, 0.0,
|
0.5, 0.0, 0.0, 0.0,
|
||||||
0.0, 0.5, 0.0, 0.0,
|
0.0, 0.5, 0.0, 0.0,
|
||||||
|
@ -620,11 +620,6 @@ int32_t polymer_init(void)
|
||||||
polymer_initartsky();
|
polymer_initartsky();
|
||||||
skyboxdatavbo = 0;
|
skyboxdatavbo = 0;
|
||||||
|
|
||||||
if (spriteplane.buffer == NULL) {
|
|
||||||
spriteplane.buffer = Bmalloc(4 * sizeof(GLfloat) * 5);
|
|
||||||
spriteplane.vertcount = 4;
|
|
||||||
}
|
|
||||||
|
|
||||||
i = 0;
|
i = 0;
|
||||||
while (i < nextmodelid)
|
while (i < nextmodelid)
|
||||||
{
|
{
|
||||||
|
@ -1055,59 +1050,105 @@ void polymer_drawmaskwall(int32_t damaskwallcnt)
|
||||||
bglDisable(GL_CULL_FACE);
|
bglDisable(GL_CULL_FACE);
|
||||||
}
|
}
|
||||||
|
|
||||||
void polymer_drawsprite(int32_t snum)
|
void polymer_updatesprite(int32_t snum)
|
||||||
{
|
{
|
||||||
int32_t curpicnum, xsize, ysize, tilexoff, tileyoff, xoff, yoff, i, j;
|
int32_t curpicnum, xsize, ysize, tilexoff, tileyoff, xoff, yoff, i, j, cs;
|
||||||
spritetype *tspr;
|
spritetype *tspr = tspriteptr[snum];
|
||||||
float xratio, yratio, ang;
|
float xratio, yratio, ang;
|
||||||
float spos[3];
|
float spos[3];
|
||||||
GLfloat *inbuffer;
|
const GLfloat *inbuffer;
|
||||||
uint8_t curpriority, flipu, flipv;
|
uint8_t flipu, flipv;
|
||||||
|
_prsprite *s;
|
||||||
|
|
||||||
if (pr_verbosity >= 3) OSD_Printf("PR : Sprite %i...\n", snum);
|
if (pr_verbosity >= 3) OSD_Printf("PR : Updating sprite %i...\n", snum);
|
||||||
|
|
||||||
tspr = tspriteptr[snum];
|
|
||||||
|
|
||||||
if (tspr->owner < 0 || tspr->picnum < 0) return;
|
if (tspr->owner < 0 || tspr->picnum < 0) return;
|
||||||
|
|
||||||
if ((tspr->cstat & 8192) && (depth && !mirrors[depth-1].plane))
|
cs = tspr->cstat;
|
||||||
return;
|
|
||||||
if ((tspr->cstat & 16384) && (!depth || mirrors[depth-1].plane))
|
|
||||||
return;
|
|
||||||
|
|
||||||
fogcalc(tspr->shade,sector[tspr->sectnum].visibility,sector[tspr->sectnum].floorpal);
|
if (prsprites[tspr->owner] == NULL)
|
||||||
bglFogf(GL_FOG_DENSITY,fogresult);
|
|
||||||
bglFogfv(GL_FOG_COLOR,fogcol);
|
|
||||||
|
|
||||||
if (usemodels && tile2model[Ptile2tile(tspr->picnum,tspr->pal)].modelid >= 0 && tile2model[Ptile2tile(tspr->picnum,tspr->pal)].framenum >= 0)
|
|
||||||
{
|
{
|
||||||
polymer_drawmdsprite(tspr);
|
prsprites[tspr->owner] = (_prsprite *) Bcalloc(sizeof(_prsprite), 1);
|
||||||
return;
|
|
||||||
|
if (prsprites[tspr->owner] == NULL)
|
||||||
|
{
|
||||||
|
if (pr_verbosity >= 1) OSD_Printf("PR : Cannot initialize sprite %i : Bmalloc failed.\n", tspr->owner);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
prsprites[tspr->owner]->plane.buffer = (GLfloat *) Bmalloc(4 * sizeof(GLfloat) * 5);
|
||||||
|
prsprites[tspr->owner]->plane.vertcount = 4;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if ((tspr->cstat & 48) && (pr_vbos > 0) && !prsprites[tspr->owner]->plane.vbo)
|
||||||
|
{
|
||||||
|
bglGenBuffersARB(1, &prsprites[tspr->owner]->plane.vbo);
|
||||||
|
bglBindBufferARB(GL_ARRAY_BUFFER_ARB, prsprites[tspr->owner]->plane.vbo);
|
||||||
|
bglBufferDataARB(GL_ARRAY_BUFFER_ARB, 4 * sizeof(GLfloat) * 5, NULL, mapvbousage);
|
||||||
|
}
|
||||||
|
|
||||||
|
s = prsprites[tspr->owner];
|
||||||
|
|
||||||
curpicnum = tspr->picnum;
|
curpicnum = tspr->picnum;
|
||||||
if (picanm[curpicnum]&192) curpicnum += animateoffs(curpicnum,tspr->owner+32768);
|
if (picanm[curpicnum]&192) curpicnum += animateoffs(curpicnum,tspr->owner+32768);
|
||||||
|
|
||||||
polymer_getbuildmaterial(&spriteplane.material, curpicnum, tspr->pal, tspr->shade);
|
if (tspr->cstat & 48)
|
||||||
|
{
|
||||||
|
uint32_t crc = crc32once((uint8_t *)tspr, offsetof(spritetype, owner));
|
||||||
|
int32_t curpriority = 0;
|
||||||
|
|
||||||
|
if (crc == s->crc && tspr->picnum == curpicnum) return;
|
||||||
|
s->crc = crc;
|
||||||
|
|
||||||
|
polymer_resetplanelights(&s->plane);
|
||||||
|
|
||||||
|
while ((curpriority < pr_maxlightpriority) && (!depth || mirrors[depth-1].plane))
|
||||||
|
{
|
||||||
|
i = j = 0;
|
||||||
|
while (j < lightcount)
|
||||||
|
{
|
||||||
|
while (!prlights[i].flags.active)
|
||||||
|
i++;
|
||||||
|
|
||||||
|
if (prlights[i].priority != curpriority)
|
||||||
|
{
|
||||||
|
i++;
|
||||||
|
j++;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (polymer_planeinlight(&s->plane, &prlights[i]))
|
||||||
|
polymer_addplanelight(&s->plane, i);
|
||||||
|
i++;
|
||||||
|
j++;
|
||||||
|
}
|
||||||
|
curpriority++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
polymer_getbuildmaterial(&s->plane.material, curpicnum, tspr->pal, tspr->shade, 4);
|
||||||
|
|
||||||
if (tspr->cstat & 2)
|
if (tspr->cstat & 2)
|
||||||
{
|
{
|
||||||
if (tspr->cstat & 512)
|
if (tspr->cstat & 512)
|
||||||
spriteplane.material.diffusemodulation[3] = 0x55;
|
s->plane.material.diffusemodulation[3] = 0x55;
|
||||||
else
|
else
|
||||||
spriteplane.material.diffusemodulation[3] = 0xAA;
|
s->plane.material.diffusemodulation[3] = 0xAA;
|
||||||
}
|
}
|
||||||
|
|
||||||
spriteplane.material.diffusemodulation[3] *= (1.0f - spriteext[tspr->owner].alpha);
|
s->plane.material.diffusemodulation[3] *= (1.0f - spriteext[tspr->owner].alpha);
|
||||||
|
|
||||||
if (searchit == 2)
|
if (searchit == 2)
|
||||||
{
|
{
|
||||||
spriteplane.material.diffusemodulation[0] = 0x03;
|
s->plane.material.diffusemodulation[0] = 0x03;
|
||||||
spriteplane.material.diffusemodulation[1] = ((GLubyte *)(&tspr->owner))[0];
|
s->plane.material.diffusemodulation[1] = ((GLubyte *)(&tspr->owner))[0];
|
||||||
spriteplane.material.diffusemodulation[2] = ((GLubyte *)(&tspr->owner))[1];
|
s->plane.material.diffusemodulation[2] = ((GLubyte *)(&tspr->owner))[1];
|
||||||
spriteplane.material.diffusemodulation[3] = 0xFF;
|
s->plane.material.diffusemodulation[3] = 0xFF;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
curpicnum = tspr->picnum;
|
||||||
|
if (picanm[curpicnum]&192) curpicnum += animateoffs(curpicnum,tspr->owner+32768);
|
||||||
|
|
||||||
if (((tspr->cstat>>4) & 3) == 0)
|
if (((tspr->cstat>>4) & 3) == 0)
|
||||||
xratio = (float)(tspr->xrepeat) * 0.20f; // 32 / 160
|
xratio = (float)(tspr->xrepeat) * 0.20f; // 32 / 160
|
||||||
else
|
else
|
||||||
|
@ -1167,8 +1208,6 @@ void polymer_drawsprite(int32_t snum)
|
||||||
bglRotatef(-horizang, 1.0f, 0.0f, 0.0f);
|
bglRotatef(-horizang, 1.0f, 0.0f, 0.0f);
|
||||||
bglTranslatef((float)(-xoff), (float)(yoff), 0.0f);
|
bglTranslatef((float)(-xoff), (float)(yoff), 0.0f);
|
||||||
bglScalef((float)(xsize), (float)(ysize), 1.0f);
|
bglScalef((float)(xsize), (float)(ysize), 1.0f);
|
||||||
|
|
||||||
// bglPolygonOffset(0.0f, 0.0f);
|
|
||||||
break;
|
break;
|
||||||
case 1:
|
case 1:
|
||||||
ang = (float)((tspr->ang + 1024) & 2047) / (2048.0f / 360.0f);
|
ang = (float)((tspr->ang + 1024) & 2047) / (2048.0f / 360.0f);
|
||||||
|
@ -1177,11 +1216,6 @@ void polymer_drawsprite(int32_t snum)
|
||||||
bglRotatef(-ang, 0.0f, 1.0f, 0.0f);
|
bglRotatef(-ang, 0.0f, 1.0f, 0.0f);
|
||||||
bglTranslatef((float)(-xoff), (float)(yoff), 0.0f);
|
bglTranslatef((float)(-xoff), (float)(yoff), 0.0f);
|
||||||
bglScalef((float)(xsize), (float)(ysize), 1.0f);
|
bglScalef((float)(xsize), (float)(ysize), 1.0f);
|
||||||
|
|
||||||
prsectors[tspr->sectnum]->wallsproffset += 0.5f;
|
|
||||||
|
|
||||||
if (!depth || mirrors[depth-1].plane)
|
|
||||||
bglPolygonOffset(-1.0f, -1.0f);
|
|
||||||
break;
|
break;
|
||||||
case 2:
|
case 2:
|
||||||
ang = (float)((tspr->ang + 1024) & 2047) / (2048.0f / 360.0f);
|
ang = (float)((tspr->ang + 1024) & 2047) / (2048.0f / 360.0f);
|
||||||
|
@ -1196,15 +1230,12 @@ void polymer_drawsprite(int32_t snum)
|
||||||
bglScalef((float)(xsize), 1.0f, (float)(ysize));
|
bglScalef((float)(xsize), 1.0f, (float)(ysize));
|
||||||
|
|
||||||
inbuffer = horizsprite;
|
inbuffer = horizsprite;
|
||||||
|
|
||||||
prsectors[tspr->sectnum]->floorsproffset += 0.5f;
|
|
||||||
if (!depth || mirrors[depth-1].plane)
|
|
||||||
bglPolygonOffset(-1.0f, -1.0f);
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((tspr->cstat & 4) && (((tspr->cstat>>4) & 3) != 2))
|
if ((tspr->cstat & 4) && (((tspr->cstat>>4) & 3) != 2))
|
||||||
flipu = !flipu;
|
flipu = !flipu;
|
||||||
|
|
||||||
if (!(tspr->cstat & 4) && (((tspr->cstat>>4) & 3) == 2))
|
if (!(tspr->cstat & 4) && (((tspr->cstat>>4) & 3) == 2))
|
||||||
flipu = !flipu;
|
flipu = !flipu;
|
||||||
|
|
||||||
|
@ -1214,76 +1245,139 @@ void polymer_drawsprite(int32_t snum)
|
||||||
bglGetFloatv(GL_MODELVIEW_MATRIX, spritemodelview);
|
bglGetFloatv(GL_MODELVIEW_MATRIX, spritemodelview);
|
||||||
bglPopMatrix();
|
bglPopMatrix();
|
||||||
|
|
||||||
Bmemcpy(spriteplane.buffer, inbuffer, sizeof(GLfloat) * 4 * 5);
|
Bmemcpy(s->plane.buffer, inbuffer, sizeof(GLfloat) * 4 * 5);
|
||||||
|
|
||||||
if (flipu || flipv)
|
if (flipu || flipv)
|
||||||
{
|
{
|
||||||
i = 0;
|
i = 0;
|
||||||
while (i < 4)
|
do
|
||||||
{
|
{
|
||||||
if (flipu)
|
if (flipu)
|
||||||
spriteplane.buffer[(i * 5) + 3] =
|
s->plane.buffer[(i * 5) + 3] =
|
||||||
(spriteplane.buffer[(i * 5) + 3] - 1.0f) * -1.0f;
|
(s->plane.buffer[(i * 5) + 3] - 1.0f) * -1.0f;
|
||||||
if (flipv)
|
if (flipv)
|
||||||
spriteplane.buffer[(i * 5) + 4] =
|
s->plane.buffer[(i * 5) + 4] =
|
||||||
(spriteplane.buffer[(i * 5) + 4] - 1.0f) * -1.0f;
|
(s->plane.buffer[(i * 5) + 4] - 1.0f) * -1.0f;
|
||||||
i++;
|
|
||||||
}
|
}
|
||||||
|
while (++i < 4);
|
||||||
}
|
}
|
||||||
|
|
||||||
i = 0;
|
i = 0;
|
||||||
while (i < 4)
|
do
|
||||||
|
polymer_transformpoint(&inbuffer[i * 5], &s->plane.buffer[i * 5], spritemodelview);
|
||||||
|
while (++i < 4);
|
||||||
|
|
||||||
|
polymer_computeplane(&s->plane);
|
||||||
|
|
||||||
|
if ((cs & 48) && (pr_vbos > 0))
|
||||||
{
|
{
|
||||||
polymer_transformpoint(&inbuffer[i * 5], &spriteplane.buffer[i * 5], spritemodelview);
|
bglBindBufferARB(GL_ARRAY_BUFFER_ARB, s->plane.vbo);
|
||||||
i++;
|
bglBufferSubDataARB(GL_ARRAY_BUFFER_ARB, 0, 4 * sizeof(GLfloat) * 5, s->plane.buffer);
|
||||||
|
bglBindBufferARB(GL_ARRAY_BUFFER_ARB, 0);
|
||||||
|
}
|
||||||
|
else if (s->plane.vbo) // clean up the vbo if a wall/floor sprite becomes a face sprite
|
||||||
|
{
|
||||||
|
bglDeleteBuffersARB(1, &s->plane.vbo);
|
||||||
|
s->plane.vbo = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void polymer_drawsprite(int32_t snum)
|
||||||
|
{
|
||||||
|
spritetype *tspr;
|
||||||
|
int32_t i, j, cs;
|
||||||
|
_prsprite *s;
|
||||||
|
|
||||||
|
if (pr_verbosity >= 3) OSD_Printf("PR : Sprite %i...\n", snum);
|
||||||
|
|
||||||
|
tspr = tspriteptr[snum];
|
||||||
|
|
||||||
|
if (tspr->owner < 0 || tspr->picnum < 0) return;
|
||||||
|
|
||||||
|
if ((tspr->cstat & 8192) && (depth && !mirrors[depth-1].plane))
|
||||||
|
return;
|
||||||
|
|
||||||
|
if ((tspr->cstat & 16384) && (!depth || mirrors[depth-1].plane))
|
||||||
|
return;
|
||||||
|
|
||||||
|
fogcalc(tspr->shade,sector[tspr->sectnum].visibility,sector[tspr->sectnum].floorpal);
|
||||||
|
bglFogf(GL_FOG_DENSITY,fogresult);
|
||||||
|
bglFogfv(GL_FOG_COLOR,fogcol);
|
||||||
|
|
||||||
|
if (usemodels && tile2model[Ptile2tile(tspr->picnum,tspr->pal)].modelid >= 0 && tile2model[Ptile2tile(tspr->picnum,tspr->pal)].framenum >= 0)
|
||||||
|
{
|
||||||
|
polymer_drawmdsprite(tspr);
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
polymer_computeplane(&spriteplane);
|
cs = tspr->cstat;
|
||||||
|
|
||||||
spriteplane.lightcount = 0;
|
polymer_updatesprite(snum);
|
||||||
|
|
||||||
curpriority = 0;
|
if (prsprites[tspr->owner] == NULL)
|
||||||
|
return;
|
||||||
|
|
||||||
while ((curpriority < pr_maxlightpriority) && (!depth || mirrors[depth-1].plane))
|
s = prsprites[tspr->owner];
|
||||||
|
|
||||||
|
switch ((tspr->cstat>>4) & 3)
|
||||||
{
|
{
|
||||||
i = j = 0;
|
case 1:
|
||||||
while (j < lightcount)
|
prsectors[tspr->sectnum]->wallsproffset += 0.5f;
|
||||||
{
|
if (!depth || mirrors[depth-1].plane)
|
||||||
while (prlights[i].flags.active == 0) {
|
bglPolygonOffset(-1.0f, -1.0f);
|
||||||
i++;
|
break;
|
||||||
}
|
case 2:
|
||||||
|
prsectors[tspr->sectnum]->floorsproffset += 0.5f;
|
||||||
|
if (!depth || mirrors[depth-1].plane)
|
||||||
|
bglPolygonOffset(-1.0f, -1.0f);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
if (prlights[i].priority != curpriority) {
|
if ((cs & 48) == 0)
|
||||||
|
{
|
||||||
|
int32_t curpriority = 0;
|
||||||
|
|
||||||
|
s->plane.lightcount = 0;
|
||||||
|
|
||||||
|
while ((curpriority < pr_maxlightpriority) && (!depth || mirrors[depth-1].plane))
|
||||||
|
{
|
||||||
|
i = j = 0;
|
||||||
|
while (j < lightcount)
|
||||||
|
{
|
||||||
|
while (!prlights[i].flags.active)
|
||||||
|
i++;
|
||||||
|
|
||||||
|
if (prlights[i].priority != curpriority)
|
||||||
|
{
|
||||||
|
i++;
|
||||||
|
j++;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (polymer_planeinlight(&s->plane, &prlights[i]))
|
||||||
|
s->plane.lights[s->plane.lightcount++] = i;
|
||||||
|
|
||||||
i++;
|
i++;
|
||||||
j++;
|
j++;
|
||||||
continue;
|
|
||||||
}
|
}
|
||||||
|
curpriority++;
|
||||||
if (polymer_planeinlight(&spriteplane, &prlights[i]))
|
|
||||||
{
|
|
||||||
spriteplane.lights[spriteplane.lightcount] = i;
|
|
||||||
spriteplane.lightcount++;
|
|
||||||
}
|
|
||||||
i++;
|
|
||||||
j++;
|
|
||||||
}
|
}
|
||||||
curpriority++;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((tspr->cstat & 64) && ((tspr->cstat>>4) & 3))
|
if ((tspr->cstat & 64) && ((tspr->cstat>>4) & 3))
|
||||||
bglEnable(GL_CULL_FACE);
|
bglEnable(GL_CULL_FACE);
|
||||||
|
|
||||||
if (!pr_ati_nodepthoffset && (!depth || mirrors[depth-1].plane))
|
if ((!depth || mirrors[depth-1].plane) && !pr_ati_nodepthoffset)
|
||||||
bglEnable(GL_POLYGON_OFFSET_FILL);
|
bglEnable(GL_POLYGON_OFFSET_FILL);
|
||||||
|
|
||||||
polymer_drawplane(&spriteplane);
|
polymer_drawplane(&s->plane);
|
||||||
|
|
||||||
if (!pr_ati_nodepthoffset && (!depth || mirrors[depth-1].plane))
|
if ((!depth || mirrors[depth-1].plane) && !pr_ati_nodepthoffset)
|
||||||
bglDisable(GL_POLYGON_OFFSET_FILL);
|
bglDisable(GL_POLYGON_OFFSET_FILL);
|
||||||
|
|
||||||
if ((tspr->cstat & 64) && ((tspr->cstat>>4) & 3))
|
if ((tspr->cstat & 64) && ((tspr->cstat>>4) & 3))
|
||||||
bglDisable(GL_CULL_FACE);
|
bglDisable(GL_CULL_FACE);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void polymer_setanimatesprites(animatespritesptr animatesprites, int32_t x, int32_t y, int32_t a, int32_t smoothratio)
|
void polymer_setanimatesprites(animatespritesptr animatesprites, int32_t x, int32_t y, int32_t a, int32_t smoothratio)
|
||||||
|
@ -1306,9 +1400,8 @@ int16_t polymer_addlight(_prlight* light)
|
||||||
return (-1);
|
return (-1);
|
||||||
|
|
||||||
lighti = 0;
|
lighti = 0;
|
||||||
while ((lighti < PR_MAXLIGHTS) && (prlights[lighti].flags.active)) {
|
while ((lighti < PR_MAXLIGHTS) && (prlights[lighti].flags.active))
|
||||||
lighti++;
|
lighti++;
|
||||||
}
|
|
||||||
|
|
||||||
if (lighti == PR_MAXLIGHTS)
|
if (lighti == PR_MAXLIGHTS)
|
||||||
return (-1);
|
return (-1);
|
||||||
|
@ -1348,32 +1441,25 @@ void polymer_invalidatelights(void)
|
||||||
int32_t i = PR_MAXLIGHTS-1;
|
int32_t i = PR_MAXLIGHTS-1;
|
||||||
|
|
||||||
do
|
do
|
||||||
{
|
prlights[i].flags.invalidate = prlights[i].flags.active;
|
||||||
if (prlights[i].flags.active)
|
|
||||||
prlights[i].flags.invalidate = 1;
|
|
||||||
}
|
|
||||||
while (i--);
|
while (i--);
|
||||||
}
|
}
|
||||||
|
|
||||||
void polymer_texinvalidate(void)
|
void polymer_texinvalidate(void)
|
||||||
{
|
{
|
||||||
int32_t i;
|
int32_t i = numsectors-1;
|
||||||
|
|
||||||
if (!prsectors[numsectors-1])
|
if (!numsectors || !prsectors[i])
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
do
|
||||||
|
prsectors[i--]->flags.invalidtex = 1;
|
||||||
|
while (i >= 0);
|
||||||
|
|
||||||
i = numsectors-1;
|
|
||||||
while (i >= 0)
|
|
||||||
{
|
|
||||||
prsectors[i]->flags.invalidtex = 1;
|
|
||||||
i--;
|
|
||||||
}
|
|
||||||
i = numwalls-1;
|
i = numwalls-1;
|
||||||
while (i >= 0)
|
do
|
||||||
{
|
prwalls[i--]->flags.invalidtex = 1;
|
||||||
prwalls[i]->flags.invalidtex = 1;
|
while (i >= 0);
|
||||||
i--;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// CORE
|
// CORE
|
||||||
|
@ -1447,10 +1533,8 @@ static void polymer_displayrooms(int16_t dacursectnum)
|
||||||
// consider these walls as visportals
|
// consider these walls as visportals
|
||||||
if (wall[sec->wallptr + i].nextsector < 0)
|
if (wall[sec->wallptr + i].nextsector < 0)
|
||||||
doquery = 1;
|
doquery = 1;
|
||||||
|
|
||||||
i--;
|
|
||||||
}
|
}
|
||||||
while (i >= 0);
|
while (--i >= 0);
|
||||||
|
|
||||||
i = sec->wallnum-1;
|
i = sec->wallnum-1;
|
||||||
while (i >= 0)
|
while (i >= 0)
|
||||||
|
@ -1568,10 +1652,8 @@ static void polymer_displayrooms(int16_t dacursectnum)
|
||||||
drawingstate[wall[sec->wallptr + i].nextsector] = 1;
|
drawingstate[wall[sec->wallptr + i].nextsector] = 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
i--;
|
|
||||||
}
|
}
|
||||||
while (i >= 0);
|
while (--i >= 0);
|
||||||
|
|
||||||
front++;
|
front++;
|
||||||
}
|
}
|
||||||
|
@ -1889,6 +1971,21 @@ static void polymer_freeboard(void)
|
||||||
|
|
||||||
i++;
|
i++;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
i = 0;
|
||||||
|
while (i < MAXSPRITES)
|
||||||
|
{
|
||||||
|
if (prsprites[i])
|
||||||
|
{
|
||||||
|
if (prsprites[i]->plane.buffer) Bfree(prsprites[i]->plane.buffer);
|
||||||
|
if (prsprites[i]->plane.vbo) bglDeleteBuffersARB(1, &prsprites[i]->plane.vbo);
|
||||||
|
Bfree(prsprites[i]);
|
||||||
|
prsprites[i] = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
i++;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// SECTORS
|
// SECTORS
|
||||||
|
@ -1897,7 +1994,7 @@ static int32_t polymer_initsector(int16_t sectnum)
|
||||||
sectortype *sec;
|
sectortype *sec;
|
||||||
_prsector* s;
|
_prsector* s;
|
||||||
|
|
||||||
if (pr_verbosity >= 2) OSD_Printf("PR : Initalizing sector %i...\n", sectnum);
|
if (pr_verbosity >= 2) OSD_Printf("PR : Initializing sector %i...\n", sectnum);
|
||||||
|
|
||||||
sec = §or[sectnum];
|
sec = §or[sectnum];
|
||||||
s = Bcalloc(1, sizeof(_prsector));
|
s = Bcalloc(1, sizeof(_prsector));
|
||||||
|
@ -1934,7 +2031,7 @@ static int32_t polymer_initsector(int16_t sectnum)
|
||||||
|
|
||||||
prsectors[sectnum] = s;
|
prsectors[sectnum] = s;
|
||||||
|
|
||||||
if (pr_verbosity >= 2) OSD_Printf("PR : Initalized sector %i.\n", sectnum);
|
if (pr_verbosity >= 2) OSD_Printf("PR : Initialized sector %i.\n", sectnum);
|
||||||
|
|
||||||
return (1);
|
return (1);
|
||||||
}
|
}
|
||||||
|
@ -2146,8 +2243,8 @@ attributes:
|
||||||
(ceilingpicnum == s->ceilingpicnum))
|
(ceilingpicnum == s->ceilingpicnum))
|
||||||
goto finish;
|
goto finish;
|
||||||
|
|
||||||
polymer_getbuildmaterial(&s->floor.material, floorpicnum, sec->floorpal, sec->floorshade);
|
polymer_getbuildmaterial(&s->floor.material, floorpicnum, sec->floorpal, sec->floorshade, 0);
|
||||||
polymer_getbuildmaterial(&s->ceil.material, ceilingpicnum, sec->ceilingpal, sec->ceilingshade);
|
polymer_getbuildmaterial(&s->ceil.material, ceilingpicnum, sec->ceilingpal, sec->ceilingshade, 0);
|
||||||
|
|
||||||
s->flags.invalidtex = 0;
|
s->flags.invalidtex = 0;
|
||||||
|
|
||||||
|
@ -2346,7 +2443,7 @@ static int32_t polymer_initwall(int16_t wallnum)
|
||||||
{
|
{
|
||||||
_prwall *w;
|
_prwall *w;
|
||||||
|
|
||||||
if (pr_verbosity >= 2) OSD_Printf("PR : Initalizing wall %i...\n", wallnum);
|
if (pr_verbosity >= 2) OSD_Printf("PR : Initializing wall %i...\n", wallnum);
|
||||||
|
|
||||||
w = Bcalloc(1, sizeof(_prwall));
|
w = Bcalloc(1, sizeof(_prwall));
|
||||||
if (w == NULL)
|
if (w == NULL)
|
||||||
|
@ -2387,7 +2484,7 @@ static int32_t polymer_initwall(int16_t wallnum)
|
||||||
|
|
||||||
prwalls[wallnum] = w;
|
prwalls[wallnum] = w;
|
||||||
|
|
||||||
if (pr_verbosity >= 2) OSD_Printf("PR : Initalized wall %i.\n", wallnum);
|
if (pr_verbosity >= 2) OSD_Printf("PR : Initialized wall %i.\n", wallnum);
|
||||||
|
|
||||||
return (1);
|
return (1);
|
||||||
}
|
}
|
||||||
|
@ -2514,7 +2611,7 @@ static void polymer_updatewall(int16_t wallnum)
|
||||||
else
|
else
|
||||||
curpicnum = walloverpicnum;
|
curpicnum = walloverpicnum;
|
||||||
|
|
||||||
polymer_getbuildmaterial(&w->wall.material, curpicnum, wal->pal, wal->shade);
|
polymer_getbuildmaterial(&w->wall.material, curpicnum, wal->pal, wal->shade, 0);
|
||||||
|
|
||||||
if (wal->cstat & 4)
|
if (wal->cstat & 4)
|
||||||
yref = sec->floorz;
|
yref = sec->floorz;
|
||||||
|
@ -2595,7 +2692,7 @@ static void polymer_updatewall(int16_t wallnum)
|
||||||
curypanning = wal->ypanning;
|
curypanning = wal->ypanning;
|
||||||
}
|
}
|
||||||
|
|
||||||
polymer_getbuildmaterial(&w->wall.material, curpicnum, curpal, curshade);
|
polymer_getbuildmaterial(&w->wall.material, curpicnum, curpal, curshade, 0);
|
||||||
|
|
||||||
if ((!(wal->cstat & 2) && (wal->cstat & 4)) || ((wal->cstat & 2) && (wall[nwallnum].cstat & 4)))
|
if ((!(wal->cstat & 2) && (wal->cstat & 4)) || ((wal->cstat & 2) && (wall[nwallnum].cstat & 4)))
|
||||||
yref = sec->ceilingz;
|
yref = sec->ceilingz;
|
||||||
|
@ -2668,12 +2765,12 @@ static void polymer_updatewall(int16_t wallnum)
|
||||||
else
|
else
|
||||||
curpicnum = wallpicnum;
|
curpicnum = wallpicnum;
|
||||||
|
|
||||||
polymer_getbuildmaterial(&w->over.material, curpicnum, wal->pal, wal->shade);
|
polymer_getbuildmaterial(&w->over.material, curpicnum, wal->pal, wal->shade, 0);
|
||||||
|
|
||||||
if ((wal->cstat & 16) || (wal->cstat & 32))
|
if ((wal->cstat & 16) || (wal->cstat & 32))
|
||||||
{
|
{
|
||||||
// mask
|
// mask
|
||||||
polymer_getbuildmaterial(&w->mask.material, walloverpicnum, wal->pal, wal->shade);
|
polymer_getbuildmaterial(&w->mask.material, walloverpicnum, wal->pal, wal->shade, 0);
|
||||||
|
|
||||||
if (wal->cstat & 128)
|
if (wal->cstat & 128)
|
||||||
{
|
{
|
||||||
|
@ -3019,7 +3116,7 @@ static inline void polymer_crossproduct(GLfloat* in_a, GLfloat* in_b, GLfloat*
|
||||||
out[2] = in_a[0] * in_b[1] - in_a[1] * in_b[0];
|
out[2] = in_a[0] * in_b[1] - in_a[1] * in_b[0];
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline void polymer_transformpoint(float* inpos, float* pos, float* matrix)
|
static inline void polymer_transformpoint(const float* inpos, float* pos, float* matrix)
|
||||||
{
|
{
|
||||||
pos[0] = inpos[0] * matrix[0] +
|
pos[0] = inpos[0] * matrix[0] +
|
||||||
inpos[1] * matrix[4] +
|
inpos[1] * matrix[4] +
|
||||||
|
@ -3091,9 +3188,8 @@ static void polymer_extractfrustum(GLfloat* modelview, GLfloat* projecti
|
||||||
frustum[i + 8] = matrix[(4 * i) + 3] - matrix[(4 * i) + 1]; // top
|
frustum[i + 8] = matrix[(4 * i) + 3] - matrix[(4 * i) + 1]; // top
|
||||||
frustum[i + 12] = matrix[(4 * i) + 3] + matrix[(4 * i) + 1]; // bottom
|
frustum[i + 12] = matrix[(4 * i) + 3] + matrix[(4 * i) + 1]; // bottom
|
||||||
frustum[i + 16] = matrix[(4 * i) + 3] - matrix[(4 * i) + 2]; // far
|
frustum[i + 16] = matrix[(4 * i) + 3] - matrix[(4 * i) + 2]; // far
|
||||||
i++;
|
|
||||||
}
|
}
|
||||||
while (i < 4);
|
while (++i < 4);
|
||||||
|
|
||||||
if (pr_verbosity >= 3) OSD_Printf("PR : Frustum extracted.\n");
|
if (pr_verbosity >= 3) OSD_Printf("PR : Frustum extracted.\n");
|
||||||
}
|
}
|
||||||
|
@ -3551,15 +3647,15 @@ static void polymer_drawmdsprite(spritetype *tspr)
|
||||||
i = j = 0;
|
i = j = 0;
|
||||||
while (j < lightcount)
|
while (j < lightcount)
|
||||||
{
|
{
|
||||||
while (prlights[i].flags.active == 0) {
|
while (!prlights[i].flags.active)
|
||||||
i++;
|
i++;
|
||||||
}
|
|
||||||
|
if (prlights[i].priority != curpriority)
|
||||||
if (prlights[i].priority != curpriority) {
|
{
|
||||||
i++;
|
i++;
|
||||||
j++;
|
j++;
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
lradius = prlights[i].range / 1000.0f;
|
lradius = prlights[i].range / 1000.0f;
|
||||||
|
|
||||||
|
@ -3576,12 +3672,9 @@ static void polymer_drawmdsprite(spritetype *tspr)
|
||||||
vec[2] = tlpos[2] - spos[2];
|
vec[2] = tlpos[2] - spos[2];
|
||||||
vec[2] *= vec[2];
|
vec[2] *= vec[2];
|
||||||
|
|
||||||
if ((vec[0] + vec[1] + vec[2]) <=
|
if ((vec[0] + vec[1] + vec[2]) <= ((sradius+lradius) * (sradius+lradius)))
|
||||||
((sradius+lradius) * (sradius+lradius)))
|
modellights[modellightcount++] = i;
|
||||||
{
|
|
||||||
modellights[modellightcount] = i;
|
|
||||||
modellightcount++;
|
|
||||||
}
|
|
||||||
i++;
|
i++;
|
||||||
j++;
|
j++;
|
||||||
}
|
}
|
||||||
|
@ -3690,11 +3783,9 @@ static void polymer_drawmdsprite(spritetype *tspr)
|
||||||
curlight = 0;
|
curlight = 0;
|
||||||
do {
|
do {
|
||||||
materialbits = polymer_bindmaterial(mdspritematerial, modellights, modellightcount);
|
materialbits = polymer_bindmaterial(mdspritematerial, modellights, modellightcount);
|
||||||
bglDrawElements(GL_TRIANGLES, s->numtris * 3, GL_UNSIGNED_INT, 0);
|
bglDrawElements(GL_TRIANGLES, s->numtris * 3, GL_UNSIGNED_INT, 0);
|
||||||
polymer_unbindmaterial(materialbits);
|
polymer_unbindmaterial(materialbits);
|
||||||
|
} while ((++curlight < modellightcount) && (curlight < pr_maxlightpasses));
|
||||||
curlight++;
|
|
||||||
} while ((curlight < modellightcount) && (curlight < pr_maxlightpasses));
|
|
||||||
|
|
||||||
bglBindBufferARB(GL_ELEMENT_ARRAY_BUFFER_ARB, 0);
|
bglBindBufferARB(GL_ELEMENT_ARRAY_BUFFER_ARB, 0);
|
||||||
bglBindBufferARB(GL_ARRAY_BUFFER_ARB, 0);
|
bglBindBufferARB(GL_ARRAY_BUFFER_ARB, 0);
|
||||||
|
@ -3716,9 +3807,7 @@ static void polymer_drawmdsprite(spritetype *tspr)
|
||||||
materialbits = polymer_bindmaterial(mdspritematerial, modellights, modellightcount);
|
materialbits = polymer_bindmaterial(mdspritematerial, modellights, modellightcount);
|
||||||
bglDrawElements(GL_TRIANGLES, s->numtris * 3, GL_UNSIGNED_INT, s->tris);
|
bglDrawElements(GL_TRIANGLES, s->numtris * 3, GL_UNSIGNED_INT, s->tris);
|
||||||
polymer_unbindmaterial(materialbits);
|
polymer_unbindmaterial(materialbits);
|
||||||
|
} while ((++curlight < modellightcount) && (curlight < pr_maxlightpasses));
|
||||||
curlight++;
|
|
||||||
} while ((curlight < modellightcount) && (curlight < pr_maxlightpasses));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
bglDisableClientState(GL_NORMAL_ARRAY);
|
bglDisableClientState(GL_NORMAL_ARRAY);
|
||||||
|
@ -3800,7 +3889,7 @@ static void polymer_getscratchmaterial(_prmaterial* material)
|
||||||
material->mdspritespace = GL_FALSE;
|
material->mdspritespace = GL_FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void polymer_getbuildmaterial(_prmaterial* material, int16_t tilenum, char pal, int8_t shade)
|
static void polymer_getbuildmaterial(_prmaterial* material, int16_t tilenum, char pal, int8_t shade, int32_t cmeth)
|
||||||
{
|
{
|
||||||
pthtyp* pth;
|
pthtyp* pth;
|
||||||
|
|
||||||
|
@ -3810,7 +3899,7 @@ static void polymer_getbuildmaterial(_prmaterial* material, int16_t tile
|
||||||
if (!waloff[tilenum])
|
if (!waloff[tilenum])
|
||||||
loadtile(tilenum);
|
loadtile(tilenum);
|
||||||
|
|
||||||
if ((pth = gltexcache(tilenum, pal, (material == &spriteplane.material) ? 4 : 0)))
|
if ((pth = gltexcache(tilenum, pal, cmeth)))
|
||||||
{
|
{
|
||||||
material->diffusemap = pth->glpic;
|
material->diffusemap = pth->glpic;
|
||||||
|
|
||||||
|
@ -4453,7 +4542,7 @@ static void polymer_updatelights(void)
|
||||||
{
|
{
|
||||||
int32_t i = 0;
|
int32_t i = 0;
|
||||||
|
|
||||||
while (i < PR_MAXLIGHTS)
|
do
|
||||||
{
|
{
|
||||||
if (prlights[i].flags.active && prlights[i].flags.invalidate) {
|
if (prlights[i].flags.active && prlights[i].flags.invalidate) {
|
||||||
// highly suboptimal
|
// highly suboptimal
|
||||||
|
@ -4461,6 +4550,7 @@ static void polymer_updatelights(void)
|
||||||
|
|
||||||
if (prlights[i].radius)
|
if (prlights[i].radius)
|
||||||
polymer_processspotlight(&prlights[i]);
|
polymer_processspotlight(&prlights[i]);
|
||||||
|
|
||||||
polymer_culllight(i);
|
polymer_culllight(i);
|
||||||
|
|
||||||
prlights[i].flags.invalidate = 0;
|
prlights[i].flags.invalidate = 0;
|
||||||
|
@ -4468,8 +4558,8 @@ static void polymer_updatelights(void)
|
||||||
|
|
||||||
if (prlights[i].flags.active)
|
if (prlights[i].flags.active)
|
||||||
prlights[i].rtindex = -1;
|
prlights[i].rtindex = -1;
|
||||||
i++;
|
|
||||||
}
|
}
|
||||||
|
while (++i < PR_MAXLIGHTS);
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline void polymer_resetplanelights(_prplane* plane)
|
static inline void polymer_resetplanelights(_prplane* plane)
|
||||||
|
@ -4480,22 +4570,38 @@ static inline void polymer_resetplanelights(_prplane* plane)
|
||||||
|
|
||||||
static void polymer_addplanelight(_prplane* plane, int16_t lighti)
|
static void polymer_addplanelight(_prplane* plane, int16_t lighti)
|
||||||
{
|
{
|
||||||
int32_t i = 0;
|
|
||||||
_prplanelist* oldhead;
|
_prplanelist* oldhead;
|
||||||
|
int32_t i = 0;
|
||||||
|
|
||||||
if (plane->lightcount == PR_MAXLIGHTS - 1)
|
if (plane->lightcount == PR_MAXLIGHTS - 1)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if (plane->lightcount)
|
if (plane->lightcount)
|
||||||
{
|
{
|
||||||
|
do
|
||||||
|
{
|
||||||
|
if (plane->lights[i++] == lighti)
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
while (i < plane->lightcount);
|
||||||
|
|
||||||
|
i = 0;
|
||||||
while (i < plane->lightcount && prlights[plane->lights[i]].priority < prlights[lighti].priority)
|
while (i < plane->lightcount && prlights[plane->lights[i]].priority < prlights[lighti].priority)
|
||||||
i++;
|
i++;
|
||||||
memmove(&plane->lights[i+1], &plane->lights[i], sizeof(int16_t) * (plane->lightcount - i));
|
Bmemmove(&plane->lights[i+1], &plane->lights[i], sizeof(int16_t) * (plane->lightcount - i));
|
||||||
}
|
}
|
||||||
|
|
||||||
plane->lights[i] = lighti;
|
plane->lights[i] = lighti;
|
||||||
plane->lightcount++;
|
plane->lightcount++;
|
||||||
|
|
||||||
|
out:
|
||||||
|
oldhead = prlights[lighti].planelist;
|
||||||
|
while (oldhead != NULL)
|
||||||
|
{
|
||||||
|
if (oldhead->plane == plane) return;
|
||||||
|
oldhead = oldhead->n;
|
||||||
|
}
|
||||||
|
|
||||||
oldhead = prlights[lighti].planelist;
|
oldhead = prlights[lighti].planelist;
|
||||||
prlights[lighti].planelist = Bmalloc(sizeof(_prplanelist));
|
prlights[lighti].planelist = Bmalloc(sizeof(_prplanelist));
|
||||||
prlights[lighti].planelist->n = oldhead;
|
prlights[lighti].planelist->n = oldhead;
|
||||||
|
@ -4512,7 +4618,7 @@ static inline void polymer_deleteplanelight(_prplane* plane, int16_t lighti)
|
||||||
{
|
{
|
||||||
if (plane->lights[i] == lighti)
|
if (plane->lights[i] == lighti)
|
||||||
{
|
{
|
||||||
memmove(&plane->lights[i], &plane->lights[i+1], sizeof(int16_t) * (plane->lightcount - i));
|
Bmemmove(&plane->lights[i], &plane->lights[i+1], sizeof(int16_t) * (plane->lightcount - i));
|
||||||
plane->lightcount--;
|
plane->lightcount--;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -4545,25 +4651,22 @@ static int32_t polymer_planeinlight(_prplane* plane, _prlight* light)
|
||||||
{
|
{
|
||||||
if (plane->buffer[(j * 5) + i] > (lightpos[i] + light->range)) k++;
|
if (plane->buffer[(j * 5) + i] > (lightpos[i] + light->range)) k++;
|
||||||
if (plane->buffer[(j * 5) + i] < (lightpos[i] - light->range)) l++;
|
if (plane->buffer[(j * 5) + i] < (lightpos[i] - light->range)) l++;
|
||||||
j++;
|
|
||||||
}
|
}
|
||||||
while (j < plane->vertcount);
|
while (++j < plane->vertcount);
|
||||||
|
|
||||||
if ((k == plane->vertcount) || (l == plane->vertcount))
|
if ((k == plane->vertcount) || (l == plane->vertcount))
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
i++;
|
|
||||||
}
|
}
|
||||||
while (i < 3);
|
while (++i < 3);
|
||||||
|
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void polymer_invalidateplanelights(_prplane* plane)
|
static void polymer_invalidateplanelights(_prplane* plane)
|
||||||
{
|
{
|
||||||
int32_t i = -1;
|
int32_t i = plane->lightcount;
|
||||||
|
|
||||||
while (++i < plane->lightcount)
|
while (i--)
|
||||||
{
|
{
|
||||||
if (plane && (plane->lights[i] != -1) && (prlights[plane->lights[i]].flags.active))
|
if (plane && (plane->lights[i] != -1) && (prlights[plane->lights[i]].flags.active))
|
||||||
prlights[plane->lights[i]].flags.invalidate = 1;
|
prlights[plane->lights[i]].flags.invalidate = 1;
|
||||||
|
@ -4574,7 +4677,6 @@ static void polymer_invalidatesectorlights(int16_t sectnum)
|
||||||
{
|
{
|
||||||
int32_t i;
|
int32_t i;
|
||||||
_prsector *s = prsectors[sectnum];
|
_prsector *s = prsectors[sectnum];
|
||||||
_prwall *w;
|
|
||||||
sectortype *sec = §or[sectnum];
|
sectortype *sec = §or[sectnum];
|
||||||
|
|
||||||
if (!s)
|
if (!s)
|
||||||
|
@ -4587,6 +4689,7 @@ static void polymer_invalidatesectorlights(int16_t sectnum)
|
||||||
|
|
||||||
while (i--)
|
while (i--)
|
||||||
{
|
{
|
||||||
|
_prwall *w;
|
||||||
if (!(w = prwalls[sec->wallptr + i])) continue;
|
if (!(w = prwalls[sec->wallptr + i])) continue;
|
||||||
|
|
||||||
polymer_invalidateplanelights(&w->wall);
|
polymer_invalidateplanelights(&w->wall);
|
||||||
|
@ -4668,7 +4771,7 @@ static inline void polymer_culllight(int16_t lighti)
|
||||||
|
|
||||||
sectorqueue[0] = light->sector;
|
sectorqueue[0] = light->sector;
|
||||||
|
|
||||||
while (front != back)
|
do
|
||||||
{
|
{
|
||||||
s = prsectors[sectorqueue[front]];
|
s = prsectors[sectorqueue[front]];
|
||||||
sec = §or[sectorqueue[front]];
|
sec = §or[sectorqueue[front]];
|
||||||
|
@ -4739,6 +4842,21 @@ static inline void polymer_culllight(int16_t lighti)
|
||||||
}
|
}
|
||||||
front++;
|
front++;
|
||||||
}
|
}
|
||||||
|
while (front != back);
|
||||||
|
|
||||||
|
i = MAXSPRITES-1;
|
||||||
|
|
||||||
|
do
|
||||||
|
{
|
||||||
|
_prsprite *s = prsprites[i];
|
||||||
|
|
||||||
|
if ((sprite[i].cstat & 48) == 0 || s == NULL || sprite[i].statnum == MAXSTATUS || sprite[i].sectnum == MAXSECTORS)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
if (polymer_planeinlight(&s->plane, light))
|
||||||
|
polymer_addplanelight(&s->plane, lighti);
|
||||||
|
}
|
||||||
|
while (i--);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void polymer_prepareshadows(void)
|
static void polymer_prepareshadows(void)
|
||||||
|
@ -4766,9 +4884,8 @@ static void polymer_prepareshadows(void)
|
||||||
|
|
||||||
while ((k < lightcount) && (j < pr_shadowcount))
|
while ((k < lightcount) && (j < pr_shadowcount))
|
||||||
{
|
{
|
||||||
while (prlights[i].flags.active == 0) {
|
while (!prlights[i].flags.active)
|
||||||
i++;
|
i++;
|
||||||
}
|
|
||||||
|
|
||||||
if (prlights[i].radius && prlights[i].flags.isinview)
|
if (prlights[i].radius && prlights[i].flags.isinview)
|
||||||
{
|
{
|
||||||
|
|
|
@ -2827,6 +2827,8 @@ static int32_t SetupOpenGL(int32_t width, int32_t height, int32_t bitspp)
|
||||||
err = 0;
|
err = 0;
|
||||||
else if (!Bstrcmp(glinfo.renderer,"Mobile Intel(R) 4 Series Express Chipset Family"))
|
else if (!Bstrcmp(glinfo.renderer,"Mobile Intel(R) 4 Series Express Chipset Family"))
|
||||||
err = 0;
|
err = 0;
|
||||||
|
else if (!Bstrcmp(glinfo.renderer,"Intel Brookdale-G"))
|
||||||
|
err = 0;
|
||||||
else err = 1;
|
else err = 1;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
|
|
@ -4368,7 +4368,7 @@ static void Keys3d(void)
|
||||||
if (ASSERT_AIMING)
|
if (ASSERT_AIMING)
|
||||||
{
|
{
|
||||||
Bsprintf(tempbuf, "%s extra: ", Typestr_wss[searchstat]);
|
Bsprintf(tempbuf, "%s extra: ", Typestr_wss[searchstat]);
|
||||||
getnumberptr256(tempbuf, &AIMED(extra), sizeof(int16_t), BTAG_MAX, 0, NULL);
|
getnumberptr256(tempbuf, &AIMED(extra), sizeof(int16_t), BTAG_MAX, 1, NULL);
|
||||||
asksave = 1;
|
asksave = 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -9718,7 +9718,7 @@ static void G_DoAutoload(const char *fn)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static char *makename(char *destname, char *OGGname, char *origname)
|
static char *makename(char *destname, char *OGGname, const char *origname)
|
||||||
{
|
{
|
||||||
if (!origname)
|
if (!origname)
|
||||||
return destname;
|
return destname;
|
||||||
|
@ -9744,7 +9744,7 @@ static char *makename(char *destname, char *OGGname, char *origname)
|
||||||
return destname;
|
return destname;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int32_t AL_DefineSound(int32_t ID,char *name)
|
static int32_t S_DefineSound(int32_t ID,char *name)
|
||||||
{
|
{
|
||||||
if (ID >= MAXSOUNDS)
|
if (ID >= MAXSOUNDS)
|
||||||
return 1;
|
return 1;
|
||||||
|
@ -9754,7 +9754,7 @@ static int32_t AL_DefineSound(int32_t ID,char *name)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int32_t AL_DefineMusic(char *ID,char *name)
|
static int32_t S_DefineMusic(char *ID,char *name)
|
||||||
{
|
{
|
||||||
int32_t lev, ep;
|
int32_t lev, ep;
|
||||||
int32_t sel = MAXVOLUMES * MAXLEVELS;
|
int32_t sel = MAXVOLUMES * MAXLEVELS;
|
||||||
|
@ -9923,7 +9923,7 @@ static int32_t parsedefinitions_game(scriptfile *script, const int32_t preload)
|
||||||
else Bfree(tfn);
|
else Bfree(tfn);
|
||||||
pathsearchmode = i;
|
pathsearchmode = i;
|
||||||
|
|
||||||
if (AL_DefineMusic(ID,fn))
|
if (S_DefineMusic(ID,fn))
|
||||||
initprintf("Error: invalid music ID on line %s:%d\n", script->filename, scriptfile_getlinum(script,tinttokptr));
|
initprintf("Error: invalid music ID on line %s:%d\n", script->filename, scriptfile_getlinum(script,tinttokptr));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -9977,7 +9977,7 @@ static int32_t parsedefinitions_game(scriptfile *script, const int32_t preload)
|
||||||
else Bfree(tfn);
|
else Bfree(tfn);
|
||||||
pathsearchmode = i;
|
pathsearchmode = i;
|
||||||
|
|
||||||
if (AL_DefineSound(num,fn))
|
if (S_DefineSound(num,fn))
|
||||||
initprintf("Error: invalid sound ID on line %s:%d\n", script->filename, scriptfile_getlinum(script,tinttokptr));
|
initprintf("Error: invalid sound ID on line %s:%d\n", script->filename, scriptfile_getlinum(script,tinttokptr));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -326,12 +326,12 @@ void G_DoSectorAnimations(void)
|
||||||
|
|
||||||
int32_t GetAnimationGoal(int32_t *animptr)
|
int32_t GetAnimationGoal(int32_t *animptr)
|
||||||
{
|
{
|
||||||
int32_t i = g_animateCount-1, j = -1;
|
int32_t i = g_animateCount-1;
|
||||||
|
|
||||||
for (; i>=0; i--)
|
for (; i>=0; i--)
|
||||||
if (animptr == (int32_t *)animateptr[i])
|
if (animptr == (int32_t *)animateptr[i])
|
||||||
return j;
|
return i;
|
||||||
return(j);
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t SetAnimation(int32_t animsect,int32_t *animptr, int32_t thegoal, int32_t thevel)
|
int32_t SetAnimation(int32_t animsect,int32_t *animptr, int32_t thegoal, int32_t thevel)
|
||||||
|
|
Loading…
Reference in a new issue