diff --git a/external/reshade/shaders/OSD.fx b/external/reshade/shaders/OSD.fx index 2e7cd5c..e0c2bfc 100644 --- a/external/reshade/shaders/OSD.fx +++ b/external/reshade/shaders/OSD.fx @@ -21,6 +21,12 @@ uniform bool IgnoreHits_Enabled = false; // Stealth uniform bool OSD_ShowStealth = false; uniform bool Stealth_Enabled = false; +// Stamina +uniform bool OSD_ShowStamina = false; +uniform bool Stamina_Enabled = false; +// Mana +uniform bool OSD_ShowMana = false; +uniform bool Mana_Enabled = false; // --- Character arrays for labels --- static const int ON_LENGTH = 2; @@ -60,7 +66,7 @@ static float AI_CHARS[32] = { // New labels static const int GOD_LEN = 9; static float GOD_CHARS[32] = { - 71-32, 111-32, 100-32, 32-32, 77-32, 111-32, 100-32, 101-32, // God Mode + 71-32, 111-32, 100-32, 32-32, 77-32, 111-32, 100-32, 101-32, // God Mode : 32 -32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 @@ -68,7 +74,7 @@ static float GOD_CHARS[32] = { static const int INV_LEN = 12; static float INV_CHARS[32] = { - 73-32, 103-32, 110-32, 111-32, 114-32, 101-32, 32-32, 104-32, // "Ignore hits" + 73-32, 103-32, 110-32, 111-32, 114-32, 101-32, 32-32, 104-32, // Ignore hits : 105-32, 116-32, 115-32, 32-32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 @@ -76,12 +82,28 @@ static float INV_CHARS[32] = { static const int STEALTH_LEN = 13; static float STEALTH_CHARS[32] = { - 83-32, 116-32, 101-32, 97-32, 108-32, 116-32, 104-32, 32-32, // "Stealth Mode" + 83-32, 116-32, 101-32, 97-32, 108-32, 116-32, 104-32, 32-32, // Stealth Mode : 77-32, 111-32, 100-32, 101-32, 32-32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; +static const int STAMINA_LEN = 8; +static float STAMINA_CHARS[32] = { + 83 - 32, 116 - 32, 97 - 32, 109 - 32, 105 - 32, 110 - 32, 97 - 32, 32 - 32, // Stamina + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0 +}; + +static const int MANA_LEN = 5; +static float MANA_CHARS[32] = { + 77 - 32, 97 - 32, 110 - 32, 97 - 32, 32 - 32, 0, 0, 0, // Mana : + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0 +}; + // --- SDF Rectangle --- float sdRoundRect(float2 p, float2 b, float r) { float2 q = abs(p) - b + r; @@ -89,57 +111,67 @@ float sdRoundRect(float2 p, float2 b, float r) { } // --- Draw a character --- -float4 DrawChar(float2 uv, float2 pos, float2 charSize, float charIndex) { +float4 DrawChar(float2 uv, float2 posPx, float2 charSizePx, float charIndex) { + float2 pixelPos = uv * ReShade::ScreenSize; + float2 local = (pixelPos - posPx) / charSizePx; + + if (local.x < 0 || local.x > 1 || local.y < 0 || local.y > 1) + return float4(0, 0, 0, 0); + float2 texSize = float2(14.0, 7.0); - float2 fontUV = float2(charIndex % texSize.x, floor(charIndex / texSize.x)) / texSize; + float2 fontUV = float2(charIndex - texSize.x * floor(charIndex / texSize.x), + floor(charIndex / texSize.x)) / texSize; + float2 fontUVSize = 1.0 / texSize; - float2 localUV = (uv - pos) / charSize; - float2 finalFontUV = fontUV + fontUVSize * localUV; - return tex2D(FontSampler, finalFontUV); + float2 finalUV = fontUV + local * fontUVSize; + + return tex2D(FontSampler, finalUV); } // --- Draw text array --- -float4 DrawText(float2 uv, float2 startPos, float2 charSize, float chars[32], int length) { - float4 col = float4(0,0,0,0); +float4 DrawText(float2 uv, float2 startPosPx, float2 charSizePx, float chars[32], int length) { + float4 col = float4(0, 0, 0, 0); + [unroll] for (int i = 0; i < 32; i++) { if (i >= length) break; - float2 charPos = startPos + float2(i*charSize.x,0); - if (uv.x >= charPos.x && uv.x < charPos.x+charSize.x && - uv.y >= charPos.y && uv.y < charPos.y+charSize.y) { - float4 glyph = DrawChar(uv,charPos,charSize,chars[i]); - col.rgb = lerp(col.rgb,glyph.rgb,glyph.a); - col.a = max(col.a,glyph.a); - } + + float2 charPos = startPosPx + float2(i * charSizePx.x, 0); + float4 glyph = DrawChar(uv, charPos, charSizePx, chars[i]); + + col.rgb = lerp(col.rgb, glyph.rgb, glyph.a); + col.a = max(col.a, glyph.a); } + return col; } // --- Draw float number as text --- -float4 DrawFloat(float2 uv, float2 startPos, float2 charSize, float value) { - float4 col = float4(0,0,0,0); +float4 DrawFloat(float2 uv, float2 startPosPx, float2 charSizePx, float value) { + float4 col = float4(0, 0, 0, 0); + float v = abs(value); - int iv = (int)(v * 100.0 + 0.5); + int iv = (int) (v * 100.0 + 0.5); + int i0 = iv / 100; int i1 = (iv / 10) % 10; int i2 = iv % 10; float chars[4]; - chars[0] = i0 + 16; // '0' - chars[1] = 14; // '.' + chars[0] = i0 + 16; + chars[1] = 14; chars[2] = i1 + 16; chars[3] = i2 + 16; - //float chars[4] = { i0 + 16, 14, i1 + 16, i2 + 16 }; + [unroll] - for (int i=0;i<4;i++) { - float2 pos = startPos + float2(i * charSize.x, 0); - if (uv.x >= pos.x && uv.x < pos.x+charSize.x && - uv.y >= pos.y && uv.y < pos.y+charSize.y) { - float4 g = DrawChar(uv, pos, charSize, chars[i]); - col.rgb = lerp(col.rgb, g.rgb, g.a); - col.a = max(col.a, g.a); - } + for (int i = 0; i < 4; i++) { + float2 pos = startPosPx + float2(i * charSizePx.x, 0); + float4 g = DrawChar(uv, pos, charSizePx, chars[i]); + + col.rgb = lerp(col.rgb, g.rgb, g.a); + col.a = max(col.a, g.a); } + return col; } @@ -166,16 +198,19 @@ float4 DrawFlag(float2 uv, inout float2 pen, float2 charSize, const float label[ float4 PS_OSD(float4 pos : SV_Position, float2 uv : TEXCOORD) : SV_Target { float4 col = tex2D(ReShade::BackBuffer, uv); -if (!OSD_ShowTD && !OSD_ShowGodMode && !OSD_ShowIgnoreHits && !OSD_ShowStealth) + if (!OSD_ShowTD && !OSD_ShowGodMode && !OSD_ShowIgnoreHits && !OSD_ShowStealth && !OSD_ShowStamina && !OSD_ShowMana) return col; + float2 pixelPos = uv * ReShade::ScreenSize; + float margin_top = 20.0; - float2 center_uv = float2(0.5, margin_top / ReShade::ScreenSize.y + 0.01); - float2 p = uv - center_uv; p.x *= ReShade::AspectRatio; + float2 centerPx = float2(ReShade::ScreenSize.x * 0.5, margin_top); + float2 p = pixelPos - centerPx; // --- Frame rect --- - float charAdvance = 0.003; - float2 charSize = float2(0.003, 0.02); // widht * height + float2 charSize = float2(14.0, 20.0); // pixels + float charAdvance = charSize.x; + float totalLen = 0; float3 color; if (TD_Enabled && OSD_ShowTD) { @@ -210,19 +245,37 @@ if (!OSD_ShowTD && !OSD_ShowGodMode && !OSD_ShowIgnoreHits && !OSD_ShowStealth) totalLen = STEALTH_LEN + OFF_LENGTH; color = float3(1.0, 0.3, 0.3); } + if (Stamina_Enabled && OSD_ShowStamina) { + totalLen = STAMINA_LEN + ON_LENGTH; + color = float3(0.3, 1.0, 0.3); + } + if (!Stamina_Enabled && OSD_ShowStamina) { + totalLen = STAMINA_LEN + OFF_LENGTH; + color = float3(1.0, 0.3, 0.3); + } + if (Mana_Enabled && OSD_ShowMana) { + totalLen = MANA_LEN + ON_LENGTH; + color = float3(0.3, 1.0, 0.3); + } + if (!Mana_Enabled && OSD_ShowMana) { + totalLen = MANA_LEN + OFF_LENGTH; + color = float3(1.0, 0.3, 0.3); + } - float2 size_uv = float2((totalLen* charAdvance * 0.5 + charAdvance * 1.0) * ReShade::AspectRatio, 20.0 / ReShade::ScreenSize.y); - float thickness_px = 1.0; - float thickness = thickness_px * ReShade::PixelSize.y; - float radius_px = 2.0; - float radius = radius_px * ReShade::PixelSize.y; - float d = sdRoundRect(p,size_uv,radius); - if (abs(d)