working outlining

main
Brett 2024-05-13 22:24:06 -04:00
parent af143549cb
commit 8ec4c2c30b
5 changed files with 45 additions and 43 deletions

View File

@ -1,6 +1,6 @@
cmake_minimum_required(VERSION 3.25) cmake_minimum_required(VERSION 3.25)
set(BLT_GRAPHICS_VERSION 0.13.16) set(BLT_GRAPHICS_VERSION 0.13.17)
set(BLT_GRAPHICS_TEST_VERSION 0.0.1) set(BLT_GRAPHICS_TEST_VERSION 0.0.1)
project(BLT_WITH_GRAPHICS VERSION ${BLT_GRAPHICS_VERSION}) project(BLT_WITH_GRAPHICS VERSION ${BLT_GRAPHICS_VERSION})

View File

@ -206,9 +206,9 @@ namespace blt::gfx
// called after draw_objects() // called after draw_objects()
void post_reset(); void post_reset();
void draw_points(bool outlined, const f32 denominator); void draw_points(bool outlined, bool clear, const f32 denominator);
void draw_lines(bool outlined, const f32 denominator); void draw_lines(bool outlined, bool clear, const f32 denominator);
void draw_rectangles(bool outlined, const f32 denominator); void draw_rectangles(bool outlined, bool clear, const f32 denominator);
void draw_objects(); void draw_objects();

View File

