Add BFI Settings Menu

This commit is contained in:
Lorenzooone
2024-05-21 23:28:41 +02:00
parent d33e4b2adb
commit e27db15bfd
19 changed files with 418 additions and 94 deletions

View File

@@ -132,7 +132,7 @@ file(MAKE_DIRECTORY ${TOOLS_DATA_DIR})
set(OUTPUT_NAME cc3dsfs)
add_executable(CMakeBin2C tools/bin2c.cpp)
add_executable(${OUTPUT_NAME} source/cc3dsfs.cpp source/utils.cpp source/audio_data.cpp source/audio.cpp source/frontend.cpp source/TextRectangle.cpp source/WindowScreen.cpp source/3dscapture.cpp source/conversions.cpp source/Menus/ConnectionMenu.cpp source/Menus/OptionSelectionMenu.cpp source/Menus/MainMenu.cpp source/Menus/VideoMenu.cpp source/Menus/CropMenu.cpp source/Menus/PARMenu.cpp source/Menus/RotationMenu.cpp source/Menus/OffsetMenu.cpp source/Menus/AudioMenu.cpp ${TOOLS_DATA_DIR}/font_ttf.cpp)
add_executable(${OUTPUT_NAME} source/cc3dsfs.cpp source/utils.cpp source/audio_data.cpp source/audio.cpp source/frontend.cpp source/TextRectangle.cpp source/WindowScreen.cpp source/3dscapture.cpp source/conversions.cpp source/Menus/ConnectionMenu.cpp source/Menus/OptionSelectionMenu.cpp source/Menus/MainMenu.cpp source/Menus/VideoMenu.cpp source/Menus/CropMenu.cpp source/Menus/PARMenu.cpp source/Menus/RotationMenu.cpp source/Menus/OffsetMenu.cpp source/Menus/AudioMenu.cpp source/Menus/BFIMenu.cpp ${TOOLS_DATA_DIR}/font_ttf.cpp)
add_dependencies(${OUTPUT_NAME} FTD3XX_BUILD_PROJECT CMakeBin2C)
target_link_libraries(${OUTPUT_NAME} PRIVATE sfml-graphics sfml-audio sfml-window sfml-system ${ftd3xx_BINARY_DIR}/${FTD3XX_SUBFOLDER}/${FTD3XX_LIB})
target_link_directories(${OUTPUT_NAME} PRIVATE ${ftd3xx_BINARY_DIR}/${FTD3XX_SUBFOLDER})

View File

@@ -79,7 +79,6 @@ On MacOS, you may also be prompted to install the Apple Command Line Developer T
- __5 key__: In Fullscreen mode, changes the Y distance from the border between 0, 1/2 Max and Max.
- __6 key__: In Joint mode, changes the position of the smaller screen relative to the bigger one between 0, 1/2 Max and Max.
- __7 key__: In Joint Fullscreen mode, changes the distance from the upper screen between 0, 1/2 Max and Max.
- __I key__: Toggles BFI (Motion Blur Reduction) on/off. Best used on 120+hz monitors. DO NOT USE THIS IF YOU'RE AT RISK OF SEIZURES!!!
- __Z key__: Decreases the Menu Scaling multiplier by 0.1. 0.3 is the minimum.
- __X key__: Increases the Menu Scaling multiplier by 0.1. 10.0 is the maximum.
- __R key__: Toggles extra padding on/off. It can be used to account for windows with rounded corners.

40
include/Menus/BFIMenu.hpp Executable file
View File

@@ -0,0 +1,40 @@
#ifndef __BFIMENU_HPP
#define __BFIMENU_HPP
#include "OptionSelectionMenu.hpp"
#include <chrono>
#include "TextRectangle.hpp"
#include "sfml_gfx_structs.hpp"
#include "display_structs.hpp"
enum BFIMenuOutAction{
BFI_MENU_NO_ACTION,
BFI_MENU_BACK,
BFI_MENU_TOGGLE,
BFI_MENU_DIVIDER_DEC,
BFI_MENU_DIVIDER_INC,
BFI_MENU_AMOUNT_DEC,
BFI_MENU_AMOUNT_INC,
};
class BFIMenu : public OptionSelectionMenu {
public:
BFIMenu(bool font_load_success, sf::Font &text_font);
~BFIMenu();
void prepare(float scaling_factor, int view_size_x, int view_size_y, ScreenInfo *info);
void insert_data();
BFIMenuOutAction selected_index = BFIMenuOutAction::BFI_MENU_NO_ACTION;
void reset_output_option();
protected:
bool is_option_selectable(int index, int action);
bool is_option_inc_dec(int index);
void set_output_option(int index, int action);
int get_num_options();
std::string get_string_option(int index, int action);
void class_setup();
private:
int *options_indexes;
int num_enabled_options;
};
#endif

View File

