Primera implementación funcional de shaders

This commit is contained in:
2024-06-30 08:14:30 +02:00
parent 85a24e0100
commit b800ab2073
8 changed files with 571 additions and 27 deletions

View File

@@ -1,6 +1,9 @@
#include "screen.h"
#include <string>
#include <iostream>
#include "jshader.h"
#include <fstream>
#include <streambuf>
// Constructor
Screen::Screen(SDL_Window *window, SDL_Renderer *renderer, Asset *asset, options_t *options)
@@ -12,8 +15,7 @@ Screen::Screen(SDL_Window *window, SDL_Renderer *renderer, Asset *asset, options
this->asset = asset;
// Inicializa variables
windowWidth = 0;
windowHeight = 0;
SDL_GetRendererOutputSize(renderer, &windowWidth, &windowHeight);
gameCanvasWidth = options->video.gameWidth;
gameCanvasHeight = options->video.gameHeight;
borderWidth = options->video.border.width * 2;
@@ -72,18 +74,25 @@ void Screen::blit()
// Actualiza y dibuja el efecto de flash en la pantalla
doFlash();
// Vuelve a dejar el renderizador en modo normal
SDL_SetRenderTarget(renderer, nullptr);
if (options->video.shaders)
{
shader::render();
}
else
{
// Vuelve a dejar el renderizador en modo normal
SDL_SetRenderTarget(renderer, nullptr);
// Borra el contenido previo
SDL_SetRenderDrawColor(renderer, borderColor.r, borderColor.g, borderColor.b, 0xFF);
SDL_RenderClear(renderer);
// Borra el contenido previo
SDL_SetRenderDrawColor(renderer, borderColor.r, borderColor.g, borderColor.b, 0xFF);
SDL_RenderClear(renderer);
// Copia la textura de juego en el renderizador en la posición adecuada
SDL_RenderCopy(renderer, gameCanvas, nullptr, &dest);
// Copia la textura de juego en el renderizador en la posición adecuada
SDL_RenderCopy(renderer, gameCanvas, nullptr, &dest);
// Muestra por pantalla el renderizador
SDL_RenderPresent(renderer);
// Muestra por pantalla el renderizador
SDL_RenderPresent(renderer);
}
}
// Establece el modo de video
@@ -170,8 +179,20 @@ void Screen::setVideoMode(int videoMode)
}
}
// Reinicia los shaders
if (options->video.shaders)
{
std::ifstream f(asset->get("crtpi.glsl").c_str());
std::string source((std::istreambuf_iterator<char>(f)), std::istreambuf_iterator<char>());
shader::init(window, gameCanvas, source.c_str());
}
// Modifica el tamaño del renderizador
SDL_RenderSetLogicalSize(renderer, windowWidth, windowHeight);
else
{
SDL_RenderSetLogicalSize(renderer, windowWidth, windowHeight);
}
// Actualiza las opciones
options->video.mode = videoMode;
@@ -377,13 +398,6 @@ void Screen::doFlash()
SDL_SetRenderTarget(renderer, temp);
// Actualiza la lógica del efecto
if (flashEffect.counter < flashEffect.lenght)
{
flashEffect.counter++;
}
else
{
flashEffect.enabled = false;
}
flashEffect.counter < flashEffect.lenght ? flashEffect.counter++ : flashEffect.enabled = false;
}
}