From 754ad2de49d1c8ab89c3059fe4ea978196483660 Mon Sep 17 00:00:00 2001 From: Sergio Valor Date: Sun, 29 Mar 2026 09:09:22 +0200 Subject: [PATCH] comandos i tecles per a manejar el nou disseny de shaders --- data/locale/ca.yaml | 6 +- data/locale/en.yaml | 6 +- source/core/input/global_inputs.cpp | 41 +++++++------ source/core/rendering/render_info.cpp | 16 ++++-- source/core/rendering/screen.cpp | 33 ++++++++--- source/core/rendering/screen.hpp | 3 +- source/game/ui/console.cpp | 83 +++++++++++++++++++-------- 7 files changed, 130 insertions(+), 58 deletions(-) diff --git a/data/locale/ca.yaml b/data/locale/ca.yaml index 57250f5..f1b321a 100644 --- a/data/locale/ca.yaml +++ b/data/locale/ca.yaml @@ -108,9 +108,11 @@ ui: fullscreen_enabled: "PANTALLA COMPLETA ACTIVADA" fullscreen_disabled: "PANTALLA COMPLETA DESACTIVADA" window_zoom: "ZOOM FINESTRA x" - postfx_enabled: "POSTFX ACTIVAT" - postfx_disabled: "POSTFX DESACTIVAT" + shaders_enabled: "SHADERS ACTIVATS" + shaders_disabled: "SHADERS DESACTIVATS" + shader: "SHADER" postfx: "POSTFX" + crtpi: "CRTPI" supersampling_enabled: "SUPERMOSTREIG ACTIVAT" supersampling_disabled: "SUPERMOSTREIG DESACTIVAT" palette: "PALETA" diff --git a/data/locale/en.yaml b/data/locale/en.yaml index 843393f..bb9de52 100644 --- a/data/locale/en.yaml +++ b/data/locale/en.yaml @@ -108,9 +108,11 @@ ui: fullscreen_enabled: "FULLSCREEN ENABLED" fullscreen_disabled: "FULLSCREEN DISABLED" window_zoom: "WINDOW ZOOM x" - postfx_enabled: "POSTFX ENABLED" - postfx_disabled: "POSTFX DISABLED" + shaders_enabled: "SHADERS ON" + shaders_disabled: "SHADERS OFF" + shader: "SHADER" postfx: "POSTFX" + crtpi: "CRTPI" supersampling_enabled: "SUPERSAMPLING ON" supersampling_disabled: "SUPERSAMPLING OFF" palette: "PALETTE" diff --git a/source/core/input/global_inputs.cpp b/source/core/input/global_inputs.cpp index 5b95324..6497322 100644 --- a/source/core/input/global_inputs.cpp +++ b/source/core/input/global_inputs.cpp @@ -90,24 +90,33 @@ namespace GlobalInputs { } } - void handleTogglePostFX() { - Screen::get()->togglePostFX(); - Notifier::get()->show({Locale::get()->get(Options::video.postfx ? "ui.postfx_enabled" : "ui.postfx_disabled")}); // NOLINT(readability-static-accessed-through-instance) + void handleToggleShaders() { + Screen::get()->toggleShaders(); + Notifier::get()->show({Locale::get()->get(Options::video.postfx ? "ui.shaders_enabled" : "ui.shaders_disabled")}); // NOLINT(readability-static-accessed-through-instance) } - void handleToggleSupersampling() { - Screen::get()->toggleSupersampling(); - Notifier::get()->show({Locale::get()->get(Options::video.supersampling ? "ui.supersampling_enabled" : "ui.supersampling_disabled")}); // NOLINT(readability-static-accessed-through-instance) - } - - void handleNextPostFXPreset() { - if (!Options::postfx_presets.empty()) { - Options::current_postfx_preset = (Options::current_postfx_preset + 1) % static_cast(Options::postfx_presets.size()); - Screen::get()->reloadPostFX(); - Notifier::get()->show({Locale::get()->get("ui.postfx") + " " + Options::postfx_presets[static_cast(Options::current_postfx_preset)].name}); // NOLINT(readability-static-accessed-through-instance) + void handleNextShaderPreset() { + if (Options::current_shader == Rendering::ShaderType::CRTPI) { + if (!Options::crtpi_presets.empty()) { + Options::current_crtpi_preset = (Options::current_crtpi_preset + 1) % static_cast(Options::crtpi_presets.size()); + Screen::get()->reloadCrtPi(); + Notifier::get()->show({Locale::get()->get("ui.crtpi") + " " + Options::crtpi_presets[static_cast(Options::current_crtpi_preset)].name}); // NOLINT(readability-static-accessed-through-instance) + } + } else { + if (!Options::postfx_presets.empty()) { + Options::current_postfx_preset = (Options::current_postfx_preset + 1) % static_cast(Options::postfx_presets.size()); + Screen::get()->reloadPostFX(); + Notifier::get()->show({Locale::get()->get("ui.postfx") + " " + Options::postfx_presets[static_cast(Options::current_postfx_preset)].name}); // NOLINT(readability-static-accessed-through-instance) + } } } + void handleNextShader() { + Screen::get()->nextShader(); + Notifier::get()->show({Locale::get()->get("ui.shader") + " " + // NOLINT(readability-static-accessed-through-instance) + (Options::current_shader == Rendering::ShaderType::CRTPI ? "CRTPI" : "POSTFX")}); + } + void handleNextPalette() { Screen::get()->nextPalette(); Notifier::get()->show({Locale::get()->get("ui.palette") + " " + Options::video.palette}); // NOLINT(readability-static-accessed-through-instance) @@ -246,15 +255,15 @@ namespace GlobalInputs { break; case InputAction::TOGGLE_POSTFX: - handleTogglePostFX(); + handleToggleShaders(); break; case InputAction::NEXT_POSTFX_PRESET: - handleNextPostFXPreset(); + handleNextShaderPreset(); break; case InputAction::TOGGLE_SUPERSAMPLING: - handleToggleSupersampling(); + handleNextShader(); break; case InputAction::NEXT_PALETTE: diff --git a/source/core/rendering/render_info.cpp b/source/core/rendering/render_info.cpp index 12bb59e..79bb754 100644 --- a/source/core/rendering/render_info.cpp +++ b/source/core/rendering/render_info.cpp @@ -66,13 +66,21 @@ void RenderInfo::render() const { } line += " | " + zoom_str + "x"; - // PostFX: muestra preset y supersampling, o nada si está desactivado + // PostFX: muestra shader + preset y supersampling, o nada si está desactivado if (Options::video.postfx) { + const bool IS_CRTPI = (Options::current_shader == Rendering::ShaderType::CRTPI); + const std::string SHADER_NAME = IS_CRTPI ? "crtpi" : "postfx"; std::string preset_name = "-"; - if (!Options::postfx_presets.empty()) { - preset_name = Options::postfx_presets[static_cast(Options::current_postfx_preset)].name; + if (IS_CRTPI) { + if (!Options::crtpi_presets.empty()) { + preset_name = Options::crtpi_presets[static_cast(Options::current_crtpi_preset)].name; + } + } else { + if (!Options::postfx_presets.empty()) { + preset_name = Options::postfx_presets[static_cast(Options::current_postfx_preset)].name; + } } - line += " | " + preset_name + (Options::video.supersampling ? " (ss)" : ""); + line += " | " + SHADER_NAME + " " + preset_name + (Options::video.supersampling ? " (ss)" : ""); } // Todo en lowercase diff --git a/source/core/rendering/screen.cpp b/source/core/rendering/screen.cpp index 63cbb80..2736ff5 100644 --- a/source/core/rendering/screen.cpp +++ b/source/core/rendering/screen.cpp @@ -226,14 +226,21 @@ void Screen::renderNotifications() const { } } -// Cambia el estado del PostFX -void Screen::togglePostFX() { +// Activa/desactiva todos los shaders respetando el shader actualmente seleccionado +void Screen::toggleShaders() { Options::video.postfx = !Options::video.postfx; if (shader_backend_ && shader_backend_->isHardwareAccelerated()) { if (Options::video.postfx) { - applyCurrentPostFXPreset(); + // Activar: usar el shader actualmente seleccionado + if (Options::current_shader == Rendering::ShaderType::CRTPI) { + shader_backend_->setActiveShader(Rendering::ShaderType::CRTPI); + applyCurrentCrtPiPreset(); + } else { + applyCurrentPostFXPreset(); + } } else { - // Pass-through: efectos a 0, el shader copia la textura sin modificar + // Desactivar: pass-through con POSTFX (pipeline sin efecto) + shader_backend_->setActiveShader(Rendering::ShaderType::POSTFX); shader_backend_->setPostFXParams(Rendering::PostFXParams{}); } } else { @@ -252,6 +259,12 @@ void Screen::reloadPostFX() { } } +// Recarga el shader CrtPi del preset actual sin toggle +void Screen::reloadCrtPi() { + if (!shader_backend_) { return; } + applyCurrentCrtPiPreset(); +} + // Actualiza la lógica de la clase (versión nueva con delta_time para escenas migradas) void Screen::update(float delta_time) { fps_.calculate(SDL_GetTicks()); @@ -583,15 +596,17 @@ void Screen::applyCurrentCrtPiPreset() { // NOLINT(readability-convert-member-f void Screen::setActiveShader(Rendering::ShaderType type) { Options::current_shader = type; if (!shader_backend_) { return; } + if (!Options::video.postfx) { + // Shaders desactivados: guardar preferencia pero mantener pass-through + shader_backend_->setActiveShader(Rendering::ShaderType::POSTFX); + shader_backend_->setPostFXParams(Rendering::PostFXParams{}); + return; + } shader_backend_->setActiveShader(type); if (type == Rendering::ShaderType::CRTPI) { applyCurrentCrtPiPreset(); } else { - if (Options::video.postfx) { - applyCurrentPostFXPreset(); - } else { - shader_backend_->setPostFXParams(Rendering::PostFXParams{}); - } + applyCurrentPostFXPreset(); } } diff --git a/source/core/rendering/screen.hpp b/source/core/rendering/screen.hpp index 72ed229..d784de4 100644 --- a/source/core/rendering/screen.hpp +++ b/source/core/rendering/screen.hpp @@ -55,9 +55,10 @@ class Screen { void nextPalette(); // Cambia a la siguiente paleta void previousPalette(); // Cambia a la paleta anterior void setPalete(); // Establece la paleta actual - void togglePostFX(); // Cambia el estado del PostFX + void toggleShaders(); // Activa/desactiva todos los shaders respetando current_shader void toggleSupersampling(); // Activa/desactiva el supersampling global void reloadPostFX(); // Recarga el shader del preset actual sin toggle + void reloadCrtPi(); // Recarga el shader CrtPi del preset actual sin toggle void setLinearUpscale(bool linear); // Upscale NEAREST (false) o LINEAR (true) en el paso SS void setDownscaleAlgo(int algo); // 0=bilinear legacy, 1=Lanczos2, 2=Lanczos3 void setActiveShader(Rendering::ShaderType type); // Cambia el shader de post-procesado activo diff --git a/source/game/ui/console.cpp b/source/game/ui/console.cpp index f837b4e..df87a3a 100644 --- a/source/game/ui/console.cpp +++ b/source/game/ui/console.cpp @@ -74,8 +74,9 @@ static auto parseTokens(const std::string& input) -> std::vector { // Texto de ayuda común para HELP y ? static void printHelp() { SDL_Log("=== JDD CONSOLE COMMANDS ==="); - SDL_Log(" SS [ON|OFF|SIZE] Supersampling (Ctrl+F4)"); - SDL_Log(" POSTFX [ON|OFF|NEXT] Post-FX / next preset (F4/Shift+F4)"); + SDL_Log(" SS [ON|OFF|SIZE] Supersampling"); + SDL_Log(" SHADERS [ON|OFF|NEXT [PRESET]] Toggle/next shader or preset (F4/Shift+F4)"); + SDL_Log(" SET SHADER [POSTFX|CRTPI] Set active shader"); SDL_Log(" BORDER [ON|OFF] Decorative border (B)"); SDL_Log(" FULLSCREEN [ON|OFF] Fullscreen mode (F3)"); SDL_Log(" ZOOM [UP|DOWN] Window zoom (F1/F2)"); @@ -108,7 +109,7 @@ static void printHelp() { // Tabla de comandos disponibles static const std::vector COMMANDS = { - // SS [ON|OFF|SIZE] — Supersampling (Ctrl+F4) + // SS [ON|OFF|SIZE] — Supersampling {.keyword = "SS", .execute = [](const std::vector& args) -> std::string { if (!args.empty() && args[0] == "SIZE") { if (!Options::video.supersampling) { return "Supersampling OFF"; } @@ -133,32 +134,48 @@ static const std::vector COMMANDS = { return "Usage: SS [ON|OFF|SIZE]"; }}, - // POSTFX [ON|OFF|NEXT] — PostFX y presets (F4 / Shift+F4) - {.keyword = "POSTFX", .execute = [](const std::vector& args) -> std::string { + // SHADERS [ON|OFF|NEXT [PRESET]] — Toggle/cicla shaders (F4 / Shift+F4 / Ctrl+F4) + {.keyword = "SHADERS", .execute = [](const std::vector& args) -> std::string { if (args.empty()) { - Screen::get()->togglePostFX(); - return std::string("PostFX ") + (Options::video.postfx ? "ON" : "OFF"); + Screen::get()->toggleShaders(); + return std::string("Shaders ") + (Options::video.postfx ? "ON" : "OFF"); } if (args[0] == "ON") { - if (Options::video.postfx) { return "PostFX already ON"; } - Screen::get()->togglePostFX(); - return "PostFX ON"; + if (Options::video.postfx) { return "Shaders already ON"; } + Screen::get()->toggleShaders(); + return "Shaders ON"; } if (args[0] == "OFF") { - if (!Options::video.postfx) { return "PostFX already OFF"; } - Screen::get()->togglePostFX(); - return "PostFX OFF"; + if (!Options::video.postfx) { return "Shaders already OFF"; } + Screen::get()->toggleShaders(); + return "Shaders OFF"; } if (args[0] == "NEXT") { - if (Options::postfx_presets.empty()) { return "No presets available"; } - Options::current_postfx_preset = - (Options::current_postfx_preset + 1) % - static_cast(Options::postfx_presets.size()); - Screen::get()->reloadPostFX(); - return "PostFX preset: " + - Options::postfx_presets[static_cast(Options::current_postfx_preset)].name; + // SHADERS NEXT PRESET → cicla presets del shader activo + if (args.size() >= 2 && args[1] == "PRESET") { + if (Options::current_shader == Rendering::ShaderType::CRTPI) { + if (Options::crtpi_presets.empty()) { return "No CrtPi presets available"; } + Options::current_crtpi_preset = + (Options::current_crtpi_preset + 1) % + static_cast(Options::crtpi_presets.size()); + Screen::get()->reloadCrtPi(); + return "CrtPi preset: " + + Options::crtpi_presets[static_cast(Options::current_crtpi_preset)].name; + } + if (Options::postfx_presets.empty()) { return "No PostFX presets available"; } + Options::current_postfx_preset = + (Options::current_postfx_preset + 1) % + static_cast(Options::postfx_presets.size()); + Screen::get()->reloadPostFX(); + return "PostFX preset: " + + Options::postfx_presets[static_cast(Options::current_postfx_preset)].name; + } + // SHADERS NEXT → cicla entre tipos de shader (POSTFX ↔ CRTPI) + Screen::get()->nextShader(); + return std::string("Shader: ") + + (Options::current_shader == Rendering::ShaderType::CRTPI ? "CRTPI" : "POSTFX"); } - return "Usage: POSTFX [ON|OFF|NEXT]"; + return "Usage: SHADERS [ON|OFF|NEXT [PRESET]]"; }}, // BORDER [ON|OFF] — Borde decorativo (B) @@ -451,10 +468,26 @@ static const std::vector COMMANDS = { return "Jail closed"; }}, - // SET INITIAL [ROOM|POS] — guarda habitación/posición actual como inicio en debug.yaml; solo escena GAME +#endif + + // SET SHADER [POSTFX|CRTPI] — Activa un shader concreto (disponible en todos los builds) + // SET INITIAL [ROOM|POS] — Guarda habitación/posición actual como inicio (solo _DEBUG, GAME) {.keyword = "SET", .execute = [](const std::vector& args) -> std::string { + if (!args.empty() && args[0] == "SHADER") { + if (args.size() < 2) { return "Usage: SET SHADER [POSTFX|CRTPI]"; } + if (args[1] == "POSTFX") { + Screen::get()->setActiveShader(Rendering::ShaderType::POSTFX); + return "Shader set to POSTFX"; + } + if (args[1] == "CRTPI") { + Screen::get()->setActiveShader(Rendering::ShaderType::CRTPI); + return "Shader set to CRTPI"; + } + return "Usage: SET SHADER [POSTFX|CRTPI]"; + } +#ifdef _DEBUG if (SceneManager::current != SceneManager::Scene::GAME) { return "Only available in GAME scene"; } - if (args.empty() || args[0] != "INITIAL") { return "Usage: SET INITIAL [ROOM|POS]"; } + if (args.empty() || args[0] != "INITIAL") { return "Usage: SET INITIAL [ROOM|POS] | SET SHADER [POSTFX|CRTPI]"; } const bool DO_ROOM = args.size() == 1 || (args.size() >= 2 && args[1] == "ROOM"); const bool DO_POS = args.size() == 1 || (args.size() >= 2 && args[1] == "POS"); @@ -469,8 +502,10 @@ static const std::vector COMMANDS = { result += GameControl::set_initial_pos(); } return result; - }}, +#else + return "Usage: SET SHADER [POSTFX|CRTPI]"; #endif + }}, // SCENE [LOGO|LOADING|TITLE|CREDITS|GAME|ENDING|ENDING2|RESTART] — Cambiar o reiniciar escena {.keyword = "SCENE", .execute = [](const std::vector& args) -> std::string {