forked from jaildesigner-jailgames/jaildoctors_dilemma
presets en postfx
This commit is contained in:
@@ -132,7 +132,7 @@ void Screen::render() {
|
||||
|
||||
// En el path SDL3GPU, los píxeles se suben directamente desde la Surface.
|
||||
// En el path SDL_Renderer, primero copiamos la surface a la SDL_Texture.
|
||||
if (!(Options::video.shaders && shader_backend_ && shader_backend_->isHardwareAccelerated())) {
|
||||
if (!(Options::video.postfx && shader_backend_ && shader_backend_->isHardwareAccelerated())) {
|
||||
surfaceToTexture();
|
||||
}
|
||||
|
||||
@@ -209,17 +209,26 @@ void Screen::renderNotifications() const {
|
||||
}
|
||||
}
|
||||
|
||||
// Cambia el estado de los shaders
|
||||
void Screen::toggleShaders() {
|
||||
Options::video.shaders = !Options::video.shaders;
|
||||
if (!Options::video.shaders && shader_backend_) {
|
||||
// Al desactivar shaders, limpiar el backend para liberar el swapchain de GPU
|
||||
// Cambia el estado del PostFX
|
||||
void Screen::togglePostFX() {
|
||||
Options::video.postfx = !Options::video.postfx;
|
||||
if (!Options::video.postfx && shader_backend_) {
|
||||
// Al desactivar PostFX, limpiar el backend para liberar el swapchain de GPU
|
||||
shader_backend_->cleanup();
|
||||
} else {
|
||||
initShaders();
|
||||
}
|
||||
}
|
||||
|
||||
// Recarga el shader del preset actual sin toggle
|
||||
void Screen::reloadPostFX() {
|
||||
if (Options::video.postfx) {
|
||||
vertex_shader_source_.clear();
|
||||
fragment_shader_source_.clear();
|
||||
initShaders();
|
||||
}
|
||||
}
|
||||
|
||||
// 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());
|
||||
@@ -319,7 +328,7 @@ void Screen::surfaceToTexture() {
|
||||
void Screen::textureToRenderer() {
|
||||
SDL_Texture* texture_to_render = Options::video.border.enabled ? border_texture_ : game_texture_;
|
||||
|
||||
if (Options::video.shaders && shader_backend_ && shader_backend_->isHardwareAccelerated()) {
|
||||
if (Options::video.postfx && shader_backend_ && shader_backend_->isHardwareAccelerated()) {
|
||||
// ---- SDL3 GPU path: convertir Surface → ARGB → upload → PostFX → present ----
|
||||
if (Options::video.border.enabled) {
|
||||
// El border_surface_ solo tiene el color de borde; hay que componer encima el game_surface_
|
||||
@@ -439,16 +448,32 @@ auto loadData(const std::string& filepath) -> std::vector<uint8_t> {
|
||||
|
||||
// Carga el contenido de los archivos GLSL
|
||||
void Screen::loadShaders() {
|
||||
// Obtener nombres de fichero desde el preset actual (o usar fallback)
|
||||
std::string preset_vertex = "crtpi_vertex.glsl";
|
||||
std::string preset_fragment = "crtpi_fragment.glsl";
|
||||
if (!Options::postfx_presets.empty()) {
|
||||
const auto& preset = Options::postfx_presets[static_cast<size_t>(Options::current_postfx_preset)];
|
||||
if (!preset.vertex.empty()) {
|
||||
preset_vertex = preset.vertex;
|
||||
}
|
||||
if (!preset.fragment.empty()) {
|
||||
preset_fragment = preset.fragment;
|
||||
}
|
||||
}
|
||||
|
||||
if (vertex_shader_source_.empty()) {
|
||||
// Detectar si necesitamos OpenGL ES (Raspberry Pi)
|
||||
// Intentar cargar versión ES primero si existe
|
||||
std::string vertex_file = "crtpi_vertex_es.glsl";
|
||||
auto data = loadData(Resource::List::get()->get(vertex_file));
|
||||
// Intentar cargar versión ES primero si existe (reemplaza .glsl por _es.glsl)
|
||||
std::string vertex_es = preset_vertex;
|
||||
auto pos = vertex_es.rfind(".glsl");
|
||||
if (pos != std::string::npos) {
|
||||
vertex_es.insert(pos, "_es");
|
||||
}
|
||||
auto data = loadData(Resource::List::get()->get(vertex_es));
|
||||
|
||||
if (data.empty()) {
|
||||
// Si no existe versión ES, usar versión Desktop
|
||||
vertex_file = "crtpi_vertex.glsl";
|
||||
data = loadData(Resource::List::get()->get(vertex_file));
|
||||
data = loadData(Resource::List::get()->get(preset_vertex));
|
||||
std::cout << "Usando shaders OpenGL Desktop 3.3\n";
|
||||
} else {
|
||||
std::cout << "Usando shaders OpenGL ES 3.0 (Raspberry Pi)\n";
|
||||
@@ -460,13 +485,16 @@ void Screen::loadShaders() {
|
||||
}
|
||||
if (fragment_shader_source_.empty()) {
|
||||
// Intentar cargar versión ES primero si existe
|
||||
std::string fragment_file = "crtpi_fragment_es.glsl";
|
||||
auto data = loadData(Resource::List::get()->get(fragment_file));
|
||||
std::string fragment_es = preset_fragment;
|
||||
auto pos = fragment_es.rfind(".glsl");
|
||||
if (pos != std::string::npos) {
|
||||
fragment_es.insert(pos, "_es");
|
||||
}
|
||||
auto data = loadData(Resource::List::get()->get(fragment_es));
|
||||
|
||||
if (data.empty()) {
|
||||
// Si no existe versión ES, usar versión Desktop
|
||||
fragment_file = "crtpi_fragment.glsl";
|
||||
data = loadData(Resource::List::get()->get(fragment_file));
|
||||
data = loadData(Resource::List::get()->get(preset_fragment));
|
||||
}
|
||||
|
||||
if (!data.empty()) {
|
||||
@@ -477,7 +505,7 @@ void Screen::loadShaders() {
|
||||
|
||||
// Inicializa los shaders
|
||||
void Screen::initShaders() {
|
||||
if (!Options::video.shaders) {
|
||||
if (!Options::video.postfx) {
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -619,8 +647,8 @@ auto Screen::initSDLVideo() -> bool {
|
||||
return false;
|
||||
}
|
||||
// Sin OpenGL garantizado, deshabilitar shaders
|
||||
Options::video.shaders = false;
|
||||
std::cout << "WARNING: Shaders disabled (OpenGL not available)\n";
|
||||
Options::video.postfx = false;
|
||||
std::cout << "WARNING: PostFX disabled (OpenGL not available)\n";
|
||||
}
|
||||
|
||||
// Configurar renderer
|
||||
|
||||
Reference in New Issue
Block a user