ref: refactor R_AddDynamicLights
This commit is contained in:
parent
015f1ba8c0
commit
40c051fb6b
2 changed files with 66 additions and 49 deletions
|
@ -516,21 +516,17 @@ texture_t *R_TextureAnimation( msurface_t *s )
|
||||||
R_AddDynamicLights
|
R_AddDynamicLights
|
||||||
===============
|
===============
|
||||||
*/
|
*/
|
||||||
static void R_AddDynamicLights( msurface_t *surf )
|
static void R_AddDynamicLights( const msurface_t *surf )
|
||||||
{
|
{
|
||||||
float dist, rad, minlight;
|
const mextrasurf_t *info = surf->info;
|
||||||
int lnum, s, t, sd, td, smax, tmax;
|
int lnum, smax, tmax;
|
||||||
float sl, tl, sacc, tacc;
|
int sample_frac = 1.0;
|
||||||
vec3_t impact, origin_l;
|
float sample_size;
|
||||||
mextrasurf_t *info = surf->info;
|
mtexinfo_t *tex;
|
||||||
int sample_frac = 1.0;
|
|
||||||
float sample_size;
|
|
||||||
mtexinfo_t *tex;
|
|
||||||
dlight_t *dl;
|
|
||||||
uint *bl;
|
|
||||||
|
|
||||||
// no dlighted surfaces here
|
// no dlighted surfaces here
|
||||||
if( !surf->dlightbits ) return;
|
if( !surf->dlightbits )
|
||||||
|
return;
|
||||||
|
|
||||||
sample_size = gEngfuncs.Mod_SampleSizeForFace( surf );
|
sample_size = gEngfuncs.Mod_SampleSizeForFace( surf );
|
||||||
smax = (info->lightextents[0] / sample_size) + 1;
|
smax = (info->lightextents[0] / sample_size) + 1;
|
||||||
|
@ -548,6 +544,12 @@ static void R_AddDynamicLights( msurface_t *surf )
|
||||||
|
|
||||||
for( lnum = 0; lnum < MAX_DLIGHTS; lnum++ )
|
for( lnum = 0; lnum < MAX_DLIGHTS; lnum++ )
|
||||||
{
|
{
|
||||||
|
dlight_t *dl;
|
||||||
|
vec3_t impact, origin_l;
|
||||||
|
float dist, rad, minlight;
|
||||||
|
float sl, tl;
|
||||||
|
int t;
|
||||||
|
|
||||||
if( !FBitSet( surf->dlightbits, BIT( lnum )))
|
if( !FBitSet( surf->dlightbits, BIT( lnum )))
|
||||||
continue; // not lit by this light
|
continue; // not lit by this light
|
||||||
|
|
||||||
|
@ -578,23 +580,32 @@ static void R_AddDynamicLights( msurface_t *surf )
|
||||||
|
|
||||||
sl = DotProduct( impact, info->lmvecs[0] ) + info->lmvecs[0][3] - info->lightmapmins[0];
|
sl = DotProduct( impact, info->lmvecs[0] ) + info->lmvecs[0][3] - info->lightmapmins[0];
|
||||||
tl = DotProduct( impact, info->lmvecs[1] ) + info->lmvecs[1][3] - info->lightmapmins[1];
|
tl = DotProduct( impact, info->lmvecs[1] ) + info->lmvecs[1][3] - info->lightmapmins[1];
|
||||||
bl = r_blocklights;
|
|
||||||
|
|
||||||
for( t = 0, tacc = 0; t < tmax; t++, tacc += sample_size )
|
for( t = 0; t < tmax; t++ )
|
||||||
{
|
{
|
||||||
td = (tl - tacc) * sample_frac;
|
int td = (tl - sample_size * t) * sample_frac;
|
||||||
if( td < 0 ) td = -td;
|
int s;
|
||||||
|
|
||||||
for( s = 0, sacc = 0; s < smax; s++, sacc += sample_size, bl += 3 )
|
if( td < 0 )
|
||||||
|
td = -td;
|
||||||
|
|
||||||
|
for( s = 0; s < smax; s++ )
|
||||||
{
|
{
|
||||||
sd = (sl - sacc) * sample_frac;
|
int sd = (sl - sample_size * s) * sample_frac;
|
||||||
if( sd < 0 ) sd = -sd;
|
float dist;
|
||||||
|
|
||||||
if( sd > td ) dist = sd + (td >> 1);
|
if( sd < 0 )
|
||||||
else dist = td + (sd >> 1);
|
sd = -sd;
|
||||||
|
|
||||||
|
if( sd > td )
|
||||||
|
dist = sd + (td >> 1);
|
||||||
|
else
|
||||||
|
dist = td + (sd >> 1);
|
||||||
|
|
||||||
if( dist < minlight )
|
if( dist < minlight )
|
||||||
{
|
{
|
||||||
|
uint *bl = &r_blocklights[(s + (t * smax)) * 3];
|
||||||
|
|
||||||
bl[0] += ((int)((rad - dist) * 256) * dl->color.r ) / 256;
|
bl[0] += ((int)((rad - dist) * 256) * dl->color.r ) / 256;
|
||||||
bl[1] += ((int)((rad - dist) * 256) * dl->color.g ) / 256;
|
bl[1] += ((int)((rad - dist) * 256) * dl->color.g ) / 256;
|
||||||
bl[2] += ((int)((rad - dist) * 256) * dl->color.b ) / 256;
|
bl[2] += ((int)((rad - dist) * 256) * dl->color.b ) / 256;
|
||||||
|
|
|
@ -72,21 +72,17 @@ static void R_BuildLightMap( void );
|
||||||
R_AddDynamicLights
|
R_AddDynamicLights
|
||||||
===============
|
===============
|
||||||
*/
|
*/
|
||||||
static void R_AddDynamicLights( msurface_t *surf )
|
static void R_AddDynamicLights( const msurface_t *surf )
|
||||||
{
|
{
|
||||||
float dist, rad, minlight;
|
const mextrasurf_t *info = surf->info;
|
||||||
int lnum, s, t, sd, td, smax, tmax;
|
int lnum, smax, tmax;
|
||||||
float sl, tl, sacc, tacc;
|
int sample_frac = 1.0;
|
||||||
vec3_t impact, origin_l;
|
float sample_size;
|
||||||
mextrasurf_t *info = surf->info;
|
mtexinfo_t *tex;
|
||||||
int sample_frac = 1.0;
|
|
||||||
float sample_size;
|
|
||||||
mtexinfo_t *tex;
|
|
||||||
dlight_t *dl;
|
|
||||||
uint *bl;
|
|
||||||
|
|
||||||
// no dlighted surfaces here
|
// no dlighted surfaces here
|
||||||
if( !surf->dlightbits ) return;
|
if( !surf->dlightbits )
|
||||||
|
return;
|
||||||
|
|
||||||
sample_size = gEngfuncs.Mod_SampleSizeForFace( surf );
|
sample_size = gEngfuncs.Mod_SampleSizeForFace( surf );
|
||||||
smax = (info->lightextents[0] / sample_size) + 1;
|
smax = (info->lightextents[0] / sample_size) + 1;
|
||||||
|
@ -104,6 +100,12 @@ static void R_AddDynamicLights( msurface_t *surf )
|
||||||
|
|
||||||
for( lnum = 0; lnum < MAX_DLIGHTS; lnum++ )
|
for( lnum = 0; lnum < MAX_DLIGHTS; lnum++ )
|
||||||
{
|
{
|
||||||
|
dlight_t *dl;
|
||||||
|
vec3_t impact, origin_l;
|
||||||
|
float dist, rad, minlight;
|
||||||
|
float sl, tl;
|
||||||
|
int t, monolight;
|
||||||
|
|
||||||
if( !FBitSet( surf->dlightbits, BIT( lnum )))
|
if( !FBitSet( surf->dlightbits, BIT( lnum )))
|
||||||
continue; // not lit by this light
|
continue; // not lit by this light
|
||||||
|
|
||||||
|
@ -112,8 +114,7 @@ static void R_AddDynamicLights( msurface_t *surf )
|
||||||
// transform light origin to local bmodel space
|
// transform light origin to local bmodel space
|
||||||
if( !tr.modelviewIdentity )
|
if( !tr.modelviewIdentity )
|
||||||
Matrix4x4_VectorITransform( RI.objectMatrix, dl->origin, origin_l );
|
Matrix4x4_VectorITransform( RI.objectMatrix, dl->origin, origin_l );
|
||||||
else
|
else VectorCopy( dl->origin, origin_l );
|
||||||
VectorCopy( dl->origin, origin_l );
|
|
||||||
|
|
||||||
rad = dl->radius;
|
rad = dl->radius;
|
||||||
dist = PlaneDiff( origin_l, surf->plane );
|
dist = PlaneDiff( origin_l, surf->plane );
|
||||||
|
@ -135,28 +136,33 @@ static void R_AddDynamicLights( msurface_t *surf )
|
||||||
|
|
||||||
sl = DotProduct( impact, info->lmvecs[0] ) + info->lmvecs[0][3] - info->lightmapmins[0];
|
sl = DotProduct( impact, info->lmvecs[0] ) + info->lmvecs[0][3] - info->lightmapmins[0];
|
||||||
tl = DotProduct( impact, info->lmvecs[1] ) + info->lmvecs[1][3] - info->lightmapmins[1];
|
tl = DotProduct( impact, info->lmvecs[1] ) + info->lmvecs[1][3] - info->lightmapmins[1];
|
||||||
bl = blocklights;
|
|
||||||
|
|
||||||
for( t = 0, tacc = 0; t < tmax; t++, tacc += sample_size )
|
monolight = gEngfuncs.LightToTexGamma(( dl->color.r + dl->color.g + dl->color.b ) / 3 ) * 3;
|
||||||
|
|
||||||
|
for( t = 0; t < tmax; t++ )
|
||||||
{
|
{
|
||||||
td = (tl - tacc) * sample_frac;
|
int td = (tl - sample_size * t) * sample_frac;
|
||||||
if( td < 0 ) td = -td;
|
int s;
|
||||||
|
|
||||||
for( s = 0, sacc = 0; s < smax; s++, sacc += sample_size, bl += 1 )
|
if( td < 0 )
|
||||||
|
td = -td;
|
||||||
|
|
||||||
|
for( s = 0; s < smax; s++ )
|
||||||
{
|
{
|
||||||
sd = (sl - sacc) * sample_frac;
|
int sd = (sl - sample_size * s) * sample_frac;
|
||||||
if( sd < 0 ) sd = -sd;
|
float dist;
|
||||||
|
|
||||||
if( sd > td ) dist = sd + (td >> 1);
|
if( sd < 0 )
|
||||||
else dist = td + (sd >> 1);
|
sd = -sd;
|
||||||
|
|
||||||
|
if( sd > td )
|
||||||
|
dist = sd + (td >> 1);
|
||||||
|
else
|
||||||
|
dist = td + (sd >> 1);
|
||||||
|
|
||||||
if( dist < minlight )
|
if( dist < minlight )
|
||||||
{
|
{
|
||||||
//printf("dlight %f\n", dist);
|
blocklights[(s + (t * smax))] += ((int)((rad - dist) * 256) * monolight ) / 256;
|
||||||
//*(void**)0 = 0;
|
|
||||||
bl[0] += ((int)((rad - dist) * 256) * gEngfuncs.LightToTexGamma( (dl->color.r + dl->color.g + dl->color.b ) / 3) * 3) / 256;
|
|
||||||
//bl[1] += ((int)((rad - dist) * 256) * 2.5) / 256;
|
|
||||||
//bl[2] += ((int)((rad - dist) * 256) * 2.5) / 256;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Reference in a new issue