Merge pull request #8783 from Robyt3/Menus-Skin-ColorPicker-Cleanup

Use HSLA scrollbar color picker for 0.7 tee settings, refactor HSLA scrollbar color picker rendering
This commit is contained in:
Dennis Felsing 2024-08-21 17:10:27 +00:00 committed by GitHub
commit 4dc7346b4f
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
6 changed files with 118 additions and 226 deletions

View file

@ -791,7 +791,7 @@ private:
// found in menus_settings.cpp // found in menus_settings.cpp
void RenderSettingsDDNet(CUIRect MainView); void RenderSettingsDDNet(CUIRect MainView);
void RenderSettingsAppearance(CUIRect MainView); void RenderSettingsAppearance(CUIRect MainView);
ColorHSLA RenderHSLScrollbars(CUIRect *pRect, unsigned int *pColor, bool Alpha = false, bool ClampedLight = false); bool RenderHslaScrollbars(CUIRect *pRect, unsigned int *pColor, bool Alpha, float DarkestLight);
CServerProcess m_ServerProcess; CServerProcess m_ServerProcess;
}; };

View file

@ -758,10 +758,7 @@ void CMenus::RenderSettingsTee(CUIRect MainView)
{ {
aRects[i].HSplitTop(20.0f, &Label, &aRects[i]); aRects[i].HSplitTop(20.0f, &Label, &aRects[i]);
Ui()->DoLabel(&Label, apParts[i], 14.0f, TEXTALIGN_ML); Ui()->DoLabel(&Label, apParts[i], 14.0f, TEXTALIGN_ML);
if(RenderHslaScrollbars(&aRects[i], apColors[i], false, ColorHSLA::DARKEST_LGT))
const unsigned PrevColor = *apColors[i];
RenderHSLScrollbars(&aRects[i], apColors[i], false, true);
if(PrevColor != *apColors[i])
{ {
SetNeedSendInfo(); SetNeedSendInfo();
} }
@ -2128,53 +2125,39 @@ void CMenus::RenderSettings(CUIRect MainView)
} }
} }
ColorHSLA CMenus::RenderHSLScrollbars(CUIRect *pRect, unsigned int *pColor, bool Alpha, bool ClampedLight) bool CMenus::RenderHslaScrollbars(CUIRect *pRect, unsigned int *pColor, bool Alpha, float DarkestLight)
{ {
const unsigned PrevPackedColor = *pColor;
ColorHSLA Color(*pColor, Alpha); ColorHSLA Color(*pColor, Alpha);
CUIRect Preview, Button, Label; const ColorHSLA OriginalColor = Color;
char aBuf[32];
float *apComponent[] = {&Color.h, &Color.s, &Color.l, &Color.a};
const char *apLabels[] = {Localize("Hue"), Localize("Sat."), Localize("Lht."), Localize("Alpha")}; const char *apLabels[] = {Localize("Hue"), Localize("Sat."), Localize("Lht."), Localize("Alpha")};
const float SizePerEntry = 20.0f;
const float MarginPerEntry = 5.0f;
const float PreviewMargin = 2.5f;
const float PreviewHeight = 40.0f + 2 * PreviewMargin;
const float OffY = (SizePerEntry + MarginPerEntry) * (3 + (Alpha ? 1 : 0)) - PreviewHeight;
float SizePerEntry = 20.0f; CUIRect Preview;
float MarginPerEntry = 5.0f; pRect->VSplitLeft(PreviewHeight, &Preview, pRect);
Preview.HSplitTop(OffY / 2.0f, nullptr, &Preview);
Preview.HSplitTop(PreviewHeight, &Preview, nullptr);
float OffY = (SizePerEntry + MarginPerEntry) * (3 + (Alpha ? 1 : 0)) - 40.0f; Preview.Draw(ColorRGBA(0.15f, 0.15f, 0.15f, 1.0f), IGraphics::CORNER_ALL, 4.0f + PreviewMargin);
pRect->VSplitLeft(40.0f, &Preview, pRect); Preview.Margin(PreviewMargin, &Preview);
Preview.HSplitTop(OffY / 2.0f, NULL, &Preview); Preview.Draw(color_cast<ColorRGBA>(Color.UnclampLighting(DarkestLight)), IGraphics::CORNER_ALL, 4.0f + PreviewMargin);
Preview.HSplitTop(40.0f, &Preview, NULL);
Graphics()->TextureClear();
{
const float SizeBorder = 5.0f;
Graphics()->SetColor(ColorRGBA(0.15f, 0.15f, 0.15f, 1));
int TmpCont = Graphics()->CreateRectQuadContainer(Preview.x - SizeBorder / 2.0f, Preview.y - SizeBorder / 2.0f, Preview.w + SizeBorder, Preview.h + SizeBorder, 4.0f + SizeBorder / 2.0f, IGraphics::CORNER_ALL);
Graphics()->RenderQuadContainer(TmpCont, -1);
Graphics()->DeleteQuadContainer(TmpCont);
}
ColorHSLA RenderColorHSLA(Color.r, Color.g, Color.b, Color.a);
if(ClampedLight)
RenderColorHSLA = RenderColorHSLA.UnclampLighting();
Graphics()->SetColor(color_cast<ColorRGBA>(RenderColorHSLA));
int TmpCont = Graphics()->CreateRectQuadContainer(Preview.x, Preview.y, Preview.w, Preview.h, 4.0f, IGraphics::CORNER_ALL);
Graphics()->RenderQuadContainer(TmpCont, -1);
Graphics()->DeleteQuadContainer(TmpCont);
auto &&RenderHSLColorsRect = [&](CUIRect *pColorRect) {
Graphics()->TextureClear();
Graphics()->TrianglesBegin();
auto &&RenderHueRect = [&](CUIRect *pColorRect) {
float CurXOff = pColorRect->x; float CurXOff = pColorRect->x;
float SizeColor = pColorRect->w / 6; const float SizeColor = pColorRect->w / 6;
// red to yellow // red to yellow
{ {
IGraphics::CColorVertex Array[4] = { IGraphics::CColorVertex aColorVertices[] = {
IGraphics::CColorVertex(0, 1, 0, 0, 1), IGraphics::CColorVertex(0, 1, 0, 0, 1),
IGraphics::CColorVertex(1, 1, 1, 0, 1), IGraphics::CColorVertex(1, 1, 1, 0, 1),
IGraphics::CColorVertex(2, 1, 0, 0, 1), IGraphics::CColorVertex(2, 1, 0, 0, 1),
IGraphics::CColorVertex(3, 1, 1, 0, 1)}; IGraphics::CColorVertex(3, 1, 1, 0, 1)};
Graphics()->SetColorVertex(Array, 4); Graphics()->SetColorVertex(aColorVertices, std::size(aColorVertices));
IGraphics::CFreeformItem Freeform( IGraphics::CFreeformItem Freeform(
CurXOff, pColorRect->y, CurXOff, pColorRect->y,
@ -2187,12 +2170,12 @@ ColorHSLA CMenus::RenderHSLScrollbars(CUIRect *pRect, unsigned int *pColor, bool
// yellow to green // yellow to green
CurXOff += SizeColor; CurXOff += SizeColor;
{ {
IGraphics::CColorVertex Array[4] = { IGraphics::CColorVertex aColorVertices[] = {
IGraphics::CColorVertex(0, 1, 1, 0, 1), IGraphics::CColorVertex(0, 1, 1, 0, 1),
IGraphics::CColorVertex(1, 0, 1, 0, 1), IGraphics::CColorVertex(1, 0, 1, 0, 1),
IGraphics::CColorVertex(2, 1, 1, 0, 1), IGraphics::CColorVertex(2, 1, 1, 0, 1),
IGraphics::CColorVertex(3, 0, 1, 0, 1)}; IGraphics::CColorVertex(3, 0, 1, 0, 1)};
Graphics()->SetColorVertex(Array, 4); Graphics()->SetColorVertex(aColorVertices, std::size(aColorVertices));
IGraphics::CFreeformItem Freeform( IGraphics::CFreeformItem Freeform(
CurXOff, pColorRect->y, CurXOff, pColorRect->y,
@ -2205,12 +2188,12 @@ ColorHSLA CMenus::RenderHSLScrollbars(CUIRect *pRect, unsigned int *pColor, bool
CurXOff += SizeColor; CurXOff += SizeColor;
// green to turquoise // green to turquoise
{ {
IGraphics::CColorVertex Array[4] = { IGraphics::CColorVertex aColorVertices[] = {
IGraphics::CColorVertex(0, 0, 1, 0, 1), IGraphics::CColorVertex(0, 0, 1, 0, 1),
IGraphics::CColorVertex(1, 0, 1, 1, 1), IGraphics::CColorVertex(1, 0, 1, 1, 1),
IGraphics::CColorVertex(2, 0, 1, 0, 1), IGraphics::CColorVertex(2, 0, 1, 0, 1),
IGraphics::CColorVertex(3, 0, 1, 1, 1)}; IGraphics::CColorVertex(3, 0, 1, 1, 1)};
Graphics()->SetColorVertex(Array, 4); Graphics()->SetColorVertex(aColorVertices, std::size(aColorVertices));
IGraphics::CFreeformItem Freeform( IGraphics::CFreeformItem Freeform(
CurXOff, pColorRect->y, CurXOff, pColorRect->y,
@ -2223,12 +2206,12 @@ ColorHSLA CMenus::RenderHSLScrollbars(CUIRect *pRect, unsigned int *pColor, bool
CurXOff += SizeColor; CurXOff += SizeColor;
// turquoise to blue // turquoise to blue
{ {
IGraphics::CColorVertex Array[4] = { IGraphics::CColorVertex aColorVertices[] = {
IGraphics::CColorVertex(0, 0, 1, 1, 1), IGraphics::CColorVertex(0, 0, 1, 1, 1),
IGraphics::CColorVertex(1, 0, 0, 1, 1), IGraphics::CColorVertex(1, 0, 0, 1, 1),
IGraphics::CColorVertex(2, 0, 1, 1, 1), IGraphics::CColorVertex(2, 0, 1, 1, 1),
IGraphics::CColorVertex(3, 0, 0, 1, 1)}; IGraphics::CColorVertex(3, 0, 0, 1, 1)};
Graphics()->SetColorVertex(Array, 4); Graphics()->SetColorVertex(aColorVertices, std::size(aColorVertices));
IGraphics::CFreeformItem Freeform( IGraphics::CFreeformItem Freeform(
CurXOff, pColorRect->y, CurXOff, pColorRect->y,
@ -2241,12 +2224,12 @@ ColorHSLA CMenus::RenderHSLScrollbars(CUIRect *pRect, unsigned int *pColor, bool
CurXOff += SizeColor; CurXOff += SizeColor;
// blue to purple // blue to purple
{ {
IGraphics::CColorVertex Array[4] = { IGraphics::CColorVertex aColorVertices[] = {
IGraphics::CColorVertex(0, 0, 0, 1, 1), IGraphics::CColorVertex(0, 0, 0, 1, 1),
IGraphics::CColorVertex(1, 1, 0, 1, 1), IGraphics::CColorVertex(1, 1, 0, 1, 1),
IGraphics::CColorVertex(2, 0, 0, 1, 1), IGraphics::CColorVertex(2, 0, 0, 1, 1),
IGraphics::CColorVertex(3, 1, 0, 1, 1)}; IGraphics::CColorVertex(3, 1, 0, 1, 1)};
Graphics()->SetColorVertex(Array, 4); Graphics()->SetColorVertex(aColorVertices, std::size(aColorVertices));
IGraphics::CFreeformItem Freeform( IGraphics::CFreeformItem Freeform(
CurXOff, pColorRect->y, CurXOff, pColorRect->y,
@ -2259,12 +2242,12 @@ ColorHSLA CMenus::RenderHSLScrollbars(CUIRect *pRect, unsigned int *pColor, bool
CurXOff += SizeColor; CurXOff += SizeColor;
// purple to red // purple to red
{ {
IGraphics::CColorVertex Array[4] = { IGraphics::CColorVertex aColorVertices[] = {
IGraphics::CColorVertex(0, 1, 0, 1, 1), IGraphics::CColorVertex(0, 1, 0, 1, 1),
IGraphics::CColorVertex(1, 1, 0, 0, 1), IGraphics::CColorVertex(1, 1, 0, 0, 1),
IGraphics::CColorVertex(2, 1, 0, 1, 1), IGraphics::CColorVertex(2, 1, 0, 1, 1),
IGraphics::CColorVertex(3, 1, 0, 0, 1)}; IGraphics::CColorVertex(3, 1, 0, 0, 1)};
Graphics()->SetColorVertex(Array, 4); Graphics()->SetColorVertex(aColorVertices, std::size(aColorVertices));
IGraphics::CFreeformItem Freeform( IGraphics::CFreeformItem Freeform(
CurXOff, pColorRect->y, CurXOff, pColorRect->y,
@ -2273,150 +2256,68 @@ ColorHSLA CMenus::RenderHSLScrollbars(CUIRect *pRect, unsigned int *pColor, bool
CurXOff + SizeColor, pColorRect->y + pColorRect->h); CurXOff + SizeColor, pColorRect->y + pColorRect->h);
Graphics()->QuadsDrawFreeform(&Freeform, 1); Graphics()->QuadsDrawFreeform(&Freeform, 1);
} }
Graphics()->TrianglesEnd();
}; };
auto &&RenderHSLSatRect = [&](CUIRect *pColorRect, ColorRGBA &CurColor) { auto &&RenderSaturationRect = [&](CUIRect *pColorRect, const ColorRGBA &CurColor) {
Graphics()->TextureClear();
Graphics()->TrianglesBegin();
float CurXOff = pColorRect->x;
float SizeColor = pColorRect->w;
ColorHSLA RightColor = color_cast<ColorHSLA>(CurColor);
ColorHSLA LeftColor = color_cast<ColorHSLA>(CurColor); ColorHSLA LeftColor = color_cast<ColorHSLA>(CurColor);
ColorHSLA RightColor = color_cast<ColorHSLA>(CurColor);
LeftColor.g = 0; LeftColor.s = 0.0f;
RightColor.g = 1; RightColor.s = 1.0f;
ColorRGBA RightColorRGBA = color_cast<ColorRGBA>(RightColor); const ColorRGBA LeftColorRGBA = color_cast<ColorRGBA>(LeftColor);
ColorRGBA LeftColorRGBA = color_cast<ColorRGBA>(LeftColor); const ColorRGBA RightColorRGBA = color_cast<ColorRGBA>(RightColor);
// saturation Graphics()->SetColor4(LeftColorRGBA, RightColorRGBA, RightColorRGBA, LeftColorRGBA);
{
IGraphics::CColorVertex Array[4] = {
IGraphics::CColorVertex(0, LeftColorRGBA.r, LeftColorRGBA.g, LeftColorRGBA.b, 1),
IGraphics::CColorVertex(1, RightColorRGBA.r, RightColorRGBA.g, RightColorRGBA.b, 1),
IGraphics::CColorVertex(2, LeftColorRGBA.r, LeftColorRGBA.g, LeftColorRGBA.b, 1),
IGraphics::CColorVertex(3, RightColorRGBA.r, RightColorRGBA.g, RightColorRGBA.b, 1)};
Graphics()->SetColorVertex(Array, 4);
IGraphics::CFreeformItem Freeform( IGraphics::CFreeformItem Freeform(
CurXOff, pColorRect->y, pColorRect->x, pColorRect->y,
CurXOff + SizeColor, pColorRect->y, pColorRect->x + pColorRect->w, pColorRect->y,
CurXOff, pColorRect->y + pColorRect->h, pColorRect->x, pColorRect->y + pColorRect->h,
CurXOff + SizeColor, pColorRect->y + pColorRect->h); pColorRect->x + pColorRect->w, pColorRect->y + pColorRect->h);
Graphics()->QuadsDrawFreeform(&Freeform, 1); Graphics()->QuadsDrawFreeform(&Freeform, 1);
}
Graphics()->TrianglesEnd();
}; };
auto &&RenderHSLLightRect = [&](CUIRect *pColorRect, ColorRGBA &CurColorSat) { auto &&RenderLightingRect = [&](CUIRect *pColorRect, const ColorRGBA &CurColor) {
Graphics()->TextureClear(); ColorHSLA LeftColor = color_cast<ColorHSLA>(CurColor);
Graphics()->TrianglesBegin(); ColorHSLA RightColor = color_cast<ColorHSLA>(CurColor);
float CurXOff = pColorRect->x; LeftColor.l = DarkestLight;
float SizeColor = pColorRect->w / (ClampedLight ? 1.0f : 2.0f); RightColor.l = 1.0f;
ColorHSLA RightColor = color_cast<ColorHSLA>(CurColorSat); const ColorRGBA LeftColorRGBA = color_cast<ColorRGBA>(LeftColor);
ColorHSLA LeftColor = color_cast<ColorHSLA>(CurColorSat); const ColorRGBA RightColorRGBA = color_cast<ColorRGBA>(RightColor);
LeftColor.b = ColorHSLA::DARKEST_LGT; Graphics()->SetColor4(LeftColorRGBA, RightColorRGBA, RightColorRGBA, LeftColorRGBA);
RightColor.b = 1;
ColorRGBA RightColorRGBA = color_cast<ColorRGBA>(RightColor); IGraphics::CFreeformItem Freeform(
ColorRGBA LeftColorRGBA = color_cast<ColorRGBA>(LeftColor); pColorRect->x, pColorRect->y,
pColorRect->x + pColorRect->w, pColorRect->y,
if(!ClampedLight) pColorRect->x, pColorRect->y + pColorRect->h,
CurXOff += SizeColor; pColorRect->x + pColorRect->w, pColorRect->y + pColorRect->h);
Graphics()->QuadsDrawFreeform(&Freeform, 1);
// light
{
IGraphics::CColorVertex Array[4] = {
IGraphics::CColorVertex(0, LeftColorRGBA.r, LeftColorRGBA.g, LeftColorRGBA.b, 1),
IGraphics::CColorVertex(1, RightColorRGBA.r, RightColorRGBA.g, RightColorRGBA.b, 1),
IGraphics::CColorVertex(2, LeftColorRGBA.r, LeftColorRGBA.g, LeftColorRGBA.b, 1),
IGraphics::CColorVertex(3, RightColorRGBA.r, RightColorRGBA.g, RightColorRGBA.b, 1)};
Graphics()->SetColorVertex(Array, 4);
IGraphics::CFreeformItem Freeform(
CurXOff, pColorRect->y,
CurXOff + SizeColor, pColorRect->y,
CurXOff, pColorRect->y + pColorRect->h,
CurXOff + SizeColor, pColorRect->y + pColorRect->h);
Graphics()->QuadsDrawFreeform(&Freeform, 1);
}
if(!ClampedLight)
{
CurXOff -= SizeColor;
LeftColor.b = 0;
RightColor.b = ColorHSLA::DARKEST_LGT;
RightColorRGBA = color_cast<ColorRGBA>(RightColor);
LeftColorRGBA = color_cast<ColorRGBA>(LeftColor);
IGraphics::CColorVertex Array[4] = {
IGraphics::CColorVertex(0, LeftColorRGBA.r, LeftColorRGBA.g, LeftColorRGBA.b, 1),
IGraphics::CColorVertex(1, RightColorRGBA.r, RightColorRGBA.g, RightColorRGBA.b, 1),
IGraphics::CColorVertex(2, LeftColorRGBA.r, LeftColorRGBA.g, LeftColorRGBA.b, 1),
IGraphics::CColorVertex(3, RightColorRGBA.r, RightColorRGBA.g, RightColorRGBA.b, 1)};
Graphics()->SetColorVertex(Array, 4);
IGraphics::CFreeformItem Freeform(
CurXOff, pColorRect->y,
CurXOff + SizeColor, pColorRect->y,
CurXOff, pColorRect->y + pColorRect->h,
CurXOff + SizeColor, pColorRect->y + pColorRect->h);
Graphics()->QuadsDrawFreeform(&Freeform, 1);
}
Graphics()->TrianglesEnd();
}; };
auto &&RenderHSLAlphaRect = [&](CUIRect *pColorRect, ColorRGBA &CurColorFull) { auto &&RenderAlphaRect = [&](CUIRect *pColorRect, const ColorRGBA &CurColorFull) {
Graphics()->TextureClear(); const ColorRGBA LeftColorRGBA = color_cast<ColorRGBA>(color_cast<ColorHSLA>(CurColorFull).WithAlpha(0.0f));
Graphics()->TrianglesBegin(); const ColorRGBA RightColorRGBA = color_cast<ColorRGBA>(color_cast<ColorHSLA>(CurColorFull).WithAlpha(1.0f));
float CurXOff = pColorRect->x; Graphics()->SetColor4(LeftColorRGBA, RightColorRGBA, RightColorRGBA, LeftColorRGBA);
float SizeColor = pColorRect->w;
ColorHSLA RightColor = color_cast<ColorHSLA>(CurColorFull); IGraphics::CFreeformItem Freeform(
ColorHSLA LeftColor = color_cast<ColorHSLA>(CurColorFull); pColorRect->x, pColorRect->y,
pColorRect->x + pColorRect->w, pColorRect->y,
LeftColor.a = 0; pColorRect->x, pColorRect->y + pColorRect->h,
RightColor.a = 1; pColorRect->x + pColorRect->w, pColorRect->y + pColorRect->h);
Graphics()->QuadsDrawFreeform(&Freeform, 1);
ColorRGBA RightColorRGBA = color_cast<ColorRGBA>(RightColor);
ColorRGBA LeftColorRGBA = color_cast<ColorRGBA>(LeftColor);
// alpha
{
IGraphics::CColorVertex Array[4] = {
IGraphics::CColorVertex(0, LeftColorRGBA.r, LeftColorRGBA.g, LeftColorRGBA.b, LeftColorRGBA.a),
IGraphics::CColorVertex(1, RightColorRGBA.r, RightColorRGBA.g, RightColorRGBA.b, RightColorRGBA.a),
IGraphics::CColorVertex(2, LeftColorRGBA.r, LeftColorRGBA.g, LeftColorRGBA.b, LeftColorRGBA.a),
IGraphics::CColorVertex(3, RightColorRGBA.r, RightColorRGBA.g, RightColorRGBA.b, RightColorRGBA.a)};
Graphics()->SetColorVertex(Array, 4);
IGraphics::CFreeformItem Freeform(
CurXOff, pColorRect->y,
CurXOff + SizeColor, pColorRect->y,
CurXOff, pColorRect->y + pColorRect->h,
CurXOff + SizeColor, pColorRect->y + pColorRect->h);
Graphics()->QuadsDrawFreeform(&Freeform, 1);
}
Graphics()->TrianglesEnd();
}; };
for(int i = 0; i < 3 + Alpha; i++) for(int i = 0; i < 3 + Alpha; i++)
{ {
CUIRect Button, Label;
pRect->HSplitTop(SizePerEntry, &Button, pRect); pRect->HSplitTop(SizePerEntry, &Button, pRect);
pRect->HSplitTop(MarginPerEntry, NULL, pRect); pRect->HSplitTop(MarginPerEntry, nullptr, pRect);
Button.VSplitLeft(10.0f, 0, &Button); Button.VSplitLeft(10.0f, nullptr, &Button);
Button.VSplitLeft(100.0f, &Label, &Button); Button.VSplitLeft(100.0f, &Label, &Button);
Button.Draw(ColorRGBA(0.15f, 0.15f, 0.15f, 1.0f), IGraphics::CORNER_ALL, 1.0f); Button.Draw(ColorRGBA(0.15f, 0.15f, 0.15f, 1.0f), IGraphics::CORNER_ALL, 1.0f);
@ -2424,47 +2325,43 @@ ColorHSLA CMenus::RenderHSLScrollbars(CUIRect *pRect, unsigned int *pColor, bool
CUIRect Rail; CUIRect Rail;
Button.Margin(2.0f, &Rail); Button.Margin(2.0f, &Rail);
str_format(aBuf, sizeof(aBuf), "%s: %03d", apLabels[i], (int)(*apComponent[i] * 255)); char aBuf[32];
str_format(aBuf, sizeof(aBuf), "%s: %03d", apLabels[i], round_to_int(Color[i] * 255.0f));
Ui()->DoLabel(&Label, aBuf, 14.0f, TEXTALIGN_ML); Ui()->DoLabel(&Label, aBuf, 14.0f, TEXTALIGN_ML);
ColorHSLA CurColorPureHSLA(RenderColorHSLA.r, 1, 0.5f, 1); ColorRGBA HandleColor;
ColorRGBA CurColorPure = color_cast<ColorRGBA>(CurColorPureHSLA); Graphics()->TextureClear();
ColorRGBA ColorInner(1, 1, 1, 0.25f); Graphics()->TrianglesBegin();
if(i == 0) if(i == 0)
{ {
ColorInner = CurColorPure; RenderHueRect(&Rail);
RenderHSLColorsRect(&Rail); HandleColor = color_cast<ColorRGBA>(ColorHSLA(Color.h, 1.0f, 0.5f, 1.0f));
} }
else if(i == 1) else if(i == 1)
{ {
RenderHSLSatRect(&Rail, CurColorPure); RenderSaturationRect(&Rail, color_cast<ColorRGBA>(ColorHSLA(Color.h, 1.0f, 0.5f, 1.0f)));
ColorInner = color_cast<ColorRGBA>(ColorHSLA(CurColorPureHSLA.r, *apComponent[1], CurColorPureHSLA.b, 1)); HandleColor = color_cast<ColorRGBA>(ColorHSLA(Color.h, Color.s, 0.5f, 1.0f));
} }
else if(i == 2) else if(i == 2)
{ {
ColorRGBA CurColorSat = color_cast<ColorRGBA>(ColorHSLA(CurColorPureHSLA.r, *apComponent[1], 0.5f, 1)); RenderLightingRect(&Rail, color_cast<ColorRGBA>(ColorHSLA(Color.h, Color.s, 0.5f, 1.0f)));
RenderHSLLightRect(&Rail, CurColorSat); HandleColor = color_cast<ColorRGBA>(ColorHSLA(Color.h, Color.s, Color.l, 1.0f).UnclampLighting(DarkestLight));
float LightVal = *apComponent[2];
if(ClampedLight)
LightVal = ColorHSLA::DARKEST_LGT + LightVal * (1.0f - ColorHSLA::DARKEST_LGT);
ColorInner = color_cast<ColorRGBA>(ColorHSLA(CurColorPureHSLA.r, *apComponent[1], LightVal, 1));
} }
else if(i == 3) else if(i == 3)
{ {
ColorRGBA CurColorFull = color_cast<ColorRGBA>(ColorHSLA(CurColorPureHSLA.r, *apComponent[1], *apComponent[2], 1)); RenderAlphaRect(&Rail, color_cast<ColorRGBA>(ColorHSLA(Color.h, Color.s, Color.l, 1.0f).UnclampLighting(DarkestLight)));
RenderHSLAlphaRect(&Rail, CurColorFull); HandleColor = color_cast<ColorRGBA>(Color.UnclampLighting(DarkestLight));
float LightVal = *apComponent[2];
if(ClampedLight)
LightVal = ColorHSLA::DARKEST_LGT + LightVal * (1.0f - ColorHSLA::DARKEST_LGT);
ColorInner = color_cast<ColorRGBA>(ColorHSLA(CurColorPureHSLA.r, *apComponent[1], LightVal, *apComponent[3]));
} }
Graphics()->TrianglesEnd();
*apComponent[i] = Ui()->DoScrollbarH(&((char *)pColor)[i], &Button, *apComponent[i], &ColorInner); Color[i] = Ui()->DoScrollbarH(&((char *)pColor)[i], &Button, Color[i], &HandleColor);
} }
*pColor = Color.Pack(Alpha); if(OriginalColor != Color)
return Color; {
*pColor = Color.Pack(Alpha);
}
return PrevPackedColor != *pColor;
} }
enum enum

View file

@ -312,7 +312,7 @@ void CMenus::RenderSettingsTeeBasic7(CUIRect MainView)
void CMenus::RenderSettingsTeeCustom7(CUIRect MainView) void CMenus::RenderSettingsTeeCustom7(CUIRect MainView)
{ {
CUIRect Label, Patterns, Button, Left, Right, Picker, Palette; CUIRect Label, Patterns, Button, Left, Right;
// render skin preview background // render skin preview background
float SpacingH = 2.0f; float SpacingH = 2.0f;
@ -344,33 +344,31 @@ void CMenus::RenderSettingsTeeCustom7(CUIRect MainView)
MainView.HSplitTop(SpacingH, 0, &MainView); MainView.HSplitTop(SpacingH, 0, &MainView);
MainView.VSplitMid(&Left, &Right, SpacingW); MainView.VSplitMid(&Left, &Right, SpacingW);
Right.Margin(5.0f, &Right);
// part selection
RenderSkinPartSelection7(Left); RenderSkinPartSelection7(Left);
// use custom color checkbox CUIRect CustomColorsButton;
Right.HSplitTop(ButtonHeight, &Button, &Right); Right.HSplitTop(20.0f, &CustomColorsButton, &Right);
Right.HSplitBottom(45.0f, &Picker, &Palette);
static CButtonContainer s_ColorPicker; int *pUseCustomColor = CSkins7::ms_apUCCVariables[(int)m_Dummy][m_TeePartSelected];
DoLine_ColorPicker( if(DoButton_CheckBox(pUseCustomColor, Localize("Custom colors"), *pUseCustomColor, &CustomColorsButton))
&s_ColorPicker,
25.0f, // LineSize
13.0f, // LabelSize
5.0f, // BottomMargin
&Right,
Localize("Custom colors"),
CSkins7::ms_apColorVariables[(int)m_Dummy][m_TeePartSelected],
ColorRGBA(1.0f, 1.0f, 0.5f), // DefaultColor
true, // CheckBoxSpacing
CSkins7::ms_apUCCVariables[(int)m_Dummy][m_TeePartSelected], // CheckBoxValue
m_TeePartSelected == protocol7::SKINPART_MARKING); // use alpha
static int s_OldColor = *CSkins7::ms_apColorVariables[(int)m_Dummy][m_TeePartSelected];
int NewColor = *CSkins7::ms_apColorVariables[(int)m_Dummy][m_TeePartSelected];
if(s_OldColor != NewColor)
{ {
s_OldColor = NewColor; *pUseCustomColor = !*pUseCustomColor;
SetNeedSendInfo(); SetNeedSendInfo();
} }
if(*pUseCustomColor)
{
CUIRect CustomColors;
Right.HSplitTop(5.0f, nullptr, &Right);
Right.HSplitTop(95.0f, &CustomColors, &Right);
if(RenderHslaScrollbars(&CustomColors, CSkins7::ms_apColorVariables[(int)m_Dummy][m_TeePartSelected], m_TeePartSelected == protocol7::SKINPART_MARKING, CSkins7::DARKEST_COLOR_LGT))
{
SetNeedSendInfo();
}
}
} }
void CMenus::RenderSkinSelection7(CUIRect MainView) void CMenus::RenderSkinSelection7(CUIRect MainView)

View file

@ -476,11 +476,7 @@ void CSkins7::RandomizeSkin(int Dummy)
ColorRGBA CSkins7::GetColor(int Value, bool UseAlpha) const ColorRGBA CSkins7::GetColor(int Value, bool UseAlpha) const
{ {
float Dark = DARKEST_COLOR_LGT / 255.0f; return color_cast<ColorRGBA>(ColorHSLA(Value, UseAlpha).UnclampLighting(DARKEST_COLOR_LGT));
ColorRGBA Color = color_cast<ColorRGBA>(ColorHSLA(Value).UnclampLighting(Dark));
float Alpha = UseAlpha ? ((Value >> 24) & 0xff) / 255.0f : 1.0f;
Color.a = Alpha;
return Color;
} }
ColorRGBA CSkins7::GetTeamColor(int UseCustomColors, int PartColor, int Team, int Part) const ColorRGBA CSkins7::GetTeamColor(int UseCustomColors, int PartColor, int Team, int Part) const

View file

@ -20,14 +20,14 @@ public:
SKINFLAG_SPECIAL = 1 << 0, SKINFLAG_SPECIAL = 1 << 0,
SKINFLAG_STANDARD = 1 << 1, SKINFLAG_STANDARD = 1 << 1,
DARKEST_COLOR_LGT = 61,
NUM_COLOR_COMPONENTS = 4, NUM_COLOR_COMPONENTS = 4,
HAT_NUM = 2, HAT_NUM = 2,
HAT_OFFSET_SIDE = 2, HAT_OFFSET_SIDE = 2,
}; };
static constexpr float DARKEST_COLOR_LGT = 61.0f / 255.0f;
struct CSkinPart struct CSkinPart
{ {
int m_Flags; int m_Flags;

View file

@ -1381,19 +1381,20 @@ float CUi::DoScrollbarH(const void *pId, const CUIRect *pRect, float Current, co
} }
// render // render
const ColorRGBA HandleColor = ms_ScrollBarColorFunction.GetColor(CheckActiveItem(pId), HotItem() == pId);
if(pColorInner) if(pColorInner)
{ {
CUIRect Slider; CUIRect Slider;
Handle.VMargin(-2.0f, &Slider); Handle.VMargin(-2.0f, &Slider);
Slider.HMargin(-3.0f, &Slider); Slider.HMargin(-3.0f, &Slider);
Slider.Draw(ColorRGBA(0.15f, 0.15f, 0.15f, 1.0f), IGraphics::CORNER_ALL, 5.0f); Slider.Draw(ColorRGBA(0.15f, 0.15f, 0.15f, 1.0f).Multiply(HandleColor), IGraphics::CORNER_ALL, 5.0f);
Slider.Margin(2.0f, &Slider); Slider.Margin(2.0f, &Slider);
Slider.Draw(*pColorInner, IGraphics::CORNER_ALL, 3.0f); Slider.Draw(pColorInner->Multiply(HandleColor), IGraphics::CORNER_ALL, 3.0f);
} }
else else
{ {
Rail.Draw(ColorRGBA(1.0f, 1.0f, 1.0f, 0.25f), IGraphics::CORNER_ALL, Rail.h / 2.0f); Rail.Draw(ColorRGBA(1.0f, 1.0f, 1.0f, 0.25f), IGraphics::CORNER_ALL, Rail.h / 2.0f);
Handle.Draw(ms_ScrollBarColorFunction.GetColor(CheckActiveItem(pId), HotItem() == pId), IGraphics::CORNER_ALL, Handle.h / 2.0f); Handle.Draw(HandleColor, IGraphics::CORNER_ALL, Handle.h / 2.0f);
} }
return ReturnValue; return ReturnValue;