|
|
@ -107,7 +107,7 @@ typedef struct |
|
|
|
int numlocallights; |
|
|
|
int numlocallights; |
|
|
|
int lightage[MAXSTUDIOBONES]; |
|
|
|
int lightage[MAXSTUDIOBONES]; |
|
|
|
dlight_t *locallight[MAX_LOCALLIGHTS]; |
|
|
|
dlight_t *locallight[MAX_LOCALLIGHTS]; |
|
|
|
color24 locallightcolor[MAX_LOCALLIGHTS]; |
|
|
|
uint locallightcolor[MAX_LOCALLIGHTS][3]; |
|
|
|
vec4_t lightpos[MAXSTUDIOVERTS][MAX_LOCALLIGHTS]; |
|
|
|
vec4_t lightpos[MAXSTUDIOVERTS][MAX_LOCALLIGHTS]; |
|
|
|
vec3_t lightbonepos[MAXSTUDIOBONES][MAX_LOCALLIGHTS]; |
|
|
|
vec3_t lightbonepos[MAXSTUDIOBONES][MAX_LOCALLIGHTS]; |
|
|
|
float locallightR2[MAX_LOCALLIGHTS]; |
|
|
|
float locallightR2[MAX_LOCALLIGHTS]; |
|
|
@ -1377,13 +1377,13 @@ void R_StudioDynamicLight( cl_entity_t *ent, alight_t *plight ) |
|
|
|
{ |
|
|
|
{ |
|
|
|
VectorSet( lightDir, mv->skyvec_x, mv->skyvec_y, mv->skyvec_z ); |
|
|
|
VectorSet( lightDir, mv->skyvec_x, mv->skyvec_y, mv->skyvec_z ); |
|
|
|
|
|
|
|
|
|
|
|
light.r = gEngfuncs.LightToTexGamma( bound( 0, mv->skycolor_r, 255 )); |
|
|
|
light.r = mv->skycolor_r; |
|
|
|
light.g = gEngfuncs.LightToTexGamma( bound( 0, mv->skycolor_g, 255 )); |
|
|
|
light.g = mv->skycolor_g; |
|
|
|
light.b = gEngfuncs.LightToTexGamma( bound( 0, mv->skycolor_b, 255 )); |
|
|
|
light.b = mv->skycolor_b; |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
if(( light.r + light.g + light.b ) < 16 ) // TESTTEST
|
|
|
|
if(( light.r + light.g + light.b ) == 0 ) |
|
|
|
{ |
|
|
|
{ |
|
|
|
colorVec gcolor; |
|
|
|
colorVec gcolor; |
|
|
|
float grad[4]; |
|
|
|
float grad[4]; |
|
|
@ -1431,6 +1431,13 @@ void R_StudioDynamicLight( cl_entity_t *ent, alight_t *plight ) |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if( ent->curstate.renderfx == kRenderFxLightMultiplier && ent->curstate.iuser4 != 10 ) |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
light.r *= ent->curstate.iuser4 / 10.0f; |
|
|
|
|
|
|
|
light.g *= ent->curstate.iuser4 / 10.0f; |
|
|
|
|
|
|
|
light.b *= ent->curstate.iuser4 / 10.0f; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
VectorSet( finalLight, light.r, light.g, light.b ); |
|
|
|
VectorSet( finalLight, light.r, light.g, light.b ); |
|
|
|
ent->cvFloorColor = light; |
|
|
|
ent->cvFloorColor = light; |
|
|
|
|
|
|
|
|
|
|
@ -1462,15 +1469,15 @@ void R_StudioDynamicLight( cl_entity_t *ent, alight_t *plight ) |
|
|
|
|
|
|
|
|
|
|
|
VectorAdd( lightDir, dist, lightDir ); |
|
|
|
VectorAdd( lightDir, dist, lightDir ); |
|
|
|
|
|
|
|
|
|
|
|
finalLight[0] += gEngfuncs.LightToTexGamma( dl->color.r ) * ( add / 256.0f ) * 2.0f; |
|
|
|
finalLight[0] += dl->color.r * ( add / 256.0f ); |
|
|
|
finalLight[1] += gEngfuncs.LightToTexGamma( dl->color.g ) * ( add / 256.0f ) * 2.0f; |
|
|
|
finalLight[1] += dl->color.g * ( add / 256.0f ); |
|
|
|
finalLight[2] += gEngfuncs.LightToTexGamma( dl->color.b ) * ( add / 256.0f ) * 2.0f; |
|
|
|
finalLight[2] += dl->color.b * ( add / 256.0f ); |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
if( FBitSet( ent->model->flags, STUDIO_AMBIENT_LIGHT )) |
|
|
|
if( FBitSet( ent->model->flags, STUDIO_AMBIENT_LIGHT )) |
|
|
|
add = 0.6f; |
|
|
|
add = 0.6f; |
|
|
|
else add = 0.9f; |
|
|
|
else add = bound( 0.75f, v_direct->value, 1.0f ); |
|
|
|
|
|
|
|
|
|
|
|
VectorScale( lightDir, add, lightDir ); |
|
|
|
VectorScale( lightDir, add, lightDir ); |
|
|
|
|
|
|
|
|
|
|
@ -1564,9 +1571,9 @@ void R_StudioEntityLight( alight_t *lightinfo ) |
|
|
|
|
|
|
|
|
|
|
|
if( k != -1 ) |
|
|
|
if( k != -1 ) |
|
|
|
{ |
|
|
|
{ |
|
|
|
g_studio.locallightcolor[k].r = gEngfuncs.LightToTexGamma( el->color.r ); |
|
|
|
g_studio.locallightcolor[k][0] = gEngfuncs.LinearGammaTable( el->color.r << 2 ); |
|
|
|
g_studio.locallightcolor[k].g = gEngfuncs.LightToTexGamma( el->color.g ); |
|
|
|
g_studio.locallightcolor[k][1] = gEngfuncs.LinearGammaTable( el->color.g << 2 ); |
|
|
|
g_studio.locallightcolor[k].b = gEngfuncs.LightToTexGamma( el->color.b ); |
|
|
|
g_studio.locallightcolor[k][2] = gEngfuncs.LinearGammaTable( el->color.b << 2 ); |
|
|
|
g_studio.locallightR2[k] = r2; |
|
|
|
g_studio.locallightR2[k] = r2; |
|
|
|
g_studio.locallight[k] = el; |
|
|
|
g_studio.locallight[k] = el; |
|
|
|
lstrength[k] = minstrength; |
|
|
|
lstrength[k] = minstrength; |
|
|
@ -1642,7 +1649,7 @@ void R_StudioLighting( float *lv, int bone, int flags, vec3_t normal ) |
|
|
|
|
|
|
|
|
|
|
|
r = SHADE_LAMBERT; |
|
|
|
r = SHADE_LAMBERT; |
|
|
|
|
|
|
|
|
|
|
|
// do modified hemispherical lighting
|
|
|
|
// do modified hemispherical lighting
|
|
|
|
if( r <= 1.0f ) |
|
|
|
if( r <= 1.0f ) |
|
|
|
{ |
|
|
|
{ |
|
|
|
r += 1.0f; |
|
|
|
r += 1.0f; |
|
|
@ -1661,7 +1668,8 @@ void R_StudioLighting( float *lv, int bone, int flags, vec3_t normal ) |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
illum = Q_min( illum, 255.0f ); |
|
|
|
illum = Q_min( illum, 255.0f ); |
|
|
|
*lv = illum * (1.0f / 255.0f); |
|
|
|
|
|
|
|
|
|
|
|
*lv = gEngfuncs.LightToTexGammaEx( illum * 4 ) / 1023.0f; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
/*
|
|
|
@ -1681,11 +1689,11 @@ static void R_LightLambert( vec4_t light[MAX_LOCALLIGHTS], const vec3_t normal, |
|
|
|
return; |
|
|
|
return; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
VectorCopy( color, finalLight ); |
|
|
|
VectorSet( finalLight, 0, 0, 0 ); |
|
|
|
|
|
|
|
|
|
|
|
for( i = 0; i < g_studio.numlocallights; i++ ) |
|
|
|
for( i = 0; i < g_studio.numlocallights; i++ ) |
|
|
|
{ |
|
|
|
{ |
|
|
|
float r; |
|
|
|
float r; |
|
|
|
|
|
|
|
|
|
|
|
r = DotProduct( normal, light[i] ); |
|
|
|
r = DotProduct( normal, light[i] ); |
|
|
|
if( likely( !tr.fFlipViewModel )) |
|
|
|
if( likely( !tr.fFlipViewModel )) |
|
|
@ -1705,21 +1713,29 @@ static void R_LightLambert( vec4_t light[MAX_LOCALLIGHTS], const vec3_t normal, |
|
|
|
else light[i][3] = 0.0001f; |
|
|
|
else light[i][3] = 0.0001f; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
temp = Q_min( r * light[i][3] / 255.0f, 1.0f ); |
|
|
|
temp = r * light[i][3]; |
|
|
|
|
|
|
|
|
|
|
|
localLight[0] = (float)g_studio.locallightcolor[i].r * temp; |
|
|
|
|
|
|
|
localLight[1] = (float)g_studio.locallightcolor[i].g * temp; |
|
|
|
|
|
|
|
localLight[2] = (float)g_studio.locallightcolor[i].b * temp; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
VectorAddScalar( g_studio.locallightcolor[i], temp, localLight ); |
|
|
|
VectorAdd( finalLight, localLight, finalLight ); |
|
|
|
VectorAdd( finalLight, localLight, finalLight ); |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
VectorScale( finalLight, 255.0f, finalLight ); |
|
|
|
if( !VectorIsNull( finalLight )) |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
for( i = 0; i < 3; i++ ) |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
float c = finalLight[i] + gEngfuncs.LinearGammaTable( color[i] * 1023.0f ); |
|
|
|
|
|
|
|
|
|
|
|
out[0] = Q_min( (int)( finalLight[0] ), 255 ); |
|
|
|
if( c > 1023.0f ) |
|
|
|
out[1] = Q_min( (int)( finalLight[1] ), 255 ); |
|
|
|
out[i] = 255; |
|
|
|
out[2] = Q_min( (int)( finalLight[2] ), 255 ); |
|
|
|
else |
|
|
|
|
|
|
|
out[i] = gEngfuncs.ScreenGammaTable( c ) >> 2; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
else |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
VectorScale( color, 255.0f, out ); |
|
|
|
|
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
static void R_StudioSetColorBegin(short *ptricmds, vec3_t *pstudionorms ) |
|
|
|
static void R_StudioSetColorBegin(short *ptricmds, vec3_t *pstudionorms ) |
|
|
|