Skip to content

Commit

Permalink
Overlays: Implement individual pulse
Browse files Browse the repository at this point in the history
  • Loading branch information
Megamouse committed Mar 11, 2021
1 parent 0958c10 commit 3b2b1b2
Show file tree
Hide file tree
Showing 8 changed files with 77 additions and 13 deletions.
8 changes: 3 additions & 5 deletions rpcs3/Emu/RSX/GL/GLOverlays.cpp
@@ -1,7 +1,5 @@
#include "GLOverlays.h"

extern u64 get_system_time();

namespace gl
{
void overlay_pass::create()
Expand Down Expand Up @@ -514,12 +512,11 @@ namespace gl
{
program_handle.uniforms["viewport"] = color4f(static_cast<f32>(viewport.width()), static_cast<f32>(viewport.height()), static_cast<f32>(viewport.x1), static_cast<f32>(viewport.y1));
program_handle.uniforms["ui_scale"] = color4f(static_cast<f32>(ui.virtual_width), static_cast<f32>(ui.virtual_height), 1.f, 1.f);
program_handle.uniforms["time"] = static_cast<f32>(get_system_time() / 1000) * 0.005f;

saved_sampler_state save_30(30, m_sampler);
saved_sampler_state save_31(31, m_sampler);

for (auto &cmd : ui.get_compiled().draw_commands)
for (auto& cmd : ui.get_compiled().draw_commands)
{
set_primitive_type(cmd.config.primitives);
upload_vertex_data(cmd.verts.data(), ::size32(cmd.verts));
Expand All @@ -530,7 +527,7 @@ namespace gl
{
case rsx::overlays::image_resource_id::game_icon:
case rsx::overlays::image_resource_id::backbuffer:
//TODO
// TODO
case rsx::overlays::image_resource_id::none:
{
texture_read = GL_FALSE;
Expand All @@ -557,6 +554,7 @@ namespace gl
}
}

program_handle.uniforms["time"] = cmd.config.get_sinus_value();
program_handle.uniforms["color"] = cmd.config.color;
program_handle.uniforms["sampler_mode"] = texture_read;
program_handle.uniforms["pulse_glow"] = static_cast<s32>(cmd.config.pulse_glow);
Expand Down
32 changes: 32 additions & 0 deletions rpcs3/Emu/RSX/Overlays/overlay_controls.h
Expand Up @@ -30,6 +30,8 @@
#include <sys/sysctl.h>
#endif

extern u64 get_system_time();

// Definitions for common UI controls and their routines
namespace rsx
{
Expand Down Expand Up @@ -228,6 +230,8 @@ namespace rsx

color4f color = { 1.f, 1.f, 1.f, 1.f };
bool pulse_glow = false;
f32 pulse_sinus_offset = 0.0f; // The current pulse offset
f32 pulse_speed_modifier = 0.005f;

areaf clip_rect = {};
bool clip_region = false;
Expand All @@ -251,6 +255,12 @@ namespace rsx
texture_ref = image_resource_id::font_file;
font_ref = ref;
}

// Analog to overlay_element::set_sinus_offset
f32 get_sinus_value() const
{
return (static_cast<f32>(get_system_time() / 1000) * pulse_speed_modifier) - pulse_sinus_offset;
}
};

struct command
Expand Down Expand Up @@ -344,6 +354,24 @@ namespace rsx
color4f back_color = { 0.f, 0.f, 0.f, 1.f };
color4f fore_color = { 1.f, 1.f, 1.f, 1.f };
bool pulse_effect_enabled = false;
f32 pulse_sinus_offset = 0.0f; // The current pulse offset
f32 pulse_speed_modifier = 0.005f;

// Analog to command_config::get_sinus_value
// Apply modifier for sinus pulse. Resets the pulse. For example:
// 0 -> reset to 0.5 rising
// 0.5 -> reset to 0
// 1 -> reset to 0.5 falling
// 1.5 -> reset to 1
void set_sinus_offset(f32 sinus_modifier)
{
if (sinus_modifier >= 0)
{
static const f32 PI = 3.14159265f;
const f32 pulse_sinus_x = static_cast<f32>(get_system_time() / 1000) * pulse_speed_modifier;
pulse_sinus_offset = fmod(pulse_sinus_x + sinus_modifier * PI, 2.0f * PI);
}
}

compiled_resource compiled_resources;
bool is_compiled = false;
Expand Down Expand Up @@ -561,6 +589,8 @@ namespace rsx

config.color = back_color;
config.pulse_glow = pulse_effect_enabled;
config.pulse_sinus_offset = pulse_sinus_offset;
config.pulse_speed_modifier = pulse_speed_modifier;

auto& verts = compiled_resources_temp.draw_commands.front().verts;
verts.resize(4);
Expand Down Expand Up @@ -1066,6 +1096,8 @@ namespace rsx
u16 caret_position = 0;
u16 vertical_scroll_offset = 0;

bool m_reset_caret_pulse = 0;

using label::label;

void move_caret(direction dir);
Expand Down
11 changes: 11 additions & 0 deletions rpcs3/Emu/RSX/Overlays/overlay_edit_text.cpp
Expand Up @@ -31,6 +31,8 @@ namespace rsx

void edit_text::move_caret(direction dir)
{
m_reset_caret_pulse = true;

switch (dir)
{
case direction::left:
Expand Down Expand Up @@ -112,6 +114,7 @@ namespace rsx
}

caret_position += ::narrow<u16>(str.length());
m_reset_caret_pulse = true;
refresh();
}

Expand All @@ -136,6 +139,7 @@ namespace rsx
}

caret_position--;
m_reset_caret_pulse = true;
refresh();
}

