mirror of
https://github.com/DrBeef/Raze.git
synced 2024-11-15 17:01:51 +00:00
This overhauls the light culling/management code. Note: this renders the current gameland dynamic light code useless, to it'll have to be ported before they're back. Please don't complain on the forums.
git-svn-id: https://svn.eduke32.com/eduke32@1397 1a8010ca-5511-0410-912e-c29ae57300e0
This commit is contained in:
parent
52aff6e8d9
commit
a23c9c23ba
3 changed files with 368 additions and 149 deletions
|
@ -164,7 +164,11 @@ typedef struct s_prlight {
|
|||
GLfloat transform[16];
|
||||
float frustum[5 * 4];
|
||||
int32_t rtindex;
|
||||
char isinview;
|
||||
struct {
|
||||
int32_t active : 1;
|
||||
int32_t invalidate : 1;
|
||||
int32_t isinview : 1;
|
||||
} flags;
|
||||
GLuint lightmap;
|
||||
} _prlight;
|
||||
|
||||
|
@ -203,9 +207,8 @@ typedef struct s_prplane {
|
|||
int32_t indicescount;
|
||||
GLuint ivbo;
|
||||
// lights
|
||||
char lights[PR_MAXLIGHTS];
|
||||
char lightcount;
|
||||
char drawn;
|
||||
int16_t lights[PR_MAXLIGHTS];
|
||||
int16_t lightcount;
|
||||
} _prplane;
|
||||
|
||||
typedef struct s_prsector {
|
||||
|
@ -277,6 +280,8 @@ void polymer_rotatesprite(int32_t sx, int32_t sy, int32_t z, int1
|
|||
void polymer_drawmaskwall(int32_t damaskwallcnt);
|
||||
void polymer_drawsprite(int32_t snum);
|
||||
void polymer_setanimatesprites(animatespritesptr animatesprites, int32_t x, int32_t y, int32_t a, int32_t smoothratio);
|
||||
int16_t polymer_addlight(_prlight* light);
|
||||
void polymer_deletelight(int16_t lighti);
|
||||
|
||||
# ifdef POLYMER_C
|
||||
|
||||
|
@ -320,14 +325,21 @@ static void polymer_loadmodelvbos(md3model_t* m);
|
|||
// MATERIALS
|
||||
static void polymer_getscratchmaterial(_prmaterial* material);
|
||||
static void polymer_getbuildmaterial(_prmaterial* material, int16_t tilenum, char pal, int8_t shade);
|
||||
static int32_t polymer_bindmaterial(_prmaterial material, char* 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_compileprogram(int32_t programbits);
|
||||
// LIGHTS
|
||||
static void polymer_removelight(int16_t lighti);
|
||||
static void polymer_updatelights(void);
|
||||
static void polymer_resetlights(void);
|
||||
static void polymer_addlight(_prlight light);
|
||||
static void polymer_resetplanelights(_prplane* plane);
|
||||
static void polymer_addplanelight(_prplane* plane, int16_t lighti);
|
||||
static void polymer_deleteplanelight(_prplane* plane, int16_t lighti);
|
||||
static int32_t polymer_planeinlight(_prplane* plane, _prlight* light);
|
||||
static inline void polymer_culllight(char lightindex);
|
||||
static void polymer_invalidateplanelights(_prplane* plane);
|
||||
static void polymer_invalidatesectorlights(int16_t sectnum);
|
||||
static void polymer_processspotlight(_prlight* light);
|
||||
static inline void polymer_culllight(int16_t lighti);
|
||||
static void polymer_prepareshadows(void);
|
||||
static void polymer_applylights(void);
|
||||
// RENDER TARGETS
|
||||
|
|
|
@ -7534,41 +7534,43 @@ int32_t loadmaphack(char *filename)
|
|||
case T_LIGHT: // light sector x y z range r g b radius faderadius angle horiz minshade maxshade priority tilenum
|
||||
{
|
||||
int32_t value;
|
||||
_prlight light;
|
||||
|
||||
scriptfile_getnumber(script, &value);
|
||||
staticlights[staticlightcount].sector = value;
|
||||
light.sector = value;
|
||||
scriptfile_getnumber(script, &value);
|
||||
staticlights[staticlightcount].x = value;
|
||||
light.x = value;
|
||||
scriptfile_getnumber(script, &value);
|
||||
staticlights[staticlightcount].y = value;
|
||||
light.y = value;
|
||||
scriptfile_getnumber(script, &value);
|
||||
staticlights[staticlightcount].z = value;
|
||||
light.z = value;
|
||||
scriptfile_getnumber(script, &value);
|
||||
staticlights[staticlightcount].range = value;
|
||||
light.range = value;
|
||||
scriptfile_getnumber(script, &value);
|
||||
staticlights[staticlightcount].color[0] = value;
|
||||
light.color[0] = value;
|
||||
scriptfile_getnumber(script, &value);
|
||||
staticlights[staticlightcount].color[1] = value;
|
||||
light.color[1] = value;
|
||||
scriptfile_getnumber(script, &value);
|
||||
staticlights[staticlightcount].color[2] = value;
|
||||
light.color[2] = value;
|
||||
scriptfile_getnumber(script, &value);
|
||||
staticlights[staticlightcount].radius = value;
|
||||
light.radius = value;
|
||||
scriptfile_getnumber(script, &value);
|
||||
staticlights[staticlightcount].faderadius = value;
|
||||
light.faderadius = value;
|
||||
scriptfile_getnumber(script, &value);
|
||||
staticlights[staticlightcount].angle = value;
|
||||
light.angle = value;
|
||||
scriptfile_getnumber(script, &value);
|
||||
staticlights[staticlightcount].horiz = value;
|
||||
light.horiz = value;
|
||||
scriptfile_getnumber(script, &value);
|
||||
staticlights[staticlightcount].minshade = value;
|
||||
light.minshade = value;
|
||||
scriptfile_getnumber(script, &value);
|
||||
staticlights[staticlightcount].maxshade = value;
|
||||
light.maxshade = value;
|
||||
scriptfile_getnumber(script, &value);
|
||||
staticlights[staticlightcount].priority = value;
|
||||
light.priority = value;
|
||||
scriptfile_getnumber(script, &value);
|
||||
staticlights[staticlightcount].tilenum = value;
|
||||
light.tilenum = value;
|
||||
|
||||
polymer_addlight(&light);
|
||||
|
||||
staticlightcount++;
|
||||
break;
|
||||
}
|
||||
#endif // POLYMER
|
||||
|
|
|
@ -132,6 +132,7 @@ GLfloat artskydata[16];
|
|||
_prlight prlights[PR_MAXLIGHTS];
|
||||
int32_t lightcount;
|
||||
int32_t curlight;
|
||||
int32_t curlightcount;
|
||||
|
||||
_prlight staticlights[PR_MAXLIGHTS];
|
||||
int32_t staticlightcount;
|
||||
|
@ -693,6 +694,8 @@ void polymer_loadboard(void)
|
|||
|
||||
polymer_getsky();
|
||||
|
||||
polymer_resetlights();
|
||||
|
||||
if (pr_verbosity >= 1) OSD_Printf("PR : Board loaded.\n");
|
||||
}
|
||||
|
||||
|
@ -726,9 +729,11 @@ void polymer_drawrooms(int32_t daposx, int32_t daposy, int32_t da
|
|||
pos[1] = -(float)(daposz) / 16.0f;
|
||||
pos[2] = -daposx;
|
||||
|
||||
polymer_resetlights();
|
||||
if (pr_lighting)
|
||||
polymer_applylights();
|
||||
polymer_updatelights();
|
||||
|
||||
// polymer_resetlights();
|
||||
// if (pr_lighting)
|
||||
// polymer_applylights();
|
||||
|
||||
depth = 0;
|
||||
|
||||
|
@ -786,8 +791,6 @@ void polymer_drawrooms(int32_t daposx, int32_t daposy, int32_t da
|
|||
while (i < numsectors)
|
||||
{
|
||||
prsectors[i]->controlstate = 0;
|
||||
prsectors[i]->ceil.drawn = 0;
|
||||
prsectors[i]->floor.drawn = 0;
|
||||
prsectors[i]->wallsproffset = 0.0f;
|
||||
prsectors[i]->floorsproffset = 0.0f;
|
||||
i++;
|
||||
|
@ -796,9 +799,6 @@ void polymer_drawrooms(int32_t daposx, int32_t daposy, int32_t da
|
|||
while (i < numwalls)
|
||||
{
|
||||
prwalls[i]->controlstate = 0;
|
||||
prwalls[i]->wall.drawn = 0;
|
||||
prwalls[i]->over.drawn = 0;
|
||||
prwalls[i]->mask.drawn = 0;
|
||||
i++;
|
||||
}
|
||||
|
||||
|
@ -912,7 +912,7 @@ void polymer_drawmaskwall(int32_t damaskwallcnt)
|
|||
|
||||
void polymer_drawsprite(int32_t snum)
|
||||
{
|
||||
int32_t curpicnum, xsize, ysize, tilexoff, tileyoff, xoff, yoff, i;
|
||||
int32_t curpicnum, xsize, ysize, tilexoff, tileyoff, xoff, yoff, i, j;
|
||||
spritetype *tspr;
|
||||
float xratio, yratio, ang;
|
||||
float spos[3];
|
||||
|
@ -1067,15 +1067,21 @@ void polymer_drawsprite(int32_t snum)
|
|||
polymer_computeplane(&spriteplane);
|
||||
|
||||
spriteplane.lightcount = 0;
|
||||
i = 0;
|
||||
while (i < lightcount)
|
||||
|
||||
i = j = 0;
|
||||
while (j < lightcount)
|
||||
{
|
||||
while (prlights[i].flags.active == 0) {
|
||||
i++;
|
||||
}
|
||||
|
||||
if (polymer_planeinlight(&spriteplane, &prlights[i]))
|
||||
{
|
||||
spriteplane.lights[spriteplane.lightcount] = i;
|
||||
spriteplane.lightcount++;
|
||||
}
|
||||
i++;
|
||||
j++;
|
||||
}
|
||||
|
||||
if ((tspr->cstat & 64) && ((tspr->cstat>>4) & 3))
|
||||
|
@ -1103,6 +1109,48 @@ void polymer_setanimatesprites(animatespritesptr animatesprites,
|
|||
asi.smoothratio = smoothratio;
|
||||
}
|
||||
|
||||
int16_t polymer_addlight(_prlight* light)
|
||||
{
|
||||
int16_t lighti;
|
||||
|
||||
if ((light->sector == -1) || (light->sector >= numsectors))
|
||||
return (-1);
|
||||
|
||||
if (lightcount >= PR_MAXLIGHTS)
|
||||
return (-1);
|
||||
|
||||
lighti = 0;
|
||||
while ((lighti < PR_MAXLIGHTS) && (prlights[lighti].flags.active)) {
|
||||
lighti++;
|
||||
}
|
||||
|
||||
if (lighti == PR_MAXLIGHTS)
|
||||
return (-1);
|
||||
|
||||
memcpy(&prlights[lighti], light, sizeof(_prlight));
|
||||
|
||||
if (light->radius)
|
||||
polymer_processspotlight(&prlights[lighti]);
|
||||
|
||||
prlights[lighti].flags.isinview = 0;
|
||||
prlights[lighti].flags.active = 1;
|
||||
|
||||
polymer_culllight(lighti);
|
||||
|
||||
lightcount++;
|
||||
|
||||
return (lighti);
|
||||
}
|
||||
|
||||
void polymer_deletelight(int16_t lighti)
|
||||
{
|
||||
polymer_removelight(lighti);
|
||||
|
||||
prlights[lighti].flags.active = 0;
|
||||
|
||||
lightcount--;
|
||||
}
|
||||
|
||||
// CORE
|
||||
static void polymer_displayrooms(int16_t dacursectnum)
|
||||
{
|
||||
|
@ -1487,10 +1535,13 @@ static void polymer_drawplane(_prplane* plane)
|
|||
bglTexCoordPointer(2, GL_FLOAT, 5 * sizeof(GLfloat), &plane->buffer[3]);
|
||||
}
|
||||
|
||||
curlight = 0;
|
||||
|
||||
while ((curlight == 0) || ((curlight < plane->lightcount) && (curlight < pr_maxlightpasses)))
|
||||
curlight = curlightcount = 0;
|
||||
while ((curlight == 0) || ((curlightcount < plane->lightcount) && (curlightcount < pr_maxlightpasses)))
|
||||
{
|
||||
while (plane->lightcount && plane->lights[curlight] == -1) {
|
||||
curlight++;
|
||||
}
|
||||
|
||||
materialbits = polymer_bindmaterial(plane->material, plane->lights, plane->lightcount);
|
||||
|
||||
if (materialbits & prprogrambits[PR_BIT_NORMAL_MAP].bit)
|
||||
|
@ -1511,7 +1562,11 @@ static void polymer_drawplane(_prplane* plane)
|
|||
|
||||
polymer_unbindmaterial(materialbits);
|
||||
|
||||
if (plane->lightcount && (!depth || mirrors[depth-1].plane))
|
||||
prlights[plane->lights[curlight]].flags.isinview = 1;
|
||||
|
||||
curlight++;
|
||||
curlightcount++;
|
||||
}
|
||||
|
||||
if (plane->vbo && (pr_vbos > 0))
|
||||
|
@ -1520,8 +1575,6 @@ static void polymer_drawplane(_prplane* plane)
|
|||
if (plane->indices)
|
||||
bglBindBufferARB(GL_ELEMENT_ARRAY_BUFFER_ARB, 0);
|
||||
}
|
||||
|
||||
plane->drawn = 1;
|
||||
}
|
||||
|
||||
static inline void polymer_inb4mirror(GLfloat* buffer, GLfloat* plane)
|
||||
|
@ -2280,6 +2333,8 @@ static void polymer_updatewall(int16_t wallnum)
|
|||
}
|
||||
}
|
||||
|
||||
polymer_invalidatesectorlights(sectorofwall(wallnum));
|
||||
|
||||
w->underover = underwall = overwall = 0;
|
||||
|
||||
if (wal->cstat & 8)
|
||||
|
@ -3049,11 +3104,11 @@ static void polymer_drawmdsprite(spritetype *tspr)
|
|||
float spos[3], tspos[3], lpos[3], tlpos[3], vec[3];
|
||||
float ang;
|
||||
float scale;
|
||||
int32_t surfi, i;
|
||||
int32_t surfi, i, j;
|
||||
GLfloat* color;
|
||||
int32_t materialbits;
|
||||
float sradius, lradius;
|
||||
char modellights[PR_MAXLIGHTS];
|
||||
int16_t modellights[PR_MAXLIGHTS];
|
||||
char modellightcount;
|
||||
|
||||
m = (md3model_t*)models[tile2model[Ptile2tile(tspr->picnum,sprite[tspr->owner].pal)].modelid];
|
||||
|
@ -3221,9 +3276,13 @@ static void polymer_drawmdsprite(spritetype *tspr)
|
|||
polymer_transformpoint(spos, tspos, spritemodelview);
|
||||
polymer_transformpoint(tspos, spos, rootmodelviewmatrix);
|
||||
|
||||
i = 0;
|
||||
while (i < lightcount)
|
||||
i = j = 0;
|
||||
while (j < lightcount)
|
||||
{
|
||||
while (prlights[i].flags.active == 0) {
|
||||
i++;
|
||||
}
|
||||
|
||||
lradius = prlights[i].range / 1000.0f;
|
||||
|
||||
lpos[0] = prlights[i].y;
|
||||
|
@ -3246,6 +3305,7 @@ static void polymer_drawmdsprite(spritetype *tspr)
|
|||
modellightcount++;
|
||||
}
|
||||
i++;
|
||||
j++;
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -3328,14 +3388,19 @@ static void polymer_drawmdsprite(spritetype *tspr)
|
|||
|
||||
bglBindBufferARB(GL_ELEMENT_ARRAY_BUFFER_ARB, m->indices[surfi]);
|
||||
|
||||
curlight = 0;
|
||||
while ((curlight == 0) || ((curlight < modellightcount) && (curlight < pr_maxlightpasses)))
|
||||
curlight = curlightcount = 0;
|
||||
while ((curlight == 0) || ((curlightcount < modellightcount) && (curlightcount < pr_maxlightpasses)))
|
||||
{
|
||||
while (modellights[curlight] == -1) {
|
||||
curlight++;
|
||||
}
|
||||
|
||||
materialbits = polymer_bindmaterial(mdspritematerial, modellights, modellightcount);
|
||||
bglDrawElements(GL_TRIANGLES, s->numtris * 3, GL_UNSIGNED_INT, 0);
|
||||
polymer_unbindmaterial(materialbits);
|
||||
|
||||
curlight++;
|
||||
curlightcount++;
|
||||
}
|
||||
|
||||
bglBindBufferARB(GL_ELEMENT_ARRAY_BUFFER_ARB, 0);
|
||||
|
@ -3353,14 +3418,19 @@ static void polymer_drawmdsprite(spritetype *tspr)
|
|||
mdspritematerial.nextframedatastride = sizeof(float) * 6;
|
||||
}
|
||||
|
||||
curlight = 0;
|
||||
while ((curlight == 0) || ((curlight < modellightcount) && (curlight < pr_maxlightpasses)))
|
||||
curlight = curlightcount = 0;
|
||||
while ((curlight == 0) || ((curlightcount < modellightcount) && (curlightcount < pr_maxlightpasses)))
|
||||
{
|
||||
while (modellights[curlight] == -1) {
|
||||
curlight++;
|
||||
}
|
||||
|
||||
materialbits = polymer_bindmaterial(mdspritematerial, modellights, modellightcount);
|
||||
bglDrawElements(GL_TRIANGLES, s->numtris * 3, GL_UNSIGNED_INT, s->tris);
|
||||
polymer_unbindmaterial(materialbits);
|
||||
|
||||
curlight++;
|
||||
curlightcount++;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -3551,7 +3621,7 @@ static void polymer_getbuildmaterial(_prmaterial* material, int16_t tile
|
|||
}
|
||||
}
|
||||
|
||||
static int32_t polymer_bindmaterial(_prmaterial material, char* lights, int lightcount)
|
||||
static int32_t polymer_bindmaterial(_prmaterial material, int16_t* lights, int matlightcount)
|
||||
{
|
||||
int32_t programbits;
|
||||
int32_t texunit;
|
||||
|
@ -3565,7 +3635,7 @@ static int32_t polymer_bindmaterial(_prmaterial material, char* lights, int
|
|||
programbits |= prprogrambits[PR_BIT_ANIM_INTERPOLATION].bit;
|
||||
|
||||
// PR_BIT_LIGHTING_PASS
|
||||
if (curlight && lightcount)
|
||||
if (curlightcount && matlightcount)
|
||||
programbits |= prprogrambits[PR_BIT_LIGHTING_PASS].bit;
|
||||
|
||||
// PR_BIT_NORMAL_MAP
|
||||
|
@ -3577,7 +3647,7 @@ static int32_t polymer_bindmaterial(_prmaterial material, char* lights, int
|
|||
programbits |= prprogrambits[PR_BIT_DIFFUSE_MAP].bit;
|
||||
|
||||
// PR_BIT_DIFFUSE_DETAIL_MAP
|
||||
if (!curlight && r_detailmapping && material.detailmap)
|
||||
if (!curlightcount && r_detailmapping && material.detailmap)
|
||||
programbits |= prprogrambits[PR_BIT_DIFFUSE_DETAIL_MAP].bit;
|
||||
|
||||
// PR_BIT_DIFFUSE_MODULATION
|
||||
|
@ -3592,18 +3662,18 @@ static int32_t polymer_bindmaterial(_prmaterial material, char* lights, int
|
|||
programbits |= prprogrambits[PR_BIT_SPECULAR_MATERIAL].bit;
|
||||
|
||||
// PR_BIT_MIRROR_MAP
|
||||
if (!curlight && material.mirrormap)
|
||||
if (!curlightcount && material.mirrormap)
|
||||
programbits |= prprogrambits[PR_BIT_MIRROR_MAP].bit;
|
||||
|
||||
// PR_BIT_FOG
|
||||
programbits |= prprogrambits[PR_BIT_FOG].bit;
|
||||
|
||||
// PR_BIT_GLOW_MAP
|
||||
if (!curlight && r_glowmapping && material.glowmap)
|
||||
if (!curlightcount && r_glowmapping && material.glowmap)
|
||||
programbits |= prprogrambits[PR_BIT_GLOW_MAP].bit;
|
||||
|
||||
// PR_BIT_POINT_LIGHT
|
||||
if (lightcount) {
|
||||
if (matlightcount) {
|
||||
programbits |= prprogrambits[PR_BIT_POINT_LIGHT].bit;
|
||||
// PR_BIT_SPOT_LIGHT
|
||||
if (prlights[lights[curlight]].radius) {
|
||||
|
@ -4050,6 +4120,62 @@ static void polymer_compileprogram(int32_t programbits)
|
|||
}
|
||||
|
||||
// LIGHTS
|
||||
|
||||
static void polymer_removelight(int16_t lighti)
|
||||
{
|
||||
int32_t i;
|
||||
_prsector *s;
|
||||
_prwall *w;
|
||||
|
||||
// XXX: might need to store a list of affected planes in the light record
|
||||
// if this loop ends up consuming too much cycles
|
||||
i = 0;
|
||||
while (i < numsectors)
|
||||
{
|
||||
s = prsectors[i];
|
||||
|
||||
polymer_deleteplanelight(&s->floor, lighti);
|
||||
polymer_deleteplanelight(&s->ceil, lighti);
|
||||
|
||||
i++;
|
||||
}
|
||||
|
||||
i = 0;
|
||||
while (i < numwalls)
|
||||
{
|
||||
w = prwalls[i];
|
||||
|
||||
polymer_deleteplanelight(&w->wall, lighti);
|
||||
polymer_deleteplanelight(&w->over, lighti);
|
||||
polymer_deleteplanelight(&w->mask, lighti);
|
||||
|
||||
i++;
|
||||
}
|
||||
}
|
||||
|
||||
static void polymer_updatelights(void)
|
||||
{
|
||||
int32_t i;
|
||||
|
||||
while (i < PR_MAXLIGHTS)
|
||||
{
|
||||
if (prlights[i].flags.active && prlights[i].flags.invalidate) {
|
||||
// highly suboptimal
|
||||
polymer_removelight(i);
|
||||
|
||||
if (prlights[i].radius)
|
||||
polymer_processspotlight(&prlights[i]);
|
||||
polymer_culllight(i);
|
||||
|
||||
prlights[i].flags.invalidate = 0;
|
||||
}
|
||||
|
||||
if (prlights[i].flags.active)
|
||||
prlights[i].rtindex = -1;
|
||||
i++;
|
||||
}
|
||||
}
|
||||
|
||||
static void polymer_resetlights(void)
|
||||
{
|
||||
int32_t i;
|
||||
|
@ -4061,8 +4187,8 @@ static void polymer_resetlights(void)
|
|||
{
|
||||
s = prsectors[i];
|
||||
|
||||
s->floor.lightcount = 0;
|
||||
s->ceil.lightcount = 0;
|
||||
polymer_resetplanelights(&s->floor);
|
||||
polymer_resetplanelights(&s->ceil);
|
||||
|
||||
i++;
|
||||
}
|
||||
|
@ -4072,85 +4198,68 @@ static void polymer_resetlights(void)
|
|||
{
|
||||
w = prwalls[i];
|
||||
|
||||
w->wall.lightcount = 0;
|
||||
w->over.lightcount = 0;
|
||||
w->mask.lightcount = 0;
|
||||
polymer_resetplanelights(&w->wall);
|
||||
polymer_resetplanelights(&w->over);
|
||||
polymer_resetplanelights(&w->mask);
|
||||
|
||||
i++;
|
||||
}
|
||||
|
||||
i = 0;
|
||||
while (i < PR_MAXLIGHTS)
|
||||
{
|
||||
prlights[i].flags.active = 0;
|
||||
i++;
|
||||
}
|
||||
|
||||
lightcount = 0;
|
||||
}
|
||||
|
||||
static void polymer_addlight(_prlight light)
|
||||
static void polymer_resetplanelights(_prplane* plane)
|
||||
{
|
||||
if ((light.sector == -1) || (light.sector >= numsectors))
|
||||
return;
|
||||
int32_t i;
|
||||
|
||||
if (lightcount < PR_MAXLIGHTS)
|
||||
i = 0;
|
||||
while (i < PR_MAXLIGHTS)
|
||||
{
|
||||
prlights[lightcount] = light;
|
||||
plane->lights[i] = -1;
|
||||
i++;
|
||||
}
|
||||
|
||||
if (light.radius) {
|
||||
float radius, ang, horizang, lightpos[3];
|
||||
pthtyp* pth;
|
||||
plane->lightcount = 0;
|
||||
}
|
||||
|
||||
// hack to avoid lights beams perpendicular to walls
|
||||
if ((light.horiz <= 100) && (light.horiz > 90))
|
||||
light.horiz = 90;
|
||||
if ((light.horiz > 100) && (light.horiz < 110))
|
||||
light.horiz = 110;
|
||||
static void polymer_addplanelight(_prplane* plane, int16_t lighti)
|
||||
{
|
||||
int16_t i;
|
||||
|
||||
lightpos[0] = light.y;
|
||||
lightpos[1] = -light.z / 16.0f;
|
||||
lightpos[2] = -light.x;
|
||||
|
||||
// calculate the spot light transformations and matrices
|
||||
radius = (float)(light.radius) / (2048.0f / 360.0f);
|
||||
ang = (float)(light.angle) / (2048.0f / 360.0f);
|
||||
horizang = (float)(-getangle(128, light.horiz-100)) / (2048.0f / 360.0f);
|
||||
|
||||
bglMatrixMode(GL_PROJECTION);
|
||||
bglPushMatrix();
|
||||
bglLoadIdentity();
|
||||
bgluPerspective(radius * 2, 1, 0.1f, light.range / 1000.0f);
|
||||
bglGetFloatv(GL_PROJECTION_MATRIX, prlights[lightcount].proj);
|
||||
bglPopMatrix();
|
||||
|
||||
bglMatrixMode(GL_MODELVIEW);
|
||||
bglPushMatrix();
|
||||
bglLoadIdentity();
|
||||
bglRotatef(horizang, 1.0f, 0.0f, 0.0f);
|
||||
bglRotatef(ang, 0.0f, 1.0f, 0.0f);
|
||||
bglScalef(1.0f / 1000.0f, 1.0f / 1000.0f, 1.0f / 1000.0f);
|
||||
bglTranslatef(-lightpos[0], -lightpos[1], -lightpos[2]);
|
||||
bglGetFloatv(GL_MODELVIEW_MATRIX, prlights[lightcount].transform);
|
||||
bglPopMatrix();
|
||||
|
||||
polymer_extractfrustum(prlights[lightcount].transform, prlights[lightcount].proj, prlights[lightcount].frustum);
|
||||
|
||||
prlights[lightcount].rtindex = -1;
|
||||
|
||||
// get the texture handle for the lightmap
|
||||
prlights[lightcount].lightmap = 0;
|
||||
if (prlights[lightcount].tilenum)
|
||||
{
|
||||
if (!waloff[prlights[lightcount].tilenum])
|
||||
loadtile(prlights[lightcount].tilenum);
|
||||
|
||||
pth = NULL;
|
||||
pth = gltexcache(prlights[lightcount].tilenum, 0, 0);
|
||||
|
||||
if (pth)
|
||||
prlights[lightcount].lightmap = pth->glpic;
|
||||
}
|
||||
i = 0;
|
||||
while (i < PR_MAXLIGHTS)
|
||||
{
|
||||
if (plane->lights[i] == -1)
|
||||
{
|
||||
plane->lights[i] = lighti;
|
||||
plane->lightcount++;
|
||||
return;
|
||||
}
|
||||
i++;
|
||||
}
|
||||
}
|
||||
|
||||
prlights[lightcount].isinview = 0;
|
||||
static void polymer_deleteplanelight(_prplane* plane, int16_t lighti)
|
||||
{
|
||||
int16_t i;
|
||||
|
||||
polymer_culllight(lightcount);
|
||||
|
||||
lightcount++;
|
||||
i = 0;
|
||||
while (i < PR_MAXLIGHTS)
|
||||
{
|
||||
if (plane->lights[i] == lighti)
|
||||
{
|
||||
plane->lights[i] = -1;
|
||||
plane->lightcount--;
|
||||
return;
|
||||
}
|
||||
i++;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -4191,7 +4300,111 @@ static int32_t polymer_planeinlight(_prplane* plane, _prlight* light)
|
|||
return 1;
|
||||
}
|
||||
|
||||
static inline void polymer_culllight(char lightindex)
|
||||
static void polymer_invalidateplanelights(_prplane* plane)
|
||||
{
|
||||
int32_t i;
|
||||
|
||||
i = 0;
|
||||
while (i < PR_MAXLIGHTS)
|
||||
{
|
||||
if (plane && (plane->lights[i] != -1) && (prlights[plane->lights[i]].flags.active))
|
||||
prlights[plane->lights[i]].flags.invalidate = 1;
|
||||
|
||||
i++;
|
||||
}
|
||||
}
|
||||
|
||||
static void polymer_invalidatesectorlights(int16_t sectnum)
|
||||
{
|
||||
int32_t i;
|
||||
_prsector *s;
|
||||
_prwall *w;
|
||||
sectortype *sec;
|
||||
|
||||
s = prsectors[sectnum];
|
||||
sec = §or[sectnum];
|
||||
|
||||
if (!s)
|
||||
return;
|
||||
|
||||
polymer_invalidateplanelights(&s->floor);
|
||||
polymer_invalidateplanelights(&s->ceil);
|
||||
|
||||
i = 0;
|
||||
while (i < sec->wallnum)
|
||||
{
|
||||
w = prwalls[sec->wallptr + i];
|
||||
|
||||
if (!w) {
|
||||
i++;
|
||||
continue;
|
||||
}
|
||||
|
||||
polymer_invalidateplanelights(&w->wall);
|
||||
polymer_invalidateplanelights(&w->over);
|
||||
polymer_invalidateplanelights(&w->mask);
|
||||
|
||||
i++;
|
||||
}
|
||||
}
|
||||
|
||||
static void polymer_processspotlight(_prlight* light)
|
||||
{
|
||||
float radius, ang, horizang, lightpos[3];
|
||||
pthtyp* pth;
|
||||
|
||||
// hack to avoid lights beams perpendicular to walls
|
||||
if ((light->horiz <= 100) && (light->horiz > 90))
|
||||
light->horiz = 90;
|
||||
if ((light->horiz > 100) && (light->horiz < 110))
|
||||
light->horiz = 110;
|
||||
|
||||
lightpos[0] = light->y;
|
||||
lightpos[1] = -light->z / 16.0f;
|
||||
lightpos[2] = -light->x;
|
||||
|
||||
// calculate the spot light transformations and matrices
|
||||
radius = (float)(light->radius) / (2048.0f / 360.0f);
|
||||
ang = (float)(light->angle) / (2048.0f / 360.0f);
|
||||
horizang = (float)(-getangle(128, light->horiz-100)) / (2048.0f / 360.0f);
|
||||
|
||||
bglMatrixMode(GL_PROJECTION);
|
||||
bglPushMatrix();
|
||||
bglLoadIdentity();
|
||||
bgluPerspective(radius * 2, 1, 0.1f, light->range / 1000.0f);
|
||||
bglGetFloatv(GL_PROJECTION_MATRIX, light->proj);
|
||||
bglPopMatrix();
|
||||
|
||||
bglMatrixMode(GL_MODELVIEW);
|
||||
bglPushMatrix();
|
||||
bglLoadIdentity();
|
||||
bglRotatef(horizang, 1.0f, 0.0f, 0.0f);
|
||||
bglRotatef(ang, 0.0f, 1.0f, 0.0f);
|
||||
bglScalef(1.0f / 1000.0f, 1.0f / 1000.0f, 1.0f / 1000.0f);
|
||||
bglTranslatef(-lightpos[0], -lightpos[1], -lightpos[2]);
|
||||
bglGetFloatv(GL_MODELVIEW_MATRIX, light->transform);
|
||||
bglPopMatrix();
|
||||
|
||||
polymer_extractfrustum(light->transform, light->proj, light->frustum);
|
||||
|
||||
light->rtindex = -1;
|
||||
|
||||
// get the texture handle for the lightmap
|
||||
light->lightmap = 0;
|
||||
if (light->tilenum)
|
||||
{
|
||||
if (!waloff[light->tilenum])
|
||||
loadtile(light->tilenum);
|
||||
|
||||
pth = NULL;
|
||||
pth = gltexcache(light->tilenum, 0, 0);
|
||||
|
||||
if (pth)
|
||||
light->lightmap = pth->glpic;
|
||||
}
|
||||
}
|
||||
|
||||
static inline void polymer_culllight(int16_t lighti)
|
||||
{
|
||||
_prlight* light;
|
||||
int32_t front;
|
||||
|
@ -4201,7 +4414,7 @@ static inline void polymer_culllight(char lightindex)
|
|||
_prwall *w;
|
||||
sectortype *sec;
|
||||
|
||||
light = &prlights[lightindex];
|
||||
light = &prlights[lighti];
|
||||
front = 0;
|
||||
back = 1;
|
||||
Bmemset(drawingstate, 0, sizeof(int16_t) * numsectors);
|
||||
|
@ -4217,16 +4430,10 @@ static inline void polymer_culllight(char lightindex)
|
|||
polymer_pokesector(sectorqueue[front]);
|
||||
|
||||
if (polymer_planeinlight(&s->floor, light)) {
|
||||
s->floor.lights[s->floor.lightcount] = lightindex;
|
||||
s->floor.lightcount++;
|
||||
if (s->floor.drawn)
|
||||
light->isinview = 1;
|
||||
polymer_addplanelight(&s->floor, lighti);
|
||||
}
|
||||
if (polymer_planeinlight(&s->ceil, light)) {
|
||||
s->ceil.lights[s->ceil.lightcount] = lightindex;
|
||||
s->ceil.lightcount++;
|
||||
if (s->ceil.drawn)
|
||||
light->isinview = 1;
|
||||
polymer_addplanelight(&s->ceil, lighti);
|
||||
}
|
||||
|
||||
i = 0;
|
||||
|
@ -4235,16 +4442,10 @@ static inline void polymer_culllight(char lightindex)
|
|||
w = prwalls[sec->wallptr + i];
|
||||
|
||||
if (polymer_planeinlight(&w->wall, light)) {
|
||||
w->wall.lights[w->wall.lightcount] = lightindex;
|
||||
w->wall.lightcount++;
|
||||
if (w->wall.drawn)
|
||||
light->isinview = 1;
|
||||
polymer_addplanelight(&w->wall, lighti);
|
||||
}
|
||||
if (polymer_planeinlight(&w->over, light)) {
|
||||
w->over.lights[w->over.lightcount] = lightindex;
|
||||
w->over.lightcount++;
|
||||
if (w->over.drawn)
|
||||
light->isinview = 1;
|
||||
polymer_addplanelight(&w->over, lighti);
|
||||
}
|
||||
if (wallvisible(light->x, light->y, sec->wallptr + i) &&
|
||||
polymer_planeinlight(&w->mask, light)) {
|
||||
|
@ -4256,10 +4457,7 @@ static inline void polymer_culllight(char lightindex)
|
|||
continue;
|
||||
}
|
||||
|
||||
w->mask.lights[w->mask.lightcount] = lightindex;
|
||||
w->mask.lightcount++;
|
||||
if (w->mask.drawn)
|
||||
light->isinview = 1;
|
||||
polymer_addplanelight(&w->mask, lighti);
|
||||
|
||||
if ((wall[sec->wallptr + i].nextsector != -1) &&
|
||||
(!drawingstate[wall[sec->wallptr + i].nextsector])) {
|
||||
|
@ -4280,7 +4478,7 @@ static void polymer_prepareshadows(void)
|
|||
int16_t oviewangle, oglobalang;
|
||||
int32_t ocosglobalang, osinglobalang;
|
||||
int32_t ocosviewingrangeglobalang, osinviewingrangeglobalang;
|
||||
int32_t i, j;
|
||||
int32_t i, j, k;
|
||||
int32_t gx, gy, gz;
|
||||
int32_t oldoverridematerial;
|
||||
|
||||
|
@ -4296,13 +4494,19 @@ static void polymer_prepareshadows(void)
|
|||
ocosviewingrangeglobalang = cosviewingrangeglobalang;
|
||||
osinviewingrangeglobalang = sinviewingrangeglobalang;
|
||||
|
||||
i = j = 0;
|
||||
i = j = k = 0;
|
||||
|
||||
while ((i < lightcount) && (j < pr_shadowcount))
|
||||
while ((k < lightcount) && (j < pr_shadowcount))
|
||||
{
|
||||
if (prlights[i].radius && prlights[i].isinview)
|
||||
while (prlights[i].flags.active == 0) {
|
||||
i++;
|
||||
}
|
||||
|
||||
if (prlights[i].radius && prlights[i].flags.isinview)
|
||||
{
|
||||
prlights[i].flags.isinview = 0;
|
||||
prlights[i].rtindex = j + 1;
|
||||
if (pr_verbosity >= 1) OSD_Printf("PR : Drawing shadow %i...\n", i);
|
||||
|
||||
bglBindFramebufferEXT(GL_FRAMEBUFFER_EXT, prrts[prlights[i].rtindex].fbo);
|
||||
bglPushAttrib(GL_VIEWPORT_BIT);
|
||||
|
@ -4355,6 +4559,7 @@ static void polymer_prepareshadows(void)
|
|||
j++;
|
||||
}
|
||||
i++;
|
||||
k++;
|
||||
}
|
||||
|
||||
globalposx = gx;
|
||||
|
@ -4389,7 +4594,7 @@ static void polymer_applylights(void)
|
|||
}
|
||||
|
||||
if (staticlights[i].minshade == staticlights[i].maxshade)
|
||||
polymer_addlight(staticlights[i]);
|
||||
polymer_addlight(&staticlights[i]);
|
||||
else {
|
||||
light = staticlights[i];
|
||||
|
||||
|
@ -4406,7 +4611,7 @@ static void polymer_applylights(void)
|
|||
light.color[1] *= fade;
|
||||
light.color[2] *= fade;
|
||||
|
||||
polymer_addlight(light);
|
||||
polymer_addlight(&light);
|
||||
}
|
||||
i++;
|
||||
}
|
||||
|
@ -4421,7 +4626,7 @@ static void polymer_applylights(void)
|
|||
continue;
|
||||
}
|
||||
|
||||
polymer_addlight(gamelights[i]);
|
||||
polymer_addlight(&gamelights[i]);
|
||||
i++;
|
||||
}
|
||||
|
||||
|
@ -4435,7 +4640,7 @@ static void polymer_applylights(void)
|
|||
continue;
|
||||
}
|
||||
|
||||
polymer_addlight(framelights[i]);
|
||||
polymer_addlight(&framelights[i]);
|
||||
i++;
|
||||
}
|
||||
curpriority++;
|
||||
|
|
Loading…
Reference in a new issue