mirror of
https://git.code.sf.net/p/quake/quakeforge
synced 2024-11-10 23:32:09 +00:00
[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:
parent
6c29904b1d
commit
833fb2f4f8
4 changed files with 30 additions and 35 deletions
|
@ -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 =====================================================
|
||||||
|
|
|
@ -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)
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
Loading…
Reference in a new issue