Expand All @@ -155,6 +159,13 @@ namespace rsx
caret.back_color = fore_color;
caret.pulse_effect_enabled = true;

if (m_reset_caret_pulse)
{
// Reset the pulse slightly below 1 rising on each user interaction
caret.set_sinus_offset(1.6f);
m_reset_caret_pulse = false;
}

compiled.add(caret.get_compiled());

for (auto& cmd : compiled.draw_commands)
Expand Down
7 changes: 7 additions & 0 deletions rpcs3/Emu/RSX/Overlays/overlay_list_view.cpp
Expand Up @@ -108,11 +108,18 @@ namespace rsx
{
const s32 max_entry = m_elements_count - 1;

// Reset the pulse slightly below 1 rising on each user interaction
m_highlight_box->set_sinus_offset(1.6f);

if (m_selected_entry != entry)
{
m_selected_entry = std::max(0, std::min(entry, max_entry));
update_selection();
}
else
{
refresh();
}
}

void list_view::select_next(u16 count)
Expand Down
26 changes: 20 additions & 6 deletions rpcs3/Emu/RSX/Overlays/overlay_osk.cpp
Expand Up @@ -383,7 +383,7 @@ namespace rsx
{
const auto index_limit = (num_columns * num_rows) - 1;

auto on_accept = [&]()
const auto on_accept = [this]()
{
const u32 current_index = (selected_y * num_columns) + selected_x;
const auto& current_cell = m_grid[current_index];
Expand Down Expand Up @@ -441,11 +441,10 @@ namespace rsx
if (m_grid[get_cell_geometry(current_index).first].enabled)
{
update_selection_by_index(current_index);
m_update = true;
break;
}
}

m_reset_pulse = true;
break;
}
case pad_button::dpad_left:
Expand All @@ -461,7 +460,6 @@ namespace rsx
if (m_grid[get_cell_geometry(current_index).first].enabled)
{
update_selection_by_index(current_index);
m_update = true;
break;
}
}
Expand All @@ -470,6 +468,7 @@ namespace rsx
break;
}
}
m_reset_pulse = true;
break;
}
case pad_button::dpad_down:
Expand All @@ -486,10 +485,10 @@ namespace rsx
if (m_grid[get_cell_geometry(current_index).first].enabled)
{
update_selection_by_index(current_index);
m_update = true;
break;
}
}
m_reset_pulse = true;
break;
}
case pad_button::dpad_up:
Expand All @@ -501,10 +500,10 @@ namespace rsx
if (m_grid[get_cell_geometry(current_index).first].enabled)
{
update_selection_by_index(current_index);
m_update = true;
break;
}
}
m_reset_pulse = true;
break;
}
case pad_button::select:
Expand All @@ -530,6 +529,7 @@ namespace rsx
case pad_button::cross:
{
on_accept();
m_reset_pulse = true;
break;
}
case pad_button::circle:
Expand All @@ -550,6 +550,11 @@ namespace rsx
default:
break;
}

if (m_reset_pulse)
{
m_update = true;
}
}

void osk_dialog::on_text_changed()
Expand Down Expand Up @@ -706,6 +711,12 @@ namespace rsx
m_label.back_color = { 0.f, 0.f, 0.f, 0.f };
m_label.set_padding(0, 0, 10, 0);

if (m_reset_pulse)
{
// Reset the pulse slightly above 0 falling on each user interaction
m_key_pulse_cache.set_sinus_offset(0.6f);
}

for (const auto& c : m_grid)
{
u16 x = u16(c.pos.x);
Expand Down Expand Up @@ -764,16 +775,19 @@ namespace rsx
tmp.set_pos(x, y);
tmp.set_size(w, h);
tmp.pulse_effect_enabled = c.selected;
tmp.pulse_sinus_offset = m_key_pulse_cache.pulse_sinus_offset;

m_cached_resource.add(tmp.get_compiled());

if (render_label)
{
m_label.pulse_effect_enabled = c.selected;
m_label.pulse_sinus_offset = m_key_pulse_cache.pulse_sinus_offset;
m_cached_resource.add(m_label.get_compiled());
}
}

m_reset_pulse = false;
m_update = false;
}

Expand Down
3 changes: 3 additions & 0 deletions rpcs3/Emu/RSX/Overlays/overlay_osk.h
Expand Up @@ -66,6 +66,9 @@ namespace rsx
// Fade in/out
animation_color_interpolate fade_animation;

bool m_reset_pulse = false;
overlay_element m_key_pulse_cache; // Let's use this to store the pulse offset of the key, since we don't seem to cache the keys themselves.

bool m_update = true;
compiled_resource m_cached_resource;

Expand Down
1 change: 0 additions & 1 deletion rpcs3/Emu/RSX/Overlays/overlays.h
Expand Up @@ -84,7 +84,6 @@ namespace rsx
public:
s32 return_code = 0; // CELL_OK

public:
void update() override {}

compiled_resource get_compiled() override = 0;
Expand Down
2 changes: 1 addition & 1 deletion rpcs3/Emu/RSX/VK/VKOverlays.cpp
Expand Up @@ -715,7 +715,6 @@ namespace vk
vk::data_heap& upload_heap, rsx::overlays::overlay& ui)
{
m_scale_offset = color4f(ui.virtual_width, ui.virtual_height, 1.f, 1.f);
m_time = static_cast<f32>(get_system_time() / 1000) * 0.005f;
m_viewport = { { static_cast<f32>(viewport.x1), static_cast<f32>(viewport.y1) }, { static_cast<f32>(viewport.width()), static_cast<f32>(viewport.height()) } };

std::vector<vk::image_view*> image_views
Expand All @@ -731,6 +730,7 @@ namespace vk
upload_vertex_data(command.verts.data(), num_drawable_elements);
set_primitive_type(command.config.primitives);

m_time = command.config.get_sinus_value();
m_skip_texture_read = false;
m_color = command.config.color;
m_pulse_glow = command.config.pulse_glow;
Expand Down

0 comments on commit 3b2b1b2

Please sign in to comment.