presets en postfx

This commit is contained in:
2026-03-21 13:57:18 +01:00
parent 2b2eb31c67
commit 6996b3a82a
11 changed files with 206 additions and 42 deletions

View File

@@ -31,7 +31,7 @@ namespace Video {
constexpr bool FULLSCREEN = false; // Modo de pantalla completa por defecto (false = ventana)
constexpr Screen::Filter FILTER = Screen::Filter::NEAREST; // Filtro por defecto
constexpr bool VERTICAL_SYNC = true; // Vsync activado por defecto
constexpr bool SHADERS = false; // Shaders desactivados por defecto
constexpr bool POSTFX = false; // PostFX desactivado por defecto
constexpr bool INTEGER_SCALE = true; // Escalado entero activado por defecto
constexpr bool KEEP_ASPECT = true; // Mantener aspecto activado por defecto
constexpr const char* PALETTE_NAME = "zx-spectrum"; // Paleta por defecto

View File

@@ -329,11 +329,11 @@ void loadBasicVideoFieldsFromYaml(const fkyaml::node& vid) {
}
}
if (vid.contains("shaders")) {
if (vid.contains("postfx")) {
try {
video.shaders = vid["shaders"].get_value<bool>();
video.postfx = vid["postfx"].get_value<bool>();
} catch (...) {
video.shaders = Defaults::Video::SHADERS;
video.postfx = Defaults::Video::POSTFX;
}
}
@@ -606,7 +606,7 @@ auto saveToFile() -> bool {
file << "video:\n";
file << " fullscreen: " << (video.fullscreen ? "true" : "false") << "\n";
file << " filter: " << filterToString(video.filter) << " # filter: nearest (pixel perfect) | linear (smooth)\n";
file << " shaders: " << (video.shaders ? "true" : "false") << "\n";
file << " postfx: " << (video.postfx ? "true" : "false") << "\n";
file << " vertical_sync: " << (video.vertical_sync ? "true" : "false") << "\n";
file << " integer_scale: " << (video.integer_scale ? "true" : "false") << "\n";
file << " keep_aspect: " << (video.keep_aspect ? "true" : "false") << "\n";
@@ -649,4 +649,97 @@ auto saveToFile() -> bool {
return true;
}
// Establece la ruta del fichero de PostFX
void setPostFXFile(const std::string& path) {
postfx_file_path = path;
}
// Carga los presets de PostFX desde el fichero
auto loadPostFXFromFile() -> bool {
postfx_presets.clear();
current_postfx_preset = 0;
std::ifstream file(postfx_file_path);
if (!file.good()) {
if (console) {
std::cout << "PostFX file not found, creating default: " << postfx_file_path << '\n';
}
return savePostFXToFile();
}
std::string content((std::istreambuf_iterator<char>(file)), std::istreambuf_iterator<char>());
file.close();
try {
auto yaml = fkyaml::node::deserialize(content);
if (yaml.contains("presets")) {
const auto& presets = yaml["presets"];
for (size_t i = 0; i < presets.size(); ++i) {
const auto& p = presets[i];
PostFXPreset preset;
if (p.contains("name")) {
preset.name = p["name"].get_value<std::string>();
}
if (p.contains("vertex")) {
preset.vertex = p["vertex"].get_value<std::string>();
}
if (p.contains("fragment")) {
preset.fragment = p["fragment"].get_value<std::string>();
}
postfx_presets.push_back(preset);
}
}
if (console) {
std::cout << "PostFX file loaded: " << postfx_presets.size() << " preset(s)\n";
}
return true;
} catch (const fkyaml::exception& e) {
if (console) {
std::cerr << "Error parsing PostFX YAML: " << e.what() << '\n';
}
return savePostFXToFile();
}
}
// Guarda los presets de PostFX por defecto
auto savePostFXToFile() -> bool {
if (postfx_file_path.empty()) {
return false;
}
std::ofstream file(postfx_file_path);
if (!file.is_open()) {
if (console) {
std::cerr << "Error: Unable to open file " << postfx_file_path << " for writing\n";
}
return false;
}
file << "# JailDoctor's Dilemma - PostFX Presets\n";
file << "# Add or modify presets to customize post-processing effects.\n";
file << "# vertex and fragment reference shader filenames from the shaders directory.\n";
file << "\n";
file << "presets:\n";
file << " - name: \"CRT\"\n";
file << " vertex: \"crtpi_vertex.glsl\"\n";
file << " fragment: \"crtpi_fragment.glsl\"\n";
file.close();
if (console) {
std::cout << "PostFX file created with defaults: " << postfx_file_path << '\n';
}
// Cargar los presets recién creados
postfx_presets.clear();
postfx_presets.push_back({"CRT", "crtpi_vertex.glsl", "crtpi_fragment.glsl"});
current_postfx_preset = 0;
return true;
}
} // namespace Options

View File

@@ -5,6 +5,7 @@
#include <algorithm>
#include <string> // Para string, basic_string
#include <utility>
#include <vector> // Para vector
#include "core/rendering/screen.hpp" // Para Screen::Filter
#include "game/defaults.hpp"
@@ -79,7 +80,7 @@ struct Video {
bool fullscreen{Defaults::Video::FULLSCREEN}; // Contiene el valor del modo de pantalla completa
Screen::Filter filter{Defaults::Video::FILTER}; // Filtro usado para el escalado de la imagen
bool vertical_sync{Defaults::Video::VERTICAL_SYNC}; // Indica si se quiere usar vsync o no
bool shaders{Defaults::Video::SHADERS}; // Indica si se van a usar shaders o no
bool postfx{Defaults::Video::POSTFX}; // Indica si se van a usar efectos PostFX o no
bool integer_scale{Defaults::Video::INTEGER_SCALE}; // Indica si el escalado de la imagen ha de ser entero en el modo a pantalla completa
bool keep_aspect{Defaults::Video::KEEP_ASPECT}; // Indica si se ha de mantener la relación de aspecto al poner el modo a pantalla completa
Border border{}; // Borde de la pantalla
@@ -113,6 +114,13 @@ struct Game {
float height{Defaults::Canvas::HEIGHT}; // Alto de la resolucion del juego
};
// Estructura para un preset de PostFX
struct PostFXPreset {
std::string name; // Nombre del preset
std::string vertex; // Nombre del fichero vertex shader
std::string fragment; // Nombre del fichero fragment shader
};
// --- Variables globales ---
inline std::string version{}; // Versión del fichero de configuración. Sirve para saber si las opciones son compatibles
inline bool console{false}; // Indica si ha de mostrar información por la consola de texto
@@ -129,10 +137,18 @@ inline Kiosk kiosk{}; // Opciones del modo kiosko
// Ruta completa del fichero de configuración (establecida mediante setConfigFile)
inline std::string config_file_path{};
// --- Variables PostFX ---
inline std::vector<PostFXPreset> postfx_presets{}; // Lista de presets de PostFX
inline int current_postfx_preset{0}; // Índice del preset de PostFX actual
inline std::string postfx_file_path{}; // Ruta del fichero postfx.yaml
// --- Funciones públicas ---
void init(); // Crea e inicializa las opciones del programa
void setConfigFile(const std::string& path); // Establece la ruta del fichero de configuración
auto loadFromFile() -> bool; // Carga las opciones desde el fichero configurado
auto saveToFile() -> bool; // Guarda las opciones al fichero configurado
void init(); // Crea e inicializa las opciones del programa
void setConfigFile(const std::string& path); // Establece la ruta del fichero de configuración
auto loadFromFile() -> bool; // Carga las opciones desde el fichero configurado
auto saveToFile() -> bool; // Guarda las opciones al fichero configurado
void setPostFXFile(const std::string& path); // Establece la ruta del fichero de PostFX
auto loadPostFXFromFile() -> bool; // Carga los presets de PostFX desde el fichero
auto savePostFXToFile() -> bool; // Guarda los presets de PostFX por defecto
} // namespace Options