424d0d2b89
Resuelve la categoría de findings de tidy que son bugs reales o cambios
de tipo concretos, no transforms automáticos:
Bugs reales (bugprone-* y clang-diagnostic-*):
- bugprone-empty-catch en postfx_config.cpp: el catch silencioso del
parser RGB era intencional (fallback a defaults si el array no parsea
como int). Marcado con @INTENTIONAL (keyword ya configurado en
.clang-tidy via bugprone-empty-catch.IgnoreCatchWithKeywords) y
comentario ampliado explicando la decisión.
- clang-diagnostic-unused-private-field en Starfield: el campo
'densitat_' se asignaba en el constructor pero nunca se leía. El
parámetro 'densitat' se reparte directamente en las CapaConfig al
construir, así que el field era código muerto. Eliminado.
- bugprone-branch-clone en vector_text.cpp: el switch de
get_shape_filename tenía dos grupos consecutivos (dígitos 0-9 y
mayúsculas A-Z) con cuerpo idéntico. Fusionados en un único case con
comentario explicando que comparten path porque la shape se llama
igual que el caracter.
- bugprone-switch-missing-default-case en Input::handleEvent: el switch
manejaba solo SDL_EVENT_GAMEPAD_ADDED/REMOVED y caía por fall-through
a un return {} fuera del switch. Añadido default: explícito con
comentario sobre qué hace Input vs el resto del sistema.
- bugprone-implicit-widening-of-multiplication-result en
GameScene::bullets_ y Collision::Context::bullets: 'MAX_BALES * 2'
es int*int y se widening implícitamente a std::size_t para el
template arg de std::array. Cast explícito a size_t en ambos sitios.
Otros mecánicos:
- performance-enum-size: 10 enums sin tipo subyacente pasaron a
': std::uint8_t' (PrimitiveType, InputAction, Mode, SceneType,
Option, AnimationState, TitleState, ModeSpawn, EstatStage,
ShipState). #include <cstdint> añadido donde faltaba.
- modernize-use-equals-default en SpawnController: el ctor por
defecto tenía cuerpo vacío ({}). Pasado a '= default;'.
Cero supresiones. La única "marca" es @INTENTIONAL en el empty-catch,
que es el mecanismo configurado en el .clang-tidy del proyecto para
distinguir intencionales de accidentales.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
111 lines
4.2 KiB
C++
111 lines
4.2 KiB
C++
// postfx_config.cpp - Implementación del cargador de YAML del postpro.
|
|
|
|
#include "core/config/postfx_config.hpp"
|
|
|
|
#include <iostream>
|
|
|
|
#include "core/resources/resource_helper.hpp"
|
|
#include "external/fkyaml_node.hpp"
|
|
|
|
namespace Config::PostFx {
|
|
|
|
namespace {
|
|
|
|
// Helper: lee `key` en `node` solo si existe; deja `dst` intacto en caso
|
|
// contrario. Así, un YAML parcial sigue funcionando con los defaults del
|
|
// struct para los campos que falten.
|
|
template <typename T>
|
|
void readField(const fkyaml::node& node, const char* key, T& dst) {
|
|
if (node.contains(key)) {
|
|
dst = node[key].get_value<T>();
|
|
}
|
|
}
|
|
|
|
// Lee un array RGB [r, g, b] (0..255) y lo normaliza a [0..1] sobre tres
|
|
// destinos floats. Si la clave no existe o no es secuencia de 3, deja los
|
|
// destinos como están.
|
|
void readRgb255(const fkyaml::node& node, const char* key,
|
|
float& dst_r, float& dst_g, float& dst_b) {
|
|
if (!node.contains(key)) {
|
|
return;
|
|
}
|
|
const auto& arr = node[key];
|
|
if (!arr.is_sequence() || arr.size() < 3) {
|
|
return;
|
|
}
|
|
try {
|
|
const auto R = arr[0].get_value<int>();
|
|
const auto G = arr[1].get_value<int>();
|
|
const auto B = arr[2].get_value<int>();
|
|
dst_r = static_cast<float>(R) / 255.0F;
|
|
dst_g = static_cast<float>(G) / 255.0F;
|
|
dst_b = static_cast<float>(B) / 255.0F;
|
|
} catch (...) { // @INTENTIONAL
|
|
// Mantiene los defaults si algún elemento del RGB no es entero parseable
|
|
// (el YAML viene de archivo, así que es razonable degradar a los defaults
|
|
// en vez de propagar la excepción y abortar el load del postpro entero).
|
|
}
|
|
}
|
|
|
|
} // namespace
|
|
|
|
auto load(const std::string& path) -> Rendering::GPU::PostFxParams {
|
|
Rendering::GPU::PostFxParams params{}; // valores por defecto del struct
|
|
|
|
auto bytes = Resource::Helper::loadFile(path);
|
|
if (bytes.empty()) {
|
|
std::cerr << "[PostFxConfig] No se pudo cargar " << path
|
|
<< " — usando defaults built-in\n";
|
|
return params;
|
|
}
|
|
|
|
try {
|
|
const auto* begin = reinterpret_cast<const char*>(bytes.data());
|
|
const auto* end = begin + bytes.size();
|
|
auto yaml = fkyaml::node::deserialize(begin, end);
|
|
|
|
if (yaml.contains("bloom") && yaml["bloom"].is_mapping()) {
|
|
const auto& node = yaml["bloom"];
|
|
readField(node, "enabled", params.bloom_enabled);
|
|
readField(node, "intensity", params.bloom_intensity);
|
|
readField(node, "threshold", params.bloom_threshold);
|
|
readField(node, "radius_px", params.bloom_radius_px);
|
|
}
|
|
|
|
if (yaml.contains("flicker") && yaml["flicker"].is_mapping()) {
|
|
const auto& node = yaml["flicker"];
|
|
readField(node, "enabled", params.flicker_enabled);
|
|
readField(node, "amplitude", params.flicker_amplitude);
|
|
readField(node, "frequency_hz", params.flicker_frequency_hz);
|
|
}
|
|
|
|
if (yaml.contains("background") && yaml["background"].is_mapping()) {
|
|
const auto& node = yaml["background"];
|
|
readField(node, "enabled", params.background_enabled);
|
|
readRgb255(node, "color_min",
|
|
params.background_min_r,
|
|
params.background_min_g,
|
|
params.background_min_b);
|
|
readRgb255(node, "color_max",
|
|
params.background_max_r,
|
|
params.background_max_g,
|
|
params.background_max_b);
|
|
readField(node, "pulse_frequency_hz", params.background_pulse_freq_hz);
|
|
}
|
|
|
|
std::cout << "[PostFxConfig] Cargado " << path
|
|
<< " (bloom=" << (params.bloom_enabled ? "on" : "off")
|
|
<< " intensity=" << params.bloom_intensity
|
|
<< ", flicker=" << (params.flicker_enabled ? "on" : "off")
|
|
<< " amp=" << params.flicker_amplitude
|
|
<< ", bg=" << (params.background_enabled ? "on" : "off")
|
|
<< ")\n";
|
|
} catch (const fkyaml::exception& e) {
|
|
std::cerr << "[PostFxConfig] Error parseando " << path << ": " << e.what()
|
|
<< " — usando defaults built-in\n";
|
|
}
|
|
return params;
|
|
}
|
|
|
|
} // namespace Config::PostFx
|