fixed r_lightmap not being used and made it archived

removed the r_maplight* cvars
removed dead code (RB_StageIteratorGeneric)
This commit is contained in:
myT 2017-08-18 17:03:30 +02:00
parent ec042e37e1
commit f9fbe4797f
8 changed files with 40 additions and 186 deletions

View file

@ -1,6 +1,8 @@
DD Mmm 17 - 1.49
fix: r_lightmap is now archived and actually does its job
add: r_greyscale to control how monochromatic the final image looks
r_greyscale 0 (default) = full color (nothing done)
r_greyscale 1 = monochrome

View file

@ -120,16 +120,10 @@ void GL_TexEnv( int env )
switch ( env )
{
case GL_MODULATE:
qglTexEnvf( GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE );
break;
case GL_REPLACE:
qglTexEnvf( GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE );
break;
case GL_DECAL:
qglTexEnvf( GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL );
break;
case GL_ADD:
qglTexEnvf( GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_ADD );
qglTexEnvf( GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, env );
break;
default:
ri.Error( ERR_DROP, "GL_TexEnv: invalid env '%d' passed\n", env );

View file

@ -65,30 +65,6 @@ static void R_LoadLightmaps( const lump_t* l )
int i, j, k;
byte image[LIGHTMAP_SIZE * LIGHTMAP_SIZE * 4];
for(k = 0; k < 3; k++) {
if(strlen(r_maplightColor->string) == 3) {
int hexNum = r_maplightColor->string[k] - 48 < 0 ? 0 : r_maplightColor->string[k] - 48;
hexNum = hexNum > 15 ? hexNum - 65 + 48 + 10: hexNum;
hexNum = hexNum > 15 ? hexNum - 97 + 65: hexNum;
vMaplightColorFilter[k] = ((float)hexNum * 16.0f) / 255.0f;
}
else if(strlen(r_maplightColor->string) == 6) {
int hexHigh = r_maplightColor->string[k * 2] - 48 < 0 ? 0 : r_maplightColor->string[k * 2] - 48;
hexHigh = hexHigh > 15 ? hexHigh - 65 + 48 + 10: hexHigh;
hexHigh = hexHigh > 15 ? hexHigh - 97 + 65: hexHigh;
int hexLow = r_maplightColor->string[k * 2 + 1] - 48 < 0 ? 0 : r_maplightColor->string[k * 2 + 1] - 48;
hexLow = hexLow > 15 ? hexLow - 65 + 48 + 10: hexLow;
hexLow = hexLow > 15 ? hexLow - 97 + 65: hexLow;
vMaplightColorFilter[k] = (((float)hexHigh * 16.0f) + (float)hexLow) / 255.0f;
}
else {
vMaplightColorFilter[k] = 1.0f;
}
}
// if we are in r_vertexLight mode, we don't need the lightmaps at all
if (r_vertexLight->integer)
return;
@ -112,25 +88,14 @@ static void R_LoadLightmaps( const lump_t* l )
for ( i = 0; i < tr.numLightmaps; ++i ) {
// expand the 24 bit on-disk to 32 bit
for ( j = 0; j < LIGHTMAP_SIZE * LIGHTMAP_SIZE; ++j ) {
R_ColorShiftLightingBytes( &p[j*3], &image[j*4] );
image[j*4+3] = 255;
vec3_t vColor = {(float)image[j * 4 + 0] / 255.0f, (float)image[j * 4 + 1] / 255.0f, (float)image[j * 4 + 2] / 255.0f};
float greyColor = (vColor[0] + vColor[1] + vColor[2]) / 3.0f;
R_ColorShiftLightingBytes( &p[j * 3], &image[j * 4] );
for(k = 0; k < 3; k++) {
if(r_maplightColorMode->integer > 0) {
vColor[k] = vColor[k] * r_maplightSaturation->value + greyColor * (1.0f - r_maplightSaturation->value);
}
else {
vColor[k] = greyColor;
}
vColor[k] *= r_maplightBrightness->value;
vColor[k] *= vMaplightColorFilter[k];
vColor[k] = vColor[k] < 0.0f ? 0.0f : vColor[k];
vColor[k] = vColor[k] > 1.0f ? 1.0f : vColor[k];
image[j * 4 + k] = (byte)(vColor[k] * 255.0f);
for ( k = 0; k < 3; ++k ) {
const float c1 = (float)image[j * 4 + k] / 255.0f;
const float c2 = Com_Clamp( 0.0f, 1.0f, c1 );
image[j * 4 + k] = (byte)(c2 * 255.0f);
}
image[j * 4 + 3] = 255;
}
tr.lightmaps[i] = R_CreateImage( va("*lightmap%d",i), image,
LIGHTMAP_SIZE, LIGHTMAP_SIZE, GL_RGB, IMG_NOMIPMAP | IMG_NOPICMIP, GL_CLAMP );

View file

@ -175,17 +175,33 @@ static void GL2_DynLights_LightingPass()
///////////////////////////////////////////////////////////////
static void GL2_DynLights_MultitextureStage( int stage )
// returns qtrue if needs to break early
static qbool GL2_DynLights_MultitextureStage( int stage )
{
// everything we care about from the first stage is already done
const shaderStage_t* pStage = tess.xstages[++stage];
static stageVars_t svarsMT; // this is a huge struct
const shaderStage_t* pPrevStage = tess.xstages[stage++];
const shaderStage_t* pStage = tess.xstages[stage];
const qbool lightmapOnly = r_lightmap->integer && (pStage->type == ST_LIGHTMAP || pPrevStage->type == ST_LIGHTMAP);
if ( lightmapOnly ) {
const int prevEnv = glState.texEnv[glState.currenttmu];
GL_TexEnv( GL_REPLACE );
if ( pStage->type == ST_LIGHTMAP ) {
R_BindAnimatedImage( &pStage->bundle );
R_ComputeTexCoords( pStage, svarsMT );
qglTexCoordPointer( 2, GL_FLOAT, 0, svarsMT.texcoords );
}
qglDrawElements( GL_TRIANGLES, tess.numIndexes, GL_INDEX_TYPE, tess.indexes );
GL_TexEnv( prevEnv );
return qtrue;
}
GL_SelectTexture( 1 );
qglEnable( GL_TEXTURE_2D );
GL_TexEnv( pStage->mtEnv );
R_BindAnimatedImage( &pStage->bundle );
static stageVars_t svarsMT; // this is a huge struct
R_ComputeTexCoords( pStage, svarsMT );
qglEnableClientState( GL_TEXTURE_COORD_ARRAY );
qglTexCoordPointer( 2, GL_FLOAT, 0, svarsMT.texcoords );
@ -194,6 +210,8 @@ static void GL2_DynLights_MultitextureStage( int stage )
qglDisable( GL_TEXTURE_2D );
GL_SelectTexture( 0 );
return qfalse;
}
@ -231,6 +249,7 @@ void GL2_DynLights_StageIterator()
const shaderStage_t* pStage = tess.xstages[stage];
R_ComputeColors( pStage, tess.svars );
R_ComputeTexCoords( pStage, tess.svars );
R_BindAnimatedImage( &pStage->bundle );
GL_State( pStage->stateBits );
@ -239,11 +258,12 @@ void GL2_DynLights_StageIterator()
// so color changes are ignored unless we "update" the color pointer again
qglColorPointer( 4, GL_UNSIGNED_BYTE, 0, tess.svars.colors );
qglTexCoordPointer( 2, GL_FLOAT, 0, tess.svars.texcoords );
if (pStage->mtStages) {
if ( pStage->mtStages ) {
// we can't really cope with massive collapses, so
assert( pStage->mtStages == 1 );
GL2_DynLights_MultitextureStage( stage );
if ( GL2_DynLights_MultitextureStage( stage ) )
break;
stage += pStage->mtStages;
continue;
}

View file

@ -60,6 +60,7 @@ cvar_t *r_drawentities;
cvar_t *r_drawworld;
cvar_t *r_speeds;
cvar_t *r_fullbright;
cvar_t *r_lightmap;
cvar_t *r_novis;
cvar_t *r_nocull;
cvar_t *r_nocurves;
@ -70,7 +71,6 @@ cvar_t *r_msaa;
cvar_t *r_ignoreGLErrors;
cvar_t *r_lightmap;
cvar_t *r_vertexLight;
cvar_t *r_uiFullScreen;
cvar_t *r_mode;
@ -481,15 +481,6 @@ static void R_Register()
r_ext_compressed_textures = ri.Cvar_Get( "r_ext_compressed_textures", "0", CVAR_ARCHIVE | CVAR_LATCH );
r_ext_max_anisotropy = ri.Cvar_Get( "r_ext_max_anisotropy", "16", CVAR_ARCHIVE | CVAR_LATCH );
r_msaa = ri.Cvar_Get( "r_msaa", "0", CVAR_ARCHIVE | CVAR_LATCH );
///////////////////////////////////////////////////////////////
r_maplightBrightness = ri.Cvar_Get("r_maplightBrightness", "1", CVAR_ARCHIVE | CVAR_LATCH);
AssertCvarRange(r_maplightBrightness, 0.0f, 8.0f, qfalse);
r_maplightSaturation = ri.Cvar_Get("r_maplightSaturation", "1", CVAR_ARCHIVE | CVAR_LATCH);
AssertCvarRange(r_maplightSaturation, 0.0f, 4.0f, qfalse);
r_maplightColorMode = ri.Cvar_Get("r_maplightColorMode", "1", CVAR_ARCHIVE | CVAR_LATCH);
AssertCvarRange(r_maplightColorMode, 0, 1, qtrue);
r_maplightColor = ri.Cvar_Get("r_maplightColor", "ffffff", CVAR_ARCHIVE | CVAR_LATCH);
r_picmip = ri.Cvar_Get ("r_picmip", "0", CVAR_ARCHIVE | CVAR_LATCH );
AssertCvarRange( r_picmip, 0, 16, qtrue );
@ -508,6 +499,7 @@ static void R_Register()
r_customaspect = ri.Cvar_Get( "r_customaspect", "1.333", CVAR_ARCHIVE | CVAR_LATCH );
r_vertexLight = ri.Cvar_Get( "r_vertexLight", "0", CVAR_ARCHIVE | CVAR_LATCH );
r_fullbright = ri.Cvar_Get( "r_fullbright", "0", CVAR_ARCHIVE | CVAR_LATCH );
r_lightmap = ri.Cvar_Get( "r_lightmap", "0", CVAR_ARCHIVE );
r_subdivisions = ri.Cvar_Get( "r_subdivisions", "4", CVAR_ARCHIVE | CVAR_LATCH );
#ifdef USE_R_SMP
r_smp = ri.Cvar_Get( "r_smp", "0", CVAR_ARCHIVE | CVAR_LATCH );
@ -560,7 +552,6 @@ static void R_Register()
r_nocurves = ri.Cvar_Get ("r_nocurves", "0", CVAR_CHEAT );
r_drawworld = ri.Cvar_Get ("r_drawworld", "1", CVAR_CHEAT );
r_lightmap = ri.Cvar_Get ("r_lightmap", "0", 0 );
r_portalOnly = ri.Cvar_Get ("r_portalOnly", "0", CVAR_CHEAT );
r_flareSize = ri.Cvar_Get ("r_flareSize", "40", CVAR_CHEAT);

View file

@ -1011,14 +1011,6 @@ extern cvar_t *r_flareSize;
extern cvar_t *r_flareFade;
extern cvar_t *r_flareCoeff;
///////////////////////////////////////////////////////////////
extern cvar_t *r_maplightBrightness;
extern cvar_t *r_maplightSaturation;
extern cvar_t *r_maplightColor;
extern cvar_t *r_maplightColorMode;
extern vec3_t vMaplightColorFilter;
///////////////////////////////////////////////////////////////
void R_NoiseInit();
double R_NoiseGet4f( double x, double y, double z, double t );
@ -1214,7 +1206,6 @@ void R_ComputeTexCoords( const shaderStage_t* pStage, stageVars_t& svars );
void R_BindAnimatedImage( const textureBundle_t* bundle );
void RB_FogPass();
void RB_StageIteratorGeneric();
void RB_StageIteratorSky();
void RB_AddQuadStamp( vec3_t origin, vec3_t left, vec3_t up, byte *color );

View file

@ -262,33 +262,7 @@ void R_ComputeColors( const shaderStage_t* pStage, stageVars_t& svars )
}
break;
case CGEN_EXACT_VERTEX:
if(r_fullbright->integer < 0) {
for (i = 0; i < tess.numVertexes; i++) {
int k;
vec3_t vColor = {(float)tess.vertexColors[i][0] * tr.identityLight / 255.0f, (float)tess.vertexColors[i][1] * tr.identityLight / 255.0f, (float)tess.vertexColors[i][2] * tr.identityLight / 255.0f};
float greyColor = (vColor[0] + vColor[1] + vColor[2]) / 3.0f;
for(k = 0; k < 3; k++) {
if(r_maplightColorMode->integer > 0) {
vColor[k] = vColor[k] * r_maplightSaturation->value + greyColor * (1.0f - r_maplightSaturation->value);
}
else {
vColor[k] = greyColor;
}
vColor[k] *= r_maplightBrightness->value;
vColor[k] *= vMaplightColorFilter[k];
vColor[k] = vColor[k] < 0.0f ? 0.0f : vColor[k];
vColor[k] = vColor[k] > 1.0f ? 1.0f : vColor[k];
svars.colors[i][k] = (byte)(vColor[k] * 255.0f);
}
svars.colors[i][3] = tess.vertexColors[i][3];
}
}
else {
Com_Memcpy( svars.colors, tess.vertexColors, tess.numVertexes * sizeof( tess.vertexColors[0] ) );
}
Com_Memcpy( svars.colors, tess.vertexColors, tess.numVertexes * sizeof( tess.vertexColors[0] ) );
break;
case CGEN_ONE_MINUS_VERTEX:
if ( tr.identityLight == 1 )
@ -503,82 +477,3 @@ void R_ComputeTexCoords( const shaderStage_t* pStage, stageVars_t& svars )
}
}
///////////////////////////////////////////////////////////////
static void RB_IterateStagesGeneric( const shaderCommands_t* input )
{
for (int stage = 0; stage < MAX_SHADER_STAGES; ++stage)
{
const shaderStage_t* pStage = tess.xstages[stage];
if ( !pStage )
break;
R_ComputeColors( pStage, tess.svars );
R_ComputeTexCoords( pStage, tess.svars );
if ( r_lightmap->integer && (pStage->type == ST_LIGHTMAP) )
GL_TexEnv( GL_REPLACE );
R_BindAnimatedImage( &pStage->bundle );
GL_State( pStage->stateBits );
R_DrawElements( input->numIndexes, input->indexes );
// allow skipping out to show just lightmaps during development
if ( r_lightmap->integer && (pStage->type == ST_LIGHTMAP) ) {
GL_TexEnv( GL_MODULATE );
break;
}
}
}
void RB_StageIteratorGeneric()
{
shaderCommands_t* input = &tess;
if (tess.pass == shaderCommands_t::TP_LIGHT)
return;
GL_Program();
RB_DeformTessGeometry();
GL_Cull( input->shader->cullType );
if ( input->shader->polygonOffset )
{
qglEnable( GL_POLYGON_OFFSET_FILL );
//qglPolygonOffset( r_offsetFactor->value, r_offsetUnits->value );
}
// geometry is per-shader and can be compiled
// color and tc are per-stage, and can't
qglDisableClientState( GL_COLOR_ARRAY );
qglDisableClientState( GL_TEXTURE_COORD_ARRAY );
qglVertexPointer( 3, GL_FLOAT, 16, input->xyz ); // padded for SIMD
qglLockArraysEXT( 0, input->numVertexes );
qglEnableClientState( GL_COLOR_ARRAY );
qglColorPointer( 4, GL_UNSIGNED_BYTE, 0, input->svars.colors );
qglEnableClientState( GL_TEXTURE_COORD_ARRAY );
qglTexCoordPointer( 2, GL_FLOAT, 0, input->svars.texcoords[0] );
// call shader function
RB_IterateStagesGeneric( input );
if ( tess.fogNum && tess.shader->fogPass ) {
RB_FogPass();
}
qglUnlockArraysEXT();
if ( input->shader->polygonOffset )
{
qglDisable( GL_POLYGON_OFFSET_FILL );
}
}

View file

@ -1541,8 +1541,6 @@ static void ComputeStageIteratorFunc()
}
shader.siFunc = GL2_DynLights_StageIterator;
//shader.siFunc = RB_StageIteratorGeneric;
}
@ -2398,8 +2396,6 @@ void R_ShaderList_f( void )
ri.Printf( PRINT_ALL, " " );
} else if ( shader->siFunc == RB_StageIteratorSky ) {
ri.Printf( PRINT_ALL, "sky " );
} else if ( shader->siFunc == RB_StageIteratorGeneric ) {
ri.Printf( PRINT_ALL, "lgc " );
} else {
ri.Printf( PRINT_ALL, "??? " );
}