@ -5,14 +5,14 @@ const std::string shader_2d_textured_frag = R"("
precision mediump float; precision mediump float;
layout (location = 0) out vec4 FragColor; layout (location = 0) out vec4 FragColor;
layout (location = 1) out vec4 OutMask; //layout (location = 1) out vec4 OutMask;
in vec2 uv; in vec2 uv;
in vec2 pos; in vec2 pos;
uniform sampler2D tex; uniform sampler2D tex;
uniform vec4 color; uniform vec4 color;
uniform vec4 use_texture; uniform vec4 use_texture;
uniform vec4 outline_color; //uniform vec4 outline_color;
vec4 linear_iter(vec4 i, vec4 p, float factor){ vec4 linear_iter(vec4 i, vec4 p, float factor){
return (i + p) * factor; return (i + p) * factor;
@ -20,8 +20,8 @@ vec4 linear_iter(vec4 i, vec4 p, float factor){
void main() { void main() {
FragColor = (texture(tex, uv) * use_texture) + color; FragColor = (texture(tex, uv) * use_texture) + color;
OutMask = outline_color; //OutMask = outline_color;
OutMask.a = FragColor.a; //OutMask.a = FragColor.a;
} }
")"; ")";

View File

@ -5,14 +5,14 @@ const std::string shader_2d_textured_cirlce_frag = R"("
precision mediump float; precision mediump float;
layout (location = 0) out vec4 FragColor; layout (location = 0) out vec4 FragColor;
layout (location = 1) out vec4 OutMask; //layout (location = 1) out vec4 OutMask;
in vec2 uv; in vec2 uv;
in vec2 pos; in vec2 pos;
uniform sampler2D tex; uniform sampler2D tex;
uniform vec4 color; uniform vec4 color;
uniform vec4 use_texture; uniform vec4 use_texture;
uniform vec4 outline_color; //uniform vec4 outline_color;
const float offset = 1.0 / 32.0; const float offset = 1.0 / 32.0;
@ -28,8 +28,8 @@ void main() {
if (ts >= sq) if (ts >= sq)
discard; discard;
FragColor = (texture(tex, uv) * use_texture) + color; FragColor = (texture(tex, uv) * use_texture) + color;
OutMask = outline_color; //OutMask = outline_color;
OutMask.a = FragColor.a; //OutMask.a = FragColor.a;
} }
")"; ")";

View File

@ -188,35 +188,35 @@ namespace blt::gfx
const f32 denominator = 1.0f / (draw.z_max - draw.z_min); const f32 denominator = 1.0f / (draw.z_max - draw.z_min);
glEnable(GL_STENCIL_TEST); glEnable(GL_STENCIL_TEST);
glClear(GL_STENCIL_BUFFER_BIT);
glStencilOp(GL_KEEP, GL_KEEP, GL_REPLACE); glStencilOp(GL_KEEP, GL_KEEP, GL_REPLACE);
glClear(GL_STENCIL_BUFFER_BIT);
glStencilMask(0xFF); glStencilMask(0xFF);
glStencilFunc(GL_ALWAYS, 1, 0xFF); glStencilFunc(GL_ALWAYS, 1, 0xFF);
draw_points(false, denominator); draw_points(true, false, denominator);
glStencilFunc(GL_NOTEQUAL, 1, 0xFF); glDisable(GL_DEPTH_TEST);
glStencilMask(0x00); glStencilFunc(GL_EQUAL, 1, 0xFF);
draw_points(true, denominator); draw_points(false, true, denominator);
glEnable(GL_DEPTH_TEST);
glClear(GL_STENCIL_BUFFER_BIT);
glStencilMask(0xFF);
glStencilFunc(GL_ALWAYS, 2, 0xFF); glStencilFunc(GL_ALWAYS, 2, 0xFF);
draw_rectangles(false, denominator); draw_rectangles(true, false, denominator);
glStencilFunc(GL_NOTEQUAL, 2, 0xFF); glDisable(GL_DEPTH_TEST);
glStencilMask(0x00); glStencilFunc(GL_EQUAL, 2, 0xFF);
draw_rectangles(true, denominator); draw_rectangles(false, true, denominator);
glEnable(GL_DEPTH_TEST);
glClear(GL_STENCIL_BUFFER_BIT);
glStencilMask(0xFF);
glStencilFunc(GL_ALWAYS, 4, 0xFF); glStencilFunc(GL_ALWAYS, 4, 0xFF);
draw_lines(false, denominator); draw_lines(true, false, denominator);
glDisable(GL_DEPTH_TEST);
glStencilFunc(GL_EQUAL, 4, 0xFF);
draw_lines(false, true, denominator);
glEnable(GL_DEPTH_TEST);
glStencilFunc(GL_NOTEQUAL, 4, 0xFF);
glStencilMask(0x00); glStencilMask(0x00);
draw_lines(true, denominator);
glDisable(GL_STENCIL_TEST); glDisable(GL_STENCIL_TEST);
post_reset(); post_reset();
} }
@ -237,7 +237,7 @@ namespace blt::gfx
} }
void batch_renderer_2d::draw_points(const bool outlined, const f32 denominator) void batch_renderer_2d::draw_points(const bool outlined, bool clear, const f32 denominator)
{ {
point_shader->bind(); point_shader->bind();
square_vao->bind(); square_vao->bind();
@ -266,19 +266,19 @@ namespace blt::gfx
point_shader->setVec4("use_texture", render_info.blend); point_shader->setVec4("use_texture", render_info.blend);
} }
point_shader->setVec4("outline_color", render_info.outline_color); //point_shader->setVec4("outline_color", render_info.outline_color);
point_shader->setFloat("z_index", (z_index - draw.z_min) * denominator); point_shader->setFloat("z_index", (z_index - draw.z_min) * denominator);
point_shader->setMatrix("model", model); point_shader->setMatrix("model", model);
glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_INT, 0); glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_INT, 0);
draw.draw_count++; draw.draw_count++;
} }
if (outlined) if (clear)
objects.clear(); objects.clear();
} }
} }
void batch_renderer_2d::draw_lines(bool outlined, const f32 denominator) void batch_renderer_2d::draw_lines(bool outlined, bool clear, const f32 denominator)
{ {
mat4x4 empty_model; mat4x4 empty_model;
square_shader->setMatrix("model", empty_model); square_shader->setMatrix("model", empty_model);
@ -294,17 +294,19 @@ namespace blt::gfx
{ {
auto& [z_index, line] = object; auto& [z_index, line] = object;
float thickness = line.thickness;
if (outlined){ if (outlined){
if (!render_info.outline) if (!render_info.outline)
continue; continue;
square_shader->setVec4("color", render_info.outline_color); square_shader->setVec4("color", render_info.outline_color);
square_shader->setVec4("use_texture", {0,0,0,0}); square_shader->setVec4("use_texture", {0,0,0,0});
thickness *= render_info.outline_thickness;
} else { } else {
square_shader->setVec4("color", render_info.color); square_shader->setVec4("color", render_info.color);
square_shader->setVec4("use_texture", render_info.blend); square_shader->setVec4("use_texture", render_info.blend);
} }
square_shader->setVec4("outline_color", render_info.outline_color); //square_shader->setVec4("outline_color", render_info.outline_color);
square_shader->setFloat("z_index", (z_index - draw.z_min) * denominator); square_shader->setFloat("z_index", (z_index - draw.z_min) * denominator);
// 0, 1 (top right) // 0, 1 (top right)
@ -315,11 +317,11 @@ namespace blt::gfx
vec2 right = {dir.y(), -dir.x()}; vec2 right = {dir.y(), -dir.x()};
vec2 left = {-dir.y(), dir.x()}; vec2 left = {-dir.y(), dir.x()};
auto bottom_left = line.p1 + left * line.thickness; auto bottom_left = line.p1 + left * thickness;
auto bottom_right = line.p1 + right * line.thickness; auto bottom_right = line.p1 + right * thickness;
auto top_left = line.p2 + left * line.thickness; auto top_left = line.p2 + left * thickness;
auto top_right = line.p2 + right * line.thickness; auto top_right = line.p2 + right * thickness;
line_vertices[0] = top_right.x(); line_vertices[0] = top_right.x();
line_vertices[1] = top_right.y(); line_vertices[1] = top_right.y();
@ -338,12 +340,12 @@ namespace blt::gfx
glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_INT, 0); glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_INT, 0);
draw.draw_count++; draw.draw_count++;
} }
if (outlined) if (clear)
objects.clear(); objects.clear();
} }
} }
void batch_renderer_2d::draw_rectangles(bool outlined, const f32 denominator) void batch_renderer_2d::draw_rectangles(bool outlined, bool clear, const f32 denominator)
{ {
square_shader->bind(); square_shader->bind();
square_vao->bind(); square_vao->bind();
@ -377,13 +379,13 @@ namespace blt::gfx
if (rect.rotation != 0) if (rect.rotation != 0)
model.rotateZ(toRadians(rect.rotation)); model.rotateZ(toRadians(rect.rotation));
square_shader->setVec4("outline_color", render_info.outline_color); //square_shader->setVec4("outline_color", render_info.outline_color);
square_shader->setFloat("z_index", (z_index - draw.z_min) * denominator); square_shader->setFloat("z_index", (z_index - draw.z_min) * denominator);
square_shader->setMatrix("model", model); square_shader->setMatrix("model", model);
glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_INT, 0); glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_INT, 0);
draw.draw_count++; draw.draw_count++;
} }
if (outlined) if (clear)
objects.clear(); objects.clear();
} }
} }