start on gui
This commit is contained in:
parent
2a36233670
commit
2da7af7431
Binary file not shown.
Binary file not shown.
1
dub.json
1
dub.json
@ -13,6 +13,7 @@
|
|||||||
"sourcePaths": ["src/editor", "src/dlib", "src/dlib/external/xxhash", "src/VulkanRenderer"],
|
"sourcePaths": ["src/editor", "src/dlib", "src/dlib/external/xxhash", "src/VulkanRenderer"],
|
||||||
"libs-linux": ["xcb", "X11", "X11-xcb", "vulkan", "stdc++", "xcb-xfixes", "freetype"],
|
"libs-linux": ["xcb", "X11", "X11-xcb", "vulkan", "stdc++", "xcb-xfixes", "freetype"],
|
||||||
"libs-windows": [],
|
"libs-windows": [],
|
||||||
|
"versions": ["VK_DEBUG_PRINTF"],
|
||||||
"preGenerateCommands-linux": ["./build.sh"],
|
"preGenerateCommands-linux": ["./build.sh"],
|
||||||
"preGenerateCommands-windows": [],
|
"preGenerateCommands-windows": [],
|
||||||
"dflags": ["-Xcc=-mno-sse", "-P-I/usr/include/freetype2", "-Jbuild"],
|
"dflags": ["-Xcc=-mno-sse", "-P-I/usr/include/freetype2", "-Jbuild"],
|
||||||
|
|||||||
@ -1 +1 @@
|
|||||||
Subproject commit f3b7536c8e4edea80d3b7ef3e4265e521a050c03
|
Subproject commit b0d96f26fe727d297c441ce989f3fec45095e3c3
|
||||||
2
src/dlib
2
src/dlib
@ -1 +1 @@
|
|||||||
Subproject commit 98701be20c223d1130a1f423c8ca3b520c9d4a95
|
Subproject commit f8d1707450d92bd147a3283527043c86312b3872
|
||||||
@ -41,20 +41,26 @@ struct Editor
|
|||||||
u8[] font_data;
|
u8[] font_data;
|
||||||
FontFace font;
|
FontFace font;
|
||||||
FontAtlasBuf atlas_buf;
|
FontAtlasBuf atlas_buf;
|
||||||
|
|
||||||
|
UVec2 res;
|
||||||
}
|
}
|
||||||
|
|
||||||
struct PushConst
|
struct PushConst
|
||||||
{
|
{
|
||||||
Vec2 res;
|
Mat4 projection;
|
||||||
}
|
}
|
||||||
|
|
||||||
struct Vertex
|
struct Vertex
|
||||||
{
|
{
|
||||||
|
Vec4 col;
|
||||||
Vec2 dst_start;
|
Vec2 dst_start;
|
||||||
Vec2 dst_end;
|
Vec2 dst_end;
|
||||||
Vec2 src_start;
|
Vec2 src_start;
|
||||||
Vec2 src_end;
|
Vec2 src_end;
|
||||||
Vec4 col;
|
f32 border_thickness;
|
||||||
|
f32 corner_radius;
|
||||||
|
f32 edge_softness;
|
||||||
|
f32 raised;
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
@ -68,11 +74,18 @@ Cycle(Editor* ed)
|
|||||||
f32 h = ed.atlas_buf.atlas.size;
|
f32 h = ed.atlas_buf.atlas.size;
|
||||||
DrawBuffer(ed, 0.0, 0.0, h, ed.active_buffer);
|
DrawBuffer(ed, 0.0, 0.0, h, ed.active_buffer);
|
||||||
|
|
||||||
|
//DrawRect(ed, 200.0, 200.0, 300.0, 300.0, 0.0, 0.0, 0.0, Vec4(0.2, 0.4, 0.8, 1.0));
|
||||||
|
//DrawRect(ed, 330.0, 330.0, 430.0, 430.0, 0.0, 0.0, 0.0, Vec4(0.2, 0.4, 0.8, 1.0));
|
||||||
|
DrawRect(ed, 450.0, 450.0, 550.0, 550.0, 0.0, 1.0, 0.0, Vec4(1.0));
|
||||||
|
|
||||||
BeginFrame(&ed.rd);
|
BeginFrame(&ed.rd);
|
||||||
|
|
||||||
UVec2 ext = UVec2(GetExtent(&ed.rd));
|
UVec2 ext = UVec2(GetExtent(&ed.rd));
|
||||||
ed.pc.res.x = cast(f32)ext.x;
|
if (ext != ed.res)
|
||||||
ed.pc.res.y = cast(f32)ext.y;
|
{
|
||||||
|
ed.res = ext;
|
||||||
|
Ortho(&ed.pc.projection, 0.0, 0.0, cast(f32)(ext.x), cast(f32)(ext.y), 1000.0, 0.1);
|
||||||
|
}
|
||||||
|
|
||||||
BeginRendering(&ed.rd);
|
BeginRendering(&ed.rd);
|
||||||
|
|
||||||
@ -169,12 +182,16 @@ CreateEditor(PlatformWindow* window, u8[] buffer_data, u8[] buffer_name)
|
|||||||
editor.desc_set = AllocDescSet(&editor.rd, editor.desc_set_layout);
|
editor.desc_set = AllocDescSet(&editor.rd, editor.desc_set_layout);
|
||||||
editor.pipeline_layout = CreatePipelineLayout(&editor.rd, editor.desc_set_layout, PushConst.sizeof);
|
editor.pipeline_layout = CreatePipelineLayout(&editor.rd, editor.desc_set_layout, PushConst.sizeof);
|
||||||
|
|
||||||
Attribute[5] attributes = [
|
Attribute[9] attributes = [
|
||||||
{ binding: 0, location: 0, format: FMT.RG_F32, offset: Vertex.dst_start.offsetof },
|
{ binding: 0, location: 0, format: FMT.RGBA_F32, offset: Vertex.col.offsetof },
|
||||||
{ binding: 0, location: 1, format: FMT.RG_F32, offset: Vertex.dst_end.offsetof },
|
{ binding: 0, location: 1, format: FMT.RG_F32, offset: Vertex.dst_start.offsetof },
|
||||||
{ binding: 0, location: 2, format: FMT.RG_F32, offset: Vertex.src_start.offsetof },
|
{ binding: 0, location: 2, format: FMT.RG_F32, offset: Vertex.dst_end.offsetof },
|
||||||
{ binding: 0, location: 3, format: FMT.RG_F32, offset: Vertex.src_end.offsetof },
|
{ binding: 0, location: 3, format: FMT.RG_F32, offset: Vertex.src_start.offsetof },
|
||||||
{ binding: 0, location: 4, format: FMT.RGBA_F32, offset: Vertex.col.offsetof },
|
{ binding: 0, location: 4, format: FMT.RG_F32, offset: Vertex.src_end.offsetof },
|
||||||
|
{ binding: 0, location: 5, format: FMT.R_F32, offset: Vertex.border_thickness.offsetof },
|
||||||
|
{ binding: 0, location: 6, format: FMT.R_F32, offset: Vertex.corner_radius.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 },
|
||||||
];
|
];
|
||||||
|
|
||||||
GfxPipelineInfo ui_info = {
|
GfxPipelineInfo ui_info = {
|
||||||
@ -184,6 +201,12 @@ CreateEditor(PlatformWindow* window, u8[] buffer_data, u8[] buffer_name)
|
|||||||
input_rate_stride: Vertex.sizeof,
|
input_rate_stride: Vertex.sizeof,
|
||||||
layout: editor.pipeline_layout,
|
layout: editor.pipeline_layout,
|
||||||
vertex_attributes: attributes,
|
vertex_attributes: attributes,
|
||||||
|
src_color: BF.SrcAlpha,
|
||||||
|
dst_color: BF.OneMinusSrcAlpha,
|
||||||
|
color_op: BO.Add,
|
||||||
|
src_alpha: BF.One,
|
||||||
|
dst_alpha: BF.Zero,
|
||||||
|
alpha_op: BO.Add,
|
||||||
};
|
};
|
||||||
|
|
||||||
assert(CreateGraphicsPipeline(&editor.rd, &editor.pipeline, &ui_info), "Unable to build UI pipeline");
|
assert(CreateGraphicsPipeline(&editor.rd, &editor.pipeline, &ui_info), "Unable to build UI pipeline");
|
||||||
@ -319,9 +342,9 @@ DrawGlyph(Editor* ed, Glyph* glyph, f32 scale, f32* x_pos, f32 y, Vec4 col = Vec
|
|||||||
f32 y_pos = glyph.plane_top * scale;
|
f32 y_pos = glyph.plane_top * scale;
|
||||||
|
|
||||||
v.dst_start.x = *x_pos + l;
|
v.dst_start.x = *x_pos + l;
|
||||||
v.dst_start.y = y + h - y_pos;
|
v.dst_start.y = y - y_pos;
|
||||||
v.dst_end.x = *x_pos + w + l;
|
v.dst_end.x = *x_pos + w + l;
|
||||||
v.dst_end.y = y - y_pos;
|
v.dst_end.y = y + h - y_pos;
|
||||||
|
|
||||||
v.src_start.x = glyph.atlas_left;
|
v.src_start.x = glyph.atlas_left;
|
||||||
v.src_start.y = glyph.atlas_top;
|
v.src_start.y = glyph.atlas_top;
|
||||||
@ -336,6 +359,23 @@ DrawGlyph(Editor* ed, Glyph* glyph, f32 scale, f32* x_pos, f32 y, Vec4 col = Vec
|
|||||||
*x_pos += glyph.advance * scale;
|
*x_pos += glyph.advance * scale;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
DrawRect(Editor* ed, f32 p0_x, f32 p0_y, f32 p1_x, f32 p1_y, f32 border, f32 corner, f32 softness, Vec4 col)
|
||||||
|
{
|
||||||
|
// Y reversed
|
||||||
|
Vertex* v = ed.vertices.ptr + ed.ui_count;
|
||||||
|
v.dst_start.x = p0_x;
|
||||||
|
v.dst_start.y = p0_y;
|
||||||
|
v.dst_end.x = p1_x;
|
||||||
|
v.dst_end.y = p1_y;
|
||||||
|
v.col = col;
|
||||||
|
v.border_thickness = border;
|
||||||
|
v.corner_radius = corner;
|
||||||
|
v.edge_softness = softness;
|
||||||
|
|
||||||
|
AddUIIndices(ed);
|
||||||
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
AddUIIndices(Editor* ed)
|
AddUIIndices(Editor* ed)
|
||||||
{
|
{
|
||||||
|
|||||||
@ -1,18 +1,49 @@
|
|||||||
#version 460
|
#version 460
|
||||||
|
|
||||||
#extension GL_GOOGLE_include_directive : require
|
#extension GL_GOOGLE_include_directive : require
|
||||||
|
#extension GL_EXT_debug_printf : require
|
||||||
|
|
||||||
#include "gui.layout"
|
#include "gui.layout"
|
||||||
|
|
||||||
layout (location = 0) in struct FragDataIn {
|
layout (location = 0) in struct FragDataIn {
|
||||||
vec4 color;
|
vec4 color;
|
||||||
vec2 uv;
|
vec2 uv;
|
||||||
} FragData;
|
vec2 dst_pos;
|
||||||
|
vec2 dst_center;
|
||||||
|
vec2 dst_half_size;
|
||||||
|
float corner_radius;
|
||||||
|
float softness;
|
||||||
|
float raised;
|
||||||
|
float border_thickness;
|
||||||
|
} FD;
|
||||||
|
|
||||||
layout (location = 0) out vec4 FragColor;
|
layout (location = 0) out vec4 FragColor;
|
||||||
|
|
||||||
|
float RoundedRectSDF(vec2 pos, vec2 center, vec2 half_size, float radius)
|
||||||
|
{
|
||||||
|
vec2 dist = (abs(center - pos) - half_size + vec2(radius));
|
||||||
|
return min(max(dist.x, dist.y), 0.0) + length(max(dist, 0.0)) - radius;
|
||||||
|
}
|
||||||
|
|
||||||
|
float RoundedRectSDF2(vec2 pos, vec2 center, vec2 size, float radius)
|
||||||
|
{
|
||||||
|
return length(max(abs(pos - center) - size + radius, 0.0)) - radius;
|
||||||
|
}
|
||||||
|
|
||||||
void main()
|
void main()
|
||||||
{
|
{
|
||||||
vec4 tex_color = texture(sampler2D(SpriteAtlas, SamplerNearest), FragData.uv);
|
float softness = FD.softness;
|
||||||
FragColor = FragData.color * tex_color;
|
vec2 softness_padding = vec2(max(0, softness*2-1), max(0, softness*2-1));
|
||||||
|
|
||||||
|
//float dist = RoundedRectSDF(FD.dst_pos, FD.dst_center, FD.dst_half_size-softness_padding, FD.corner_radius);
|
||||||
|
float dist = RoundedRectSDF2(FD.dst_pos, FD.dst_center, vec2(1.0), FD.corner_radius);
|
||||||
|
|
||||||
|
float sdf_factor = 1.0 - smoothstep(0, 2*softness, dist);
|
||||||
|
|
||||||
|
debugPrintfEXT("%v2f %v2f %v2f", FD.dst_pos, FD.dst_center, FD.dst_half_size);
|
||||||
|
|
||||||
|
vec4 tex_color = texture(sampler2D(SpriteAtlas, SamplerNearest), FD.uv);
|
||||||
|
vec4 out_color = FD.color * tex_color * sdf_factor;
|
||||||
|
|
||||||
|
FragColor = out_color;
|
||||||
}
|
}
|
||||||
|
|||||||
@ -5,5 +5,5 @@ layout (set = 0, binding = 1) uniform sampler SamplerNearest;
|
|||||||
layout (set = 1, binding = 0) uniform texture2D SpriteAtlas;
|
layout (set = 1, binding = 0) uniform texture2D SpriteAtlas;
|
||||||
|
|
||||||
layout (push_constant) uniform Constants {
|
layout (push_constant) uniform Constants {
|
||||||
vec2 res;
|
mat4 projection;
|
||||||
} PC;
|
} PC;
|
||||||
|
|||||||
@ -4,22 +4,33 @@
|
|||||||
|
|
||||||
#include "gui.layout"
|
#include "gui.layout"
|
||||||
|
|
||||||
layout (location = 0) in vec2 in_dst_start;
|
layout (location = 0) in vec4 in_col;
|
||||||
layout (location = 1) in vec2 in_dst_end;
|
layout (location = 1) in vec2 in_dst_start;
|
||||||
layout (location = 2) in vec2 in_src_start;
|
layout (location = 2) in vec2 in_dst_end;
|
||||||
layout (location = 3) in vec2 in_src_end;
|
layout (location = 3) in vec2 in_src_start;
|
||||||
layout (location = 4) in vec4 in_col;
|
layout (location = 4) in vec2 in_src_end;
|
||||||
|
layout (location = 5) in float border_thickness;
|
||||||
|
layout (location = 6) in float corner_radius;
|
||||||
|
layout (location = 7) in float edge_softness;
|
||||||
|
layout (location = 8) in float raised;
|
||||||
|
|
||||||
layout (location = 0) out struct FragDataOut {
|
layout (location = 0) out struct FragDataOut {
|
||||||
vec4 color;
|
vec4 color;
|
||||||
vec2 uv;
|
vec2 uv;
|
||||||
|
vec2 dst_pos;
|
||||||
|
vec2 dst_center;
|
||||||
|
vec2 dst_half_size;
|
||||||
|
float corner_radius;
|
||||||
|
float softness;
|
||||||
|
float raised;
|
||||||
|
float border_thickness;
|
||||||
} FragData;
|
} FragData;
|
||||||
|
|
||||||
vec2 Vertices[4] = vec2[4](
|
vec2 Vertices[4] = vec2[4](
|
||||||
vec2(-1.0, +1.0),
|
|
||||||
vec2(-1.0, -1.0),
|
vec2(-1.0, -1.0),
|
||||||
vec2(+1.0, +1.0),
|
vec2(-1.0, +1.0),
|
||||||
vec2(+1.0, -1.0)
|
vec2(+1.0, -1.0),
|
||||||
|
vec2(+1.0, +1.0)
|
||||||
);
|
);
|
||||||
|
|
||||||
vec2 rotate(vec2 coords, float theta)
|
vec2 rotate(vec2 coords, float theta)
|
||||||
@ -31,9 +42,12 @@ void main()
|
|||||||
{
|
{
|
||||||
ivec2 tex_size = textureSize(sampler2D(SpriteAtlas, SamplerNearest), 0);
|
ivec2 tex_size = textureSize(sampler2D(SpriteAtlas, SamplerNearest), 0);
|
||||||
|
|
||||||
vec2 dst_half_size = (in_dst_end - in_dst_start) / 2;
|
vec4 pos_start = PC.projection * vec4(in_dst_start.x, in_dst_start.y, 0.0, 1.0);
|
||||||
vec2 dst_center = (in_dst_end + in_dst_start) / 2;
|
vec4 pos_end = PC.projection * vec4(in_dst_end.x, in_dst_end.y, 0.0, 1.0);
|
||||||
vec2 dst_pos = (Vertices[gl_VertexIndex] * dst_half_size + dst_center);
|
|
||||||
|
vec2 half_size = ((pos_end.xy - pos_start.xy) / 2);
|
||||||
|
vec2 center = ((pos_end.xy + pos_start.xy) / 2);
|
||||||
|
vec2 pos = (Vertices[gl_VertexIndex] * half_size + center);
|
||||||
|
|
||||||
vec2 src_half_size = (in_src_end - in_src_start) / 2;
|
vec2 src_half_size = (in_src_end - in_src_start) / 2;
|
||||||
vec2 src_center = (in_src_end + in_src_start) / 2;
|
vec2 src_center = (in_src_end + in_src_start) / 2;
|
||||||
@ -48,9 +62,13 @@ void main()
|
|||||||
|
|
||||||
FragData.color = in_col;
|
FragData.color = in_col;
|
||||||
FragData.uv = uvs[gl_VertexIndex] / tex_size;
|
FragData.uv = uvs[gl_VertexIndex] / tex_size;
|
||||||
|
FragData.dst_pos = pos;
|
||||||
|
FragData.dst_center = center;
|
||||||
|
FragData.dst_half_size = half_size;
|
||||||
|
FragData.corner_radius = corner_radius;
|
||||||
|
FragData.softness = edge_softness;
|
||||||
|
FragData.raised = raised;
|
||||||
|
FragData.border_thickness = border_thickness;
|
||||||
|
|
||||||
gl_Position = vec4(2 * dst_pos.x / PC.res.x - 1,
|
gl_Position = vec4(pos.x, pos.y, 0, 1);
|
||||||
2 * dst_pos.y / PC.res.y - 1,
|
|
||||||
0,
|
|
||||||
1);
|
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user