yquake2remaster/src/refresh/gl_light.c

762 lines
15 KiB
C
Raw Normal View History

/*
2010-10-20 09:15:50 +00:00
* Copyright (C) 1997-2001 Id Software, Inc.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
*
* See the GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*
*/
/* r_light.c */
2009-03-05 11:03:08 +00:00
#include "header/local.h"
2010-10-20 09:15:50 +00:00
int r_dlightframecount;
2010-10-20 09:15:50 +00:00
#define DLIGHT_CUTOFF 64
2010-10-20 09:15:50 +00:00
void
R_RenderDlight ( dlight_t *light )
{
int i, j;
float a;
vec3_t v;
float rad;
2010-10-20 09:15:50 +00:00
rad = light->intensity * 0.35;
2010-10-20 09:15:50 +00:00
VectorSubtract( light->origin, r_origin, v );
2010-10-20 09:15:50 +00:00
qglBegin( GL_TRIANGLE_FAN );
qglColor3f( light->color [ 0 ] * 0.2, light->color [ 1 ] * 0.2, light->color [ 2 ] * 0.2 );
2010-10-20 09:15:50 +00:00
for ( i = 0; i < 3; i++ )
{
v [ i ] = light->origin [ i ] - vpn [ i ] * rad;
}
2010-10-20 09:15:50 +00:00
qglVertex3fv( v );
qglColor3f( 0, 0, 0 );
2010-10-20 09:15:50 +00:00
for ( i = 16; i >= 0; i-- )
{
2010-10-20 09:15:50 +00:00
a = i / 16.0 * M_PI * 2;
for ( j = 0; j < 3; j++ )
{
v [ j ] = light->origin [ j ] + vright [ j ] * cos( a ) * rad
+ vup [ j ] * sin( a ) * rad;
}
qglVertex3fv( v );
}
2010-10-20 09:15:50 +00:00
qglEnd();
}
2010-10-20 09:15:50 +00:00
R_RenderDlights ( void )
{
2010-10-20 09:15:50 +00:00
int i;
dlight_t *l;
2010-10-20 09:15:50 +00:00
if ( !gl_flashblend->value )
{
return;
2010-10-20 09:15:50 +00:00
}
2010-10-20 09:15:50 +00:00
/* because the count hasn't advanced yet for this frame */
r_dlightframecount = r_framecount + 1;
qglDepthMask( 0 );
qglDisable( GL_TEXTURE_2D );
qglShadeModel( GL_SMOOTH );
qglEnable( GL_BLEND );
qglBlendFunc( GL_ONE, GL_ONE );
l = r_newrefdef.dlights;
2010-10-20 09:15:50 +00:00
for ( i = 0; i < r_newrefdef.num_dlights; i++, l++ )
{
R_RenderDlight( l );
}
2010-10-20 09:15:50 +00:00
qglColor3f( 1, 1, 1 );
qglDisable( GL_BLEND );
qglEnable( GL_TEXTURE_2D );
qglBlendFunc( GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA );
qglDepthMask( 1 );
}
2010-10-20 09:15:50 +00:00
void
R_MarkLights ( dlight_t *light, int bit, mnode_t *node )
{
2010-10-20 09:15:50 +00:00
cplane_t *splitplane;
float dist;
msurface_t *surf;
int i;
if ( node->contents != -1 )
{
return;
2010-10-20 09:15:50 +00:00
}
splitplane = node->plane;
2010-10-20 09:15:50 +00:00
dist = DotProduct( light->origin, splitplane->normal ) - splitplane->dist;
if ( dist > light->intensity - DLIGHT_CUTOFF )
{
2010-10-20 09:15:50 +00:00
R_MarkLights( light, bit, node->children [ 0 ] );
return;
}
2010-10-20 09:15:50 +00:00
if ( dist < -light->intensity + DLIGHT_CUTOFF )
{
2010-10-20 09:15:50 +00:00
R_MarkLights( light, bit, node->children [ 1 ] );
return;
}
2010-10-20 09:15:50 +00:00
/* mark the polygons */
surf = r_worldmodel->surfaces + node->firstsurface;
2010-10-20 09:15:50 +00:00
for ( i = 0; i < node->numsurfaces; i++, surf++ )
{
2010-10-20 09:15:50 +00:00
if ( surf->dlightframe != r_dlightframecount )
{
surf->dlightbits = 0;
surf->dlightframe = r_dlightframecount;
}
2010-10-20 09:15:50 +00:00
surf->dlightbits |= bit;
}
2010-10-20 09:15:50 +00:00
R_MarkLights( light, bit, node->children [ 0 ] );
R_MarkLights( light, bit, node->children [ 1 ] );
}
2010-10-20 09:15:50 +00:00
void
R_PushDlights ( void )
{
2010-10-20 09:15:50 +00:00
int i;
dlight_t *l;
2010-10-20 09:15:50 +00:00
if ( gl_flashblend->value )
{
return;
2010-10-20 09:15:50 +00:00
}
2010-10-20 09:15:50 +00:00
/* because the count hasn't advanced yet for this frame */
r_dlightframecount = r_framecount + 1;
l = r_newrefdef.dlights;
2010-10-20 09:15:50 +00:00
for ( i = 0; i < r_newrefdef.num_dlights; i++, l++ )
{
R_MarkLights( l, 1 << i, r_worldmodel->nodes );
}
}
2010-10-20 09:15:50 +00:00
vec3_t pointcolor;
cplane_t *lightplane; /* used as shadow plane */
vec3_t lightspot;
2010-10-20 09:15:50 +00:00
int
RecursiveLightPoint ( mnode_t *node, vec3_t start, vec3_t end )
{
2010-10-20 09:15:50 +00:00
float front, back, frac;
int side;
cplane_t *plane;
vec3_t mid;
msurface_t *surf;
int s, t, ds, dt;
int i;
mtexinfo_t *tex;
byte *lightmap;
int maps;
int r;
2010-10-20 09:15:50 +00:00
if ( node->contents != -1 )
{
return ( -1 ); /* didn't hit anything */
}
/* calculate mid point */
plane = node->plane;
2010-10-20 09:15:50 +00:00
front = DotProduct( start, plane->normal ) - plane->dist;
back = DotProduct( end, plane->normal ) - plane->dist;
side = front < 0;
2010-10-20 09:15:50 +00:00
if ( ( back < 0 ) == side )
{
return ( RecursiveLightPoint( node->children [ side ], start, end ) );
}
frac = front / ( front - back );
mid [ 0 ] = start [ 0 ] + ( end [ 0 ] - start [ 0 ] ) * frac;
mid [ 1 ] = start [ 1 ] + ( end [ 1 ] - start [ 1 ] ) * frac;
mid [ 2 ] = start [ 2 ] + ( end [ 2 ] - start [ 2 ] ) * frac;
/* go down front side */
r = RecursiveLightPoint( node->children [ side ], start, mid );
if ( r >= 0 )
{
return ( r ); /* hit something */
}
if ( ( back < 0 ) == side )
{
return ( -1 ); /* didn't hit anuthing */
}
/* check for impact on this node */
VectorCopy( mid, lightspot );
lightplane = plane;
surf = r_worldmodel->surfaces + node->firstsurface;
2010-10-20 09:15:50 +00:00
for ( i = 0; i < node->numsurfaces; i++, surf++ )
{
2010-10-20 09:15:50 +00:00
if ( surf->flags & ( SURF_DRAWTURB | SURF_DRAWSKY ) )
{
continue; /* no lightmaps */
}
tex = surf->texinfo;
2010-10-20 09:15:50 +00:00
s = DotProduct( mid, tex->vecs [ 0 ] ) + tex->vecs [ 0 ] [ 3 ];
t = DotProduct( mid, tex->vecs [ 1 ] ) + tex->vecs [ 1 ] [ 3 ];
if ( ( s < surf->texturemins [ 0 ] ) ||
( t < surf->texturemins [ 1 ] ) )
{
continue;
2010-10-20 09:15:50 +00:00
}
ds = s - surf->texturemins [ 0 ];
dt = t - surf->texturemins [ 1 ];
if ( ( ds > surf->extents [ 0 ] ) || ( dt > surf->extents [ 1 ] ) )
{
continue;
2010-10-20 09:15:50 +00:00
}
2010-10-20 09:15:50 +00:00
if ( !surf->samples )
{
return ( 0 );
}
ds >>= 4;
dt >>= 4;
lightmap = surf->samples;
2010-10-20 09:15:50 +00:00
VectorCopy( vec3_origin, pointcolor );
if ( lightmap )
{
vec3_t scale;
2010-10-20 09:15:50 +00:00
lightmap += 3 * ( dt * ( ( surf->extents [ 0 ] >> 4 ) + 1 ) + ds );
2010-10-20 09:15:50 +00:00
for ( maps = 0; maps < MAXLIGHTMAPS && surf->styles [ maps ] != 255;
maps++ )
{
2010-10-20 09:15:50 +00:00
for ( i = 0; i < 3; i++ )
{
scale [ i ] = gl_modulate->value * r_newrefdef.lightstyles [ surf->styles [ maps ] ].rgb [ i ];
}
pointcolor [ 0 ] += lightmap [ 0 ] * scale [ 0 ] * ( 1.0 / 255 );
pointcolor [ 1 ] += lightmap [ 1 ] * scale [ 1 ] * ( 1.0 / 255 );
pointcolor [ 2 ] += lightmap [ 2 ] * scale [ 2 ] * ( 1.0 / 255 );
lightmap += 3 * ( ( surf->extents [ 0 ] >> 4 ) + 1 ) *
( ( surf->extents [ 1 ] >> 4 ) + 1 );
}
}
2010-10-20 09:15:50 +00:00
return ( 1 );
}
2010-10-20 09:15:50 +00:00
/* go down back side */
return ( RecursiveLightPoint( node->children [ !side ], mid, end ) );
}
2010-10-20 09:15:50 +00:00
void
R_LightPoint ( vec3_t p, vec3_t color )
{
2010-10-20 09:15:50 +00:00
vec3_t end;
float r;
int lnum;
dlight_t *dl;
float light;
vec3_t dist;
float add;
if ( !r_worldmodel->lightdata )
{
2010-10-20 09:15:50 +00:00
color [ 0 ] = color [ 1 ] = color [ 2 ] = 1.0;
return;
}
2010-10-20 09:15:50 +00:00
end [ 0 ] = p [ 0 ];
end [ 1 ] = p [ 1 ];
end [ 2 ] = p [ 2 ] - 2048;
r = RecursiveLightPoint( r_worldmodel->nodes, p, end );
if ( r == -1 )
{
2010-10-20 09:15:50 +00:00
VectorCopy( vec3_origin, color );
}
else
{
2010-10-20 09:15:50 +00:00
VectorCopy( pointcolor, color );
}
2010-10-20 09:15:50 +00:00
/* add dynamic lights */
light = 0;
dl = r_newrefdef.dlights;
2010-10-20 09:15:50 +00:00
for ( lnum = 0; lnum < r_newrefdef.num_dlights; lnum++, dl++ )
{
2010-10-20 09:15:50 +00:00
VectorSubtract( currententity->origin,
dl->origin,
dist );
add = dl->intensity - VectorLength( dist );
add *= ( 1.0 / 256 );
if ( add > 0 )
{
2010-10-20 09:15:50 +00:00
VectorMA( color, add, dl->color, color );
}
}
2010-10-20 09:15:50 +00:00
VectorScale( color, gl_modulate->value, color );
}
2010-10-20 09:15:50 +00:00
static float s_blocklights [ 34 * 34 * 3 ];
2010-10-20 09:15:50 +00:00
void
R_AddDynamicLights ( msurface_t *surf )
{
2010-10-20 09:15:50 +00:00
int lnum;
int sd, td;
float fdist, frad, fminlight;
vec3_t impact, local;
int s, t;
int i;
int smax, tmax;
mtexinfo_t *tex;
dlight_t *dl;
float *pfBL;
float fsacc, ftacc;
smax = ( surf->extents [ 0 ] >> 4 ) + 1;
tmax = ( surf->extents [ 1 ] >> 4 ) + 1;
tex = surf->texinfo;
2010-10-20 09:15:50 +00:00
for ( lnum = 0; lnum < r_newrefdef.num_dlights; lnum++ )
{
2010-10-20 09:15:50 +00:00
if ( !( surf->dlightbits & ( 1 << lnum ) ) )
{
continue; /* not lit by this light */
}
2010-10-20 09:15:50 +00:00
dl = &r_newrefdef.dlights [ lnum ];
frad = dl->intensity;
2010-10-20 09:15:50 +00:00
fdist = DotProduct( dl->origin, surf->plane->normal ) -
surf->plane->dist;
2010-10-20 09:15:50 +00:00
frad -= fabs( fdist );
/* rad is now the highest intensity on the plane */
fminlight = DLIGHT_CUTOFF;
2010-10-20 09:15:50 +00:00
if ( frad < fminlight )
{
continue;
2010-10-20 09:15:50 +00:00
}
fminlight = frad - fminlight;
2010-10-20 09:15:50 +00:00
for ( i = 0; i < 3; i++ )
{
2010-10-20 09:15:50 +00:00
impact [ i ] = dl->origin [ i ] -
surf->plane->normal [ i ] * fdist;
}
2010-10-20 09:15:50 +00:00
local [ 0 ] = DotProduct( impact, tex->vecs [ 0 ] ) + tex->vecs [ 0 ] [ 3 ] - surf->texturemins [ 0 ];
local [ 1 ] = DotProduct( impact, tex->vecs [ 1 ] ) + tex->vecs [ 1 ] [ 3 ] - surf->texturemins [ 1 ];
pfBL = s_blocklights;
2010-10-20 09:15:50 +00:00
for ( t = 0, ftacc = 0; t < tmax; t++, ftacc += 16 )
{
2010-10-20 09:15:50 +00:00
td = local [ 1 ] - ftacc;
if ( td < 0 )
2010-10-20 09:15:50 +00:00
{
td = -td;
2010-10-20 09:15:50 +00:00
}
2010-10-20 09:15:50 +00:00
for ( s = 0, fsacc = 0; s < smax; s++, fsacc += 16, pfBL += 3 )
{
2010-10-20 09:15:50 +00:00
sd = Q_ftol( local [ 0 ] - fsacc );
if ( sd < 0 )
2010-10-20 09:15:50 +00:00
{
sd = -sd;
2010-10-20 09:15:50 +00:00
}
2010-10-20 09:15:50 +00:00
if ( sd > td )
{
fdist = sd + ( td >> 1 );
}
else
2010-10-20 09:15:50 +00:00
{
fdist = td + ( sd >> 1 );
}
if ( fdist < fminlight )
{
2010-10-20 09:15:50 +00:00
pfBL [ 0 ] += ( frad - fdist ) * dl->color [ 0 ];
pfBL [ 1 ] += ( frad - fdist ) * dl->color [ 1 ];
pfBL [ 2 ] += ( frad - fdist ) * dl->color [ 2 ];
}
}
}
}
}
2010-10-20 09:15:50 +00:00
void
R_SetCacheState ( msurface_t *surf )
{
int maps;
2010-10-20 09:15:50 +00:00
for ( maps = 0; maps < MAXLIGHTMAPS && surf->styles [ maps ] != 255;
maps++ )
{
2010-10-20 09:15:50 +00:00
surf->cached_light [ maps ] = r_newrefdef.lightstyles [ surf->styles [ maps ] ].white;
}
}
/*
2010-10-20 09:15:50 +00:00
* Combine and scale multiple lightmaps into the floating format in blocklights
*/
void
R_BuildLightMap ( msurface_t *surf, byte *dest, int stride )
{
2010-10-20 09:15:50 +00:00
int smax, tmax;
int r, g, b, a, max;
int i, j, size;
byte *lightmap;
float scale [ 4 ];
int nummaps;
float *bl;
lightstyle_t *style;
int monolightmap;
2010-10-20 09:15:50 +00:00
if ( surf->texinfo->flags & ( SURF_SKY | SURF_TRANS33 | SURF_TRANS66 | SURF_WARP ) )
{
ri.Sys_Error( ERR_DROP, "R_BuildLightMap called for non-lit surface" );
}
smax = ( surf->extents [ 0 ] >> 4 ) + 1;
tmax = ( surf->extents [ 1 ] >> 4 ) + 1;
size = smax * tmax;
2010-10-20 09:15:50 +00:00
if ( size > ( sizeof ( s_blocklights ) >> 4 ) )
{
ri.Sys_Error( ERR_DROP, "Bad s_blocklights size" );
}
2010-10-20 09:15:50 +00:00
/* set to full bright if no light data */
if ( !surf->samples )
{
int maps;
2010-10-20 09:15:50 +00:00
for ( i = 0; i < size * 3; i++ )
{
s_blocklights [ i ] = 255;
}
for ( maps = 0; maps < MAXLIGHTMAPS && surf->styles [ maps ] != 255;
maps++ )
{
2010-10-20 09:15:50 +00:00
style = &r_newrefdef.lightstyles [ surf->styles [ maps ] ];
}
2010-10-20 09:15:50 +00:00
goto store;
}
2010-10-20 09:15:50 +00:00
/* count the # of maps */
for ( nummaps = 0; nummaps < MAXLIGHTMAPS && surf->styles [ nummaps ] != 255;
nummaps++ )
{
}
lightmap = surf->samples;
2010-10-20 09:15:50 +00:00
/* add all the lightmaps */
if ( nummaps == 1 )
{
int maps;
2010-10-20 09:15:50 +00:00
for ( maps = 0; maps < MAXLIGHTMAPS && surf->styles [ maps ] != 255;
maps++ )
{
bl = s_blocklights;
2010-10-20 09:15:50 +00:00
for ( i = 0; i < 3; i++ )
{
scale [ i ] = gl_modulate->value * r_newrefdef.lightstyles [ surf->styles [ maps ] ].rgb [ i ];
}
2010-10-20 09:15:50 +00:00
if ( ( scale [ 0 ] == 1.0F ) &&
( scale [ 1 ] == 1.0F ) &&
( scale [ 2 ] == 1.0F ) )
{
2010-10-20 09:15:50 +00:00
for ( i = 0; i < size; i++, bl += 3 )
{
2010-10-20 09:15:50 +00:00
bl [ 0 ] = lightmap [ i * 3 + 0 ];
bl [ 1 ] = lightmap [ i * 3 + 1 ];
bl [ 2 ] = lightmap [ i * 3 + 2 ];
}
}
else
{
2010-10-20 09:15:50 +00:00
for ( i = 0; i < size; i++, bl += 3 )
{
2010-10-20 09:15:50 +00:00
bl [ 0 ] = lightmap [ i * 3 + 0 ] * scale [ 0 ];
bl [ 1 ] = lightmap [ i * 3 + 1 ] * scale [ 1 ];
bl [ 2 ] = lightmap [ i * 3 + 2 ] * scale [ 2 ];
}
}
2010-10-20 09:15:50 +00:00
lightmap += size * 3; /* skip to next lightmap */
}
}
else
{
int maps;
2010-10-20 09:15:50 +00:00
memset( s_blocklights, 0, sizeof ( s_blocklights [ 0 ] ) * size * 3 );
2010-10-20 09:15:50 +00:00
for ( maps = 0; maps < MAXLIGHTMAPS && surf->styles [ maps ] != 255;
maps++ )
{
bl = s_blocklights;
2010-10-20 09:15:50 +00:00
for ( i = 0; i < 3; i++ )
{
scale [ i ] = gl_modulate->value * r_newrefdef.lightstyles [ surf->styles [ maps ] ].rgb [ i ];
}
2010-10-20 09:15:50 +00:00
if ( ( scale [ 0 ] == 1.0F ) &&
( scale [ 1 ] == 1.0F ) &&
( scale [ 2 ] == 1.0F ) )
{
2010-10-20 09:15:50 +00:00
for ( i = 0; i < size; i++, bl += 3 )
{
2010-10-20 09:15:50 +00:00
bl [ 0 ] += lightmap [ i * 3 + 0 ];
bl [ 1 ] += lightmap [ i * 3 + 1 ];
bl [ 2 ] += lightmap [ i * 3 + 2 ];
}
}
else
{
2010-10-20 09:15:50 +00:00
for ( i = 0; i < size; i++, bl += 3 )
{
2010-10-20 09:15:50 +00:00
bl [ 0 ] += lightmap [ i * 3 + 0 ] * scale [ 0 ];
bl [ 1 ] += lightmap [ i * 3 + 1 ] * scale [ 1 ];
bl [ 2 ] += lightmap [ i * 3 + 2 ] * scale [ 2 ];
}
}
2010-10-20 09:15:50 +00:00
lightmap += size * 3; /* skip to next lightmap */
}
}
2010-10-20 09:15:50 +00:00
/* add all the dynamic lights */
if ( surf->dlightframe == r_framecount )
{
R_AddDynamicLights( surf );
}
store:
2010-10-20 09:15:50 +00:00
stride -= ( smax << 2 );
bl = s_blocklights;
2010-10-20 09:15:50 +00:00
monolightmap = gl_monolightmap->string [ 0 ];
if ( monolightmap == '0' )
{
2010-10-20 09:15:50 +00:00
for ( i = 0; i < tmax; i++, dest += stride )
{
2010-10-20 09:15:50 +00:00
for ( j = 0; j < smax; j++ )
{
2010-10-20 09:15:50 +00:00
r = Q_ftol( bl [ 0 ] );
g = Q_ftol( bl [ 1 ] );
b = Q_ftol( bl [ 2 ] );
2010-10-20 09:15:50 +00:00
/* catch negative lights */
if ( r < 0 )
{
r = 0;
2010-10-20 09:15:50 +00:00
}
if ( g < 0 )
{
g = 0;
2010-10-20 09:15:50 +00:00
}
if ( b < 0 )
{
b = 0;
2010-10-20 09:15:50 +00:00
}
2010-10-20 09:15:50 +00:00
/* determine the brightest of the three color components */
if ( r > g )
{
max = r;
2010-10-20 09:15:50 +00:00
}
else
2010-10-20 09:15:50 +00:00
{
max = g;
2010-10-20 09:15:50 +00:00
}
if ( b > max )
{
max = b;
2010-10-20 09:15:50 +00:00
}
2010-10-20 09:15:50 +00:00
/* alpha is ONLY used for the mono lightmap case. For this reason
we set it to the brightest of the color components so that
things don't get too dim. */
a = max;
2010-10-20 09:15:50 +00:00
/* rescale all the color components if the intensity of the greatest
channel exceeds 1.0 */
if ( max > 255 )
{
float t = 255.0F / max;
2010-10-20 09:15:50 +00:00
r = r * t;
g = g * t;
b = b * t;
a = a * t;
}
2010-10-20 09:15:50 +00:00
dest [ 0 ] = r;
dest [ 1 ] = g;
dest [ 2 ] = b;
dest [ 3 ] = a;
bl += 3;
dest += 4;
}
}
}
else
{
2010-10-20 09:15:50 +00:00
for ( i = 0; i < tmax; i++, dest += stride )
{
2010-10-20 09:15:50 +00:00
for ( j = 0; j < smax; j++ )
{
2010-10-20 09:15:50 +00:00
r = Q_ftol( bl [ 0 ] );
g = Q_ftol( bl [ 1 ] );
b = Q_ftol( bl [ 2 ] );
2010-10-20 09:15:50 +00:00
/* catch negative lights */
if ( r < 0 )
{
r = 0;
2010-10-20 09:15:50 +00:00
}
if ( g < 0 )
{
g = 0;
2010-10-20 09:15:50 +00:00
}
if ( b < 0 )
{
b = 0;
2010-10-20 09:15:50 +00:00
}
2010-10-20 09:15:50 +00:00
/* determine the brightest of the three color components */
if ( r > g )
{
max = r;
2010-10-20 09:15:50 +00:00
}
else
2010-10-20 09:15:50 +00:00
{
max = g;
2010-10-20 09:15:50 +00:00
}
if ( b > max )
{
max = b;
2010-10-20 09:15:50 +00:00
}
2010-10-20 09:15:50 +00:00
/* alpha is ONLY used for the mono lightmap case. For this reason
we set it to the brightest of the color components so that
things don't get too dim. */
a = max;
2010-10-20 09:15:50 +00:00
/* rescale all the color components if the intensity of the greatest
channel exceeds 1.0 */
if ( max > 255 )
{
float t = 255.0F / max;
2010-10-20 09:15:50 +00:00
r = r * t;
g = g * t;
b = b * t;
a = a * t;
}
2010-10-20 09:15:50 +00:00
/* So if we are doing alpha lightmaps we need to set the R, G, and B
components to 0 and we need to set alpha to 1-alpha. */
switch ( monolightmap )
{
2010-10-20 09:15:50 +00:00
case 'L':
case 'I':
r = a;
g = b = 0;
break;
case 'C':
/* try faking colored lighting */
a = 255 - ( ( r + g + b ) / 3 );
r *= a / 255.0;
g *= a / 255.0;
b *= a / 255.0;
break;
case 'A':
default:
r = g = b = 0;
a = 255 - a;
break;
}
2010-10-20 09:15:50 +00:00
dest [ 0 ] = r;
dest [ 1 ] = g;
dest [ 2 ] = b;
dest [ 3 ] = a;
bl += 3;
dest += 4;
}
}
}
}