diff --git a/src/engine/client/cl_main.cpp b/src/engine/client/cl_main.cpp index e50d447cc9..f80b735470 100644 --- a/src/engine/client/cl_main.cpp +++ b/src/engine/client/cl_main.cpp @@ -2136,7 +2136,7 @@ bool CL_InitRenderer() } } - cls.whiteShader = re.RegisterShader( "white", RSF_NOMIP ); + cls.whiteShader = re.RegisterShader( "white", RSF_NOMIP | RSF_2D ); g_console_field_width = cls.windowConfig.vidWidth / SMALLCHAR_WIDTH - 2; g_consoleField.SetWidth(g_console_field_width); diff --git a/src/engine/client/client.h b/src/engine/client/client.h index f693fd48b8..1bb4fae16f 100644 --- a/src/engine/client/client.h +++ b/src/engine/client/client.h @@ -315,7 +315,7 @@ struct clientStatic_t // rendering info WindowConfig windowConfig; - qhandle_t whiteShader; + qhandle_t whiteShader; // used for console drawing fontInfo_t *consoleFont; // www downloading diff --git a/src/engine/renderer/tr_local.h b/src/engine/renderer/tr_local.h index 100f14228c..d67b4ba3c5 100644 --- a/src/engine/renderer/tr_local.h +++ b/src/engine/renderer/tr_local.h @@ -745,6 +745,8 @@ enum class ssaoMode { OP_GLOBAL5, OP_GLOBAL6, OP_GLOBAL7, + OP_NAIVE_BLENDING, + OP_LINEAR_BLENDING, OP_FRAGMENTSHADERS, OP_FRAMEBUFFEROBJECTS, OP_SOUND, diff --git a/src/engine/renderer/tr_shade_calc.cpp b/src/engine/renderer/tr_shade_calc.cpp index 48a4cf0dc2..c72be78fb2 100644 --- a/src/engine/renderer/tr_shade_calc.cpp +++ b/src/engine/renderer/tr_shade_calc.cpp @@ -176,6 +176,14 @@ static float GetOpValue( const expOperation_t *op ) value = 1.0; break; + case opcode_t::OP_NAIVE_BLENDING: + value = float( !tr.worldLinearizeTexture ); + break; + + case opcode_t::OP_LINEAR_BLENDING: + value = float( tr.worldLinearizeTexture ); + break; + case opcode_t::OP_FRAGMENTSHADERS: value = 1.0; break; @@ -272,6 +280,8 @@ static float EvalExpression( const expression_t *exp, float defaultValue ) case opcode_t::OP_GLOBAL5: case opcode_t::OP_GLOBAL6: case opcode_t::OP_GLOBAL7: + case opcode_t::OP_NAIVE_BLENDING: + case opcode_t::OP_LINEAR_BLENDING: case opcode_t::OP_FRAGMENTSHADERS: case opcode_t::OP_FRAMEBUFFEROBJECTS: case opcode_t::OP_SOUND: diff --git a/src/engine/renderer/tr_shader.cpp b/src/engine/renderer/tr_shader.cpp index 7c622a26e4..4895b97ba2 100644 --- a/src/engine/renderer/tr_shader.cpp +++ b/src/engine/renderer/tr_shader.cpp @@ -290,6 +290,8 @@ const opstring_t opStrings[] = { {"global5", opcode_t::OP_GLOBAL5}, {"global6", opcode_t::OP_GLOBAL6}, {"global7", opcode_t::OP_GLOBAL7}, + {"naiveBlending", opcode_t::OP_NAIVE_BLENDING}, + {"linearBlending", opcode_t::OP_LINEAR_BLENDING}, {"fragmentShaders", opcode_t::OP_FRAGMENTSHADERS}, {"frameBufferObjects", opcode_t::OP_FRAMEBUFFEROBJECTS}, {"sound", opcode_t::OP_SOUND}, @@ -373,6 +375,8 @@ static bool IsOperand( opcode_t oc ) case opcode_t::OP_GLOBAL5: case opcode_t::OP_GLOBAL6: case opcode_t::OP_GLOBAL7: + case opcode_t::OP_NAIVE_BLENDING: + case opcode_t::OP_LINEAR_BLENDING: case opcode_t::OP_FRAGMENTSHADERS: case opcode_t::OP_FRAMEBUFFEROBJECTS: case opcode_t::OP_SOUND: @@ -2101,6 +2105,7 @@ static bool ParseStage( shaderStage_t *stage, const char **text ) char buffer[ 1024 ] = ""; bool loadMap = false; bool loadAnimMap = false; + bool staticEnabled = true; stage->convertColorFromSRGB = convertColorFromSRGB_NOP; @@ -2126,6 +2131,12 @@ static bool ParseStage( shaderStage_t *stage, const char **text ) { ParseExpression( text, &stage->ifExp ); } + else if ( !Q_stricmp( token, "ifStatic" ) ) + { + expression_t expr; + ParseExpression( text, &expr ); + staticEnabled = !!RB_EvalExpression( &expr, 1.0f ); + } // map else if ( !Q_stricmp( token, "map" ) ) { @@ -3335,6 +3346,12 @@ static bool ParseStage( shaderStage_t *stage, const char **text ) } } + if ( !staticEnabled ) + { + // parsing succeeded, but stage disabled + return true; + } + // parsing succeeded stage->active = true; @@ -6238,6 +6255,11 @@ shader_t *R_FindShader( const char *name, int flags ) // going to have to upload an image R_SyncRenderThread(); + if ( !( flags & RSF_2D ) && !tr.worldMapLoaded ) + { + Log::Warn( "non-2D shader '%s' registered before map colorspace is known, assuming naive blending", name ); + } + ClearGlobalShader(); Q_strncpyz( shader.name, strippedName, sizeof( shader.name ) );