From d360b018278ba7550e731351c0980882cc88d231 Mon Sep 17 00:00:00 2001 From: Bill Currie Date: Sun, 20 May 2001 05:42:52 +0000 Subject: [PATCH] move dlight stuff out of cl_* into r_main.c. nq dlights seem to be broken, but that seems to have been from before this work --- include/QF/render.h | 24 ++++++++++++++- include/r_local.h | 18 ++---------- include/r_shared.h | 1 + nq/include/client.h | 4 --- nq/source/cl_main.c | 68 ++++--------------------------------------- nq/source/cl_parse.c | 2 +- nq/source/cl_tent.c | 6 ++-- nq/source/gl_rlight.c | 4 +-- nq/source/gl_rmain.c | 8 ++--- nq/source/gl_rmisc.c | 4 +-- nq/source/gl_rsurf.c | 18 ++++++------ nq/source/gl_screen.c | 1 + nq/source/host.c | 2 +- nq/source/r_main.c | 64 ++++++++++++++++++++++++++++++++++++++++ nq/source/screen.c | 1 + nq/source/sw_ralias.c | 1 - nq/source/sw_rlight.c | 4 ++- nq/source/sw_rmain.c | 22 +++++++------- nq/source/sw_rsurf.c | 6 ++-- qw/include/cl_main.h | 3 -- qw/include/client.h | 1 - qw/source/cl_ents.c | 58 ++---------------------------------- qw/source/cl_main.c | 5 ++-- qw/source/cl_parse.c | 4 +-- qw/source/cl_tent.c | 6 ++-- qw/source/gl_rlight.c | 4 +-- qw/source/gl_rmain.c | 8 ++--- qw/source/gl_rmisc.c | 4 +-- qw/source/gl_rsurf.c | 18 ++++++------ qw/source/gl_screen.c | 1 + qw/source/r_main.c | 64 ++++++++++++++++++++++++++++++++++++++++ qw/source/screen.c | 1 + qw/source/sw_ralias.c | 1 - qw/source/sw_rlight.c | 4 ++- qw/source/sw_rmain.c | 23 ++++++++------- qw/source/sw_rsurf.c | 6 ++-- 36 files changed, 247 insertions(+), 222 deletions(-) diff --git a/include/QF/render.h b/include/QF/render.h index 4f999914c..631ebde7b 100644 --- a/include/QF/render.h +++ b/include/QF/render.h @@ -34,6 +34,24 @@ #include "QF/model.h" #include "QF/vid.h" +// dynamic lights =========================================================== + +#define MAX_DLIGHTS 32 +typedef struct dlight_s +{ + int key; // so entities can reuse same entry + vec3_t origin; + float radius; + float die; // stop lighting after this time + float decay; // drop this each second + float minlight; // don't add when contributing less + float color[3]; // Don't use alpha --KB +} dlight_t; + +extern dlight_t r_dlights[MAX_DLIGHTS]; + +//=============== + #define TOP_RANGE 16 // soldier uniform colors #define BOTTOM_RANGE 96 @@ -140,7 +158,7 @@ void R_ViewChanged (vrect_t *pvrect, int lineadj, float aspect); void R_AddEfrags (entity_t *ent); void R_RemoveEfrags (entity_t *ent); -void R_NewMap (void); +void R_NewMap (model_t *worldmodel); // LordHavoc: relative bmodel lighting @@ -166,4 +184,8 @@ void R_ClearEfrags (void); void R_ClearEnts (void); struct entity_s **R_NewEntity (void); +dlight_t *R_AllocDlight (int key); +void R_DecayLights (void); +void R_ClearDlights (void); + #endif // __render_h diff --git a/include/r_local.h b/include/r_local.h index 2b966d25a..5d9739c13 100644 --- a/include/r_local.h +++ b/include/r_local.h @@ -42,21 +42,6 @@ #define BMODEL_FULLY_CLIPPED 0x10 // value returned by R_BmodelCheckBBox () // if bbox is trivially rejected -// dynamic lights =========================================================== - -#define MAX_DLIGHTS 32 -typedef struct -{ - int key; // so entities can reuse same entry - vec3_t origin; - float radius; - float die; // stop lighting after this time - float decay; // drop this each second - float minlight; // don't add when contributing less - float color[3]; // Don't use alpha --KB -} dlight_t; - - // color shifts ============================================================= typedef struct @@ -335,6 +320,7 @@ extern qboolean r_fov_greater_than_90; extern int r_numvisedicts; extern struct entity_s *r_visedicts[]; +struct dlight_s; void R_StoreEfrags (efrag_t **ppefrag); void R_TimeRefresh_f (void); @@ -349,7 +335,7 @@ void R_cshift_f (void); void R_EmitEdge (mvertex_t *pv0, mvertex_t *pv1); void R_ClipEdge (mvertex_t *pv0, mvertex_t *pv1, clipplane_t *clip); void R_SplitEntityOnNode2 (mnode_t *node); -void R_MarkLights (vec3_t lightorigin, dlight_t *light, int bit, mnode_t *node); +void R_MarkLights (vec3_t lightorigin, struct dlight_s *light, int bit, mnode_t *node); void R_LoadSkys (const char *); diff --git a/include/r_shared.h b/include/r_shared.h index 92ef73d6a..c9d604070 100644 --- a/include/r_shared.h +++ b/include/r_shared.h @@ -139,6 +139,7 @@ extern void R_MakeSky (void); extern int ubasestep, errorterm, erroradjustup, erroradjustdown; extern double r_realtime; +extern double r_frametime; // flags in finalvert_t.flags #define ALIAS_LEFT_CLIP 0x0001 diff --git a/nq/include/client.h b/nq/include/client.h index 6bc47be33..4bc66872e 100644 --- a/nq/include/client.h +++ b/nq/include/client.h @@ -282,15 +282,11 @@ extern client_state_t cl; extern entity_t cl_entities[MAX_EDICTS]; extern entity_t cl_static_entities[MAX_STATIC_ENTITIES]; extern lightstyle_t cl_lightstyle[MAX_LIGHTSTYLES]; -extern dlight_t cl_dlights[MAX_DLIGHTS]; /* cl_main */ -dlight_t *CL_AllocDlight (int key); -void CL_DecayLights (void); - void CL_Init (void); void CL_InitCvars (void); diff --git a/nq/source/cl_main.c b/nq/source/cl_main.c index 05e20a52e..cedeb0ec6 100644 --- a/nq/source/cl_main.c +++ b/nq/source/cl_main.c @@ -89,7 +89,6 @@ entity_state_t cl_baselines[MAX_EDICTS]; entity_t cl_static_entities[MAX_STATIC_ENTITIES]; entity_state_t cl_static_entity_baselines[MAX_STATIC_ENTITIES]; lightstyle_t cl_lightstyle[MAX_LIGHTSTYLES]; -dlight_t cl_dlights[MAX_DLIGHTS]; void @@ -170,12 +169,12 @@ CL_ClearState (void) // clear other arrays memset (cl_entities, 0, sizeof (cl_entities)); memset (cl_baselines, 0, sizeof (cl_baselines)); - memset (cl_dlights, 0, sizeof (cl_dlights)); memset (cl_lightstyle, 0, sizeof (cl_lightstyle)); CL_ClearTEnts (); R_ClearEfrags (); + R_ClearDlights (); for (i = 0; i < MAX_EDICTS; i++) { cl_entities[i].baseline = &cl_baselines[i]; @@ -413,47 +412,13 @@ SetPal (int i) } -dlight_t * -CL_AllocDlight (int key) -{ - int i; - dlight_t *dl; - - // first look for an exact key match - if (key) { - dl = cl_dlights; - for (i = 0; i < MAX_DLIGHTS; i++, dl++) { - if (dl->key == key) { - memset (dl, 0, sizeof (*dl)); - dl->key = key; - return dl; - } - } - } - // then look for anything else - dl = cl_dlights; - for (i = 0; i < MAX_DLIGHTS; i++, dl++) { - if (dl->die < cl.time) { - memset (dl, 0, sizeof (*dl)); - dl->key = key; - return dl; - } - } - - dl = &cl_dlights[0]; - memset (dl, 0, sizeof (*dl)); - dl->key = key; - return dl; -} - - void CL_NewDlight (int key, float x, float y, float z, float radius, float time, int type) { dlight_t *dl; - dl = CL_AllocDlight (key); + dl = R_AllocDlight (key); dl->origin[0] = x; dl->origin[1] = y; dl->origin[2] = z; @@ -485,27 +450,6 @@ CL_NewDlight (int key, float x, float y, float z, float radius, float time, } -void -CL_DecayLights (void) -{ - int i; - dlight_t *dl; - float time; - - time = cl.time - cl.oldtime; - - dl = cl_dlights; - for (i = 0; i < MAX_DLIGHTS; i++, dl++) { - if (dl->die < cl.time || !dl->radius) - continue; - - dl->radius -= time * dl->decay; - if (dl->radius < 0) - dl->radius = 0; - } -} - - /* CL_LerpPoint @@ -639,7 +583,7 @@ CL_RelinkEntities (void) if (ent->effects & EF_MUZZLEFLASH) { vec3_t fv, rv, uv; - dl = CL_AllocDlight (i); + dl = R_AllocDlight (i); VectorCopy (ent->origin, dl->origin); dl->origin[2] += 16; AngleVectors (ent->angles, fv, rv, uv); @@ -669,14 +613,14 @@ CL_RelinkEntities (void) 200 + (rand () & 31), 0.001, 0); #ifdef QUAKE2 if (ent->effects & EF_DARKLIGHT) { - dl = CL_AllocDlight (i); + dl = R_AllocDlight (i); VectorCopy (ent->origin, dl->origin); dl->radius = 200.0 + (rand () & 31); dl->die = cl.time + 0.001; dl->dark = true; } if (ent->effects & EF_LIGHT) { - dl = CL_AllocDlight (i); + dl = R_AllocDlight (i); VectorCopy (ent->origin, dl->origin); dl->radius = 200; dl->die = cl.time + 0.001; @@ -685,7 +629,7 @@ CL_RelinkEntities (void) if (VectorDistance_fast(ent->msg_origins[1], ent->origin) > (256*256)) VectorCopy (ent ->origin, ent->msg_origins[1]); if (ent->model->flags & EF_ROCKET) { - dl = CL_AllocDlight (i); + dl = R_AllocDlight (i); VectorCopy (ent->origin, dl->origin); VectorCopy (r_firecolor->vec, dl->color); dl->radius = 200; diff --git a/nq/source/cl_parse.c b/nq/source/cl_parse.c index d8d3cdbb4..c7d41bc7d 100644 --- a/nq/source/cl_parse.c +++ b/nq/source/cl_parse.c @@ -313,7 +313,7 @@ CL_ParseServerInfo (void) // local state cl_entities[0].model = cl.worldmodel = cl.model_precache[1]; - R_NewMap (); + R_NewMap (cl.worldmodel); Hunk_Check (); // make sure nothing is hurt diff --git a/nq/source/cl_tent.c b/nq/source/cl_tent.c index 91f00d441..8d2aca120 100644 --- a/nq/source/cl_tent.c +++ b/nq/source/cl_tent.c @@ -287,7 +287,7 @@ CL_ParseTEnt (void) R_ParticleExplosion (pos); // light - dl = CL_AllocDlight (0); + dl = R_AllocDlight (0); VectorCopy (pos, dl->origin); dl->radius = 350; dl->die = cl.time + 0.5; @@ -354,7 +354,7 @@ CL_ParseTEnt (void) colorStart = MSG_ReadByte (net_message); colorLength = MSG_ReadByte (net_message); R_ParticleExplosion2 (pos, colorStart, colorLength); - dl = CL_AllocDlight (0); + dl = R_AllocDlight (0); VectorCopy (pos, dl->origin); dl->radius = 350; dl->die = cl.time + 0.5; @@ -401,7 +401,7 @@ CL_ParseTEnt (void) R_RocketTrail (pos, endpos, 0 + 128); R_ParticleExplosion (endpos); */ - dl = CL_AllocDlight (-1); + dl = R_AllocDlight (-1); VectorCopy (endpos, dl->origin); dl->radius = 350; dl->die = cl.time + 0.5; diff --git a/nq/source/gl_rlight.c b/nq/source/gl_rlight.c index 4c4e0f6f9..c5e990dce 100644 --- a/nq/source/gl_rlight.c +++ b/nq/source/gl_rlight.c @@ -167,7 +167,7 @@ R_RenderDlights (void) glBlendFunc (GL_ONE, GL_ONE); glShadeModel (GL_SMOOTH); - l = cl_dlights; + l = r_dlights; for (i = 0; i < MAX_DLIGHTS; i++, l++) { if (l->die < r_realtime || !l->radius) continue; @@ -291,7 +291,7 @@ R_PushDlights (vec3_t entorigin) if (!gl_dlight_lightmap->int_val) return; - l = cl_dlights; + l = r_dlights; for (i = 0; i < MAX_DLIGHTS; i++, l++) { if (l->die < r_realtime || !l->radius) diff --git a/nq/source/gl_rmain.c b/nq/source/gl_rmain.c index 8fae6ac01..4593750c3 100644 --- a/nq/source/gl_rmain.c +++ b/nq/source/gl_rmain.c @@ -639,10 +639,10 @@ R_DrawAliasModel (entity_t *e) shadelight = max (shadelight, 24); for (lnum = 0; lnum < MAX_DLIGHTS; lnum++) { - if (cl_dlights[lnum].die >= r_realtime) { - VectorSubtract (currententity->origin, cl_dlights[lnum].origin, + if (r_dlights[lnum].die >= r_realtime) { + VectorSubtract (currententity->origin, r_dlights[lnum].origin, dist); - add = (cl_dlights[lnum].radius * cl_dlights[lnum].radius * 8) / + add = (r_dlights[lnum].radius * r_dlights[lnum].radius * 8) / (DotProduct (dist, dist)); // FIXME Deek if (add > 0) @@ -787,7 +787,7 @@ R_ShowNearestLoc (void) nearloc = locs_find (r_origin); if (nearloc) { - dl = CL_AllocDlight (4096); + dl = R_AllocDlight (4096); VectorCopy (nearloc->loc, dl->origin); dl->radius = 200; dl->die = r_realtime + 0.1; diff --git a/nq/source/gl_rmisc.c b/nq/source/gl_rmisc.c index b61159aa8..db884ce77 100644 --- a/nq/source/gl_rmisc.c +++ b/nq/source/gl_rmisc.c @@ -175,7 +175,7 @@ R_Init (void) void -R_NewMap (void) +R_NewMap (model_t *worldmodel) { int i; cvar_t *r_skyname; @@ -184,7 +184,7 @@ R_NewMap (void) d_lightstylevalue[i] = 264; // normal light value memset (&r_worldentity, 0, sizeof (r_worldentity)); - r_worldentity.model = cl.worldmodel; + r_worldentity.model = worldmodel; // clear out efrags in case the level hasn't been reloaded for (i = 0; i < r_worldentity.model->numleafs; i++) diff --git a/nq/source/gl_rsurf.c b/nq/source/gl_rsurf.c index 1d64345c3..fb74c8603 100644 --- a/nq/source/gl_rsurf.c +++ b/nq/source/gl_rsurf.c @@ -163,11 +163,11 @@ R_AddDynamicLights (msurface_t *surf) if (!(surf->dlightbits & (1 << lnum))) continue; // not lit by this light - VectorSubtract (cl_dlights[lnum].origin, currententity->origin, local); + VectorSubtract (r_dlights[lnum].origin, currententity->origin, local); dist = DotProduct (local, surf->plane->normal) - surf->plane->dist; for (i = 0; i < 3; i++) impact[i] = - cl_dlights[lnum].origin[i] - surf->plane->normal[i] * dist; + r_dlights[lnum].origin[i] - surf->plane->normal[i] * dist; i = f = DotProduct (impact, surf->texinfo->vecs[0]) + surf->texinfo->vecs[0][3] - surf->texturemins[0]; @@ -181,7 +181,7 @@ R_AddDynamicLights (msurface_t *surf) surf->texinfo->vecs[1][3] - surf->texturemins[1]; // for comparisons to minimum acceptable light - maxdist = (int) ((cl_dlights[lnum].radius * cl_dlights[lnum].radius) * 0.75); + maxdist = (int) ((r_dlights[lnum].radius * r_dlights[lnum].radius) * 0.75); // clamp radius to avoid exceeding 8192 entry division table if (maxdist > 1048576) @@ -189,9 +189,9 @@ R_AddDynamicLights (msurface_t *surf) maxdist3 = maxdist - (int) (dist * dist); // convert to 8.8 blocklights format - red = f = cl_dlights[lnum].color[0] * maxdist; - green = f = cl_dlights[lnum].color[1] * maxdist; - blue = f = cl_dlights[lnum].color[2] * maxdist; + red = f = r_dlights[lnum].color[0] * maxdist; + green = f = r_dlights[lnum].color[1] * maxdist; + blue = f = r_dlights[lnum].color[2] * maxdist; bl = blocklights; for (t = 0; t < tmax; t++, i -= 16) { td = i * i; @@ -723,11 +723,11 @@ R_DrawBrushModel (entity_t *e) vec3_t lightorigin; for (k = 0; k < MAX_DLIGHTS; k++) { - if ((cl_dlights[k].die < r_realtime) || (!cl_dlights[k].radius)) + if ((r_dlights[k].die < r_realtime) || (!r_dlights[k].radius)) continue; - VectorSubtract (cl_dlights[k].origin, e->origin, lightorigin); - R_MarkLights (lightorigin, &cl_dlights[k], 1 << k, + VectorSubtract (r_dlights[k].origin, e->origin, lightorigin); + R_MarkLights (lightorigin, &r_dlights[k], 1 << k, clmodel->nodes + clmodel->hulls[0].firstclipnode); } } diff --git a/nq/source/gl_screen.c b/nq/source/gl_screen.c index cefc493b0..bae11343b 100644 --- a/nq/source/gl_screen.c +++ b/nq/source/gl_screen.c @@ -884,6 +884,7 @@ SCR_UpdateScreen (double realtime) if (block_drawing) return; + r_frametime = min (realtime - r_realtime, 5); // bound to 0.2 fps r_realtime = realtime; vid.numpages = 2 + gl_triplebuffer->int_val; diff --git a/nq/source/host.c b/nq/source/host.c index 231d7411a..c4b847d9c 100644 --- a/nq/source/host.c +++ b/nq/source/host.c @@ -713,7 +713,7 @@ _Host_Frame (float time) // update audio if (cls.signon == SIGNONS) { S_Update (r_origin, vpn, vright, vup); - CL_DecayLights (); + R_DecayLights (); } else S_Update (vec3_origin, vec3_origin, vec3_origin, vec3_origin); diff --git a/nq/source/r_main.c b/nq/source/r_main.c index 276766c57..e5be65e55 100644 --- a/nq/source/r_main.c +++ b/nq/source/r_main.c @@ -1 +1,65 @@ +#include "QF/render.h" + +#include "r_local.h" + double r_realtime; +double r_frametime; +dlight_t r_dlights[MAX_DLIGHTS]; + +dlight_t * +R_AllocDlight (int key) +{ + int i; + dlight_t *dl; + + // first look for an exact key match + if (key) { + dl = r_dlights; + for (i = 0; i < MAX_DLIGHTS; i++, dl++) { + if (dl->key == key) { + memset (dl, 0, sizeof (*dl)); + dl->key = key; + dl->color[0] = dl->color[1] = dl->color[2] = 1; + return dl; + } + } + } + // then look for anything else + dl = r_dlights; + for (i = 0; i < MAX_DLIGHTS; i++, dl++) { + if (dl->die < r_realtime) { + memset (dl, 0, sizeof (*dl)); + dl->key = key; + dl->color[0] = dl->color[1] = dl->color[2] = 1; + return dl; + } + } + + dl = &r_dlights[0]; + memset (dl, 0, sizeof (*dl)); + dl->key = key; + return dl; +} + +void +R_DecayLights (void) +{ + int i; + dlight_t *dl; + + dl = r_dlights; + for (i = 0; i < MAX_DLIGHTS; i++, dl++) { + if (dl->die < r_realtime || !dl->radius) + continue; + + dl->radius -= r_frametime * dl->decay; + if (dl->radius < 0) + dl->radius = 0; + } +} + +void +R_ClearDlights (void) +{ + memset (r_dlights, 0, sizeof (r_dlights)); +} diff --git a/nq/source/screen.c b/nq/source/screen.c index 8e53a8c1f..24a770b0b 100644 --- a/nq/source/screen.c +++ b/nq/source/screen.c @@ -893,6 +893,7 @@ SCR_UpdateScreen (double realtime) } #endif + r_frametime = min (realtime - r_realtime, 5); // bound to 0.2 fps r_realtime = realtime; scr_copytop = 0; diff --git a/nq/source/sw_ralias.c b/nq/source/sw_ralias.c index 831bdc21c..0d72be248 100644 --- a/nq/source/sw_ralias.c +++ b/nq/source/sw_ralias.c @@ -678,7 +678,6 @@ R_AliasDrawModel (alight_t *plighting) if (currententity != &cl.viewent) ziscale = (float) 0x8000 *(float) 0x10000; - else ziscale = (float) 0x8000 *(float) 0x10000 *3.0; diff --git a/nq/source/sw_rlight.c b/nq/source/sw_rlight.c index 736e76457..225c551b5 100644 --- a/nq/source/sw_rlight.c +++ b/nq/source/sw_rlight.c @@ -30,6 +30,8 @@ # include "config.h" #endif +#include "QF/render.h" + #include "client.h" #include "r_local.h" @@ -108,7 +110,7 @@ R_PushDlights (vec3_t entorigin) r_dlightframecount = r_framecount + 1; // because the count hasn't // advanced yet for this frame - l = cl_dlights; + l = r_dlights; for (i = 0; i < MAX_DLIGHTS; i++, l++) { if (l->die < r_realtime || !l->radius) diff --git a/nq/source/sw_rmain.c b/nq/source/sw_rmain.c index 01ac0e268..bfc0e860f 100644 --- a/nq/source/sw_rmain.c +++ b/nq/source/sw_rmain.c @@ -183,12 +183,12 @@ R_Init (void) void -R_NewMap (void) +R_NewMap (model_t *worldmodel) { int i; memset (&r_worldentity, 0, sizeof (r_worldentity)); - r_worldentity.model = cl.worldmodel; + r_worldentity.model = worldmodel; // clear out efrags in case the level hasn't been reloaded // FIXME: is this one short? @@ -465,7 +465,7 @@ R_ShowNearestLoc (void) return; nearloc = locs_find (r_origin); if (nearloc) { - dl = CL_AllocDlight (4096); + dl = R_AllocDlight (4096); VectorCopy (nearloc->loc, dl->origin); dl->radius = 200; dl->die = r_realtime + 0.1; @@ -526,10 +526,10 @@ R_DrawEntitiesOnList (void) lighting.plightvec = lightvec; for (lnum = 0; lnum < MAX_DLIGHTS; lnum++) { - if (cl_dlights[lnum].die >= r_realtime) { + if (r_dlights[lnum].die >= r_realtime) { VectorSubtract (currententity->origin, - cl_dlights[lnum].origin, dist); - add = cl_dlights[lnum].radius - Length (dist); + r_dlights[lnum].origin, dist); + add = r_dlights[lnum].radius - Length (dist); if (add > 0) lighting.ambientlight += add; @@ -597,7 +597,7 @@ R_DrawViewModel (void) // add dynamic lights for (lnum = 0; lnum < MAX_DLIGHTS; lnum++) { - dl = &cl_dlights[lnum]; + dl = &r_dlights[lnum]; if (!dl->radius) continue; if (!dl->radius) @@ -728,12 +728,12 @@ R_DrawBEntitiesOnList (void) vec3_t lightorigin; for (k = 0; k < MAX_DLIGHTS; k++) { - if ((cl_dlights[k].die < r_realtime) || - (!cl_dlights[k].radius)) continue; + if ((r_dlights[k].die < r_realtime) || + (!r_dlights[k].radius)) continue; - VectorSubtract (cl_dlights[k].origin, + VectorSubtract (r_dlights[k].origin, currententity->origin, lightorigin); - R_MarkLights (lightorigin, &cl_dlights[k], 1 << k, + R_MarkLights (lightorigin, &r_dlights[k], 1 << k, clmodel->nodes + clmodel->hulls[0].firstclipnode); } diff --git a/nq/source/sw_rsurf.c b/nq/source/sw_rsurf.c index d24005464..791929c13 100644 --- a/nq/source/sw_rsurf.c +++ b/nq/source/sw_rsurf.c @@ -84,13 +84,13 @@ R_AddDynamicLights (void) if (!(surf->dlightbits & (1 << lnum))) continue; // not lit by this light - VectorSubtract (cl_dlights[lnum].origin, currententity->origin, + VectorSubtract (r_dlights[lnum].origin, currententity->origin, lightorigin); - rad = cl_dlights[lnum].radius; + rad = r_dlights[lnum].radius; dist = DotProduct (lightorigin, surf->plane->normal) - surf->plane->dist; rad -= fabs (dist); - minlight = cl_dlights[lnum].minlight; + minlight = r_dlights[lnum].minlight; if (rad < minlight) continue; minlight = rad - minlight; diff --git a/qw/include/cl_main.h b/qw/include/cl_main.h index 509a2746a..154dfc24f 100644 --- a/qw/include/cl_main.h +++ b/qw/include/cl_main.h @@ -33,9 +33,6 @@ #include "QF/qtypes.h" #include "QF/render.h" -dlight_t *CL_AllocDlight (int key); -void CL_DecayLights (void); - void CL_Init (void); void Host_WriteConfiguration (void); diff --git a/qw/include/client.h b/qw/include/client.h index d9b1db95b..be33fe771 100644 --- a/qw/include/client.h +++ b/qw/include/client.h @@ -318,7 +318,6 @@ extern client_state_t cl; extern entity_state_t cl_baselines[MAX_EDICTS]; extern entity_t cl_static_entities[MAX_STATIC_ENTITIES]; extern lightstyle_t cl_lightstyle[MAX_LIGHTSTYLES]; -extern dlight_t cl_dlights[MAX_DLIGHTS]; extern qboolean nomaster; extern char *server_version; // version of server we connected to diff --git a/qw/source/cl_ents.c b/qw/source/cl_ents.c index 1428e6591..4c8adff01 100644 --- a/qw/source/cl_ents.c +++ b/qw/source/cl_ents.c @@ -82,42 +82,6 @@ CL_ClearEnts () } -dlight_t * -CL_AllocDlight (int key) -{ - int i; - dlight_t *dl; - - // first look for an exact key match - if (key) { - dl = cl_dlights; - for (i = 0; i < MAX_DLIGHTS; i++, dl++) { - if (dl->key == key) { - memset (dl, 0, sizeof (*dl)); - dl->key = key; - dl->color[0] = dl->color[1] = dl->color[2] = 1; - return dl; - } - } - } - // then look for anything else - dl = cl_dlights; - for (i = 0; i < MAX_DLIGHTS; i++, dl++) { - if (dl->die < cl.time) { - memset (dl, 0, sizeof (*dl)); - dl->key = key; - dl->color[0] = dl->color[1] = dl->color[2] = 1; - return dl; - } - } - - dl = &cl_dlights[0]; - memset (dl, 0, sizeof (*dl)); - dl->key = key; - return dl; -} - - void CL_NewDlight (int key, vec3_t org, int effects) { @@ -133,7 +97,7 @@ CL_NewDlight (int key, vec3_t org, int effects) return; radius = 200 + (rand () & 31); - dl = CL_AllocDlight (key); + dl = R_AllocDlight (key); VectorCopy (org, dl->origin); dl->die = cl.time + 0.1; switch (effects & (EF_BLUE | EF_RED)) { @@ -158,24 +122,6 @@ CL_NewDlight (int key, vec3_t org, int effects) } -void -CL_DecayLights (void) -{ - int i; - dlight_t *dl; - - dl = cl_dlights; - for (i = 0; i < MAX_DLIGHTS; i++, dl++) { - if (dl->die < cl.time || !dl->radius) - continue; - - dl->radius -= host_frametime * dl->decay; - if (dl->radius < 0) - dl->radius = 0; - } -} - - /* PACKET ENTITY PARSING / LINKING */ @@ -552,7 +498,7 @@ CL_LinkPacketEntities (void) VectorCopy ((*ent)->origin, (*ent)->old_origin); if (model->flags & EF_ROCKET) { - dl = CL_AllocDlight (-(*ent)->keynum); + dl = R_AllocDlight (-(*ent)->keynum); VectorCopy ((*ent)->origin, dl->origin); VectorCopy (r_firecolor->vec, dl->color); dl->radius = 200; diff --git a/qw/source/cl_main.c b/qw/source/cl_main.c index 648585fd7..310734f38 100644 --- a/qw/source/cl_main.c +++ b/qw/source/cl_main.c @@ -165,7 +165,6 @@ entity_state_t cl_baselines[MAX_EDICTS]; efrag_t cl_efrags[MAX_EFRAGS]; entity_t cl_static_entities[MAX_STATIC_ENTITIES]; lightstyle_t cl_lightstyle[MAX_LIGHTSTYLES]; -dlight_t cl_dlights[MAX_DLIGHTS]; double connect_time = -1; // for connection retransmits @@ -411,6 +410,7 @@ CL_ClearState (void) CL_ClearTEnts (); R_ClearEfrags (); + R_ClearDlights (); // wipe the entire cl structure memset (&cl, 0, sizeof (cl)); @@ -419,7 +419,6 @@ CL_ClearState (void) // clear other arrays memset (cl_efrags, 0, sizeof (cl_efrags)); - memset (cl_dlights, 0, sizeof (cl_dlights)); memset (cl_lightstyle, 0, sizeof (cl_lightstyle)); } @@ -1489,7 +1488,7 @@ Host_Frame (float time) // update audio if (cls.state == ca_active) { S_Update (r_origin, vpn, vright, vup); - CL_DecayLights (); + R_DecayLights (); } else S_Update (vec3_origin, vec3_origin, vec3_origin, vec3_origin); diff --git a/qw/source/cl_parse.c b/qw/source/cl_parse.c index 53945b5cf..fba257fbb 100644 --- a/qw/source/cl_parse.c +++ b/qw/source/cl_parse.c @@ -297,7 +297,7 @@ Model_NextDownload (void) // all done cl.worldmodel = cl.model_precache[1]; - R_NewMap (); + R_NewMap (cl.worldmodel); Team_NewMap (); Hunk_Check (); // make sure nothing is hurt @@ -1081,7 +1081,7 @@ CL_MuzzleFlash (void) pl = &cl.frames[parsecountmod].playerstate[i - 1]; - dl = CL_AllocDlight (i); + dl = R_AllocDlight (i); VectorCopy (pl->origin, dl->origin); AngleVectors (pl->viewangles, fv, rv, uv); diff --git a/qw/source/cl_tent.c b/qw/source/cl_tent.c index c5f89a60a..1f635df9f 100644 --- a/qw/source/cl_tent.c +++ b/qw/source/cl_tent.c @@ -283,7 +283,7 @@ CL_ParseTEnt (void) R_ParticleExplosion (pos); // light - dl = CL_AllocDlight (0); + dl = R_AllocDlight (0); VectorCopy (pos, dl->origin); dl->radius = 350; dl->die = cl.time + 0.5; @@ -350,7 +350,7 @@ CL_ParseTEnt (void) colorStart = MSG_ReadByte (net_message); colorLength = MSG_ReadByte (net_message); R_ParticleExplosion2 (pos, colorStart, colorLength); - dl = CL_AllocDlight (0); + dl = R_AllocDlight (0); VectorCopy (pos, dl->origin); dl->radius = 350; dl->die = cl.time + 0.5; @@ -392,7 +392,7 @@ CL_ParseTEnt (void) R_RocketTrail (pos, endpos, 0 + 128); R_ParticleExplosion (endpos); */ - dl = CL_AllocDlight (-1); + dl = R_AllocDlight (-1); VectorCopy (endpos, dl->origin); dl->radius = 350; dl->die = cl.time + 0.5; diff --git a/qw/source/gl_rlight.c b/qw/source/gl_rlight.c index 4c4e0f6f9..c5e990dce 100644 --- a/qw/source/gl_rlight.c +++ b/qw/source/gl_rlight.c @@ -167,7 +167,7 @@ R_RenderDlights (void) glBlendFunc (GL_ONE, GL_ONE); glShadeModel (GL_SMOOTH); - l = cl_dlights; + l = r_dlights; for (i = 0; i < MAX_DLIGHTS; i++, l++) { if (l->die < r_realtime || !l->radius) continue; @@ -291,7 +291,7 @@ R_PushDlights (vec3_t entorigin) if (!gl_dlight_lightmap->int_val) return; - l = cl_dlights; + l = r_dlights; for (i = 0; i < MAX_DLIGHTS; i++, l++) { if (l->die < r_realtime || !l->radius) diff --git a/qw/source/gl_rmain.c b/qw/source/gl_rmain.c index 63d783650..eef076aee 100644 --- a/qw/source/gl_rmain.c +++ b/qw/source/gl_rmain.c @@ -640,10 +640,10 @@ R_DrawAliasModel (entity_t *e) shadelight = max (shadelight, 24); for (lnum = 0; lnum < MAX_DLIGHTS; lnum++) { - if (cl_dlights[lnum].die >= r_realtime) { - VectorSubtract (currententity->origin, cl_dlights[lnum].origin, + if (r_dlights[lnum].die >= r_realtime) { + VectorSubtract (currententity->origin, r_dlights[lnum].origin, dist); - add = (cl_dlights[lnum].radius * cl_dlights[lnum].radius * 8) / + add = (r_dlights[lnum].radius * r_dlights[lnum].radius * 8) / (DotProduct (dist, dist)); // FIXME Deek if (add > 0) @@ -801,7 +801,7 @@ R_ShowNearestLoc (void) nearloc = locs_find (r_origin); if (nearloc) { - dl = CL_AllocDlight (4096); + dl = R_AllocDlight (4096); VectorCopy (nearloc->loc, dl->origin); dl->radius = 200; dl->die = r_realtime + 0.1; diff --git a/qw/source/gl_rmisc.c b/qw/source/gl_rmisc.c index b61159aa8..db884ce77 100644 --- a/qw/source/gl_rmisc.c +++ b/qw/source/gl_rmisc.c @@ -175,7 +175,7 @@ R_Init (void) void -R_NewMap (void) +R_NewMap (model_t *worldmodel) { int i; cvar_t *r_skyname; @@ -184,7 +184,7 @@ R_NewMap (void) d_lightstylevalue[i] = 264; // normal light value memset (&r_worldentity, 0, sizeof (r_worldentity)); - r_worldentity.model = cl.worldmodel; + r_worldentity.model = worldmodel; // clear out efrags in case the level hasn't been reloaded for (i = 0; i < r_worldentity.model->numleafs; i++) diff --git a/qw/source/gl_rsurf.c b/qw/source/gl_rsurf.c index 1d64345c3..fb74c8603 100644 --- a/qw/source/gl_rsurf.c +++ b/qw/source/gl_rsurf.c @@ -163,11 +163,11 @@ R_AddDynamicLights (msurface_t *surf) if (!(surf->dlightbits & (1 << lnum))) continue; // not lit by this light - VectorSubtract (cl_dlights[lnum].origin, currententity->origin, local); + VectorSubtract (r_dlights[lnum].origin, currententity->origin, local); dist = DotProduct (local, surf->plane->normal) - surf->plane->dist; for (i = 0; i < 3; i++) impact[i] = - cl_dlights[lnum].origin[i] - surf->plane->normal[i] * dist; + r_dlights[lnum].origin[i] - surf->plane->normal[i] * dist; i = f = DotProduct (impact, surf->texinfo->vecs[0]) + surf->texinfo->vecs[0][3] - surf->texturemins[0]; @@ -181,7 +181,7 @@ R_AddDynamicLights (msurface_t *surf) surf->texinfo->vecs[1][3] - surf->texturemins[1]; // for comparisons to minimum acceptable light - maxdist = (int) ((cl_dlights[lnum].radius * cl_dlights[lnum].radius) * 0.75); + maxdist = (int) ((r_dlights[lnum].radius * r_dlights[lnum].radius) * 0.75); // clamp radius to avoid exceeding 8192 entry division table if (maxdist > 1048576) @@ -189,9 +189,9 @@ R_AddDynamicLights (msurface_t *surf) maxdist3 = maxdist - (int) (dist * dist); // convert to 8.8 blocklights format - red = f = cl_dlights[lnum].color[0] * maxdist; - green = f = cl_dlights[lnum].color[1] * maxdist; - blue = f = cl_dlights[lnum].color[2] * maxdist; + red = f = r_dlights[lnum].color[0] * maxdist; + green = f = r_dlights[lnum].color[1] * maxdist; + blue = f = r_dlights[lnum].color[2] * maxdist; bl = blocklights; for (t = 0; t < tmax; t++, i -= 16) { td = i * i; @@ -723,11 +723,11 @@ R_DrawBrushModel (entity_t *e) vec3_t lightorigin; for (k = 0; k < MAX_DLIGHTS; k++) { - if ((cl_dlights[k].die < r_realtime) || (!cl_dlights[k].radius)) + if ((r_dlights[k].die < r_realtime) || (!r_dlights[k].radius)) continue; - VectorSubtract (cl_dlights[k].origin, e->origin, lightorigin); - R_MarkLights (lightorigin, &cl_dlights[k], 1 << k, + VectorSubtract (r_dlights[k].origin, e->origin, lightorigin); + R_MarkLights (lightorigin, &r_dlights[k], 1 << k, clmodel->nodes + clmodel->hulls[0].firstclipnode); } } diff --git a/qw/source/gl_screen.c b/qw/source/gl_screen.c index fc53d79a0..0cea06696 100644 --- a/qw/source/gl_screen.c +++ b/qw/source/gl_screen.c @@ -882,6 +882,7 @@ SCR_UpdateScreen (double realtime) if (block_drawing) return; + r_frametime = min (realtime - r_realtime, 5); // bound to 0.2 fps r_realtime = realtime; vid.numpages = 2 + gl_triplebuffer->int_val; diff --git a/qw/source/r_main.c b/qw/source/r_main.c index 276766c57..e5be65e55 100644 --- a/qw/source/r_main.c +++ b/qw/source/r_main.c @@ -1 +1,65 @@ +#include "QF/render.h" + +#include "r_local.h" + double r_realtime; +double r_frametime; +dlight_t r_dlights[MAX_DLIGHTS]; + +dlight_t * +R_AllocDlight (int key) +{ + int i; + dlight_t *dl; + + // first look for an exact key match + if (key) { + dl = r_dlights; + for (i = 0; i < MAX_DLIGHTS; i++, dl++) { + if (dl->key == key) { + memset (dl, 0, sizeof (*dl)); + dl->key = key; + dl->color[0] = dl->color[1] = dl->color[2] = 1; + return dl; + } + } + } + // then look for anything else + dl = r_dlights; + for (i = 0; i < MAX_DLIGHTS; i++, dl++) { + if (dl->die < r_realtime) { + memset (dl, 0, sizeof (*dl)); + dl->key = key; + dl->color[0] = dl->color[1] = dl->color[2] = 1; + return dl; + } + } + + dl = &r_dlights[0]; + memset (dl, 0, sizeof (*dl)); + dl->key = key; + return dl; +} + +void +R_DecayLights (void) +{ + int i; + dlight_t *dl; + + dl = r_dlights; + for (i = 0; i < MAX_DLIGHTS; i++, dl++) { + if (dl->die < r_realtime || !dl->radius) + continue; + + dl->radius -= r_frametime * dl->decay; + if (dl->radius < 0) + dl->radius = 0; + } +} + +void +R_ClearDlights (void) +{ + memset (r_dlights, 0, sizeof (r_dlights)); +} diff --git a/qw/source/screen.c b/qw/source/screen.c index 6c08dcd24..567c6672e 100644 --- a/qw/source/screen.c +++ b/qw/source/screen.c @@ -892,6 +892,7 @@ SCR_UpdateScreen (double realtime) } #endif + r_frametime = min (realtime - r_realtime, 5); // bound to 0.2 fps r_realtime = realtime; scr_copytop = 0; diff --git a/qw/source/sw_ralias.c b/qw/source/sw_ralias.c index cb866c441..e59fdda74 100644 --- a/qw/source/sw_ralias.c +++ b/qw/source/sw_ralias.c @@ -691,7 +691,6 @@ R_AliasDrawModel (alight_t *plighting) if (currententity != &cl.viewent) ziscale = (float) 0x8000 *(float) 0x10000; - else ziscale = (float) 0x8000 *(float) 0x10000 *3.0; diff --git a/qw/source/sw_rlight.c b/qw/source/sw_rlight.c index 736e76457..225c551b5 100644 --- a/qw/source/sw_rlight.c +++ b/qw/source/sw_rlight.c @@ -30,6 +30,8 @@ # include "config.h" #endif +#include "QF/render.h" + #include "client.h" #include "r_local.h" @@ -108,7 +110,7 @@ R_PushDlights (vec3_t entorigin) r_dlightframecount = r_framecount + 1; // because the count hasn't // advanced yet for this frame - l = cl_dlights; + l = r_dlights; for (i = 0; i < MAX_DLIGHTS; i++, l++) { if (l->die < r_realtime || !l->radius) diff --git a/qw/source/sw_rmain.c b/qw/source/sw_rmain.c index 3d8680e5d..b1751458e 100644 --- a/qw/source/sw_rmain.c +++ b/qw/source/sw_rmain.c @@ -42,6 +42,7 @@ #include "QF/console.h" #include "QF/locs.h" #include "QF/mathlib.h" +#include "QF/render.h" #include "QF/screen.h" #include "QF/sound.h" #include "QF/sys.h" @@ -184,12 +185,12 @@ R_Init (void) void -R_NewMap (void) +R_NewMap (model_t *worldmodel) { int i; memset (&r_worldentity, 0, sizeof (r_worldentity)); - r_worldentity.model = cl.worldmodel; + r_worldentity.model = worldmodel; // clear out efrags in case the level hasn't been reloaded // FIXME: is this one short? @@ -466,7 +467,7 @@ R_ShowNearestLoc (void) return; nearloc = locs_find (r_origin); if (nearloc) { - dl = CL_AllocDlight (4096); + dl = R_AllocDlight (4096); VectorCopy (nearloc->loc, dl->origin); dl->radius = 200; dl->die = r_realtime + 0.1; @@ -520,10 +521,10 @@ R_DrawEntitiesOnList (void) lighting.plightvec = lightvec; for (lnum = 0; lnum < MAX_DLIGHTS; lnum++) { - if (cl_dlights[lnum].die >= r_realtime) { + if (r_dlights[lnum].die >= r_realtime) { VectorSubtract (currententity->origin, - cl_dlights[lnum].origin, dist); - add = cl_dlights[lnum].radius - Length (dist); + r_dlights[lnum].origin, dist); + add = r_dlights[lnum].radius - Length (dist); if (add > 0) lighting.ambientlight += add; @@ -589,7 +590,7 @@ R_DrawViewModel (void) // add dynamic lights for (lnum = 0; lnum < MAX_DLIGHTS; lnum++) { - dl = &cl_dlights[lnum]; + dl = &r_dlights[lnum]; if (!dl->radius) continue; if (!dl->radius) @@ -720,12 +721,12 @@ R_DrawBEntitiesOnList (void) vec3_t lightorigin; for (k = 0; k < MAX_DLIGHTS; k++) { - if ((cl_dlights[k].die < r_realtime) || - (!cl_dlights[k].radius)) continue; + if ((r_dlights[k].die < r_realtime) || + (!r_dlights[k].radius)) continue; - VectorSubtract (cl_dlights[k].origin, + VectorSubtract (r_dlights[k].origin, currententity->origin, lightorigin); - R_MarkLights (lightorigin, &cl_dlights[k], 1 << k, + R_MarkLights (lightorigin, &r_dlights[k], 1 << k, clmodel->nodes + clmodel->hulls[0].firstclipnode); } diff --git a/qw/source/sw_rsurf.c b/qw/source/sw_rsurf.c index d24005464..791929c13 100644 --- a/qw/source/sw_rsurf.c +++ b/qw/source/sw_rsurf.c @@ -84,13 +84,13 @@ R_AddDynamicLights (void) if (!(surf->dlightbits & (1 << lnum))) continue; // not lit by this light - VectorSubtract (cl_dlights[lnum].origin, currententity->origin, + VectorSubtract (r_dlights[lnum].origin, currententity->origin, lightorigin); - rad = cl_dlights[lnum].radius; + rad = r_dlights[lnum].radius; dist = DotProduct (lightorigin, surf->plane->normal) - surf->plane->dist; rad -= fabs (dist); - minlight = cl_dlights[lnum].minlight; + minlight = r_dlights[lnum].minlight; if (rad < minlight) continue; minlight = rad - minlight;