diff --git a/src/engine/renderer/tr_local.h b/src/engine/renderer/tr_local.h index 8ccb74c662..b9bfc778d3 100644 --- a/src/engine/renderer/tr_local.h +++ b/src/engine/renderer/tr_local.h @@ -1322,6 +1322,8 @@ enum class shaderProfilerRenderSubGroupsMode { int autoSpriteMode; + bool forceLightMap; + uint8_t numDeforms; deformStage_t deforms[ MAX_SHADER_DEFORMS ]; diff --git a/src/engine/renderer/tr_shader.cpp b/src/engine/renderer/tr_shader.cpp index 4f6ea8e370..13717aa42e 100644 --- a/src/engine/renderer/tr_shader.cpp +++ b/src/engine/renderer/tr_shader.cpp @@ -5888,6 +5888,17 @@ static shader_t *FinishShader() numStages = MAX_SHADER_STAGES; GroupActiveStages(); + if ( shader.forceLightMap ) { + for( size_t stage = 0; stage < numStages; stage++ ) { + shaderStage_t* pStage = &stages[numStages]; + + // TODO: Add lightmap as the first stage if there's a heatHaze stage here? + if ( pStage->type == stageType_t::ST_COLORMAP ) { + pStage->type = stageType_t::ST_DIFFUSEMAP; + } + } + } + // set appropriate stage information for ( size_t stage = 0; stage < numStages; stage++ ) { @@ -6375,6 +6386,11 @@ shader_t *R_FindShader( const char *name, shaderType_t type, int flags ) shader.entitySpriteFaceViewDirection = true; } + if ( flags & RSF_FORCE_LIGHTMAP ) + { + shader.forceLightMap = true; + } + // attempt to define shader from an explicit parameter file shaderText = FindShaderInShaderText( strippedName ); diff --git a/src/engine/renderer/tr_types.h b/src/engine/renderer/tr_types.h index 3746d33eed..42f9ed1221 100644 --- a/src/engine/renderer/tr_types.h +++ b/src/engine/renderer/tr_types.h @@ -90,7 +90,7 @@ enum RegisterShaderFlags_t { RSF_NOMIP = BIT( 2 ), RSF_FITSCREEN = BIT( 3 ), RSF_LIGHT_ATTENUATION = BIT( 4 ), - RSF_NOLIGHTSCALE = BIT( 5 ), // TODO(0.56): delete, does nothing + RSF_FORCE_LIGHTMAP = BIT( 5 ), // Used to make particles/trails work with the lightGrid in GLSL RSF_SPRITE = BIT( 6 ), };