working outlining
parent
af143549cb
commit
8ec4c2c30b
|
@ -1,6 +1,6 @@
|
|||
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)
|
||||
|
||||
project(BLT_WITH_GRAPHICS VERSION ${BLT_GRAPHICS_VERSION})
|
||||
|
|
|
@ -206,9 +206,9 @@ namespace blt::gfx
|
|||
// called after draw_objects()
|
||||
void post_reset();
|
||||
|
||||
void draw_points(bool outlined, const f32 denominator);
|
||||
void draw_lines(bool outlined, const f32 denominator);
|
||||
void draw_rectangles(bool outlined, const f32 denominator);
|
||||
void draw_points(bool outlined, bool clear, const f32 denominator);
|
||||
void draw_lines(bool outlined, bool clear, const f32 denominator);
|
||||
void draw_rectangles(bool outlined, bool clear, const f32 denominator);
|
||||
|
||||
void draw_objects();
|
||||
|
||||
|
|
|
@ -5,14 +5,14 @@ const std::string shader_2d_textured_frag = R"("
|
|||
precision mediump float;
|
||||
|
||||
layout (location = 0) out vec4 FragColor;
|
||||
layout (location = 1) out vec4 OutMask;
|
||||
//layout (location = 1) out vec4 OutMask;
|
||||
in vec2 uv;
|
||||
in vec2 pos;
|
||||
|
||||
uniform sampler2D tex;
|
||||
uniform vec4 color;
|
||||
uniform vec4 use_texture;
|
||||
uniform vec4 outline_color;
|
||||
//uniform vec4 outline_color;
|
||||
|
||||
vec4 linear_iter(vec4 i, vec4 p, float factor){
|
||||
return (i + p) * factor;
|
||||
|
@ -20,8 +20,8 @@ vec4 linear_iter(vec4 i, vec4 p, float factor){
|
|||
|
||||
void main() {
|
||||
FragColor = (texture(tex, uv) * use_texture) + color;
|
||||
OutMask = outline_color;
|
||||
OutMask.a = FragColor.a;
|
||||
//OutMask = outline_color;
|
||||
//OutMask.a = FragColor.a;
|
||||
}
|
||||
|
||||
")";
|
||||
|
|
|
@ -5,14 +5,14 @@ const std::string shader_2d_textured_cirlce_frag = R"("
|
|||
precision mediump float;
|
||||
|
||||
layout (location = 0) out vec4 FragColor;
|
||||
layout (location = 1) out vec4 OutMask;
|
||||
//layout (location = 1) out vec4 OutMask;
|
||||
in vec2 uv;
|
||||
in vec2 pos;
|
||||
|
||||
uniform sampler2D tex;
|
||||
uniform vec4 color;
|
||||
uniform vec4 use_texture;
|
||||
uniform vec4 outline_color;
|
||||
//uniform vec4 outline_color;
|
||||
|
||||
const float offset = 1.0 / 32.0;
|
||||
|
||||
|
@ -28,8 +28,8 @@ void main() {
|
|||
if (ts >= sq)
|
||||
discard;
|
||||
FragColor = (texture(tex, uv) * use_texture) + color;
|
||||
OutMask = outline_color;
|
||||
OutMask.a = FragColor.a;
|
||||
//OutMask = outline_color;
|
||||
//OutMask.a = FragColor.a;
|
||||
}
|
||||
|
||||
")";
|
||||
|
|
|
@ -188,35 +188,35 @@ namespace blt::gfx
|
|||
const f32 denominator = 1.0f / (draw.z_max - draw.z_min);
|
||||
|
||||
glEnable(GL_STENCIL_TEST);
|
||||
glClear(GL_STENCIL_BUFFER_BIT);
|
||||
glStencilOp(GL_KEEP, GL_KEEP, GL_REPLACE);
|
||||
|
||||
glClear(GL_STENCIL_BUFFER_BIT);
|
||||
glStencilMask(0xFF);
|
||||
|
||||
glStencilFunc(GL_ALWAYS, 1, 0xFF);
|
||||
draw_points(false, denominator);
|
||||
draw_points(true, false, denominator);
|
||||
|
||||
glStencilFunc(GL_NOTEQUAL, 1, 0xFF);
|
||||
glStencilMask(0x00);
|
||||
draw_points(true, denominator);
|
||||
glDisable(GL_DEPTH_TEST);
|
||||
glStencilFunc(GL_EQUAL, 1, 0xFF);
|
||||
draw_points(false, true, denominator);
|
||||
glEnable(GL_DEPTH_TEST);
|
||||
|
||||
glClear(GL_STENCIL_BUFFER_BIT);
|
||||
glStencilMask(0xFF);
|
||||
glStencilFunc(GL_ALWAYS, 2, 0xFF);
|
||||
draw_rectangles(false, denominator);
|
||||
draw_rectangles(true, false, denominator);
|
||||
|
||||
glStencilFunc(GL_NOTEQUAL, 2, 0xFF);
|
||||
glStencilMask(0x00);
|
||||
draw_rectangles(true, denominator);
|
||||
glDisable(GL_DEPTH_TEST);
|
||||
glStencilFunc(GL_EQUAL, 2, 0xFF);
|
||||
draw_rectangles(false, true, denominator);
|
||||
glEnable(GL_DEPTH_TEST);
|
||||
|
||||
glClear(GL_STENCIL_BUFFER_BIT);
|
||||
glStencilMask(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);
|
||||
draw_lines(true, denominator);
|
||||
|
||||
glDisable(GL_STENCIL_TEST);
|
||||
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();
|
||||
square_vao->bind();
|
||||
|
@ -266,19 +266,19 @@ namespace blt::gfx
|
|||
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->setMatrix("model", model);
|
||||
|
||||
glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_INT, 0);
|
||||
draw.draw_count++;
|
||||
}
|
||||
if (outlined)
|
||||
if (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;
|
||||
square_shader->setMatrix("model", empty_model);
|
||||
|
@ -294,17 +294,19 @@ namespace blt::gfx
|
|||
{
|
||||
auto& [z_index, line] = object;
|
||||
|
||||
float thickness = line.thickness;
|
||||
if (outlined){
|
||||
if (!render_info.outline)
|
||||
continue;
|
||||
square_shader->setVec4("color", render_info.outline_color);
|
||||
square_shader->setVec4("use_texture", {0,0,0,0});
|
||||
thickness *= render_info.outline_thickness;
|
||||
} else {
|
||||
square_shader->setVec4("color", render_info.color);
|
||||
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);
|
||||
|
||||
// 0, 1 (top right)
|
||||
|
@ -315,11 +317,11 @@ namespace blt::gfx
|
|||
vec2 right = {dir.y(), -dir.x()};
|
||||
vec2 left = {-dir.y(), dir.x()};
|
||||
|
||||
auto bottom_left = line.p1 + left * line.thickness;
|
||||
auto bottom_right = line.p1 + right * line.thickness;
|
||||
auto bottom_left = line.p1 + left * thickness;
|
||||
auto bottom_right = line.p1 + right * thickness;
|
||||
|
||||
auto top_left = line.p2 + left * line.thickness;
|
||||
auto top_right = line.p2 + right * line.thickness;
|
||||
auto top_left = line.p2 + left * thickness;
|
||||
auto top_right = line.p2 + right * thickness;
|
||||
|
||||
line_vertices[0] = top_right.x();
|
||||
line_vertices[1] = top_right.y();
|
||||
|
@ -338,12 +340,12 @@ namespace blt::gfx
|
|||
glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_INT, 0);
|
||||
draw.draw_count++;
|
||||
}
|
||||
if (outlined)
|
||||
if (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_vao->bind();
|
||||
|
@ -377,13 +379,13 @@ namespace blt::gfx
|
|||
if (rect.rotation != 0)
|
||||
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->setMatrix("model", model);
|
||||
glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_INT, 0);
|
||||
draw.draw_count++;
|
||||
}
|
||||
if (outlined)
|
||||
if (clear)
|
||||
objects.clear();
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue