comandos i tecles per a manejar el nou disseny de shaders

This commit is contained in:
2026-03-29 09:09:22 +02:00
parent a9b7c3f025
commit 754ad2de49
7 changed files with 130 additions and 58 deletions

View File

@@ -108,9 +108,11 @@ ui:
fullscreen_enabled: "PANTALLA COMPLETA ACTIVADA" fullscreen_enabled: "PANTALLA COMPLETA ACTIVADA"
fullscreen_disabled: "PANTALLA COMPLETA DESACTIVADA" fullscreen_disabled: "PANTALLA COMPLETA DESACTIVADA"
window_zoom: "ZOOM FINESTRA x" window_zoom: "ZOOM FINESTRA x"
postfx_enabled: "POSTFX ACTIVAT" shaders_enabled: "SHADERS ACTIVATS"
postfx_disabled: "POSTFX DESACTIVAT" shaders_disabled: "SHADERS DESACTIVATS"
shader: "SHADER"
postfx: "POSTFX" postfx: "POSTFX"
crtpi: "CRTPI"
supersampling_enabled: "SUPERMOSTREIG ACTIVAT" supersampling_enabled: "SUPERMOSTREIG ACTIVAT"
supersampling_disabled: "SUPERMOSTREIG DESACTIVAT" supersampling_disabled: "SUPERMOSTREIG DESACTIVAT"
palette: "PALETA" palette: "PALETA"

View File

@@ -108,9 +108,11 @@ ui:
fullscreen_enabled: "FULLSCREEN ENABLED" fullscreen_enabled: "FULLSCREEN ENABLED"
fullscreen_disabled: "FULLSCREEN DISABLED" fullscreen_disabled: "FULLSCREEN DISABLED"
window_zoom: "WINDOW ZOOM x" window_zoom: "WINDOW ZOOM x"
postfx_enabled: "POSTFX ENABLED" shaders_enabled: "SHADERS ON"
postfx_disabled: "POSTFX DISABLED" shaders_disabled: "SHADERS OFF"
shader: "SHADER"
postfx: "POSTFX" postfx: "POSTFX"
crtpi: "CRTPI"
supersampling_enabled: "SUPERSAMPLING ON" supersampling_enabled: "SUPERSAMPLING ON"
supersampling_disabled: "SUPERSAMPLING OFF" supersampling_disabled: "SUPERSAMPLING OFF"
palette: "PALETTE" palette: "PALETTE"

View File

@@ -90,24 +90,33 @@ namespace GlobalInputs {
} }
} }
void handleTogglePostFX() { void handleToggleShaders() {
Screen::get()->togglePostFX(); Screen::get()->toggleShaders();
Notifier::get()->show({Locale::get()->get(Options::video.postfx ? "ui.postfx_enabled" : "ui.postfx_disabled")}); // NOLINT(readability-static-accessed-through-instance) Notifier::get()->show({Locale::get()->get(Options::video.postfx ? "ui.shaders_enabled" : "ui.shaders_disabled")}); // NOLINT(readability-static-accessed-through-instance)
} }
void handleToggleSupersampling() { void handleNextShaderPreset() {
Screen::get()->toggleSupersampling(); if (Options::current_shader == Rendering::ShaderType::CRTPI) {
Notifier::get()->show({Locale::get()->get(Options::video.supersampling ? "ui.supersampling_enabled" : "ui.supersampling_disabled")}); // NOLINT(readability-static-accessed-through-instance) if (!Options::crtpi_presets.empty()) {
} Options::current_crtpi_preset = (Options::current_crtpi_preset + 1) % static_cast<int>(Options::crtpi_presets.size());
Screen::get()->reloadCrtPi();
void handleNextPostFXPreset() { Notifier::get()->show({Locale::get()->get("ui.crtpi") + " " + Options::crtpi_presets[static_cast<size_t>(Options::current_crtpi_preset)].name}); // NOLINT(readability-static-accessed-through-instance)
if (!Options::postfx_presets.empty()) { }
Options::current_postfx_preset = (Options::current_postfx_preset + 1) % static_cast<int>(Options::postfx_presets.size()); } else {
Screen::get()->reloadPostFX(); if (!Options::postfx_presets.empty()) {
Notifier::get()->show({Locale::get()->get("ui.postfx") + " " + Options::postfx_presets[static_cast<size_t>(Options::current_postfx_preset)].name}); // NOLINT(readability-static-accessed-through-instance) Options::current_postfx_preset = (Options::current_postfx_preset + 1) % static_cast<int>(Options::postfx_presets.size());
Screen::get()->reloadPostFX();
Notifier::get()->show({Locale::get()->get("ui.postfx") + " " + Options::postfx_presets[static_cast<size_t>(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() { void handleNextPalette() {
Screen::get()->nextPalette(); Screen::get()->nextPalette();
Notifier::get()->show({Locale::get()->get("ui.palette") + " " + Options::video.palette}); // NOLINT(readability-static-accessed-through-instance) Notifier::get()->show({Locale::get()->get("ui.palette") + " " + Options::video.palette}); // NOLINT(readability-static-accessed-through-instance)
@@ -246,15 +255,15 @@ namespace GlobalInputs {
break; break;
case InputAction::TOGGLE_POSTFX: case InputAction::TOGGLE_POSTFX:
handleTogglePostFX(); handleToggleShaders();
break; break;
case InputAction::NEXT_POSTFX_PRESET: case InputAction::NEXT_POSTFX_PRESET:
handleNextPostFXPreset(); handleNextShaderPreset();
break; break;
case InputAction::TOGGLE_SUPERSAMPLING: case InputAction::TOGGLE_SUPERSAMPLING:
handleToggleSupersampling(); handleNextShader();
break; break;
case InputAction::NEXT_PALETTE: case InputAction::NEXT_PALETTE:

View File

@@ -66,13 +66,21 @@ void RenderInfo::render() const {
} }
line += " | " + zoom_str + "x"; 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) { 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 = "-"; std::string preset_name = "-";
if (!Options::postfx_presets.empty()) { if (IS_CRTPI) {
preset_name = Options::postfx_presets[static_cast<size_t>(Options::current_postfx_preset)].name; if (!Options::crtpi_presets.empty()) {
preset_name = Options::crtpi_presets[static_cast<size_t>(Options::current_crtpi_preset)].name;
}
} else {
if (!Options::postfx_presets.empty()) {
preset_name = Options::postfx_presets[static_cast<size_t>(Options::current_postfx_preset)].name;
}
} }
line += " | " + preset_name + (Options::video.supersampling ? " (ss)" : ""); line += " | " + SHADER_NAME + " " + preset_name + (Options::video.supersampling ? " (ss)" : "");
} }
// Todo en lowercase // Todo en lowercase

View File

@@ -226,14 +226,21 @@ void Screen::renderNotifications() const {
} }
} }
// Cambia el estado del PostFX // Activa/desactiva todos los shaders respetando el shader actualmente seleccionado
void Screen::togglePostFX() { void Screen::toggleShaders() {
Options::video.postfx = !Options::video.postfx; Options::video.postfx = !Options::video.postfx;
if (shader_backend_ && shader_backend_->isHardwareAccelerated()) { if (shader_backend_ && shader_backend_->isHardwareAccelerated()) {
if (Options::video.postfx) { 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 { } 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{}); shader_backend_->setPostFXParams(Rendering::PostFXParams{});
} }
} else { } 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) // Actualiza la lógica de la clase (versión nueva con delta_time para escenas migradas)
void Screen::update(float delta_time) { void Screen::update(float delta_time) {
fps_.calculate(SDL_GetTicks()); fps_.calculate(SDL_GetTicks());
@@ -583,15 +596,17 @@ void Screen::applyCurrentCrtPiPreset() { // NOLINT(readability-convert-member-f
void Screen::setActiveShader(Rendering::ShaderType type) { void Screen::setActiveShader(Rendering::ShaderType type) {
Options::current_shader = type; Options::current_shader = type;
if (!shader_backend_) { return; } 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); shader_backend_->setActiveShader(type);
if (type == Rendering::ShaderType::CRTPI) { if (type == Rendering::ShaderType::CRTPI) {
applyCurrentCrtPiPreset(); applyCurrentCrtPiPreset();
} else { } else {
if (Options::video.postfx) { applyCurrentPostFXPreset();
applyCurrentPostFXPreset();
} else {
shader_backend_->setPostFXParams(Rendering::PostFXParams{});
}
} }
} }

View File

@@ -55,9 +55,10 @@ class Screen {
void nextPalette(); // Cambia a la siguiente paleta void nextPalette(); // Cambia a la siguiente paleta
void previousPalette(); // Cambia a la paleta anterior void previousPalette(); // Cambia a la paleta anterior
void setPalete(); // Establece la paleta actual 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 toggleSupersampling(); // Activa/desactiva el supersampling global
void reloadPostFX(); // Recarga el shader del preset actual sin toggle 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 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 setDownscaleAlgo(int algo); // 0=bilinear legacy, 1=Lanczos2, 2=Lanczos3
void setActiveShader(Rendering::ShaderType type); // Cambia el shader de post-procesado activo void setActiveShader(Rendering::ShaderType type); // Cambia el shader de post-procesado activo

View File

@@ -74,8 +74,9 @@ static auto parseTokens(const std::string& input) -> std::vector<std::string> {
// Texto de ayuda común para HELP y ? // Texto de ayuda común para HELP y ?
static void printHelp() { static void printHelp() {
SDL_Log("=== JDD CONSOLE COMMANDS ==="); SDL_Log("=== JDD CONSOLE COMMANDS ===");
SDL_Log(" SS [ON|OFF|SIZE] Supersampling (Ctrl+F4)"); SDL_Log(" SS [ON|OFF|SIZE] Supersampling");
SDL_Log(" POSTFX [ON|OFF|NEXT] Post-FX / next preset (F4/Shift+F4)"); 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(" BORDER [ON|OFF] Decorative border (B)");
SDL_Log(" FULLSCREEN [ON|OFF] Fullscreen mode (F3)"); SDL_Log(" FULLSCREEN [ON|OFF] Fullscreen mode (F3)");
SDL_Log(" ZOOM [UP|DOWN] Window zoom (F1/F2)"); SDL_Log(" ZOOM [UP|DOWN] Window zoom (F1/F2)");
@@ -108,7 +109,7 @@ static void printHelp() {
// Tabla de comandos disponibles // Tabla de comandos disponibles
static const std::vector<ConsoleCommand> COMMANDS = { static const std::vector<ConsoleCommand> COMMANDS = {
// SS [ON|OFF|SIZE] — Supersampling (Ctrl+F4) // SS [ON|OFF|SIZE] — Supersampling
{.keyword = "SS", .execute = [](const std::vector<std::string>& args) -> std::string { {.keyword = "SS", .execute = [](const std::vector<std::string>& args) -> std::string {
if (!args.empty() && args[0] == "SIZE") { if (!args.empty() && args[0] == "SIZE") {
if (!Options::video.supersampling) { return "Supersampling OFF"; } if (!Options::video.supersampling) { return "Supersampling OFF"; }
@@ -133,32 +134,48 @@ static const std::vector<ConsoleCommand> COMMANDS = {
return "Usage: SS [ON|OFF|SIZE]"; return "Usage: SS [ON|OFF|SIZE]";
}}, }},
// POSTFX [ON|OFF|NEXT] — PostFX y presets (F4 / Shift+F4) // SHADERS [ON|OFF|NEXT [PRESET]] — Toggle/cicla shaders (F4 / Shift+F4 / Ctrl+F4)
{.keyword = "POSTFX", .execute = [](const std::vector<std::string>& args) -> std::string { {.keyword = "SHADERS", .execute = [](const std::vector<std::string>& args) -> std::string {
if (args.empty()) { if (args.empty()) {
Screen::get()->togglePostFX(); Screen::get()->toggleShaders();
return std::string("PostFX ") + (Options::video.postfx ? "ON" : "OFF"); return std::string("Shaders ") + (Options::video.postfx ? "ON" : "OFF");
} }
if (args[0] == "ON") { if (args[0] == "ON") {
if (Options::video.postfx) { return "PostFX already ON"; } if (Options::video.postfx) { return "Shaders already ON"; }
Screen::get()->togglePostFX(); Screen::get()->toggleShaders();
return "PostFX ON"; return "Shaders ON";
} }
if (args[0] == "OFF") { if (args[0] == "OFF") {
if (!Options::video.postfx) { return "PostFX already OFF"; } if (!Options::video.postfx) { return "Shaders already OFF"; }
Screen::get()->togglePostFX(); Screen::get()->toggleShaders();
return "PostFX OFF"; return "Shaders OFF";
} }
if (args[0] == "NEXT") { if (args[0] == "NEXT") {
if (Options::postfx_presets.empty()) { return "No presets available"; } // SHADERS NEXT PRESET → cicla presets del shader activo
Options::current_postfx_preset = if (args.size() >= 2 && args[1] == "PRESET") {
(Options::current_postfx_preset + 1) % if (Options::current_shader == Rendering::ShaderType::CRTPI) {
static_cast<int>(Options::postfx_presets.size()); if (Options::crtpi_presets.empty()) { return "No CrtPi presets available"; }
Screen::get()->reloadPostFX(); Options::current_crtpi_preset =
return "PostFX preset: " + (Options::current_crtpi_preset + 1) %
Options::postfx_presets[static_cast<size_t>(Options::current_postfx_preset)].name; static_cast<int>(Options::crtpi_presets.size());
Screen::get()->reloadCrtPi();
return "CrtPi preset: " +
Options::crtpi_presets[static_cast<size_t>(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<int>(Options::postfx_presets.size());
Screen::get()->reloadPostFX();
return "PostFX preset: " +
Options::postfx_presets[static_cast<size_t>(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) // BORDER [ON|OFF] — Borde decorativo (B)
@@ -451,10 +468,26 @@ static const std::vector<ConsoleCommand> COMMANDS = {
return "Jail closed"; 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<std::string>& args) -> std::string { {.keyword = "SET", .execute = [](const std::vector<std::string>& 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 (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_ROOM = args.size() == 1 || (args.size() >= 2 && args[1] == "ROOM");
const bool DO_POS = args.size() == 1 || (args.size() >= 2 && args[1] == "POS"); const bool DO_POS = args.size() == 1 || (args.size() >= 2 && args[1] == "POS");
@@ -469,8 +502,10 @@ static const std::vector<ConsoleCommand> COMMANDS = {
result += GameControl::set_initial_pos(); result += GameControl::set_initial_pos();
} }
return result; return result;
}}, #else
return "Usage: SET SHADER [POSTFX|CRTPI]";
#endif #endif
}},
// SCENE [LOGO|LOADING|TITLE|CREDITS|GAME|ENDING|ENDING2|RESTART] — Cambiar o reiniciar escena // SCENE [LOGO|LOADING|TITLE|CREDITS|GAME|ENDING|ENDING2|RESTART] — Cambiar o reiniciar escena
{.keyword = "SCENE", .execute = [](const std::vector<std::string>& args) -> std::string { {.keyword = "SCENE", .execute = [](const std::vector<std::string>& args) -> std::string {