working outlining
parent
af143549cb
commit
8ec4c2c30b
|
@ -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})
|
||||||
|
|
|
@ -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();
|
||||||
|
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
")";
|
")";
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
")";
|
")";
|
||||||
|
|
|
@ -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();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue