mirror of
https://github.com/RPCSX/rpcsx.git
synced 2026-01-01 14:20:08 +01:00
323 lines
8 KiB
C++
323 lines
8 KiB
C++
#pragma once
|
|
|
|
#include "overlay_fonts.h"
|
|
|
|
#include "Emu/localized_string.h"
|
|
#include "Emu/Cell/timers.hpp"
|
|
|
|
#include <memory>
|
|
|
|
// Definitions for common UI controls and their routines
|
|
namespace rsx
|
|
{
|
|
namespace overlays
|
|
{
|
|
enum image_resource_id : u8
|
|
{
|
|
// NOTE: 1 - 252 are user defined
|
|
none = 0, // No image
|
|
raw_image = 252, // Raw image data passed via image_info struct
|
|
font_file = 253, // Font file
|
|
game_icon = 254, // Use game icon
|
|
backbuffer = 255 // Use current backbuffer contents
|
|
};
|
|
|
|
enum class primitive_type : u8
|
|
{
|
|
quad_list = 0,
|
|
triangle_strip = 1,
|
|
line_list = 2,
|
|
line_strip = 3
|
|
};
|
|
|
|
struct image_info
|
|
{
|
|
int w = 0, h = 0;
|
|
int bpp = 0;
|
|
u8* data = nullptr;
|
|
|
|
image_info(image_info&) = delete;
|
|
image_info(const char* filename);
|
|
image_info(const std::vector<u8>& bytes);
|
|
~image_info();
|
|
};
|
|
|
|
struct resource_config
|
|
{
|
|
enum standard_image_resource : u8
|
|
{
|
|
fade_top = 1,
|
|
fade_bottom,
|
|
select,
|
|
start,
|
|
cross,
|
|
circle,
|
|
triangle,
|
|
square,
|
|
L1,
|
|
R1,
|
|
L2,
|
|
R2,
|
|
save,
|
|
new_entry
|
|
};
|
|
|
|
// Define resources
|
|
std::vector<std::string> texture_resource_files;
|
|
std::vector<std::unique_ptr<image_info>> texture_raw_data;
|
|
|
|
resource_config();
|
|
|
|
void load_files();
|
|
void free_resources();
|
|
};
|
|
|
|
struct compiled_resource
|
|
{
|
|
struct command_config
|
|
{
|
|
primitive_type primitives = primitive_type::quad_list;
|
|
|
|
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;
|
|
|
|
u8 texture_ref = image_resource_id::none;
|
|
font *font_ref = nullptr;
|
|
void *external_data_ref = nullptr;
|
|
|
|
u8 blur_strength = 0;
|
|
|
|
command_config() = default;
|
|
|
|
void set_image_resource(u8 ref);
|
|
void set_font(font *ref);
|
|
|
|
// Analog to overlay_element::set_sinus_offset
|
|
f32 get_sinus_value() const;
|
|
};
|
|
|
|
struct command
|
|
{
|
|
command_config config;
|
|
std::vector<vertex> verts;
|
|
};
|
|
|
|
std::vector<command> draw_commands;
|
|
|
|
void add(const compiled_resource& other);
|
|
void add(const compiled_resource& other, f32 x_offset, f32 y_offset);
|
|
void add(const compiled_resource& other, f32 x_offset, f32 y_offset, const areaf& clip_rect);
|
|
|
|
//! Clear commands list
|
|
void clear();
|
|
|
|
//! Append the command to the back of the commands list and return it
|
|
command& append(const command& new_command);
|
|
|
|
//! Prepend the command to the front of the commands list and return it
|
|
command& prepend(const command& new_command);
|
|
};
|
|
|
|
struct overlay_element
|
|
{
|
|
enum text_align
|
|
{
|
|
left = 0,
|
|
center,
|
|
right
|
|
};
|
|
|
|
u16 x = 0;
|
|
u16 y = 0;
|
|
u16 w = 0;
|
|
u16 h = 0;
|
|
|
|
std::u32string text;
|
|
font* font_ref = nullptr;
|
|
text_align alignment = left;
|
|
bool wrap_text = false;
|
|
bool clip_text = true;
|
|
|
|
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);
|
|
|
|
compiled_resource compiled_resources;
|
|
bool is_compiled = false;
|
|
|
|
u16 padding_left = 0;
|
|
u16 padding_right = 0;
|
|
u16 padding_top = 0;
|
|
u16 padding_bottom = 0;
|
|
|
|
u16 margin_left = 0;
|
|
u16 margin_top = 0;
|
|
|
|
overlay_element() = default;
|
|
overlay_element(u16 _w, u16 _h) : w(_w), h(_h) {}
|
|
virtual ~overlay_element() = default;
|
|
|
|
virtual void refresh();
|
|
virtual void translate(s16 _x, s16 _y);
|
|
virtual void scale(f32 _x, f32 _y, bool origin_scaling);
|
|
virtual void set_pos(u16 _x, u16 _y);
|
|
virtual void set_size(u16 _w, u16 _h);
|
|
virtual void set_padding(u16 left, u16 right, u16 top, u16 bottom);
|
|
virtual void set_padding(u16 padding);
|
|
// NOTE: Functions as a simple position offset. Top left corner is the anchor.
|
|
virtual void set_margin(u16 left, u16 top);
|
|
virtual void set_margin(u16 margin);
|
|
virtual void set_text(const std::string& text);
|
|
virtual void set_unicode_text(const std::u32string& text);
|
|
void set_text(localized_string_id id);
|
|
virtual void set_font(const char* font_name, u16 font_size);
|
|
virtual void align_text(text_align align);
|
|
virtual void set_wrap_text(bool state);
|
|
virtual font* get_font() const;
|
|
virtual std::vector<vertex> render_text(const char32_t *string, f32 x, f32 y);
|
|
virtual compiled_resource& get_compiled();
|
|
void measure_text(u16& width, u16& height, bool ignore_word_wrap = false) const;
|
|
};
|
|
|
|
struct layout_container : public overlay_element
|
|
{
|
|
std::vector<std::unique_ptr<overlay_element>> m_items;
|
|
u16 advance_pos = 0;
|
|
u16 pack_padding = 0;
|
|
u16 scroll_offset_value = 0;
|
|
bool auto_resize = true;
|
|
|
|
virtual overlay_element* add_element(std::unique_ptr<overlay_element>&, int = -1) = 0;
|
|
|
|
layout_container();
|
|
|
|
void translate(s16 _x, s16 _y) override;
|
|
void set_pos(u16 _x, u16 _y) override;
|
|
|
|
compiled_resource& get_compiled() override;
|
|
|
|
virtual u16 get_scroll_offset_px() = 0;
|
|
};
|
|
|
|
struct vertical_layout : public layout_container
|
|
{
|
|
overlay_element* add_element(std::unique_ptr<overlay_element>& item, int offset = -1) override;
|
|
compiled_resource& get_compiled() override;
|
|
u16 get_scroll_offset_px() override;
|
|
};
|
|
|
|
struct horizontal_layout : public layout_container
|
|
{
|
|
overlay_element* add_element(std::unique_ptr<overlay_element>& item, int offset = -1) override;
|
|
compiled_resource& get_compiled() override;
|
|
u16 get_scroll_offset_px() override;
|
|
};
|
|
|
|
// Controls
|
|
struct spacer : public overlay_element
|
|
{
|
|
using overlay_element::overlay_element;
|
|
compiled_resource& get_compiled() override
|
|
{
|
|
// No draw
|
|
return compiled_resources;
|
|
}
|
|
};
|
|
|
|
struct image_view : public overlay_element
|
|
{
|
|
private:
|
|
u8 image_resource_ref = image_resource_id::none;
|
|
void *external_ref = nullptr;
|
|
|
|
// Strength of blur effect
|
|
u8 blur_strength = 0;
|
|
|
|
public:
|
|
using overlay_element::overlay_element;
|
|
|
|
compiled_resource& get_compiled() override;
|
|
|
|
void set_image_resource(u8 resource_id);
|
|
void set_raw_image(image_info* raw_image);
|
|
void clear_image();
|
|
void set_blur_strength(u8 strength);
|
|
};
|
|
|
|
struct image_button : public image_view
|
|
{
|
|
const u16 text_horizontal_offset = 25;
|
|
u16 m_text_offset_x = 0;
|
|
s16 m_text_offset_y = 0;
|
|
|
|
image_button();
|
|
image_button(u16 _w, u16 _h);
|
|
|
|
void set_text_vertical_adjust(s16 offset);
|
|
void set_size(u16 /*w*/, u16 h) override;
|
|
|
|
compiled_resource& get_compiled() override;
|
|
};
|
|
|
|
struct label : public overlay_element
|
|
{
|
|
label() = default;
|
|
label(const std::string& text);
|
|
|
|
bool auto_resize(bool grow_only = false, u16 limit_w = -1, u16 limit_h = -1);
|
|
};
|
|
|
|
struct graph : public overlay_element
|
|
{
|
|
private:
|
|
std::string m_title;
|
|
std::vector<f32> m_datapoints;
|
|
u32 m_datapoint_count{};
|
|
color4f m_color;
|
|
f32 m_min{};
|
|
f32 m_max{};
|
|
f32 m_avg{};
|
|
f32 m_1p{};
|
|
f32 m_guide_interval{};
|
|
label m_label{};
|
|
|
|
bool m_show_min_max{false};
|
|
bool m_show_1p_avg{false};
|
|
bool m_1p_sort_high{false};
|
|
|
|
public:
|
|
graph();
|
|
void set_pos(u16 _x, u16 _y) override;
|
|
void set_size(u16 _w, u16 _h) override;
|
|
void set_title(const char* title);
|
|
void set_font(const char* font_name, u16 font_size) override;
|
|
void set_font_size(u16 font_size);
|
|
void set_count(u32 datapoint_count);
|
|
void set_color(color4f color);
|
|
void set_guide_interval(f32 guide_interval);
|
|
void set_labels_visible(bool show_min_max, bool show_1p_avg);
|
|
void set_one_percent_sort_high(bool sort_1p_high);
|
|
u16 get_height() const;
|
|
u32 get_datapoint_count() const;
|
|
void record_datapoint(f32 datapoint, bool update_metrics);
|
|
void update();
|
|
compiled_resource& get_compiled() override;
|
|
};
|
|
}
|
|
}
|