mirror of
https://github.com/RPCS3/rpcs3.git
synced 2026-06-03 05:05:14 -06:00
overlays/sdf: Clamp rounded-rect border radius to never exceed the box sides
- If the radius exceeds any half-dimension then the box-shrink subtraction yields a negative. That negative introduces a second transition boundary when the classification happens as it transitions back to positive. Normally not a big deal but when rendering borders at the transition points it can introduce artifacts.
This commit is contained in:
parent
5acc263b73
commit
de038d37bf
@ -84,7 +84,7 @@ namespace rsx::overlays
|
|||||||
|
|
||||||
void switchbox::set_size(u16 w, u16 h)
|
void switchbox::set_size(u16 w, u16 h)
|
||||||
{
|
{
|
||||||
const u16 dim = std::max<u16>(std::min(w, h), 14) & ~1u;
|
const u16 dim = std::max<u16>(std::min(w, h), 14);
|
||||||
box_layout::set_size(w, h);
|
box_layout::set_size(w, h);
|
||||||
|
|
||||||
clear_items();
|
clear_items();
|
||||||
@ -99,7 +99,7 @@ namespace rsx::overlays
|
|||||||
ellipse_part->set_size(dim * 2, dim);
|
ellipse_part->set_size(dim * 2, dim);
|
||||||
ellipse_part->set_padding(1);
|
ellipse_part->set_padding(1);
|
||||||
ellipse_part->set_pos(0, 0);
|
ellipse_part->set_pos(0, 0);
|
||||||
ellipse_part->radius = (dim - 2) / 2;
|
ellipse_part->border_radius = (dim - 2) / 2;
|
||||||
|
|
||||||
circle_part->set_size(dim, dim);
|
circle_part->set_size(dim, dim);
|
||||||
circle_part->set_padding(4);
|
circle_part->set_padding(4);
|
||||||
|
|||||||
@ -68,7 +68,10 @@ namespace rsx
|
|||||||
br *= scale_av;
|
br *= scale_av;
|
||||||
bw *= scale_av;
|
bw *= scale_av;
|
||||||
|
|
||||||
// Account for flipped viewport
|
// Border radius clamp
|
||||||
|
br = std::min({ br, hx, hy });
|
||||||
|
|
||||||
|
// Compute the function's origin. Account for flipped viewports as well.
|
||||||
if (target_viewport.x2 < target_viewport.x1)
|
if (target_viewport.x2 < target_viewport.x1)
|
||||||
{
|
{
|
||||||
cx = target_viewport.width() - (cx * scale_x) + target_viewport.x2;
|
cx = target_viewport.width() - (cx * scale_x) + target_viewport.x2;
|
||||||
@ -1171,7 +1174,7 @@ namespace rsx
|
|||||||
overlay_element::get_compiled();
|
overlay_element::get_compiled();
|
||||||
auto& config = compiled_resources.draw_commands.front().config;
|
auto& config = compiled_resources.draw_commands.front().config;
|
||||||
configure_sdf(config, sdf_function::rounded_box);
|
configure_sdf(config, sdf_function::rounded_box);
|
||||||
config.sdf_config.br = radius;
|
config.sdf_config.br = std::min({ static_cast<f32>(border_radius), config.sdf_config.hx, config.sdf_config.hy });
|
||||||
|
|
||||||
m_is_compiled = true;
|
m_is_compiled = true;
|
||||||
return compiled_resources;
|
return compiled_resources;
|
||||||
|
|||||||
@ -350,7 +350,7 @@ namespace rsx
|
|||||||
|
|
||||||
struct rounded_rect : public overlay_element
|
struct rounded_rect : public overlay_element
|
||||||
{
|
{
|
||||||
u8 radius = 5;
|
u16 border_radius = 5;
|
||||||
|
|
||||||
using overlay_element::overlay_element;
|
using overlay_element::overlay_element;
|
||||||
compiled_resource& get_compiled() override;
|
compiled_resource& get_compiled() override;
|
||||||
|
|||||||
@ -17,7 +17,7 @@ namespace rsx
|
|||||||
|
|
||||||
scroll_indicator_grip->set_pos(1, 0);
|
scroll_indicator_grip->set_pos(1, 0);
|
||||||
scroll_indicator_grip->set_size(5, 5);
|
scroll_indicator_grip->set_size(5, 5);
|
||||||
scroll_indicator_grip->radius = 2;
|
scroll_indicator_grip->border_radius = 2;
|
||||||
scroll_indicator_track->set_size(7, height);
|
scroll_indicator_track->set_size(7, height);
|
||||||
|
|
||||||
m_scroll_indicator = std::make_unique<box_layout>();
|
m_scroll_indicator = std::make_unique<box_layout>();
|
||||||
|
|||||||
@ -144,7 +144,7 @@ namespace rsx::overlays
|
|||||||
|
|
||||||
auto background = std::make_unique<rounded_rect>();
|
auto background = std::make_unique<rounded_rect>();
|
||||||
background->set_size(w, h);
|
background->set_size(w, h);
|
||||||
background->radius = std::min(h / 4, 5);
|
background->border_radius = std::min(h / 4, 5);
|
||||||
background->back_color = color4f(0.3f, 0.3f, 0.3f, 1.0f);
|
background->back_color = color4f(0.3f, 0.3f, 0.3f, 1.0f);
|
||||||
|
|
||||||
const u16 arrow_size = std::min<u16>(h / 2, max_dropdown_arrow_dimension);
|
const u16 arrow_size = std::min<u16>(h / 2, max_dropdown_arrow_dimension);
|
||||||
|
|||||||
@ -34,22 +34,22 @@ namespace rsx::overlays
|
|||||||
auto min_label = std::make_unique<label>();
|
auto min_label = std::make_unique<label>();
|
||||||
auto max_label = std::make_unique<label>();
|
auto max_label = std::make_unique<label>();
|
||||||
|
|
||||||
indicator->radius = slider_indicator_radius;
|
indicator->border_radius = slider_indicator_radius;
|
||||||
indicator->set_size(slider_indicator_dia + 2, slider_indicator_dia + 2);
|
indicator->set_size(slider_indicator_dia + 2, slider_indicator_dia + 2);
|
||||||
indicator->set_padding(2);
|
indicator->set_padding(2);
|
||||||
indicator->set_pos(0, -2);
|
indicator->set_pos(0, -2);
|
||||||
indicator->back_color = color4f(1.f);
|
indicator->back_color = color4f(1.f);
|
||||||
|
|
||||||
background->radius = slider_rail_thickness / 2;
|
background->border_radius = slider_rail_thickness / 2;
|
||||||
background->back_color = this->back_color;
|
background->back_color = this->back_color;
|
||||||
background->back_color.a = 1.f;
|
background->back_color.a = 1.f;
|
||||||
background->set_size(w, slider_rail_thickness);
|
background->set_size(w, slider_rail_thickness);
|
||||||
background->set_pos(0, (slider_indicator_dia / 2) - background->radius);
|
background->set_pos(0, (slider_indicator_dia / 2) - background->border_radius);
|
||||||
|
|
||||||
foreground->radius = slider_cover_thickness / 2;
|
foreground->border_radius = slider_cover_thickness / 2;
|
||||||
foreground->back_color = this->fore_color;
|
foreground->back_color = this->fore_color;
|
||||||
foreground->set_size(0, slider_cover_thickness);
|
foreground->set_size(0, slider_cover_thickness);
|
||||||
foreground->set_pos(0, (slider_indicator_dia / 2) - foreground->radius);
|
foreground->set_pos(0, (slider_indicator_dia / 2) - foreground->border_radius);
|
||||||
|
|
||||||
value_label->set_padding(2);
|
value_label->set_padding(2);
|
||||||
value_label->set_font(slider_label_font_family, slider_label_font_size);
|
value_label->set_font(slider_label_font_family, slider_label_font_size);
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user