@@ -13,6 +13,7 @@
#define DEFAULT_ACTION 0
#define DEC_ACTION 1
#define INC_ACTION 2
#define FALSE_ACTION 3
class OptionSelectionMenu {
public:
@@ -39,6 +40,7 @@ protected:
bool show_x;
bool show_title;
virtual bool is_option_selectable(int index, int action);
virtual bool is_option_inc_dec(int index);
virtual void set_output_option(int index, int action);
virtual int get_num_options();
@@ -51,6 +53,9 @@ protected:
void initialize(bool font_load_success, sf::Font &text_font);
void prepare_options();
void base_prepare(float menu_scaling_factor, int view_size_x, int view_size_y);
std::string setTextOptionInt(int index, int value);
std::string setTextOptionBool(int index, bool value);
std::string setTextOptionFloat(int index, float value);
struct MenuData {
int page = 0;

View File

@@ -55,5 +55,6 @@ protected:
private:
int *options_indexes;
int num_enabled_options;
std::string setTextOptionDualPercentage(int index, int value_1, int value_2);
};
#endif

View File

@@ -6,7 +6,7 @@
enum ScreenType { TOP, BOTTOM, JOINT };
enum BottomRelativePosition { UNDER_TOP, LEFT_TOP, ABOVE_TOP, RIGHT_TOP, BOT_REL_POS_END };
enum CurrMenuType { DEFAULT_MENU_TYPE, CONNECT_MENU_TYPE, MAIN_MENU_TYPE, VIDEO_MENU_TYPE, AUDIO_MENU_TYPE, CROP_MENU_TYPE, TOP_PAR_MENU_TYPE, BOTTOM_PAR_MENU_TYPE, ROTATION_MENU_TYPE, OFFSET_MENU_TYPE };
enum CurrMenuType { DEFAULT_MENU_TYPE, CONNECT_MENU_TYPE, MAIN_MENU_TYPE, VIDEO_MENU_TYPE, AUDIO_MENU_TYPE, CROP_MENU_TYPE, TOP_PAR_MENU_TYPE, BOTTOM_PAR_MENU_TYPE, ROTATION_MENU_TYPE, OFFSET_MENU_TYPE, BFI_MENU_TYPE, LOAD_MENU_TYPE, SAVE_MENU_TYPE, RESOLUTION_MENU_TYPE, EXTRA_MENU_TYPE, STATUS_MENU_TYPE, LICENSES_MENU_TYPE, RELATIVE_POS_MENU_TYPE };
struct ScreenInfo {
bool is_blurred;
@@ -21,7 +21,8 @@ struct ScreenInfo {
bool async;
int top_scaling, bot_scaling;
bool bfi;
double bfi_divider;
int bfi_divider;
int bfi_amount;
double menu_scaling_factor;
bool rounded_corners_fix;
int top_par;

View File

@@ -20,6 +20,7 @@
#include "RotationMenu.hpp"
#include "OffsetMenu.hpp"
#include "AudioMenu.hpp"
#include "BFIMenu.hpp"
#include "display_structs.hpp"
class WindowScreen {
@@ -90,6 +91,7 @@ private:
RotationMenu *rotation_menu;
OffsetMenu *offset_menu;
AudioMenu *audio_menu;
BFIMenu *bfi_menu;
std::vector<const CropData*> possible_crops;
std::vector<const PARData*> possible_pars;
@@ -141,6 +143,7 @@ private:
void window_scaling_change(bool positive);
void rotation_change(int &value, bool right);
void ratio_change(bool top_priority);
void bfi_change();
void poll_window();
bool common_poll(SFEvent &event_data);
bool main_poll(SFEvent &event_data);
@@ -176,6 +179,14 @@ private:
void setup_offset_menu();
void setup_rotation_menu();
void setup_audio_menu();
void setup_bfi_menu();
void setup_load_menu();
void setup_save_menu();
void setup_resolution_menu();
void setup_extra_menu();
void setup_status_menu();
void setup_licenses_menu();
void setup_relative_pos_menu();
void update_connection();
};

View File

@@ -90,6 +90,8 @@ std::string AudioMenu::get_string_option(int index, int action) {
return pollable_options[this->options_indexes[index]]->inc_str;
if((action == DEC_ACTION) && this->is_option_inc_dec(index))
return pollable_options[this->options_indexes[index]]->dec_str;
if(action == FALSE_ACTION)
return pollable_options[this->options_indexes[index]]->false_name;
return pollable_options[this->options_indexes[index]]->base_name;
}
@@ -97,16 +99,6 @@ bool AudioMenu::is_option_inc_dec(int index) {
return pollable_options[this->options_indexes[index]]->is_inc;
}
static std::string setTextOptionInt(int option_index, int value) {
return pollable_options[option_index]->base_name + ": " + std::to_string(value);
}
static std::string setTextOptionBool(int option_index, bool value) {
if(value)
return pollable_options[option_index]->base_name;
return pollable_options[option_index]->false_name;
}
void AudioMenu::prepare(float menu_scaling_factor, int view_size_x, int view_size_y, AudioData *audio_data) {
int num_pages = this->get_num_pages();
if(this->future_data.page >= num_pages)
@@ -116,13 +108,14 @@ void AudioMenu::prepare(float menu_scaling_factor, int view_size_x, int view_siz
int index = (i * this->single_option_multiplier) + this->elements_start_id;
if(!this->future_enabled_labels[index])
continue;
int option_index = this->options_indexes[start + i];
int real_index = start + i;
int option_index = this->options_indexes[real_index];
switch(pollable_options[option_index]->out_action) {
case AUDIO_MENU_VOLUME_DEC:
this->labels[index]->setText(setTextOptionInt(option_index, audio_data->get_real_volume()));
this->labels[index]->setText(this->setTextOptionInt(real_index, audio_data->get_real_volume()));
break;
case AUDIO_MENU_MUTE:
this->labels[index]->setText(setTextOptionBool(option_index, audio_data->get_mute()));
this->labels[index]->setText(this->setTextOptionBool(real_index, audio_data->get_mute()));
break;
default:
break;

146
source/Menus/BFIMenu.cpp Executable file
View File

@@ -0,0 +1,146 @@
#include "BFIMenu.hpp"
#define NUM_TOTAL_MENU_OPTIONS (sizeof(pollable_options)/sizeof(pollable_options[0]))
struct BFIMenuOptionInfo {
const std::string base_name;
const std::string false_name;
const bool is_selectable;
const bool is_inc;
const std::string dec_str;
const std::string inc_str;
const BFIMenuOutAction inc_out_action;
const BFIMenuOutAction out_action;
};
static const BFIMenuOptionInfo bfi_warning_option = {
.base_name = "PHOTOSENSITIVITY", .false_name = "", .is_selectable = false,
.is_inc = false, .dec_str = "", .inc_str = "", .inc_out_action = BFI_MENU_NO_ACTION,
.out_action = BFI_MENU_NO_ACTION};
static const BFIMenuOptionInfo bfi_warning2_option = {
.base_name = "WARNING!", .false_name = "", .is_selectable = false,
.is_inc = false, .dec_str = "", .inc_str = "", .inc_out_action = BFI_MENU_NO_ACTION,
.out_action = BFI_MENU_NO_ACTION};
static const BFIMenuOptionInfo bfi_toggle_option = {
.base_name = "Turn BFI Off", .false_name = "Turn BFI On", .is_selectable = true,
.is_inc = false, .dec_str = "", .inc_str = "", .inc_out_action = BFI_MENU_NO_ACTION,
.out_action = BFI_MENU_TOGGLE};
static const BFIMenuOptionInfo bfi_divider_option = {
.base_name = "Frequency", .false_name = "", .is_selectable = true,
.is_inc = true, .dec_str = "-", .inc_str = "+", .inc_out_action = BFI_MENU_DIVIDER_INC,
.out_action = BFI_MENU_DIVIDER_DEC};
static const BFIMenuOptionInfo bfi_amount_option = {
.base_name = "Frames", .false_name = "", .is_selectable = true,
.is_inc = true, .dec_str = "-", .inc_str = "+", .inc_out_action = BFI_MENU_AMOUNT_INC,
.out_action = BFI_MENU_AMOUNT_DEC};
static const BFIMenuOptionInfo* pollable_options[] = {
&bfi_warning_option,
&bfi_warning2_option,
&bfi_toggle_option,
&bfi_divider_option,
&bfi_amount_option,
};
BFIMenu::BFIMenu(bool font_load_success, sf::Font &text_font) : OptionSelectionMenu(){
this->options_indexes = new int[NUM_TOTAL_MENU_OPTIONS];
this->initialize(font_load_success, text_font);
this->num_enabled_options = 0;
}
BFIMenu::~BFIMenu() {
delete []this->options_indexes;
}
void BFIMenu::class_setup() {
this->num_options_per_screen = 5;
this->min_elements_text_scaling_factor = num_options_per_screen + 2;
this->width_factor_menu = 16;
this->width_divisor_menu = 9;
this->base_height_factor_menu = 12;
this->base_height_divisor_menu = 6;
this->min_text_size = 0.3;
this->max_width_slack = 1.1;
this->menu_color = sf::Color(30, 30, 60, 192);
this->title = "Offset Settings";
this->show_back_x = true;
this->show_x = false;
this->show_title = true;
}
void BFIMenu::insert_data() {
this->num_enabled_options = 0;
for(int i = 0; i < NUM_TOTAL_MENU_OPTIONS; i++) {
this->options_indexes[this->num_enabled_options] = i;
this->num_enabled_options++;
}
this->prepare_options();
}
void BFIMenu::reset_output_option() {
this->selected_index = BFIMenuOutAction::BFI_MENU_NO_ACTION;
}
void BFIMenu::set_output_option(int index, int action) {
if(index == BACK_X_OUTPUT_OPTION)
this->selected_index = BFI_MENU_BACK;
else if((action == INC_ACTION) && this->is_option_inc_dec(index))
this->selected_index = pollable_options[this->options_indexes[index]]->inc_out_action;
else
this->selected_index = pollable_options[this->options_indexes[index]]->out_action;
}
int BFIMenu::get_num_options() {
return this->num_enabled_options;
}
std::string BFIMenu::get_string_option(int index, int action) {
if((action == INC_ACTION) && this->is_option_inc_dec(index))
return pollable_options[this->options_indexes[index]]->inc_str;
if((action == DEC_ACTION) && this->is_option_inc_dec(index))
return pollable_options[this->options_indexes[index]]->dec_str;
if(action == FALSE_ACTION)
return pollable_options[this->options_indexes[index]]->false_name;
return pollable_options[this->options_indexes[index]]->base_name;
}
bool BFIMenu::is_option_selectable(int index, int action) {
return pollable_options[this->options_indexes[index]]->is_selectable;
}
bool BFIMenu::is_option_inc_dec(int index) {
return pollable_options[this->options_indexes[index]]->is_inc;
}
void BFIMenu::prepare(float menu_scaling_factor, int view_size_x, int view_size_y, ScreenInfo *info) {
int num_pages = this->get_num_pages();
if(this->future_data.page >= num_pages)
this->future_data.page = num_pages - 1;
int start = this->future_data.page * this->num_options_per_screen;
for(int i = 0; i < this->num_options_per_screen + 1; i++) {
int index = (i * this->single_option_multiplier) + this->elements_start_id;
if(!this->future_enabled_labels[index])
continue;
int real_index = start + i;
int option_index = this->options_indexes[real_index];
switch(pollable_options[option_index]->out_action) {
case BFI_MENU_TOGGLE:
this->labels[index]->setText(this->setTextOptionBool(real_index, info->bfi));
break;
case BFI_MENU_DIVIDER_DEC:
this->labels[index]->setText(this->setTextOptionInt(real_index, info->bfi_divider * 60) + " hz");
break;
case BFI_MENU_AMOUNT_DEC:
this->labels[index]->setText(this->setTextOptionInt(real_index, info->bfi_amount));
break;
default:
break;
}
}
this->base_prepare(menu_scaling_factor, view_size_x, view_size_y);
}

View File

@@ -58,9 +58,9 @@ void CropMenu::prepare(float menu_scaling_factor, int view_size_x, int view_size
continue;
int crop_index = start + i;
if(crop_index == current_crop)
this->labels[index]->setText("<" + (*this->possible_crops)[crop_index]->name + ">");
this->labels[index]->setText("<" + this->get_string_option(crop_index, DEFAULT_ACTION) + ">");
else
this->labels[index]->setText((*this->possible_crops)[crop_index]->name);
this->labels[index]->setText(this->get_string_option(crop_index, DEFAULT_ACTION));
}
this->base_prepare(menu_scaling_factor, view_size_x, view_size_y);
}

View File

@@ -1,6 +1,6 @@
#include "MainMenu.hpp"
#define NUM_TOTAL_MAIN_MENU_OPTIONS (sizeof(pollable_options)/sizeof(pollable_options[0]))
#define NUM_TOTAL_MENU_OPTIONS (sizeof(pollable_options)/sizeof(pollable_options[0]))
#define OPTION_WINDOWED true
#define OPTION_FULLSCREEN true
@@ -123,7 +123,7 @@ static const MainMenuOptionInfo* pollable_options[] = {
};
MainMenu::MainMenu(bool font_load_success, sf::Font &text_font) : OptionSelectionMenu(){
this->options_indexes = new int[NUM_TOTAL_MAIN_MENU_OPTIONS];
this->options_indexes = new int[NUM_TOTAL_MENU_OPTIONS];
this->initialize(font_load_success, text_font);
this->num_enabled_options = 0;
}
@@ -150,7 +150,7 @@ void MainMenu::class_setup() {
void MainMenu::insert_data(ScreenType s_type, bool is_fullscreen) {
this->num_enabled_options = 0;
for(int i = 0; i < NUM_TOTAL_MAIN_MENU_OPTIONS; i++) {
for(int i = 0; i < NUM_TOTAL_MENU_OPTIONS; i++) {
bool valid = true;
if(is_fullscreen)
valid = valid && pollable_options[i]->active_fullscreen;
@@ -186,15 +186,11 @@ int MainMenu::get_num_options() {
}
std::string MainMenu::get_string_option(int index, int action) {
if(action == FALSE_ACTION)
return pollable_options[this->options_indexes[index]]->false_name;
return pollable_options[this->options_indexes[index]]->base_name;
}
static std::string setTextOptionBool(int option_index, bool value) {
if(value)
return pollable_options[option_index]->base_name;
return pollable_options[option_index]->false_name;
}
void MainMenu::prepare(float menu_scaling_factor, int view_size_x, int view_size_y, bool connected) {
int num_pages = this->get_num_pages();
if(this->future_data.page >= num_pages)
@@ -204,10 +200,11 @@ void MainMenu::prepare(float menu_scaling_factor, int view_size_x, int view_size
int index = (i * this->single_option_multiplier) + this->elements_start_id;
if(!this->future_enabled_labels[index])
continue;
int option_index = this->options_indexes[start + i];
int real_index = start + i;
int option_index = this->options_indexes[real_index];
switch(pollable_options[option_index]->out_action) {
case MAIN_MENU_OPEN:
this->labels[index]->setText(setTextOptionBool(option_index, connected));
this->labels[index]->setText(this->setTextOptionBool(real_index, connected));
break;
default:
break;

View File

@@ -102,10 +102,6 @@ bool OffsetMenu::is_option_inc_dec(int index) {
return pollable_options[this->options_indexes[index]]->is_inc;
}
static std::string setTextOptionFloat(int option_index, float value) {
return pollable_options[option_index]->base_name + ": " + get_float_str_decimals(value, 1);
}
void OffsetMenu::prepare(float menu_scaling_factor, int view_size_x, int view_size_y, ScreenInfo *info) {
int num_pages = this->get_num_pages();
if(this->future_data.page >= num_pages)
@@ -115,19 +111,20 @@ void OffsetMenu::prepare(float menu_scaling_factor, int view_size_x, int view_si
int index = (i * this->single_option_multiplier) + this->elements_start_id;
if(!this->future_enabled_labels[index])
continue;
int option_index = this->options_indexes[start + i];
int real_index = start + i;
int option_index = this->options_indexes[real_index];
switch(pollable_options[option_index]->out_action) {
case OFFSET_MENU_SMALL_OFFSET_DEC:
this->labels[index]->setText(setTextOptionFloat(option_index, info->subscreen_offset));
this->labels[index]->setText(this->setTextOptionFloat(real_index, info->subscreen_offset));
break;
case OFFSET_MENU_SMALL_SCREEN_DISTANCE_DEC:
this->labels[index]->setText(setTextOptionFloat(option_index, info->subscreen_attached_offset));
this->labels[index]->setText(this->setTextOptionFloat(real_index, info->subscreen_attached_offset));
break;
case OFFSET_MENU_SCREENS_X_POS_DEC:
this->labels[index]->setText(setTextOptionFloat(option_index, info->total_offset_x));
this->labels[index]->setText(this->setTextOptionFloat(real_index, info->total_offset_x));
break;
case OFFSET_MENU_SCREENS_Y_POS_DEC:
this->labels[index]->setText(setTextOptionFloat(option_index, info->total_offset_y));
this->labels[index]->setText(this->setTextOptionFloat(real_index, info->total_offset_y));
break;
default:
break;

View File

@@ -1,4 +1,5 @@
#include "OptionSelectionMenu.hpp"
#include "utils.hpp"
OptionSelectionMenu::OptionSelectionMenu() {
}
@@ -200,6 +201,10 @@ int OptionSelectionMenu::get_num_options() {
return this->num_options_per_screen;
}
bool OptionSelectionMenu::is_option_selectable(int index, int action) {
return true;
}
bool OptionSelectionMenu::is_option_inc_dec(int index) {
return false;
}
@@ -208,6 +213,20 @@ std::string OptionSelectionMenu::get_string_option(int index, int action) {
return "Sample Text";
}
std::string OptionSelectionMenu::setTextOptionInt(int index, int value) {
return this->get_string_option(index, DEFAULT_ACTION) + ": " + std::to_string(value);
}
std::string OptionSelectionMenu::setTextOptionBool(int index, bool value) {
if(value)
return this->get_string_option(index, DEFAULT_ACTION);
return this->get_string_option(index, FALSE_ACTION);
}
std::string OptionSelectionMenu::setTextOptionFloat(int index, float value) {
std::string out = this->get_string_option(index, DEFAULT_ACTION) + ": " + get_float_str_decimals(value, 1);
return out;
}
int OptionSelectionMenu::get_num_pages() {
int num_pages = 1 + ((this->get_num_options() - 1) / this->num_options_per_screen);
if(this->get_num_options() == (this->num_options_per_screen + 1))
@@ -248,16 +267,16 @@ void OptionSelectionMenu::prepare_options() {
this->labels[label_start_index]->setText(this->get_string_option(start + i, DEFAULT_ACTION));
this->labels[label_start_index]->setShowText(true);
if(!is_option_inc_dec(start + i))
this->selectable_labels[label_start_index] = true;
this->selectable_labels[label_start_index] = this->is_option_selectable(start + i, DEFAULT_ACTION);
else {
this->labels[label_start_index + 1]->setText(this->get_string_option(start + i, DEC_ACTION));
this->labels[label_start_index + 1]->setShowText(true);
this->future_enabled_labels[label_start_index + 1] = true;
this->selectable_labels[label_start_index + 1] = true;
this->selectable_labels[label_start_index + 1] = this->is_option_selectable(start + i, DEC_ACTION);
this->labels[label_start_index + 2]->setText(this->get_string_option(start + i, INC_ACTION));
this->labels[label_start_index + 2]->setShowText(true);
this->future_enabled_labels[label_start_index + 2] = true;
this->selectable_labels[label_start_index + 2] = true;
this->selectable_labels[label_start_index + 2] = this->is_option_selectable(start + i, INC_ACTION);
}
}
if(num_pages > 1) {

View File

@@ -62,9 +62,9 @@ void PARMenu::prepare(float menu_scaling_factor, int view_size_x, int view_size_
continue;
int par_index = start + i;
if(par_index == current_par)
this->labels[index]->setText("<" + (*this->possible_pars)[par_index]->name + ">");
this->labels[index]->setText("<" + this->get_string_option(par_index, DEFAULT_ACTION) + ">");
else
this->labels[index]->setText((*this->possible_pars)[par_index]->name);
this->labels[index]->setText(this->get_string_option(par_index, DEFAULT_ACTION));
}
this->base_prepare(menu_scaling_factor, view_size_x, view_size_y);
}

View File

@@ -96,10 +96,6 @@ bool RotationMenu::is_option_inc_dec(int index) {
return pollable_options[this->options_indexes[index]]->is_inc;
}
static std::string setTextOptionInt(int option_index, int value) {
return pollable_options[option_index]->base_name + ": " + std::to_string(value);
}
void RotationMenu::prepare(float menu_scaling_factor, int view_size_x, int view_size_y, ScreenInfo *info) {
int num_pages = this->get_num_pages();
if(this->future_data.page >= num_pages)
@@ -109,13 +105,14 @@ void RotationMenu::prepare(float menu_scaling_factor, int view_size_x, int view_
int index = (i * this->single_option_multiplier) + this->elements_start_id;
if(!this->future_enabled_labels[index])
continue;
int option_index = this->options_indexes[start + i];
int real_index = start + i;
int option_index = this->options_indexes[real_index];
switch(pollable_options[option_index]->out_action) {
case ROTATION_MENU_TOP_ROTATION_DEC:
this->labels[index]->setText(setTextOptionInt(option_index, info->top_rotation));
this->labels[index]->setText(this->setTextOptionInt(real_index, info->top_rotation));
break;
case ROTATION_MENU_BOTTOM_ROTATION_DEC:
this->labels[index]->setText(setTextOptionInt(option_index, info->bot_rotation));
this->labels[index]->setText(this->setTextOptionInt(real_index, info->bot_rotation));
break;
default:
break;

View File

@@ -1,6 +1,6 @@
#include "VideoMenu.hpp"
#define NUM_TOTAL_VIDEO_MENU_OPTIONS (sizeof(pollable_options)/sizeof(pollable_options[0]))
#define NUM_TOTAL_MENU_OPTIONS (sizeof(pollable_options)/sizeof(pollable_options[0]))
struct VideoMenuOptionInfo {
const std::string base_name;
@@ -173,7 +173,7 @@ static const VideoMenuOptionInfo* pollable_options[] = {
};
VideoMenu::VideoMenu(bool font_load_success, sf::Font &text_font) : OptionSelectionMenu(){
this->options_indexes = new int[NUM_TOTAL_VIDEO_MENU_OPTIONS];
this->options_indexes = new int[NUM_TOTAL_MENU_OPTIONS];
this->initialize(font_load_success, text_font);
this->num_enabled_options = 0;
}
@@ -200,7 +200,7 @@ void VideoMenu::class_setup() {
void VideoMenu::insert_data(ScreenType s_type, bool is_fullscreen) {
this->num_enabled_options = 0;
for(int i = 0; i < NUM_TOTAL_VIDEO_MENU_OPTIONS; i++) {
for(int i = 0; i < NUM_TOTAL_MENU_OPTIONS; i++) {
bool valid = true;
if(is_fullscreen)
valid = valid && pollable_options[i]->active_fullscreen;
@@ -242,6 +242,8 @@ std::string VideoMenu::get_string_option(int index, int action) {
return pollable_options[this->options_indexes[index]]->inc_str;
if((action == DEC_ACTION) && this->is_option_inc_dec(index))
return pollable_options[this->options_indexes[index]]->dec_str;
if(action == FALSE_ACTION)
return pollable_options[this->options_indexes[index]]->false_name;
return pollable_options[this->options_indexes[index]]->base_name;
}
@@ -249,26 +251,12 @@ bool VideoMenu::is_option_inc_dec(int index) {
return pollable_options[this->options_indexes[index]]->is_inc;
}
static std::string setTextOptionBool(int option_index, bool value) {
if(value)
return pollable_options[option_index]->base_name;
return pollable_options[option_index]->false_name;
}
static std::string setTextOptionFloat(int option_index, float value) {
return pollable_options[option_index]->base_name + ": " + get_float_str_decimals(value, 1);
}
static std::string setTextOptionInt(int option_index, int value) {
return pollable_options[option_index]->base_name + ": " + std::to_string(value);
}
static std::string setTextOptionDualPercentage(int option_index, int value_1, int value_2) {
std::string VideoMenu::setTextOptionDualPercentage(int index, int value_1, int value_2) {
int sum = value_1 + value_2;
value_1 = ((value_1 * 100) + (sum / 2)) / sum;
value_2 = ((value_2 * 100) + (sum / 2)) / sum;
value_1 += 100 - (value_1 + value_2);
return pollable_options[option_index]->base_name + ": " + std::to_string(value_1) + " - " + std::to_string(value_2);
return this->get_string_option(index, DEFAULT_ACTION) + ": " + std::to_string(value_1) + " - " + std::to_string(value_2);
}
void VideoMenu::prepare(float menu_scaling_factor, int view_size_x, int view_size_y, ScreenInfo *info) {
@@ -280,37 +268,38 @@ void VideoMenu::prepare(float menu_scaling_factor, int view_size_x, int view_siz
int index = (i * this->single_option_multiplier) + this->elements_start_id;
if(!this->future_enabled_labels[index])
continue;
int option_index = this->options_indexes[start + i];
int real_index = start + i;
int option_index = this->options_indexes[real_index];
switch(pollable_options[option_index]->out_action) {
case VIDEO_MENU_VSYNC:
this->labels[index]->setText(setTextOptionBool(option_index, info->v_sync_enabled));
this->labels[index]->setText(this->setTextOptionBool(real_index, info->v_sync_enabled));
break;
case VIDEO_MENU_ASYNC:
this->labels[index]->setText(setTextOptionBool(option_index, info->async));
this->labels[index]->setText(this->setTextOptionBool(real_index, info->async));
break;
case VIDEO_MENU_BLUR:
this->labels[index]->setText(setTextOptionBool(option_index, info->is_blurred));
this->labels[index]->setText(this->setTextOptionBool(real_index, info->is_blurred));
break;
case VIDEO_MENU_PADDING:
this->labels[index]->setText(setTextOptionBool(option_index, info->rounded_corners_fix));
this->labels[index]->setText(this->setTextOptionBool(real_index, info->rounded_corners_fix));
break;
case VIDEO_MENU_WINDOW_SCALING_DEC:
this->labels[index]->setText(setTextOptionFloat(option_index, info->scaling));
this->labels[index]->setText(this->setTextOptionFloat(real_index, info->scaling));
break;
case VIDEO_MENU_MENU_SCALING_DEC:
this->labels[index]->setText(setTextOptionFloat(option_index, info->menu_scaling_factor));
this->labels[index]->setText(this->setTextOptionFloat(real_index, info->menu_scaling_factor));
break;
case VIDEO_MENU_FULLSCREEN_SCALING_TOP:
this->labels[index]->setText(setTextOptionDualPercentage(option_index, info->top_scaling, info->bot_scaling));
this->labels[index]->setText(this->setTextOptionDualPercentage(real_index, info->top_scaling, info->bot_scaling));
break;
case VIDEO_MENU_SMALL_SCREEN_OFFSET_DEC:
this->labels[index]->setText(setTextOptionFloat(option_index, info->subscreen_offset));
this->labels[index]->setText(this->setTextOptionFloat(real_index, info->subscreen_offset));
break;
case VIDEO_MENU_TOP_ROTATION_DEC:
this->labels[index]->setText(setTextOptionInt(option_index, info->top_rotation));
this->labels[index]->setText(this->setTextOptionInt(real_index, info->top_rotation));
break;
case VIDEO_MENU_BOTTOM_ROTATION_DEC:
this->labels[index]->setText(setTextOptionInt(option_index, info->bot_rotation));
this->labels[index]->setText(this->setTextOptionInt(real_index, info->bot_rotation));
break;
default:
break;

View File

@@ -28,6 +28,7 @@ WindowScreen::WindowScreen(ScreenType stype, CaptureStatus* capture_status, Disp
this->offset_menu = new OffsetMenu(this->font_load_success, this->text_font);
this->rotation_menu = new RotationMenu(this->font_load_success, this->text_font);
this->audio_menu = new AudioMenu(this->font_load_success, this->text_font);
this->bfi_menu = new BFIMenu(this->font_load_success, this->text_font);
this->in_tex.create(IN_VIDEO_WIDTH, IN_VIDEO_HEIGHT);
this->m_in_rect_top.setTexture(&this->in_tex);
this->m_in_rect_bot.setTexture(&this->in_tex);
@@ -61,6 +62,7 @@ WindowScreen::~WindowScreen() {
delete this->offset_menu;
delete this->rotation_menu;
delete this->audio_menu;
delete this->bfi_menu;
}
void WindowScreen::build() {
@@ -241,6 +243,11 @@ void WindowScreen::ratio_change(bool top_priority) {
this->future_operations.call_screen_settings_update = true;
}
void WindowScreen::bfi_change() {
this->m_info.bfi = !this->m_info.bfi;
this->print_notification_on_off("BFI", this->m_info.bfi);
}
bool WindowScreen::common_poll(SFEvent &event_data) {
bool consumed = true;
switch(event_data.type) {
@@ -399,6 +406,35 @@ void WindowScreen::setup_audio_menu() {
}
}
void WindowScreen::setup_bfi_menu() {
if(this->curr_menu != BFI_MENU_TYPE) {
this->curr_menu = BFI_MENU_TYPE;
this->bfi_menu->reset_data();
this->bfi_menu->insert_data();
}
}
void WindowScreen::setup_load_menu() {
}
void WindowScreen::setup_save_menu() {
}
void WindowScreen::setup_resolution_menu() {
}
void WindowScreen::setup_extra_menu() {
}
void WindowScreen::setup_status_menu() {
}
void WindowScreen::setup_licenses_menu() {
}
void WindowScreen::setup_relative_pos_menu() {
}
bool WindowScreen::no_menu_poll(SFEvent &event_data) {
bool consumed = true;
switch(event_data.type) {
@@ -464,10 +500,9 @@ bool WindowScreen::main_poll(SFEvent &event_data) {
this->blur_change();
break;
case 'i':
this->m_info.bfi = !this->m_info.bfi;
this->print_notification_on_off("BFI", this->m_info.bfi);
break;
//case 'i':
// this->bfi_change();
// break;
case 'o':
this->m_prepare_open = true;
@@ -666,6 +701,23 @@ void WindowScreen::poll() {
case MAIN_MENU_AUDIO_SETTINGS:
this->setup_audio_menu();
return;
case MAIN_MENU_LOAD_PROFILES:
this->setup_load_menu();
return;
case MAIN_MENU_SAVE_PROFILES:
this->setup_save_menu();
return;
case MAIN_MENU_STATUS:
this->setup_status_menu();
return;
case MAIN_MENU_LICENSES:
this->setup_licenses_menu();
return;
case MAIN_MENU_EXTRA_SETTINGS:
this->setup_extra_menu();
return;
case MAIN_MENU_SHUTDOWN:
return;
default:
break;
}
@@ -773,11 +825,14 @@ void WindowScreen::poll() {
this->setup_offset_menu();
return;
case VIDEO_MENU_BFI_SETTINGS:
break;
this->setup_bfi_menu();
return;
case VIDEO_MENU_RESOLUTION_SETTINGS:
break;
this->setup_resolution_menu();
return;
case VIDEO_MENU_BOTTOM_SCREEN_POS:
break;
this->setup_relative_pos_menu();
return;
default:
break;
}
@@ -906,6 +961,46 @@ void WindowScreen::poll() {
continue;
}
break;
case BFI_MENU_TYPE:
if(this->bfi_menu->poll(event_data)) {
switch(this->bfi_menu->selected_index) {
case BFI_MENU_BACK:
this->setup_video_menu();
return;
case BFI_MENU_NO_ACTION:
break;
case BFI_MENU_TOGGLE:
this->bfi_change();
break;
case BFI_MENU_DIVIDER_DEC:
this->m_info.bfi_divider -= 1;
if(this->m_info.bfi_divider < 2)
this->m_info.bfi_divider = 2;
if(this->m_info.bfi_amount > (this->m_info.bfi_divider - 1))
this->m_info.bfi_amount = this->m_info.bfi_divider - 1;
break;
case BFI_MENU_DIVIDER_INC:
this->m_info.bfi_divider += 1;
if(this->m_info.bfi_divider > 10)
this->m_info.bfi_divider = 10;
break;
case BFI_MENU_AMOUNT_DEC:
this->m_info.bfi_amount -= 1;
if(this->m_info.bfi_amount < 1)
this->m_info.bfi_amount = 1;
break;
case BFI_MENU_AMOUNT_INC:
this->m_info.bfi_amount += 1;
if(this->m_info.bfi_amount > (this->m_info.bfi_divider - 1))
this->m_info.bfi_amount = this->m_info.bfi_divider - 1;
break;
default:
break;
}
this->bfi_menu->reset_output_option();
continue;
}
break;
default:
break;
}
@@ -1019,6 +1114,9 @@ void WindowScreen::draw(double frame_time, VideoOutputData* out_buf) {
case AUDIO_MENU_TYPE:
this->audio_menu->prepare(this->loaded_info.menu_scaling_factor, view_size_x, view_size_y, this->audio_data);
break;
case BFI_MENU_TYPE:
this->bfi_menu->prepare(this->loaded_info.menu_scaling_factor, view_size_x, view_size_y, &this->loaded_info);
break;
default:
break;
}
@@ -1349,6 +1447,9 @@ void WindowScreen::display_data_to_window(bool actually_draw, bool is_debug) {
case AUDIO_MENU_TYPE:
this->audio_menu->draw(this->loaded_info.menu_scaling_factor, this->m_win);
break;
case BFI_MENU_TYPE:
this->bfi_menu->draw(this->loaded_info.menu_scaling_factor, this->m_win);
break;
default:
break;
}
@@ -1370,8 +1471,18 @@ void WindowScreen::window_render_call() {
if(this->loaded_info.bfi) {
if(this->frame_time > 0.0) {
sf::sleep(sf::seconds(frame_time / (this->loaded_info.bfi_divider * 1.1)));
this->display_data_to_window(false);
if(this->loaded_info.bfi_divider < 2)
this->loaded_info.bfi_divider = 2;
if(this->loaded_info.bfi_divider > 10)
this->loaded_info.bfi_divider = 10;
if(this->loaded_info.bfi_amount < 1)
this->loaded_info.bfi_amount = 1;
if(this->loaded_info.bfi_amount > (this->loaded_info.bfi_divider - 1))
this->loaded_info.bfi_amount = this->loaded_info.bfi_divider - 1;
for(int i = 0; i < this->loaded_info.bfi_amount; i++) {
sf::sleep(sf::seconds(frame_time / (this->loaded_info.bfi_divider * 1.1)));
this->display_data_to_window(false);
}
}
}
}

View File

@@ -224,6 +224,10 @@ static void mainVideoOutputCall(AudioData* audio_data, CaptureData* capture_data
if(!skip_io) {
load(base_path, base_name, top_screen.m_info, bot_screen.m_info, joint_screen.m_info, frontend_data.display_data, audio_data, out_text_data);
// Due to the risk for seizures, at the start of the program, set BFI to false!
top_screen.m_info.bfi = false;
bot_screen.m_info.bfi = false;
joint_screen.m_info.bfi = false;
}
top_screen.build();

View File

@@ -181,7 +181,8 @@ void reset_screen_info(ScreenInfo &info) {
info.top_scaling = -1;
info.bot_scaling = -1;
info.bfi = false;
info.bfi_divider = 2.0;
info.bfi_divider = 2;
info.bfi_amount = 1;
info.menu_scaling_factor = 1.0;
info.rounded_corners_fix = false;
info.top_par = 0;
@@ -270,9 +271,21 @@ bool load_screen_info(std::string key, std::string value, std::string base, Scre
return true;
}
if(key == (base + "bfi_divider")) {
info.bfi_divider = std::stod(value);
if(info.bfi_divider < 1.0)
info.bfi_divider = 1.0;
info.bfi_divider = std::stoi(value);
if(info.bfi_divider < 2)
info.bfi_divider = 2;
if(info.bfi_divider > 10)
info.bfi_divider = 10;
if(info.bfi_amount > (info.bfi_divider - 1))
info.bfi_amount = info.bfi_divider - 1;
return true;
}
if(key == (base + "bfi_amount")) {
info.bfi_amount = std::stoi(value);
if(info.bfi_amount < 1)
info.bfi_amount = 1;
if(info.bfi_amount > (info.bfi_divider - 1))
info.bfi_amount = info.bfi_divider - 1;
return true;
}
if(key == (base + "menu_scaling_factor")) {
@@ -317,6 +330,7 @@ std::string save_screen_info(std::string base, const ScreenInfo &info) {
out += base + "bot_scaling=" + std::to_string(info.bot_scaling) + "\n";
out += base + "bfi=" + std::to_string(info.bfi) + "\n";
out += base + "bfi_divider=" + std::to_string(info.bfi_divider) + "\n";
out += base + "bfi_amount=" + std::to_string(info.bfi_amount) + "\n";
out += base + "menu_scaling_factor=" + std::to_string(info.menu_scaling_factor) + "\n";
out += base + "rounded_corners_fix=" + std::to_string(info.rounded_corners_fix) + "\n";
out += base + "top_par=" + std::to_string(info.top_par) + "\n";