update before refactoring all the code (again)
This commit is contained in:
parent
6e3dde1cad
commit
f89a0094cf
Binary file not shown.
Binary file not shown.
@ -1 +1 @@
|
||||
Subproject commit c2b7544979b16e1f27f419475b866a2903bd9c0a
|
||||
Subproject commit 3390ee9742fbce758941a0dd216ebec5c75876e5
|
||||
210
src/editor/ui.d
210
src/editor/ui.d
@ -332,6 +332,20 @@ struct UICtx
|
||||
debug u64 item_count;
|
||||
}
|
||||
|
||||
struct ItemStyle
|
||||
{
|
||||
Vec4 bg_col;
|
||||
Vec4 bg_hl_col;
|
||||
Vec4 border_col;
|
||||
Vec4 border_hl_col;
|
||||
Vec4 text_col;
|
||||
Vec4 text_hl_col;
|
||||
Vec2[2] padding;
|
||||
Vec4 corner_radius;
|
||||
f32 border_thickness;
|
||||
f32 edge_softness;
|
||||
}
|
||||
|
||||
enum UIElement
|
||||
{
|
||||
Default,
|
||||
@ -353,20 +367,31 @@ enum UIElement
|
||||
StatusMessage,
|
||||
Max,
|
||||
}
|
||||
|
||||
alias UIElem = UIElement;
|
||||
|
||||
struct ItemStyle
|
||||
enum Element
|
||||
{
|
||||
Vec4 bg_col;
|
||||
Vec4 bg_col_end;
|
||||
Vec4 bg_hl_col;
|
||||
Vec4 border_col;
|
||||
Vec4 border_hl_col;
|
||||
Vec4 text_col;
|
||||
Vec4 text_hl_col;
|
||||
Vec2[2] padding;
|
||||
Panel,
|
||||
PanelFocus,
|
||||
Window,
|
||||
WindowFocus,
|
||||
Border,
|
||||
BorderFocus,
|
||||
Text,
|
||||
Button,
|
||||
ButtonAlt, // Alternating option colours
|
||||
ButtonFocus,
|
||||
Max,
|
||||
} alias Elem = Element;
|
||||
|
||||
struct UIStyle
|
||||
{
|
||||
enum N = Elem.max;
|
||||
|
||||
Vec4[N] cols;
|
||||
Vec4 corner_radius;
|
||||
Vec2[2] text_box_padding;
|
||||
Vec2[2] button_padding;
|
||||
f32 border_thickness;
|
||||
f32 edge_softness;
|
||||
}
|
||||
@ -376,7 +401,6 @@ DefaultItemStyle()
|
||||
{
|
||||
ItemStyle style = {
|
||||
bg_col: BG_COL,
|
||||
bg_col_end: BG_COL,
|
||||
bg_hl_col: BG_HL_COL,
|
||||
border_col: BORDER_COL,
|
||||
border_hl_col: BORDER_HL_COL,
|
||||
@ -480,6 +504,8 @@ enum SizeType
|
||||
Percentage,
|
||||
ChildrenSum,
|
||||
TextSize,
|
||||
Pct = ST.Percentage,
|
||||
Px = ST.Pixels,
|
||||
}
|
||||
|
||||
alias ST = SizeType;
|
||||
@ -488,7 +514,6 @@ struct UISize
|
||||
{
|
||||
SizeType type;
|
||||
f32 value;
|
||||
f32 strictness = 1.0;
|
||||
}
|
||||
|
||||
struct UIBuffer
|
||||
@ -510,7 +535,6 @@ struct VPos
|
||||
struct Vertex
|
||||
{
|
||||
Vec4 cols;
|
||||
Vec4 cols_end;
|
||||
Vec4 corner_radius;
|
||||
union
|
||||
{
|
||||
@ -537,18 +561,17 @@ enum SettingType
|
||||
Toggle,
|
||||
}
|
||||
|
||||
Attribute[11] attributes = [
|
||||
{ binding: 0, location: 0, format: FMT.RGBA_F32, offset: Vertex.cols.offsetof },
|
||||
{ binding: 0, location: 1, format: FMT.RGBA_F32, offset: Vertex.cols_end.offsetof },
|
||||
{ binding: 0, location: 2, format: FMT.RGBA_F32, offset: Vertex.corner_radius.offsetof },
|
||||
{ binding: 0, location: 3, format: FMT.RG_F32, offset: Vertex.dst_start.offsetof },
|
||||
{ binding: 0, location: 4, format: FMT.RG_F32, offset: Vertex.dst_end.offsetof },
|
||||
{ binding: 0, location: 5, format: FMT.RG_F32, offset: Vertex.src_start.offsetof },
|
||||
{ binding: 0, location: 6, format: FMT.RG_F32, offset: Vertex.src_end.offsetof },
|
||||
{ binding: 0, location: 7, format: FMT.R_F32, offset: Vertex.border_thickness.offsetof },
|
||||
{ binding: 0, location: 8, format: FMT.R_F32, offset: Vertex.edge_softness.offsetof },
|
||||
{ binding: 0, location: 9, format: FMT.R_F32, offset: Vertex.raised.offsetof },
|
||||
{ binding: 0, location: 10, format: FMT.R_U32, offset: Vertex.has_texture.offsetof },
|
||||
Attribute[10] attributes = [
|
||||
{ binding: 0, location: 0, format: FMT.RGBA_F32, offset: Vertex.cols.offsetof },
|
||||
{ binding: 0, location: 1, format: FMT.RGBA_F32, offset: Vertex.corner_radius.offsetof },
|
||||
{ binding: 0, location: 2, format: FMT.RG_F32, offset: Vertex.dst_start.offsetof },
|
||||
{ binding: 0, location: 3, format: FMT.RG_F32, offset: Vertex.dst_end.offsetof },
|
||||
{ binding: 0, location: 4, format: FMT.RG_F32, offset: Vertex.src_start.offsetof },
|
||||
{ binding: 0, location: 5, format: FMT.RG_F32, offset: Vertex.src_end.offsetof },
|
||||
{ binding: 0, location: 6, format: FMT.R_F32, offset: Vertex.border_thickness.offsetof },
|
||||
{ binding: 0, location: 7, format: FMT.R_F32, offset: Vertex.edge_softness.offsetof },
|
||||
{ binding: 0, location: 8, format: FMT.R_F32, offset: Vertex.raised.offsetof },
|
||||
{ binding: 0, location: 9, format: FMT.R_U32, offset: Vertex.has_texture.offsetof },
|
||||
];
|
||||
|
||||
union Rect
|
||||
@ -568,7 +591,103 @@ struct UIKey
|
||||
}
|
||||
|
||||
enum bool KeyType(T) = (StringType!(T) || is(T == UIKey) || is(T == const(UIKey)));
|
||||
enum bool ItemAndKeyType(T) = (KeyType!(T) || is(T == UIItem*));
|
||||
enum bool ItemAndKeyType(T) = (KeyType!(T) || is(T == UIItem*));
|
||||
|
||||
// ******
|
||||
// Public
|
||||
// ******
|
||||
|
||||
void
|
||||
BeginContainer(ST x_t = ST.Pct, ST y_t = ST.Pct)(Axis2D axis, f32 w, f32 h)
|
||||
{
|
||||
PushSizeInfo(UIS2(x_t, y_t, w, h));
|
||||
PushAxisLayout(axis);
|
||||
UIItem* item = MakeItem(ZeroKey());
|
||||
PushParent(item);
|
||||
}
|
||||
|
||||
alias EndContainer = Pop!("parent");
|
||||
|
||||
enum WindowFlags
|
||||
{
|
||||
None = 0<<0,
|
||||
NoBorder = 1<<0,
|
||||
NoBackground = 1<<1,
|
||||
NoDropShadow = 1<<2,
|
||||
Draggable = 1<<3,
|
||||
NoTitleBar = 1<<4,
|
||||
} alias WinF = WindowFlags;
|
||||
|
||||
UIFlags
|
||||
GetFlags(WinF flags)()
|
||||
{
|
||||
UIFlags flags = UIF.DrawBackground|UIF.DrawBorder|UIF.DrawDropShadow|UIF.AnimateReady|UIF.Window;
|
||||
static if(flags & WinF.NoBorder)
|
||||
{
|
||||
flags &= ~UIF.DrawBorder;
|
||||
}
|
||||
static if(flags & WinF.NoBackground)
|
||||
{
|
||||
flags &= ~UIF.DrawBackground;
|
||||
}
|
||||
static if(flags & WinF.NoDropShadow)
|
||||
{
|
||||
flags &= ~UIF.DrawDropShadow;
|
||||
}
|
||||
static if(flags & WinF.Draggable)
|
||||
{
|
||||
flags &= ~UIF.Window;
|
||||
flags |= UIF.FloatingWindow;
|
||||
}
|
||||
|
||||
return flags;
|
||||
}
|
||||
|
||||
// Converts to parameters (string label, Args args, Axis2D axis, f32 x, f32 y, f32 w, f32 h)
|
||||
void
|
||||
BeginWindow(WinF flags = WinF.None, ST x_t = ST.Px, ST x_y = ST.Px, Args...)(string label, Args args)
|
||||
{
|
||||
enum len = Args.length;
|
||||
|
||||
static assert(is(typeof(Args[len-1]) == f32));
|
||||
static assert(is(typeof(Args[len-2]) == f32));
|
||||
static assert(is(typeof(Args[len-3]) == f32));
|
||||
static assert(is(typeof(Args[len-4]) == f32));
|
||||
static assert(is(typeof(Args[len-5]) == Axis2D));
|
||||
|
||||
string scratch = Scratchf!(Args[0 .. len-5])(label, args[0 .. len-5]);
|
||||
|
||||
BeginWindow!(flags, x_t, x_y)(scratch, args[len-5], args[len-4], args[len-3], args[len-2], args[len-1]);
|
||||
}
|
||||
|
||||
void
|
||||
BeginWindow(WinF flags = WinF.None, ST x_t = ST.Px, ST x_y = ST.Px)(string label, Axis2D axis, f32 x, f32 y, f32 w, f32 h)
|
||||
{
|
||||
PushFixedPos(Vec2(x, y));
|
||||
PushSizeInfo(UIS2(x_t, y_t, w, h));
|
||||
PushAxisLayout(axis);
|
||||
UIFlags flags = GetFlags!(flags);
|
||||
|
||||
static assert((flags & WinF.Draggable) == 0 || (flags & ~WinF.NoTitleBar) == flags, "Unable to use NoTitleBar flag with the Draggable flag");
|
||||
|
||||
UIItem* window = MakeItem("###window_%s", label, flags);
|
||||
|
||||
static if(flags & WinF.Draggable)
|
||||
{
|
||||
//UIItem* header
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
EndWindow()
|
||||
{
|
||||
UIItem* window = Pop!("parent");
|
||||
|
||||
}
|
||||
|
||||
// ********
|
||||
// Internal
|
||||
// ********
|
||||
|
||||
void
|
||||
InitUICtx(PlatformWindow* window)
|
||||
@ -1382,6 +1501,8 @@ EndUI()
|
||||
|
||||
BeginRendering(&ctx.rd);
|
||||
|
||||
SetStencilTest(&ctx.rd, false);
|
||||
|
||||
Vec2 ext = GetExtent();
|
||||
if(ext != ctx.res)
|
||||
{
|
||||
@ -1521,22 +1642,6 @@ EndUI()
|
||||
if(children_size > size)
|
||||
{
|
||||
f32 excess = children_size - size;
|
||||
for(UIItem* c = item.last; !Nil(c); c = c.prev)
|
||||
{
|
||||
if(c.flags & (UIF.FixedPosition | (UIF.OverflowX<<axis)))
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
f32 leniency = c.size.v[axis] - c.size.v[axis]*c.size_info[axis].strictness;
|
||||
f32 reduced = Min(excess, leniency);
|
||||
|
||||
excess -= reduced;
|
||||
c.size.v[axis] -= reduced;
|
||||
|
||||
if(excess <= 0.0009) break;
|
||||
}
|
||||
|
||||
if(excess > 0.0009)
|
||||
{
|
||||
for(UIItem* c = item.last; !Nil(c); c = c.prev)
|
||||
@ -1816,7 +1921,6 @@ RenderItem(UICtx* ctx, UIItem* item)
|
||||
v.dst_start = border_p0 - Vec2(px);
|
||||
v.dst_end = border_p1 + Vec2(px);
|
||||
v.cols = Vec4(0.0, 0.0, 0.0, alpha);
|
||||
v.cols_end = Vec4(0.0, 0.0, 0.0, alpha);
|
||||
v.corner_radius = 0.8f;
|
||||
v.edge_softness = 8.0f;
|
||||
|
||||
@ -1826,15 +1930,13 @@ RenderItem(UICtx* ctx, UIItem* item)
|
||||
if(item.flags & UIF.DrawBackground)
|
||||
{
|
||||
Vec4 bg_col = style.bg_col;
|
||||
Vec4 bg_col_end = style.bg_col_end;
|
||||
AnimateHot(item, BG_HL_COL, &bg_col, &bg_col_end);
|
||||
AnimateReady(item, &bg_col, &bg_col_end);
|
||||
AnimateHot(item, BG_HL_COL, &bg_col);
|
||||
AnimateReady(item, &bg_col);
|
||||
|
||||
Vertex* v = GetVertex(ctx);
|
||||
v.dst_start = item.rect.p0;
|
||||
v.dst_end = item.rect.p1;
|
||||
v.cols = bg_col;
|
||||
v.cols_end = item.flags & UIF.Gradient ? bg_col_end : bg_col;
|
||||
v.corner_radius = item.flags & UIF.DrawBorder ? style.corner_radius*0.5 : style.corner_radius;
|
||||
v.edge_softness = style.edge_softness;
|
||||
|
||||
@ -1851,7 +1953,6 @@ RenderItem(UICtx* ctx, UIItem* item)
|
||||
v.dst_start = border_p0;
|
||||
v.dst_end = border_p1;
|
||||
v.cols = style.border_col;
|
||||
v.cols_end = style.border_col;
|
||||
v.corner_radius = style.corner_radius;
|
||||
v.border_thickness = style.border_thickness;
|
||||
v.edge_softness = style.edge_softness;
|
||||
@ -2509,7 +2610,6 @@ DrawGlyph(UIItem* item, Glyph* glyph, f32* x_pos, f32 y, f32 line_height, Vec4 c
|
||||
v.dst_start = Vec2(*x_pos+glyph.plane_left, y_pos);
|
||||
v.dst_end = Vec2(*x_pos+glyph.plane_left+w, y_pos+h);
|
||||
v.cols = col;
|
||||
v.cols_end = col;
|
||||
v.src_start = Vec2(glyph.atlas_left, glyph.atlas_top);
|
||||
v.src_end = Vec2(glyph.atlas_right, glyph.atlas_bottom);
|
||||
v.has_texture = true;
|
||||
@ -2579,21 +2679,21 @@ GetVertex(UICtx* ctx)
|
||||
}
|
||||
|
||||
static UISize[2]
|
||||
UIS2(SizeType t0 = ST.Percentage, SizeType t1 = ST.Percentage, f32 v0 = 1.0, f32 v1 = 1.0, f32 s0 = 1.0, f32 s1 = 1.0)
|
||||
UIS2(SizeType t0 = ST.Percentage, SizeType t1 = ST.Percentage, f32 v0 = 1.0, f32 v1 = 1.0)
|
||||
{
|
||||
return [UISize(t0, v0, s0), UISize(t1, v1, s1)];
|
||||
return [UISize(t0, v0), UISize(t1, v1)];
|
||||
}
|
||||
|
||||
static UISize[2]
|
||||
UISX(SizeType type, f32 value = 1.0, f32 strictness = 1.0)
|
||||
UISX(SizeType type, f32 value = 1.0)
|
||||
{
|
||||
return [UISize(type, value, strictness), UISize(ST.Percentage, 1.0)];
|
||||
return [UISize(type, value), UISize(ST.Percentage, 1.0)];
|
||||
}
|
||||
|
||||
static UISize[2]
|
||||
UISY(SizeType type, f32 value = 1.0, f32 strictness = 1.0)
|
||||
UISY(SizeType type, f32 value = 1.0)
|
||||
{
|
||||
return [UISize(ST.Percentage, 1.0), UISize(type, value, strictness)];
|
||||
return [UISize(ST.Percentage, 1.0), UISize(type, value)];
|
||||
}
|
||||
|
||||
bool
|
||||
|
||||
@ -29,7 +29,6 @@ layout (location = 0) FragDataFlat
|
||||
layout (location = 1) FragData
|
||||
{
|
||||
vec4 color;
|
||||
vec4 color_end;
|
||||
vec2 uv;
|
||||
vec2 dst_pos;
|
||||
vec2 dst_center;
|
||||
|
||||
@ -6,17 +6,16 @@
|
||||
|
||||
#include "gui.layout"
|
||||
|
||||
layout (location = 0) in vec4 in_col_start;
|
||||
layout (location = 1) in vec4 in_col_end;
|
||||
layout (location = 2) in vec4 in_corner_radius;
|
||||
layout (location = 3) in vec2 in_dst_start;
|
||||
layout (location = 4) in vec2 in_dst_end;
|
||||
layout (location = 5) in vec2 in_src_start;
|
||||
layout (location = 6) in vec2 in_src_end;
|
||||
layout (location = 7) in float border_thickness;
|
||||
layout (location = 8) in float edge_softness;
|
||||
layout (location = 9) in float raised;
|
||||
layout (location = 10) in uint has_texture;
|
||||
layout (location = 0) in vec4 in_col;
|
||||
layout (location = 1) in vec4 in_corner_radius;
|
||||
layout (location = 2) in vec2 in_dst_start;
|
||||
layout (location = 3) in vec2 in_dst_end;
|
||||
layout (location = 4) in vec2 in_src_start;
|
||||
layout (location = 5) in vec2 in_src_end;
|
||||
layout (location = 6) in float border_thickness;
|
||||
layout (location = 7) in float edge_softness;
|
||||
layout (location = 8) in float raised;
|
||||
layout (location = 9) in uint has_texture;
|
||||
|
||||
vec2 Vertices[4] = vec2[4](
|
||||
vec2(-1.0, -1.0),
|
||||
@ -62,8 +61,7 @@ void main()
|
||||
vec2 dst_verts_pct = vec2(bool(gl_VertexIndex >> 1) ? 1.0f : 0.0f,
|
||||
bool(gl_VertexIndex & 1) ? 0.0f : 1.0f);
|
||||
|
||||
FD.color = in_col_start;
|
||||
FD.color_end = in_col_end;
|
||||
FD.color = in_col;
|
||||
FD.uv = uvs[gl_VertexIndex] / tex_size;
|
||||
FD.dst_pos = pos;
|
||||
FD.dst_center = center;
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user