From 567c0bdd866bc4e56b53717b404b8109b4f37a85 Mon Sep 17 00:00:00 2001 From: plagman Date: Sun, 12 Apr 2009 13:51:43 +0000 Subject: [PATCH] Per-frame lights cleanup. git-svn-id: https://svn.eduke32.com/eduke32@1304 1a8010ca-5511-0410-912e-c29ae57300e0 --- polymer/eduke32/build/include/polymer.h | 7 +- polymer/eduke32/build/src/polymer.c | 189 +++++++++++++----------- polymer/eduke32/source/game.c | 90 ++++++----- 3 files changed, 147 insertions(+), 139 deletions(-) diff --git a/polymer/eduke32/build/include/polymer.h b/polymer/eduke32/build/include/polymer.h index b01ebbb51..4c42265db 100644 --- a/polymer/eduke32/build/include/polymer.h +++ b/polymer/eduke32/build/include/polymer.h @@ -167,6 +167,9 @@ extern int32_t staticlightcount; extern _prlight gamelights[PR_MAXLIGHTS]; extern int32_t gamelightcount; +extern _prlight framelights[PR_MAXLIGHTS]; +extern int32_t framelightcount; + // RENDER TARGETS typedef struct s_prrt { GLenum target; @@ -271,8 +274,6 @@ 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); -void polymer_resetlights(void); -void polymer_addlight(_prlight light); # ifdef POLYMER_C @@ -318,6 +319,8 @@ static int32_t polymer_bindmaterial(_prmaterial material, char* lights, int static void polymer_unbindmaterial(int32_t programbits); static void polymer_compileprogram(int32_t programbits); // LIGHTS +static void polymer_resetlights(void); +static void polymer_addlight(_prlight light); static int32_t polymer_planeinlight(_prplane* plane, _prlight* light); static void polymer_culllight(char lightindex); static void polymer_prepareshadows(void); diff --git a/polymer/eduke32/build/src/polymer.c b/polymer/eduke32/build/src/polymer.c index a06f9987e..8f94a79a4 100644 --- a/polymer/eduke32/build/src/polymer.c +++ b/polymer/eduke32/build/src/polymer.c @@ -137,6 +137,8 @@ int32_t staticlightcount; _prlight gamelights[PR_MAXLIGHTS]; int32_t gamelightcount; +_prlight framelights[PR_MAXLIGHTS]; +int32_t framelightcount; GLfloat shadowBias[] = { @@ -700,6 +702,8 @@ void polymer_drawrooms(int32_t daposx, int32_t daposy, int32_t da pos[1] = -(float)(daposz) / 16.0f; pos[2] = -daposx; + polymer_resetlights(); + polymer_dostaticlights(); i = 0; @@ -709,6 +713,13 @@ void polymer_drawrooms(int32_t daposx, int32_t daposy, int32_t da i++; } + i = 0; + while (i < framelightcount) + { + polymer_addlight(framelights[i]); + i++; + } + depth = 0; polymer_prepareshadows(); @@ -1043,95 +1054,6 @@ void polymer_setanimatesprites(animatespritesptr animatesprites, asi.smoothratio = smoothratio; } -void polymer_resetlights(void) -{ - int32_t i; - _prsector *s; - _prwall *w; - - i = 0; - while (i < numsectors) - { - s = prsectors[i]; - - s->floor.lightcount = 0; - s->ceil.lightcount = 0; - - i++; - } - - i = 0; - while (i < numwalls) - { - w = prwalls[i]; - - w->wall.lightcount = 0; - w->over.lightcount = 0; - w->mask.lightcount = 0; - - i++; - } - - lightcount = 0; -} - -void polymer_addlight(_prlight light) -{ - if (light.sector == -1) - return; - - if (lightcount < PR_MAXLIGHTS) - { - prlights[lightcount] = light; - - if (light.radius) { - float radius, ang, horizang, lightpos[3]; - - // 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, 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; - } - - prlights[lightcount].isinview = 0; - - polymer_culllight(lightcount); - - lightcount++; - } -} - // CORE static void polymer_displayrooms(int16_t dacursectnum) { @@ -3782,6 +3704,95 @@ static void polymer_compileprogram(int32_t programbits) } // LIGHTS +static void polymer_resetlights(void) +{ + int32_t i; + _prsector *s; + _prwall *w; + + i = 0; + while (i < numsectors) + { + s = prsectors[i]; + + s->floor.lightcount = 0; + s->ceil.lightcount = 0; + + i++; + } + + i = 0; + while (i < numwalls) + { + w = prwalls[i]; + + w->wall.lightcount = 0; + w->over.lightcount = 0; + w->mask.lightcount = 0; + + i++; + } + + lightcount = 0; +} + +static void polymer_addlight(_prlight light) +{ + if (light.sector == -1) + return; + + if (lightcount < PR_MAXLIGHTS) + { + prlights[lightcount] = light; + + if (light.radius) { + float radius, ang, horizang, lightpos[3]; + + // 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, 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; + } + + prlights[lightcount].isinview = 0; + + polymer_culllight(lightcount); + + lightcount++; + } +} + static int32_t polymer_planeinlight(_prplane* plane, _prlight* light) { float lightpos[3]; diff --git a/polymer/eduke32/source/game.c b/polymer/eduke32/source/game.c index 2a442620d..5f35bab14 100644 --- a/polymer/eduke32/source/game.c +++ b/polymer/eduke32/source/game.c @@ -4530,13 +4530,13 @@ void G_DrawRooms(int32_t snum,int32_t smoothratio) } #ifdef POLYMER - if (getrendermode() == 4) + if (getrendermode() == 4) { polymer_setanimatesprites(G_DoSpriteAnimations, ud.camerax,ud.cameray,ud.cameraang,smoothratio); + } #endif drawrooms(ud.camerax,ud.cameray,ud.cameraz,ud.cameraang,ud.camerahoriz,ud.camerasect); #ifdef POLYMER - if (getrendermode() == 4) - polymer_resetlights(); + framelightcount = 0; #endif G_DoSpriteAnimations(ud.camerax,ud.cameray,ud.cameraang,smoothratio); drawmasks(); @@ -6646,9 +6646,6 @@ void G_DoSpriteAnimations(int32_t x,int32_t y,int32_t a,int32_t smoothratio) intptr_t l, t1,t3,t4; spritetype *s,*t; int32_t switchpic; -#ifdef POLYMER - _prlight light; -#endif if (!spritesortcnt) return; @@ -7372,37 +7369,36 @@ PALONLY: case FLOORFLAME__STATIC: #ifdef POLYMER - light.radius = 0; - light.sector = t->sectnum; + framelights[framelightcount].radius = 0; + framelights[framelightcount].sector = t->sectnum; - light.x = t->x; - light.y = t->y; - light.z = t->z; + framelights[framelightcount].x = t->x; + framelights[framelightcount].y = t->y; + framelights[framelightcount].z = t->z; - light.range = tilesizx[t->picnum]*tilesizy[t->picnum]; - light.range -= rand()%((light.range>>3)+1); + framelights[framelightcount].range = tilesizx[t->picnum]*tilesizy[t->picnum]; + framelights[framelightcount].range -= rand()%((framelights[framelightcount].range>>3)+1); - light.color[0] = 255; - light.color[1] = 80; - light.color[2] = 0; + framelights[framelightcount].color[0] = 255; + framelights[framelightcount].color[1] = 80; + framelights[framelightcount].color[2] = 0; if ((DynamicTileMap[s->picnum] == ATOMICHEALTH__STATIC) || (DynamicTileMap[s->picnum] == FREEZEBLAST__STATIC)) { - light.color[0] = 0; - light.color[1] = 0; - light.color[2] = 255; + framelights[framelightcount].color[0] = 0; + framelights[framelightcount].color[1] = 0; + framelights[framelightcount].color[2] = 255; } if ((DynamicTileMap[s->picnum] == SHRINKSPARK__STATIC) || (DynamicTileMap[s->picnum] == SHRINKEREXPLOSION__STATIC)) { - light.color[0] = 0; - light.color[1] = 255; - light.color[2] = 0; + framelights[framelightcount].color[0] = 0; + framelights[framelightcount].color[1] = 255; + framelights[framelightcount].color[2] = 0; } - if (getrendermode() >= 4) - polymer_addlight(light); + framelightcount++; #endif if (t->picnum == EXPLOSION2) { @@ -7420,44 +7416,42 @@ PALONLY: t->z = sector[t->sectnum].floorz; t->shade = -127; #ifdef POLYMER - light.radius = 0; - light.sector = t->sectnum; + framelights[framelightcount].radius = 0; + framelights[framelightcount].sector = t->sectnum; - light.x = t->x; - light.y = t->y; - light.z = t->z; + framelights[framelightcount].x = t->x; + framelights[framelightcount].y = t->y; + framelights[framelightcount].z = t->z; - light.range = tilesizx[t->picnum]*tilesizy[t->picnum]; - light.range -= rand()%((light.range>>3)+1); + framelights[framelightcount].range = tilesizx[t->picnum]*tilesizy[t->picnum]; + framelights[framelightcount].range -= rand()%((framelights[framelightcount].range>>3)+1); - light.color[0] = 255; - light.color[1] = 80; - light.color[2] = 0; + framelights[framelightcount].color[0] = 255; + framelights[framelightcount].color[1] = 80; + framelights[framelightcount].color[2] = 0; - if (getrendermode() >= 4) - polymer_addlight(light); + framelightcount++; #endif break; case COOLEXPLOSION1__STATIC: t->shade = -127; t->picnum += (s->shade>>1); #ifdef POLYMER - light.radius = 0; - light.sector = t->sectnum; + framelights[framelightcount].radius = 0; + framelights[framelightcount].sector = t->sectnum; - light.x = t->x; - light.y = t->y; - light.z = t->z; + framelights[framelightcount].x = t->x; + framelights[framelightcount].y = t->y; + framelights[framelightcount].z = t->z; - light.range = tilesizx[t->picnum]*tilesizy[t->picnum]; - light.range -= rand()%((light.range>>3)+1); + framelights[framelightcount].range = tilesizx[t->picnum]*tilesizy[t->picnum]; + framelights[framelightcount].range -= rand()%((framelights[framelightcount].range>>3)+1); - light.color[0] = 128; - light.color[1] = 0; - light.color[2] = 255; + framelights[framelightcount].color[0] = 128; + framelights[framelightcount].color[1] = 0; + framelights[framelightcount].color[2] = 255; - if (getrendermode() >= 4) - polymer_addlight(light); + framelightcount++; #endif break; case PLAYERONWATER__STATIC: