srctree

Robin Linden parent c9afe7a2 87ef5137
gfx: Give the shaders their own files to live in

inlinesplit
.github/workflows/ci.yaml added: 90, removed: 65, total 25
@@ -152,7 +152,9 @@ jobs:
steps:
- uses: actions/checkout@v3
- run: npm install --global prettier@2.7.1
- run: npx prettier --ignore-path .gitignore --write .
# Prettier thinks our fragment shaders are JS-something and complains
# about syntax errors.
- run: npx prettier --ignore-path .gitignore --write . '!**/*.frag'
- run: git diff --exit-code
 
concurrency:
 
gfx/BUILD added: 90, removed: 65, total 25
@@ -24,9 +24,27 @@ cc_library(
],
)
 
genrule(
name = "basic_vertex_shader",
srcs = ["basic_shader.vert"],
outs = ["basic_vertex_shader.h"],
cmd = "xxd -i $< >$@",
)
 
genrule(
name = "border_fragment_shader",
srcs = ["border_shader.frag"],
outs = ["border_fragment_shader.h"],
cmd = "xxd -i $< >$@",
)
 
cc_library(
name = "sfml",
srcs = ["sfml_canvas.cpp"],
srcs = [
"sfml_canvas.cpp",
":basic_vertex_shader",
":border_fragment_shader",
],
hdrs = ["sfml_canvas.h"],
visibility = ["//visibility:public"],
deps = [
 
filename was Deleted added: 90, removed: 65, total 25
@@ -0,0 +1,8 @@
// SPDX-FileCopyrightText: 2022 Mikael Larsson <c.mikael.larsson@gmail.com>
//
// SPDX-License-Identifier: BSD-2-Clause
 
void main() {
gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;
gl_FrontColor = gl_Color;
}
 
filename was Deleted added: 90, removed: 65, total 25
@@ -0,0 +1,50 @@
// SPDX-FileCopyrightText: 2022 Mikael Larsson <c.mikael.larsson@gmail.com>
//
// SPDX-License-Identifier: BSD-2-Clause
 
uniform vec2 resolution;
uniform vec3 inner_top_left;
uniform vec3 inner_top_right;
uniform vec3 inner_bottom_left;
uniform vec3 inner_bottom_right;
uniform vec3 outer_top_left;
uniform vec3 outer_top_right;
uniform vec3 outer_bottom_left;
uniform vec3 outer_bottom_right;
uniform vec4 left_border_color;
uniform vec4 right_border_color;
uniform vec4 top_border_color;
uniform vec4 bottom_border_color;
 
// Gets the position of the fragment in screen coordinates
vec3 get_frag_pos() {
vec2 p = vec2(gl_FragCoord.x, resolution.y - gl_FragCoord.y);
return vec3(p.x, p.y, 0.0);
}
 
// Checks if a point is inside a quadrilateral
bool is_point_inside(vec3 p, vec3 a, vec3 b, vec3 c, vec3 d) {
return dot(cross(p - a, b - a), cross(p - d, c - d)) <= 0.0 &&
dot(cross(p - a, d - a), cross(p - b, c - b)) <= 0.0;
}
 
void main() {
vec3 p = get_frag_pos();
if (is_point_inside(p, inner_top_left, inner_top_right, inner_bottom_right, inner_bottom_left)) {
// The fragment is not on a border, set fully transparent color
gl_FragColor = vec4(1.0, 1.0, 1.0, 0.0);
} else {
if (is_point_inside(p, outer_top_left, outer_top_right, inner_top_right, inner_top_left)) {
gl_FragColor = top_border_color;
} else if (is_point_inside(p, outer_top_right, outer_bottom_right, inner_bottom_right, inner_top_right)) {
gl_FragColor = right_border_color;
} else if (is_point_inside(p, outer_bottom_right, outer_bottom_left, inner_bottom_left, inner_bottom_right)) {
gl_FragColor = bottom_border_color;
} else if (is_point_inside(p, outer_bottom_left, outer_top_left, inner_top_left, inner_bottom_left)) {
gl_FragColor = left_border_color;
} else {
// The fragment is not on a border, set fully transparent color
gl_FragColor = vec4(1.0, 1.0, 1.0, 0.0);
}
}
}
 
gfx/sfml_canvas.cpp added: 90, removed: 65, total 25
@@ -24,63 +24,8 @@ using namespace std::literals;
namespace gfx {
namespace {
 
constexpr std::string_view basic_vertex_shader{
R"(
void main() {
gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;
gl_FrontColor = gl_Color;
}
)"sv};
 
constexpr std::string_view border_fragment_shader{
R"(
uniform vec2 resolution;
uniform vec3 inner_top_left;
uniform vec3 inner_top_right;
uniform vec3 inner_bottom_left;
uniform vec3 inner_bottom_right;
uniform vec3 outer_top_left;
uniform vec3 outer_top_right;
uniform vec3 outer_bottom_left;
uniform vec3 outer_bottom_right;
uniform vec4 left_border_color;
uniform vec4 right_border_color;
uniform vec4 top_border_color;
uniform vec4 bottom_border_color;
 
// Gets the position of the fragment in screen coordinates
vec3 get_frag_pos() {
vec2 p = vec2(gl_FragCoord.x, resolution.y - gl_FragCoord.y);
return vec3(p.x, p.y, 0.0);
}
 
// Checks if a point is inside a quadrilateral
bool is_point_inside(vec3 p, vec3 a, vec3 b, vec3 c, vec3 d) {
return dot(cross(p - a, b - a), cross(p - d, c - d)) <= 0.0 &&
dot(cross(p - a, d - a), cross(p - b, c - b)) <= 0.0;
}
 
void main() {
vec3 p = get_frag_pos();
if (is_point_inside(p, inner_top_left, inner_top_right, inner_bottom_right, inner_bottom_left)) {
// The fragment is not on a border, set fully transparent color
gl_FragColor = vec4(1.0, 1.0, 1.0, 0.0);
} else {
if (is_point_inside(p, outer_top_left, outer_top_right, inner_top_right, inner_top_left)) {
gl_FragColor = top_border_color;
} else if (is_point_inside(p, outer_top_right, outer_bottom_right, inner_bottom_right, inner_top_right)) {
gl_FragColor = right_border_color;
} else if (is_point_inside(p, outer_bottom_right, outer_bottom_left, inner_bottom_left, inner_bottom_right)) {
gl_FragColor = bottom_border_color;
} else if (is_point_inside(p, outer_bottom_left, outer_top_left, inner_top_left, inner_bottom_left)) {
gl_FragColor = left_border_color;
} else {
// The fragment is not on a border, set fully transparent color
gl_FragColor = vec4(1.0, 1.0, 1.0, 0.0);
}
}
}
)"sv};
#include "gfx/basic_vertex_shader.h"
#include "gfx/border_fragment_shader.h"
 
std::filesystem::recursive_directory_iterator get_font_dir_iterator(std::filesystem::path const &path) {
std::error_code errc;
@@ -131,7 +76,9 @@ sf::Glsl::Vec4 to_vec4(Color const &color) {
} // namespace
 
SfmlCanvas::SfmlCanvas(sf::RenderTarget &target) : target_{target} {
border_shader_.loadFromMemory(std::string{basic_vertex_shader}, std::string{border_fragment_shader});
border_shader_.loadFromMemory(
std::string{reinterpret_cast<char const *>(gfx_basic_shader_vert), gfx_basic_shader_vert_len},
std::string{reinterpret_cast<char const *>(gfx_border_shader_frag), gfx_border_shader_frag_len});
}
 
void SfmlCanvas::set_viewport_size(int width, int height) {