From b44aa0ed49b4049c9d3243c2e4616893c6a41e2e Mon Sep 17 00:00:00 2001 From: RedEnchilada Date: Mon, 17 Nov 2014 00:30:45 -0600 Subject: [PATCH] Changes to how dynamic lights are loaded to make them appear more consistently --- src/hardware/hw_defs.h | 1 + src/hardware/hw_light.c | 66 +++++++++++++++++++++++++++-------------- src/hardware/hw_light.h | 2 ++ src/hardware/hw_main.c | 23 +++++++++----- 4 files changed, 61 insertions(+), 31 deletions(-) diff --git a/src/hardware/hw_defs.h b/src/hardware/hw_defs.h index 70d776d9e..9011e8e64 100644 --- a/src/hardware/hw_defs.h +++ b/src/hardware/hw_defs.h @@ -22,6 +22,7 @@ #define ZCLIP_PLANE 4.0f #define NZCLIP_PLANE 0.9f +#define ALAM_LIGHTING // ========================================================================== // SIMPLE TYPES diff --git a/src/hardware/hw_light.c b/src/hardware/hw_light.c index ee68edd41..ffabcc020 100644 --- a/src/hardware/hw_light.c +++ b/src/hardware/hw_light.c @@ -761,8 +761,10 @@ void HWR_WallLighting(FOutVector *wlVerts) #ifdef DL_HIGH_QUALITY Surf.FlatColor.s.alpha = (UINT8)((1-dist_p2d/DL_SQRRADIUS(j))*Surf.FlatColor.s.alpha); #endif + if ((!dynlights->mo[j]) || (dynlights->mo[j]->thinker.function.acp1 != (actionf_p1)P_MobjThinker)) + continue; if (!dynlights->mo[j]->state) - return; + continue; // next state is null so fade out with alpha if (dynlights->mo[j]->state->nextstate == S_NULL) Surf.FlatColor.s.alpha = (UINT8)(((float)dynlights->mo[j]->tics/(float)dynlights->mo[j]->state->tics)*Surf.FlatColor.s.alpha); @@ -824,8 +826,10 @@ void HWR_PlaneLighting(FOutVector *clVerts, int nrClipVerts) #ifdef DL_HIGH_QUALITY Surf.FlatColor.s.alpha = (unsigned char)((1 - dist_p2d/DL_SQRRADIUS(j))*Surf.FlatColor.s.alpha); #endif + if ((!dynlights->mo[j]) || (dynlights->mo[j]->thinker.function.acp1 != (actionf_p1)P_MobjThinker)) + continue; if (!dynlights->mo[j]->state) - return; + continue; // next state is null so fade out with alpha if ((dynlights->mo[j]->state->nextstate == S_NULL)) Surf.FlatColor.s.alpha = (unsigned char)(((float)dynlights->mo[j]->tics/(float)dynlights->mo[j]->state->tics)*Surf.FlatColor.s.alpha); @@ -1231,25 +1235,6 @@ static void HWR_CheckSubsector(size_t num, fixed_t *bbox) } -// -------------------------------------------------------------------------- -// Hurdler: this adds lights by mobj. -// -------------------------------------------------------------------------- -static void HWR_AddMobjLights(mobj_t *thing) -{ - if (t_lspr[thing->sprite]->type & CORONA_SPR) - { - LIGHT_POS(dynlights->nb).x = FIXED_TO_FLOAT(thing->x); - LIGHT_POS(dynlights->nb).y = FIXED_TO_FLOAT(thing->z) + t_lspr[thing->sprite]->light_yoffset; - LIGHT_POS(dynlights->nb).z = FIXED_TO_FLOAT(thing->y); - - dynlights->p_lspr[dynlights->nb] = t_lspr[thing->sprite]; - - dynlights->nb++; - if (dynlights->nb > DL_MAX_LIGHT) - dynlights->nb = DL_MAX_LIGHT; - } -} - //Hurdler: The goal of this function is to walk through all the bsp starting // on the top. // We need to do that to know all the lights in the map and all the walls @@ -1266,8 +1251,37 @@ static void HWR_ComputeLightMapsInBSPNode(int bspnum, fixed_t *bbox) HWR_ComputeLightMapsInBSPNode(nodes[bspnum].children[0], nodes[bspnum].bbox[0]); HWR_ComputeLightMapsInBSPNode(nodes[bspnum].children[1], nodes[bspnum].bbox[1]); } +#endif -static void HWR_SearchLightsInMobjs(void) +// -------------------------------------------------------------------------- +// Hurdler: this adds lights by mobj. +// -------------------------------------------------------------------------- +static void HWR_AddMobjLights(mobj_t *thing) +{ + if (!cv_drawdist.value || P_AproxDistance(thing->x-viewx, thing->y-viewy) < cv_drawdist.value) + if (!(thing->flags2 & MF2_DEBRIS) && (thing->sprite != SPR_PLAY || + (thing->player && thing->player->powers[pw_super]))) + if ((t_lspr[thing->sprite]->type&DYNLIGHT_SPR) + && ((t_lspr[thing->sprite]->type != LIGHT_SPR) || cv_grstaticlighting.value) + && (dynlights->nb < DL_MAX_LIGHT) + + && thing->state) + { + LIGHT_POS(dynlights->nb).x = FIXED_TO_FLOAT(thing->x); + LIGHT_POS(dynlights->nb).y = FIXED_TO_FLOAT(thing->z) + t_lspr[thing->sprite]->light_yoffset; + LIGHT_POS(dynlights->nb).z = FIXED_TO_FLOAT(thing->y); + + dynlights->p_lspr[dynlights->nb] = t_lspr[thing->sprite]; + + P_SetTarget(&dynlights->mo[dynlights->nb], thing); + + dynlights->nb++; + if (dynlights->nb > DL_MAX_LIGHT) + dynlights->nb = DL_MAX_LIGHT; + } +} + +void HWR_SearchLightsInMobjs(void) { thinker_t * th; //mobj_t * mobj; @@ -1278,9 +1292,15 @@ static void HWR_SearchLightsInMobjs(void) // a mobj ? if (th->function.acp1 == (actionf_p1)P_MobjThinker) HWR_AddMobjLights((mobj_t *)th); + + + if (dynlights->nb == DL_MAX_LIGHT) + { + CONS_Printf("light limit exceeded\n"); + return; + } } } -#endif // // HWR_CreateStaticLightmaps() diff --git a/src/hardware/hw_light.h b/src/hardware/hw_light.h index 2733cc698..f3085e7ad 100644 --- a/src/hardware/hw_light.h +++ b/src/hardware/hw_light.h @@ -36,6 +36,8 @@ void HWR_WallLighting(FOutVector *wlVerts); void HWR_ResetLights(void); void HWR_SetLights(int viewnumber); +void HWR_SearchLightsInMobjs(void); + #ifdef NEWCORONAS void HWR_DrawCoronas(void); #else diff --git a/src/hardware/hw_main.c b/src/hardware/hw_main.c index 04175d504..04f3b820e 100644 --- a/src/hardware/hw_main.c +++ b/src/hardware/hw_main.c @@ -3560,7 +3560,7 @@ static void HWR_DrawSprite(gr_vissprite_t *spr) gpatch = W_CachePatchNum(spr->patchlumpnum, PU_CACHE); -#ifdef ALAM_LIGHTING +#if 0 //#ifdef ALAM_LIGHTING if (!(spr->mobj->flags2 & MF2_DEBRIS) && (spr->mobj->sprite != SPR_PLAY || (spr->mobj->player && spr->mobj->player->powers[pw_super]))) HWR_DL_AddLight(spr, gpatch); @@ -5073,6 +5073,12 @@ if (0) validcount++; +#ifdef ALAM_LIGHTING + //14/11/99: Hurdler: moved here because it doesn't work with + // subsector, see other comments; + HWR_ResetLights(); + HWR_SearchLightsInMobjs(); +#endif HWR_RenderBSPNode((INT32)numnodes-1); // Make a viewangle int so we can render things based on mouselook @@ -5108,7 +5114,7 @@ if (0) #ifdef ALAM_LIGHTING //14/11/99: Hurdler: moved here because it doesn't work with // subsector, see other comments; - HWR_ResetLights(); + //HWR_ResetLights(); #endif // Draw MD2 and sprites @@ -5303,6 +5309,13 @@ if (0) validcount++; + +#ifdef ALAM_LIGHTING + //14/11/99: Hurdler: moved here because it doesn't work with + // subsector, see other comments; + HWR_ResetLights(); + HWR_SearchLightsInMobjs(); +#endif HWR_RenderBSPNode((INT32)numnodes-1); // Make a viewangle int so we can render things based on mouselook @@ -5335,12 +5348,6 @@ if (0) // Check for new console commands. NetUpdate(); -#ifdef ALAM_LIGHTING - //14/11/99: Hurdler: moved here because it doesn't work with - // subsector, see other comments; - HWR_ResetLights(); -#endif - // Draw MD2 and sprites #ifdef SORTING HWR_SortVisSprites();