[sw] Make alight_t lightvec an actual vector

The change to using separate per-model-type entity queues resulted in
the lighting vector used for alias and iqm models being in an ephemeral
location (in the shared setup_lighting function's stack frame). This
resulted in the model rendering code getting a garbage vector due to it
being overwritten by another stack frame. What I don't get is why the
garbage varied from run to run for the same demo (demo2, the first scrag
behind the start door showed the bad lighting nicely), which made
tracking down the offending commit (and thus the code) rather
troublesome, though once I found it, it was a bit of a face-palm moment.
This commit is contained in:
Bill Currie 2022-03-17 15:04:30 +09:00
parent 6c29904b1d
commit 833fb2f4f8
4 changed files with 30 additions and 35 deletions

View file

@ -47,9 +47,9 @@
// viewmodel lighting ======================================================= // viewmodel lighting =======================================================
typedef struct { typedef struct {
int ambientlight; int ambientlight;
int shadelight; int shadelight;
float *plightvec; vec3_t lightvec;
} alight_t; } alight_t;
// clipped bmodel edges ===================================================== // clipped bmodel edges =====================================================

View file

@ -52,7 +52,7 @@ trivertx_t *r_apverts;
// TODO: these probably will go away with optimized rasterization // TODO: these probably will go away with optimized rasterization
static mdl_t *pmdl; static mdl_t *pmdl;
vec3_t r_plightvec; vec3_t r_lightvec;
int r_ambientlight; int r_ambientlight;
float r_shadelight; float r_shadelight;
static aliashdr_t *paliashdr; static aliashdr_t *paliashdr;
@ -413,7 +413,7 @@ R_AliasTransformFinalVert (finalvert_t *fv, trivertx_t *pverts,
// lighting // lighting
plightnormal = r_avertexnormals[pverts->lightnormalindex]; plightnormal = r_avertexnormals[pverts->lightnormalindex];
lightcos = DotProduct (plightnormal, r_plightvec); lightcos = DotProduct (plightnormal, r_lightvec);
temp = r_ambientlight; temp = r_ambientlight;
if (lightcos < 0) { if (lightcos < 0) {
@ -463,7 +463,7 @@ R_AliasTransformAndProjectFinalVerts (finalvert_t *fv, stvert_t *pstverts)
// lighting // lighting
plightnormal = r_avertexnormals[pverts->lightnormalindex]; plightnormal = r_avertexnormals[pverts->lightnormalindex];
lightcos = DotProduct (plightnormal, r_plightvec); lightcos = DotProduct (plightnormal, r_lightvec);
temp = r_ambientlight; temp = r_ambientlight;
if (lightcos < 0) { if (lightcos < 0) {
@ -555,11 +555,11 @@ R_AliasSetupSkin (entity_t *ent)
static void static void
R_AliasSetupLighting (alight_t *plighting) R_AliasSetupLighting (alight_t *lighting)
{ {
// guarantee that no vertex will ever be lit below LIGHT_MIN, so we don't // guarantee that no vertex will ever be lit below LIGHT_MIN, so we don't
// have to clamp off the bottom // have to clamp off the bottom
r_ambientlight = plighting->ambientlight; r_ambientlight = lighting->ambientlight;
if (r_ambientlight < LIGHT_MIN) if (r_ambientlight < LIGHT_MIN)
r_ambientlight = LIGHT_MIN; r_ambientlight = LIGHT_MIN;
@ -569,7 +569,7 @@ R_AliasSetupLighting (alight_t *plighting)
if (r_ambientlight < LIGHT_MIN) if (r_ambientlight < LIGHT_MIN)
r_ambientlight = LIGHT_MIN; r_ambientlight = LIGHT_MIN;
r_shadelight = plighting->shadelight; r_shadelight = lighting->shadelight;
if (r_shadelight < 0) if (r_shadelight < 0)
r_shadelight = 0; r_shadelight = 0;
@ -577,9 +577,9 @@ R_AliasSetupLighting (alight_t *plighting)
r_shadelight *= VID_GRADES; r_shadelight *= VID_GRADES;
// rotate the lighting vector into the model's frame of reference // rotate the lighting vector into the model's frame of reference
r_plightvec[0] = DotProduct (plighting->plightvec, alias_forward); r_lightvec[0] = DotProduct (lighting->lightvec, alias_forward);
r_plightvec[1] = DotProduct (plighting->plightvec, alias_left); r_lightvec[1] = DotProduct (lighting->lightvec, alias_left);
r_plightvec[2] = DotProduct (plighting->plightvec, alias_up); r_lightvec[2] = DotProduct (lighting->lightvec, alias_up);
} }
/* /*
@ -598,7 +598,7 @@ R_AliasSetupFrame (entity_t *ent)
void void
R_AliasDrawModel (entity_t *ent, alight_t *plighting) R_AliasDrawModel (entity_t *ent, alight_t *lighting)
{ {
int size; int size;
finalvert_t *finalverts; finalvert_t *finalverts;
@ -623,7 +623,7 @@ R_AliasDrawModel (entity_t *ent, alight_t *plighting)
R_AliasSetupSkin (ent); R_AliasSetupSkin (ent);
R_AliasSetUpTransform (ent, ent->visibility.trivial_accept); R_AliasSetUpTransform (ent, ent->visibility.trivial_accept);
R_AliasSetupLighting (plighting); R_AliasSetupLighting (lighting);
R_AliasSetupFrame (ent); R_AliasSetupFrame (ent);
r_affinetridesc.drawtype = ((ent->visibility.trivial_accept == 3) r_affinetridesc.drawtype = ((ent->visibility.trivial_accept == 3)

View file

@ -58,14 +58,14 @@
// avoid the need for inner-loop light // avoid the need for inner-loop light
// clamping // clamping
static vec3_t r_plightvec; static vec3_t r_lightvec;
static int r_ambientlight; static int r_ambientlight;
static float r_shadelight; static float r_shadelight;
static inline int static inline int
calc_light (float *normal) calc_light (float *normal)
{ {
float lightcos = DotProduct (normal, r_plightvec); float lightcos = DotProduct (normal, r_lightvec);
int temp = r_ambientlight; int temp = r_ambientlight;
if (lightcos < 0) { if (lightcos < 0) {
@ -236,9 +236,9 @@ R_IQMSetupLighting (entity_t *ent, alight_t *plighting)
mat4f_t mat; mat4f_t mat;
Transform_GetWorldMatrix (ent->transform, mat); Transform_GetWorldMatrix (ent->transform, mat);
//FIXME vectorize //FIXME vectorize
r_plightvec[0] = DotProduct (plighting->plightvec, mat[0]); r_lightvec[0] = DotProduct (plighting->lightvec, mat[0]);
r_plightvec[1] = DotProduct (plighting->plightvec, mat[1]); r_lightvec[1] = DotProduct (plighting->lightvec, mat[1]);
r_plightvec[2] = DotProduct (plighting->plightvec, mat[2]); r_lightvec[2] = DotProduct (plighting->lightvec, mat[2]);
} }
static void static void

View file

@ -60,8 +60,6 @@
#endif #endif
void *colormap; void *colormap;
static vec3_t viewlightvec;
static alight_t r_viewlighting = { 128, 192, viewlightvec };
int r_numallocatededges; int r_numallocatededges;
qboolean r_drawpolys; qboolean r_drawpolys;
qboolean r_drawculledpolys; qboolean r_drawculledpolys;
@ -369,7 +367,7 @@ setup_lighting (entity_t *ent, alight_t *lighting)
lighting->ambientlight = j; lighting->ambientlight = j;
lighting->shadelight = j; lighting->shadelight = j;
lighting->plightvec = lightvec; VectorCopy (lightvec, lighting->lightvec);
for (unsigned lnum = 0; lnum < r_maxdlights; lnum++) { for (unsigned lnum = 0; lnum < r_maxdlights; lnum++) {
if (r_dlights[lnum].die >= vr_data.realtime) { if (r_dlights[lnum].die >= vr_data.realtime) {
@ -439,7 +437,6 @@ static void
R_DrawViewModel (void) R_DrawViewModel (void)
{ {
// FIXME: remove and do real lighting // FIXME: remove and do real lighting
float lightvec[3] = { -1, 0, 0 };
int j; int j;
unsigned int lnum; unsigned int lnum;
vec3_t dist; vec3_t dist;
@ -447,6 +444,7 @@ R_DrawViewModel (void)
float minlight; float minlight;
dlight_t *dl; dlight_t *dl;
entity_t *viewent; entity_t *viewent;
alight_t lighting;
if (vr_data.inhibit_viewmodel if (vr_data.inhibit_viewmodel
|| !r_drawviewmodel->int_val || !r_drawviewmodel->int_val
@ -459,8 +457,7 @@ R_DrawViewModel (void)
VectorCopy (Transform_GetWorldPosition (viewent->transform), r_entorigin); VectorCopy (Transform_GetWorldPosition (viewent->transform), r_entorigin);
VectorCopy (vup, viewlightvec); VectorNegate (vup, lighting.lightvec);
VectorNegate (viewlightvec, viewlightvec);
minlight = max (viewent->renderer.min_light, minlight = max (viewent->renderer.min_light,
viewent->renderer.model->min_light); viewent->renderer.model->min_light);
@ -468,8 +465,8 @@ R_DrawViewModel (void)
j = max (R_LightPoint (&r_refdef.worldmodel->brush, j = max (R_LightPoint (&r_refdef.worldmodel->brush,
r_entorigin), minlight * 128); r_entorigin), minlight * 128);
r_viewlighting.ambientlight = j; lighting.ambientlight = j;
r_viewlighting.shadelight = j; lighting.shadelight = j;
// add dynamic lights // add dynamic lights
for (lnum = 0; lnum < r_maxdlights; lnum++) { for (lnum = 0; lnum < r_maxdlights; lnum++) {
@ -484,18 +481,16 @@ R_DrawViewModel (void)
VectorSubtract (r_entorigin, dl->origin, dist); VectorSubtract (r_entorigin, dl->origin, dist);
add = dl->radius - VectorLength (dist); add = dl->radius - VectorLength (dist);
if (add > 0) if (add > 0)
r_viewlighting.ambientlight += add; lighting.ambientlight += add;
} }
// clamp lighting so it doesn't overbright as much // clamp lighting so it doesn't overbright as much
if (r_viewlighting.ambientlight > 128) if (lighting.ambientlight > 128)
r_viewlighting.ambientlight = 128; lighting.ambientlight = 128;
if (r_viewlighting.ambientlight + r_viewlighting.shadelight > 192) if (lighting.ambientlight + lighting.shadelight > 192)
r_viewlighting.shadelight = 192 - r_viewlighting.ambientlight; lighting.shadelight = 192 - lighting.ambientlight;
r_viewlighting.plightvec = lightvec; R_AliasDrawModel (viewent, &lighting);
R_AliasDrawModel (viewent, &r_viewlighting);
} }
static int static int