mirror of
https://github.com/ddnet/ddnet.git
synced 2024-11-10 10:08:18 +00:00
Merge pull request #291 from cinaera/pr_editor_scale
HSV color picker for quad points
This commit is contained in:
commit
d4ccc4728b
167
src/base/color.h
Normal file
167
src/base/color.h
Normal file
|
@ -0,0 +1,167 @@
|
||||||
|
|
||||||
|
#ifndef BASE_COLOR_H
|
||||||
|
#define BASE_COLOR_H
|
||||||
|
|
||||||
|
#include "math.h"
|
||||||
|
#include "vmath.h"
|
||||||
|
|
||||||
|
/*
|
||||||
|
Title: Color handling
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
Function: HueToRgb
|
||||||
|
Converts Hue to RGB
|
||||||
|
*/
|
||||||
|
inline float HueToRgb(float v1, float v2, float h)
|
||||||
|
{
|
||||||
|
if(h < 0.0f) h += 1;
|
||||||
|
if(h > 1.0f) h -= 1;
|
||||||
|
if((6.0f * h) < 1.0f) return v1 + (v2 - v1) * 6.0f * h;
|
||||||
|
if((2.0f * h) < 1.0f) return v2;
|
||||||
|
if((3.0f * h) < 2.0f) return v1 + (v2 - v1) * ((2.0f/3.0f) - h) * 6.0f;
|
||||||
|
return v1;
|
||||||
|
}
|
||||||
|
|
||||||
|
inline float RgbToHue(vec3 rgb)
|
||||||
|
{
|
||||||
|
float h_min = min(min(rgb.r, rgb.g), rgb.b);
|
||||||
|
float h_max = max(max(rgb.r, rgb.g), rgb.b);
|
||||||
|
|
||||||
|
float hue = 0.0f;
|
||||||
|
|
||||||
|
if(h_max == rgb.r)
|
||||||
|
hue = (rgb.g-rgb.b) / (h_max-h_min);
|
||||||
|
else if(h_max == rgb.g)
|
||||||
|
hue = 2.0f + (rgb.b-rgb.r) / (h_max-h_min);
|
||||||
|
else
|
||||||
|
hue = 4.0f + (rgb.r-rgb.g) / (h_max-h_min);
|
||||||
|
|
||||||
|
hue /= 6.0f;
|
||||||
|
|
||||||
|
if(hue < 0.0f)
|
||||||
|
hue += 1.0f;
|
||||||
|
|
||||||
|
return hue;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
Function: HslToRgb
|
||||||
|
Converts HSL to RGB
|
||||||
|
*/
|
||||||
|
inline vec3 HslToRgb(vec3 HSL)
|
||||||
|
{
|
||||||
|
if(HSL.s == 0.0f)
|
||||||
|
return vec3(HSL.l, HSL.l, HSL.l);
|
||||||
|
else
|
||||||
|
{
|
||||||
|
float v2 = HSL.l < 0.5f ? HSL.l * (1.0f + HSL.s) : (HSL.l+HSL.s) - (HSL.s*HSL.l);
|
||||||
|
float v1 = 2.0f * HSL.l - v2;
|
||||||
|
|
||||||
|
return vec3(HueToRgb(v1, v2, HSL.h + (1.0f/3.0f)), HueToRgb(v1, v2, HSL.h), HueToRgb(v1, v2, HSL.h - (1.0f/3.0f)));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
inline vec3 HsvToRgb(vec3 hsv)
|
||||||
|
{
|
||||||
|
int h = int(hsv.x * 6.0f);
|
||||||
|
float f = hsv.x * 6.0f - h;
|
||||||
|
float p = hsv.z * (1.0f - hsv.y);
|
||||||
|
float q = hsv.z * (1.0f - hsv.y * f);
|
||||||
|
float t = hsv.z * (1.0f - hsv.y * (1.0f - f));
|
||||||
|
|
||||||
|
vec3 rgb = vec3(0.0f, 0.0f, 0.0f);
|
||||||
|
|
||||||
|
switch(h % 6)
|
||||||
|
{
|
||||||
|
case 0:
|
||||||
|
rgb.r = hsv.z;
|
||||||
|
rgb.g = t;
|
||||||
|
rgb.b = p;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 1:
|
||||||
|
rgb.r = q;
|
||||||
|
rgb.g = hsv.z;
|
||||||
|
rgb.b = p;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 2:
|
||||||
|
rgb.r = p;
|
||||||
|
rgb.g = hsv.z;
|
||||||
|
rgb.b = t;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 3:
|
||||||
|
rgb.r = p;
|
||||||
|
rgb.g = q;
|
||||||
|
rgb.b = hsv.z;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 4:
|
||||||
|
rgb.r = t;
|
||||||
|
rgb.g = p;
|
||||||
|
rgb.b = hsv.z;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 5:
|
||||||
|
rgb.r = hsv.z;
|
||||||
|
rgb.g = p;
|
||||||
|
rgb.b = q;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
return rgb;
|
||||||
|
}
|
||||||
|
|
||||||
|
inline vec3 RgbToHsv(vec3 rgb)
|
||||||
|
{
|
||||||
|
float h_min = min(min(rgb.r, rgb.g), rgb.b);
|
||||||
|
float h_max = max(max(rgb.r, rgb.g), rgb.b);
|
||||||
|
|
||||||
|
// hue
|
||||||
|
float hue = 0.0f;
|
||||||
|
|
||||||
|
if(h_max == h_min)
|
||||||
|
hue = 0.0f;
|
||||||
|
else if(h_max == rgb.r)
|
||||||
|
hue = (rgb.g-rgb.b) / (h_max-h_min);
|
||||||
|
else if(h_max == rgb.g)
|
||||||
|
hue = 2.0f + (rgb.b-rgb.r) / (h_max-h_min);
|
||||||
|
else
|
||||||
|
hue = 4.0f + (rgb.r-rgb.g) / (h_max-h_min);
|
||||||
|
|
||||||
|
hue /= 6.0f;
|
||||||
|
|
||||||
|
if(hue < 0.0f)
|
||||||
|
hue += 1.0f;
|
||||||
|
|
||||||
|
// saturation
|
||||||
|
float s = 0.0f;
|
||||||
|
if(h_max != 0.0f)
|
||||||
|
s = (h_max - h_min)/h_max;
|
||||||
|
|
||||||
|
// lightness
|
||||||
|
float l = h_max;
|
||||||
|
|
||||||
|
return vec3(hue, s, l);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
Function: HexToRgba
|
||||||
|
Converts Hex to Rgba
|
||||||
|
|
||||||
|
Remarks: Hex should be RGBA8
|
||||||
|
*/
|
||||||
|
inline vec4 HexToRgba(int hex)
|
||||||
|
{
|
||||||
|
vec4 c;
|
||||||
|
c.r = ((hex >> 24) & 0xFF) / 255.0f;
|
||||||
|
c.g = ((hex >> 16) & 0xFF) / 255.0f;
|
||||||
|
c.b = ((hex >> 8) & 0xFF) / 255.0f;
|
||||||
|
c.a = (hex & 0xFF) / 255.0f;
|
||||||
|
|
||||||
|
return c;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
|
@ -2128,6 +2128,7 @@ char str_uppercase(char c)
|
||||||
}
|
}
|
||||||
|
|
||||||
int str_toint(const char *str) { return atoi(str); }
|
int str_toint(const char *str) { return atoi(str); }
|
||||||
|
int str_toint_base(const char *str, int base) { return strtol(str, NULL, base); }
|
||||||
float str_tofloat(const char *str) { return atof(str); }
|
float str_tofloat(const char *str) { return atof(str); }
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -1226,6 +1226,7 @@ typedef struct
|
||||||
void net_stats(NETSTATS *stats);
|
void net_stats(NETSTATS *stats);
|
||||||
|
|
||||||
int str_toint(const char *str);
|
int str_toint(const char *str);
|
||||||
|
int str_toint_base(const char *str, int base);
|
||||||
float str_tofloat(const char *str);
|
float str_tofloat(const char *str);
|
||||||
int str_isspace(char c);
|
int str_isspace(char c);
|
||||||
char str_uppercase(char c);
|
char str_uppercase(char c);
|
||||||
|
|
|
@ -1,6 +1,7 @@
|
||||||
/* (c) Magnus Auvinen. See licence.txt in the root of the distribution for more information. */
|
/* (c) Magnus Auvinen. See licence.txt in the root of the distribution for more information. */
|
||||||
/* If you are missing that file, acquire a complete release at teeworlds.com. */
|
/* If you are missing that file, acquire a complete release at teeworlds.com. */
|
||||||
#include <base/system.h>
|
#include <base/system.h>
|
||||||
|
#include <base/math.h>
|
||||||
|
|
||||||
#include <engine/shared/config.h>
|
#include <engine/shared/config.h>
|
||||||
#include <engine/graphics.h>
|
#include <engine/graphics.h>
|
||||||
|
@ -437,6 +438,35 @@ int CUI::DoButtonLogic(const void *pID, const char *pText, int Checked, const CU
|
||||||
|
|
||||||
return ReturnValue;
|
return ReturnValue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int CUI::DoPickerLogic(const void *pID, const CUIRect *pRect, float *pX, float *pY)
|
||||||
|
{
|
||||||
|
int Inside = MouseInside(pRect);
|
||||||
|
|
||||||
|
if(ActiveItem() == pID)
|
||||||
|
{
|
||||||
|
if(!MouseButton(0))
|
||||||
|
SetActiveItem(0);
|
||||||
|
}
|
||||||
|
else if(HotItem() == pID)
|
||||||
|
{
|
||||||
|
if(MouseButton(0))
|
||||||
|
SetActiveItem(pID);
|
||||||
|
}
|
||||||
|
else if(Inside)
|
||||||
|
SetHotItem(pID);
|
||||||
|
|
||||||
|
if(!Inside || !MouseButton(0))
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
if(pX)
|
||||||
|
*pX = clamp(m_MouseX - pRect->x, 0.0f, pRect->w) / Scale();
|
||||||
|
if(pY)
|
||||||
|
*pY = clamp(m_MouseY - pRect->y, 0.0f, pRect->h) / Scale();
|
||||||
|
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
int CUI::DoButton(const void *id, const char *text, int checked, const CUIRect *r, ui_draw_button_func draw_func, const void *extra)
|
int CUI::DoButton(const void *id, const char *text, int checked, const CUIRect *r, ui_draw_button_func draw_func, const void *extra)
|
||||||
{
|
{
|
||||||
|
|
|
@ -91,6 +91,7 @@ public:
|
||||||
float Scale();
|
float Scale();
|
||||||
|
|
||||||
int DoButtonLogic(const void *pID, const char *pText /* TODO: Refactor: Remove */, int Checked, const CUIRect *pRect);
|
int DoButtonLogic(const void *pID, const char *pText /* TODO: Refactor: Remove */, int Checked, const CUIRect *pRect);
|
||||||
|
int DoPickerLogic(const void *pID, const CUIRect *pRect, float *pX, float *pY);
|
||||||
|
|
||||||
// TODO: Refactor: Remove this?
|
// TODO: Refactor: Remove this?
|
||||||
void DoLabel(const CUIRect *pRect, const char *pText, float Size, int Align, int MaxWidth = -1);
|
void DoLabel(const CUIRect *pRect, const char *pText, float Size, int Align, int MaxWidth = -1);
|
||||||
|
|
|
@ -2,6 +2,7 @@
|
||||||
/* If you are missing that file, acquire a complete release at teeworlds.com. */
|
/* If you are missing that file, acquire a complete release at teeworlds.com. */
|
||||||
#include <base/tl/array.h>
|
#include <base/tl/array.h>
|
||||||
#include <base/system.h>
|
#include <base/system.h>
|
||||||
|
#include <base/color.h>
|
||||||
#include <time.h>
|
#include <time.h>
|
||||||
|
|
||||||
#if defined(CONF_FAMILY_UNIX)
|
#if defined(CONF_FAMILY_UNIX)
|
||||||
|
@ -48,6 +49,11 @@ int CEditor::ms_SpeedupTexture;
|
||||||
int CEditor::ms_SwitchTexture;
|
int CEditor::ms_SwitchTexture;
|
||||||
int CEditor::ms_TuneTexture;
|
int CEditor::ms_TuneTexture;
|
||||||
|
|
||||||
|
vec3 CEditor::ms_PickerColor;
|
||||||
|
int CEditor::ms_SVPicker;
|
||||||
|
int CEditor::ms_HuePicker;
|
||||||
|
|
||||||
|
|
||||||
enum
|
enum
|
||||||
{
|
{
|
||||||
BUTTON_CONTEXT=1,
|
BUTTON_CONTEXT=1,
|
||||||
|
@ -633,6 +639,12 @@ int CEditor::DoButton_ButtonDec(const void *pID, const char *pText, int Checked,
|
||||||
return DoButton_Editor_Common(pID, pText, Checked, pRect, Flags, pToolTip);
|
return DoButton_Editor_Common(pID, pText, Checked, pRect, Flags, pToolTip);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int CEditor::DoButton_ColorPicker(const void *pID, const CUIRect *pRect, vec4 *pColor, const char *pToolTip)
|
||||||
|
{
|
||||||
|
RenderTools()->DrawUIRect(pRect, *pColor, 0, 0.0f);
|
||||||
|
return DoButton_Editor_Common(pID, 0x0, 0, pRect, 0, pToolTip);
|
||||||
|
}
|
||||||
|
|
||||||
void CEditor::RenderGrid(CLayerGroup *pGroup)
|
void CEditor::RenderGrid(CLayerGroup *pGroup)
|
||||||
{
|
{
|
||||||
if(!m_GridActive)
|
if(!m_GridActive)
|
||||||
|
@ -688,7 +700,7 @@ void CEditor::RenderBackground(CUIRect View, int Texture, float Size, float Brig
|
||||||
Graphics()->QuadsEnd();
|
Graphics()->QuadsEnd();
|
||||||
}
|
}
|
||||||
|
|
||||||
int CEditor::UiDoValueSelector(void *pID, CUIRect *pRect, const char *pLabel, int Current, int Min, int Max, int Step, float Scale, const char *pToolTip, bool isDegree)
|
int CEditor::UiDoValueSelector(void *pID, CUIRect *pRect, const char *pLabel, int Current, int Min, int Max, int Step, float Scale, const char *pToolTip, bool isDegree, bool isHex)
|
||||||
{
|
{
|
||||||
// logic
|
// logic
|
||||||
static float s_Value;
|
static float s_Value;
|
||||||
|
@ -701,7 +713,10 @@ int CEditor::UiDoValueSelector(void *pID, CUIRect *pRect, const char *pLabel, in
|
||||||
{
|
{
|
||||||
s_LastTextpID = pID;
|
s_LastTextpID = pID;
|
||||||
s_TextMode = true;
|
s_TextMode = true;
|
||||||
str_format(s_NumStr, sizeof(s_NumStr), "%d", Current);
|
if(isHex)
|
||||||
|
str_format(s_NumStr, sizeof(s_NumStr), "%06X", Current);
|
||||||
|
else
|
||||||
|
str_format(s_NumStr, sizeof(s_NumStr), "%d", Current);
|
||||||
}
|
}
|
||||||
|
|
||||||
if(UI()->ActiveItem() == pID)
|
if(UI()->ActiveItem() == pID)
|
||||||
|
@ -726,7 +741,10 @@ int CEditor::UiDoValueSelector(void *pID, CUIRect *pRect, const char *pLabel, in
|
||||||
if(Input()->KeyPressed(KEY_RETURN) || Input()->KeyPressed(KEY_KP_ENTER) ||
|
if(Input()->KeyPressed(KEY_RETURN) || Input()->KeyPressed(KEY_KP_ENTER) ||
|
||||||
((UI()->MouseButton(1) || UI()->MouseButton(0)) && !Inside))
|
((UI()->MouseButton(1) || UI()->MouseButton(0)) && !Inside))
|
||||||
{
|
{
|
||||||
Current = clamp(str_toint(s_NumStr), Min, Max);
|
if(isHex)
|
||||||
|
Current = clamp(str_toint_base(s_NumStr, 16), Min, Max);
|
||||||
|
else
|
||||||
|
Current = clamp(str_toint(s_NumStr), Min, Max);
|
||||||
m_LockMouse = false;
|
m_LockMouse = false;
|
||||||
UI()->SetActiveItem(0);
|
UI()->SetActiveItem(0);
|
||||||
s_TextMode = false;
|
s_TextMode = false;
|
||||||
|
@ -782,6 +800,8 @@ int CEditor::UiDoValueSelector(void *pID, CUIRect *pRect, const char *pLabel, in
|
||||||
str_format(aBuf, sizeof(aBuf),"%s %d", pLabel, Current);
|
str_format(aBuf, sizeof(aBuf),"%s %d", pLabel, Current);
|
||||||
else if(isDegree)
|
else if(isDegree)
|
||||||
str_format(aBuf, sizeof(aBuf),"%d°", Current);
|
str_format(aBuf, sizeof(aBuf),"%d°", Current);
|
||||||
|
else if(isHex)
|
||||||
|
str_format(aBuf, sizeof(aBuf),"0x%06X", Current);
|
||||||
else
|
else
|
||||||
str_format(aBuf, sizeof(aBuf),"%d", Current);
|
str_format(aBuf, sizeof(aBuf),"%d", Current);
|
||||||
RenderTools()->DrawUIRect(pRect, GetButtonColor(pID, 0), CUI::CORNER_ALL, 5.0f);
|
RenderTools()->DrawUIRect(pRect, GetButtonColor(pID, 0), CUI::CORNER_ALL, 5.0f);
|
||||||
|
@ -2688,7 +2708,15 @@ int CEditor::DoProperties(CUIRect *pToolBox, CProperty *pProps, int *pIDs, int *
|
||||||
{
|
{
|
||||||
static const char *s_paTexts[4] = {"R", "G", "B", "A"};
|
static const char *s_paTexts[4] = {"R", "G", "B", "A"};
|
||||||
static int s_aShift[] = {24, 16, 8, 0};
|
static int s_aShift[] = {24, 16, 8, 0};
|
||||||
int NewColor = 0;
|
int NewColor = 0, NewPickerColor = 0;
|
||||||
|
|
||||||
|
// extra space
|
||||||
|
CUIRect ColorBox, ColorSlots;
|
||||||
|
|
||||||
|
pToolBox->HSplitTop(3.0f*13.0f, &Slot, pToolBox);
|
||||||
|
Slot.VSplitMid(&ColorBox, &ColorSlots);
|
||||||
|
ColorBox.HMargin(1.0f, &ColorBox);
|
||||||
|
ColorBox.VMargin(6.0f, &ColorBox);
|
||||||
|
|
||||||
for(int c = 0; c < 4; c++)
|
for(int c = 0; c < 4; c++)
|
||||||
{
|
{
|
||||||
|
@ -2697,17 +2725,50 @@ int CEditor::DoProperties(CUIRect *pToolBox, CProperty *pProps, int *pIDs, int *
|
||||||
|
|
||||||
if(c != 3)
|
if(c != 3)
|
||||||
{
|
{
|
||||||
pToolBox->HSplitTop(13.0f, &Slot, pToolBox);
|
ColorSlots.HSplitTop(13.0f, &Shifter, &ColorSlots);
|
||||||
Slot.VSplitMid(0, &Shifter);
|
|
||||||
Shifter.HMargin(1.0f, &Shifter);
|
Shifter.HMargin(1.0f, &Shifter);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// hex
|
||||||
|
pToolBox->HSplitTop(13.0f, &Slot, pToolBox);
|
||||||
|
Slot.VSplitMid(0x0, &Shifter);
|
||||||
|
Shifter.HMargin(1.0f, &Shifter);
|
||||||
|
|
||||||
|
int NewColorHex = pProps[i].m_Value&0xff;
|
||||||
|
NewColorHex |= UiDoValueSelector(((char *)&pIDs[i]+4), &Shifter, "", (pProps[i].m_Value >> 8)&0xFFFFFF, 0, 0xFFFFFF, 1, 1.0f, "Use left mouse button to drag and change the color value. Hold shift to be more precise. Rightclick to edit as text.", false, true) << 8;
|
||||||
|
|
||||||
|
// color picker
|
||||||
|
vec4 Color = vec4(
|
||||||
|
((pProps[i].m_Value >> s_aShift[0])&0xff)/255.0f,
|
||||||
|
((pProps[i].m_Value >> s_aShift[1])&0xff)/255.0f,
|
||||||
|
((pProps[i].m_Value >> s_aShift[2])&0xff)/255.0f,
|
||||||
|
1.0f);
|
||||||
|
|
||||||
|
static int s_ColorPicker, s_ColorPickerID;
|
||||||
|
if(DoButton_ColorPicker(&s_ColorPicker, &ColorBox, &Color))
|
||||||
|
{
|
||||||
|
ms_PickerColor = RgbToHsv(vec3(Color.r, Color.g, Color.b));
|
||||||
|
UiInvokePopupMenu(&s_ColorPickerID, 0, UI()->MouseX(), UI()->MouseY(), 180, 150, PopupColorPicker);
|
||||||
|
}
|
||||||
|
|
||||||
|
if(UI()->HotItem() == &ms_SVPicker || UI()->HotItem() == &ms_HuePicker)
|
||||||
|
{
|
||||||
|
vec3 c = HsvToRgb(ms_PickerColor);
|
||||||
|
NewColor = ((int)(c.r * 255.0f)&0xff) << 24 | ((int)(c.g * 255.0f)&0xff) << 16 | ((int)(c.b * 255.0f)&0xff) << 8 | (pProps[i].m_Value&0xff);
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
if(NewColor != pProps[i].m_Value)
|
if(NewColor != pProps[i].m_Value)
|
||||||
{
|
{
|
||||||
*pNewVal = NewColor;
|
*pNewVal = NewColor;
|
||||||
Change = i;
|
Change = i;
|
||||||
}
|
}
|
||||||
|
else if(NewColorHex != pProps[i].m_Value)
|
||||||
|
{
|
||||||
|
*pNewVal = NewColorHex;
|
||||||
|
Change = i;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else if(pProps[i].m_Type == PROPTYPE_IMAGE)
|
else if(pProps[i].m_Type == PROPTYPE_IMAGE)
|
||||||
{
|
{
|
||||||
|
@ -5240,6 +5301,8 @@ void CEditor::Init()
|
||||||
m_Map.m_Modified = false;
|
m_Map.m_Modified = false;
|
||||||
m_Map.m_UndoModified = 0;
|
m_Map.m_UndoModified = 0;
|
||||||
m_LastUndoUpdateTime = time_get();
|
m_LastUndoUpdateTime = time_get();
|
||||||
|
|
||||||
|
ms_PickerColor = vec3(1.0f, 0.0f, 0.0f);
|
||||||
}
|
}
|
||||||
|
|
||||||
void CEditor::DoMapBorder()
|
void CEditor::DoMapBorder()
|
||||||
|
|
|
@ -886,6 +886,8 @@ public:
|
||||||
int DoButton_Menu(const void *pID, const char *pText, int Checked, const CUIRect *pRect, int Flags, const char *pToolTip);
|
int DoButton_Menu(const void *pID, const char *pText, int Checked, const CUIRect *pRect, int Flags, const char *pToolTip);
|
||||||
int DoButton_MenuItem(const void *pID, const char *pText, int Checked, const CUIRect *pRect, int Flags=0, const char *pToolTip=0);
|
int DoButton_MenuItem(const void *pID, const char *pText, int Checked, const CUIRect *pRect, int Flags=0, const char *pToolTip=0);
|
||||||
|
|
||||||
|
int DoButton_ColorPicker(const void *pID, const CUIRect *pRect, vec4 *pColor, const char *pToolTip=0);
|
||||||
|
|
||||||
int DoEditBox(void *pID, const CUIRect *pRect, char *pStr, unsigned StrSize, float FontSize, float *Offset, bool Hidden=false, int Corners=CUI::CORNER_ALL);
|
int DoEditBox(void *pID, const CUIRect *pRect, char *pStr, unsigned StrSize, float FontSize, float *Offset, bool Hidden=false, int Corners=CUI::CORNER_ALL);
|
||||||
|
|
||||||
void RenderBackground(CUIRect View, int Texture, float Size, float Brightness);
|
void RenderBackground(CUIRect View, int Texture, float Size, float Brightness);
|
||||||
|
@ -895,7 +897,7 @@ public:
|
||||||
void UiInvokePopupMenu(void *pID, int Flags, float X, float Y, float W, float H, int (*pfnFunc)(CEditor *pEditor, CUIRect Rect), void *pExtra=0);
|
void UiInvokePopupMenu(void *pID, int Flags, float X, float Y, float W, float H, int (*pfnFunc)(CEditor *pEditor, CUIRect Rect), void *pExtra=0);
|
||||||
void UiDoPopupMenu();
|
void UiDoPopupMenu();
|
||||||
|
|
||||||
int UiDoValueSelector(void *pID, CUIRect *pRect, const char *pLabel, int Current, int Min, int Max, int Step, float Scale, const char *pToolTip, bool isDegree=false);
|
int UiDoValueSelector(void *pID, CUIRect *pRect, const char *pLabel, int Current, int Min, int Max, int Step, float Scale, const char *pToolTip, bool isDegree=false, bool isHex=false);
|
||||||
|
|
||||||
static int PopupGroup(CEditor *pEditor, CUIRect View);
|
static int PopupGroup(CEditor *pEditor, CUIRect View);
|
||||||
static int PopupLayer(CEditor *pEditor, CUIRect View);
|
static int PopupLayer(CEditor *pEditor, CUIRect View);
|
||||||
|
@ -912,6 +914,7 @@ public:
|
||||||
static int PopupSelectConfigAutoMap(CEditor *pEditor, CUIRect View);
|
static int PopupSelectConfigAutoMap(CEditor *pEditor, CUIRect View);
|
||||||
static int PopupSound(CEditor *pEditor, CUIRect View);
|
static int PopupSound(CEditor *pEditor, CUIRect View);
|
||||||
static int PopupSource(CEditor *pEditor, CUIRect View);
|
static int PopupSource(CEditor *pEditor, CUIRect View);
|
||||||
|
static int PopupColorPicker(CEditor *pEditor, CUIRect View);
|
||||||
|
|
||||||
static void CallbackOpenMap(const char *pFileName, int StorageType, void *pUser);
|
static void CallbackOpenMap(const char *pFileName, int StorageType, void *pUser);
|
||||||
static void CallbackAppendMap(const char *pFileName, int StorageType, void *pUser);
|
static void CallbackAppendMap(const char *pFileName, int StorageType, void *pUser);
|
||||||
|
@ -981,6 +984,10 @@ public:
|
||||||
int GetLineDistance();
|
int GetLineDistance();
|
||||||
void ZoomMouseTarget(float ZoomFactor);
|
void ZoomMouseTarget(float ZoomFactor);
|
||||||
|
|
||||||
|
static vec3 ms_PickerColor;
|
||||||
|
static int ms_SVPicker;
|
||||||
|
static int ms_HuePicker;
|
||||||
|
|
||||||
// DDRace
|
// DDRace
|
||||||
|
|
||||||
static int ms_FrontTexture;
|
static int ms_FrontTexture;
|
||||||
|
|
|
@ -1,6 +1,7 @@
|
||||||
/* (c) Magnus Auvinen. See licence.txt in the root of the distribution for more information. */
|
/* (c) Magnus Auvinen. See licence.txt in the root of the distribution for more information. */
|
||||||
/* If you are missing that file, acquire a complete release at teeworlds.com. */
|
/* If you are missing that file, acquire a complete release at teeworlds.com. */
|
||||||
|
|
||||||
|
#include <base/color.h>
|
||||||
#include <base/tl/array.h>
|
#include <base/tl/array.h>
|
||||||
|
|
||||||
#include <engine/console.h>
|
#include <engine/console.h>
|
||||||
|
@ -1514,3 +1515,105 @@ int CEditor::PopupTune(CEditor *pEditor, CUIRect View)
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int CEditor::PopupColorPicker(CEditor *pEditor, CUIRect View)
|
||||||
|
{
|
||||||
|
CUIRect SVPicker, HuePicker;
|
||||||
|
View.VSplitRight(20.0f, &SVPicker, &HuePicker);
|
||||||
|
HuePicker.VSplitLeft(4.0f, 0x0, &HuePicker);
|
||||||
|
|
||||||
|
pEditor->Graphics()->TextureSet(-1);
|
||||||
|
pEditor->Graphics()->QuadsBegin();
|
||||||
|
|
||||||
|
// base: white - hue
|
||||||
|
vec3 hsv = pEditor->ms_PickerColor;
|
||||||
|
IGraphics::CColorVertex ColorArray[4];
|
||||||
|
|
||||||
|
vec3 c = HsvToRgb(vec3(hsv.x, 0.0f, 1.0f));
|
||||||
|
ColorArray[0] = IGraphics::CColorVertex(0, c.r, c.g, c.b, 1.0f);
|
||||||
|
c = HsvToRgb(vec3(hsv.x, 1.0f, 1.0f));
|
||||||
|
ColorArray[1] = IGraphics::CColorVertex(1, c.r, c.g, c.b, 1.0f);
|
||||||
|
c = HsvToRgb(vec3(hsv.x, 1.0f, 1.0f));
|
||||||
|
ColorArray[2] = IGraphics::CColorVertex(2, c.r, c.g, c.b, 1.0f);
|
||||||
|
c = HsvToRgb(vec3(hsv.x, 0.0f, 1.0f));
|
||||||
|
ColorArray[3] = IGraphics::CColorVertex(3, c.r, c.g, c.b, 1.0f);
|
||||||
|
|
||||||
|
pEditor->Graphics()->SetColorVertex(ColorArray, 4);
|
||||||
|
|
||||||
|
IGraphics::CQuadItem QuadItem(SVPicker.x, SVPicker.y, SVPicker.w, SVPicker.h);
|
||||||
|
pEditor->Graphics()->QuadsDrawTL(&QuadItem, 1);
|
||||||
|
|
||||||
|
// base: transparent - black
|
||||||
|
ColorArray[0] = IGraphics::CColorVertex(0, 0.0f, 0.0f, 0.0f, 0.0f);
|
||||||
|
ColorArray[1] = IGraphics::CColorVertex(1, 0.0f, 0.0f, 0.0f, 0.0f);
|
||||||
|
ColorArray[2] = IGraphics::CColorVertex(2, 0.0f, 0.0f, 0.0f, 1.0f);
|
||||||
|
ColorArray[3] = IGraphics::CColorVertex(3, 0.0f, 0.0f, 0.0f, 1.0f);
|
||||||
|
|
||||||
|
pEditor->Graphics()->SetColorVertex(ColorArray, 4);
|
||||||
|
|
||||||
|
pEditor->Graphics()->QuadsDrawTL(&QuadItem, 1);
|
||||||
|
|
||||||
|
pEditor->Graphics()->QuadsEnd();
|
||||||
|
|
||||||
|
// marker
|
||||||
|
vec2 Marker = vec2(hsv.y*pEditor->UI()->Scale(), (1.0f - hsv.z)*pEditor->UI()->Scale()) * vec2(SVPicker.w, SVPicker.h);
|
||||||
|
pEditor->Graphics()->QuadsBegin();
|
||||||
|
pEditor->Graphics()->SetColor(0.5f, 0.5f, 0.5f, 1.0f);
|
||||||
|
IGraphics::CQuadItem aMarker[2];
|
||||||
|
aMarker[0] = IGraphics::CQuadItem(SVPicker.x+Marker.x, SVPicker.y+Marker.y - 5.0f*pEditor->UI()->PixelSize(), pEditor->UI()->PixelSize(), 11.0f*pEditor->UI()->PixelSize());
|
||||||
|
aMarker[1] = IGraphics::CQuadItem(SVPicker.x+Marker.x - 5.0f*pEditor->UI()->PixelSize(), SVPicker.y+Marker.y, 11.0f*pEditor->UI()->PixelSize(), pEditor->UI()->PixelSize());
|
||||||
|
pEditor->Graphics()->QuadsDrawTL(aMarker, 2);
|
||||||
|
pEditor->Graphics()->QuadsEnd();
|
||||||
|
|
||||||
|
// logic
|
||||||
|
float X, Y;
|
||||||
|
if(pEditor->UI()->DoPickerLogic(&pEditor->ms_SVPicker, &SVPicker, &X, &Y))
|
||||||
|
{
|
||||||
|
hsv.y = X/SVPicker.w;
|
||||||
|
hsv.z = 1.0f - Y/SVPicker.h;
|
||||||
|
}
|
||||||
|
|
||||||
|
// hue slider
|
||||||
|
static const float s_aColorIndices[7][3] = {
|
||||||
|
{1.0f, 0.0f, 0.0f}, // red
|
||||||
|
{1.0f, 0.0f, 1.0f}, // magenta
|
||||||
|
{0.0f, 0.0f, 1.0f}, // blue
|
||||||
|
{0.0f, 1.0f, 1.0f}, // cyan
|
||||||
|
{0.0f, 1.0f, 0.0f}, // green
|
||||||
|
{1.0f, 1.0f, 0.0f}, // yellow
|
||||||
|
{1.0f, 0.0f, 0.0f} // red
|
||||||
|
};
|
||||||
|
|
||||||
|
pEditor->Graphics()->QuadsBegin();
|
||||||
|
vec4 ColorTop, ColorBottom;
|
||||||
|
float Offset = HuePicker.h/6.0f;
|
||||||
|
for(int j = 0; j < 6; j++)
|
||||||
|
{
|
||||||
|
ColorTop = vec4(s_aColorIndices[j][0], s_aColorIndices[j][1], s_aColorIndices[j][2], 1.0f);
|
||||||
|
ColorBottom = vec4(s_aColorIndices[j+1][0], s_aColorIndices[j+1][1], s_aColorIndices[j+1][2], 1.0f);
|
||||||
|
|
||||||
|
ColorArray[0] = IGraphics::CColorVertex(0, ColorTop.r, ColorTop.g, ColorTop.b, ColorTop.a);
|
||||||
|
ColorArray[1] = IGraphics::CColorVertex(1, ColorTop.r, ColorTop.g, ColorTop.b, ColorTop.a);
|
||||||
|
ColorArray[2] = IGraphics::CColorVertex(2, ColorBottom.r, ColorBottom.g, ColorBottom.b, ColorBottom.a);
|
||||||
|
ColorArray[3] = IGraphics::CColorVertex(3, ColorBottom.r, ColorBottom.g, ColorBottom.b, ColorBottom.a);
|
||||||
|
pEditor->Graphics()->SetColorVertex(ColorArray, 4);
|
||||||
|
IGraphics::CQuadItem QuadItem(HuePicker.x, HuePicker.y+Offset*j, HuePicker.w, Offset);
|
||||||
|
pEditor->Graphics()->QuadsDrawTL(&QuadItem, 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
// marker
|
||||||
|
pEditor->Graphics()->SetColor(0.5f, 0.5f, 0.5f, 1.0f);
|
||||||
|
IGraphics::CQuadItem QuadItemMarker(HuePicker.x, HuePicker.y + (1.0f - hsv.x) * HuePicker.h * pEditor->UI()->Scale(), HuePicker.w, pEditor->UI()->PixelSize());
|
||||||
|
pEditor->Graphics()->QuadsDrawTL(&QuadItemMarker, 1);
|
||||||
|
|
||||||
|
pEditor->Graphics()->QuadsEnd();
|
||||||
|
|
||||||
|
if(pEditor->UI()->DoPickerLogic(&pEditor->ms_HuePicker, &HuePicker, &X, &Y))
|
||||||
|
{
|
||||||
|
hsv.x = 1.0f - Y/HuePicker.h;
|
||||||
|
}
|
||||||
|
|
||||||
|
pEditor->ms_PickerColor = hsv;
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
Loading…
Reference in a new issue