mirror of
https://github.com/0ldsk00l/nestopia.git
synced 2025-04-02 10:31:51 -04:00
115 lines
2.9 KiB
C++
115 lines
2.9 KiB
C++
#pragma once
|
|
|
|
#include <string>
|
|
|
|
#include <epoxy/gl.h>
|
|
|
|
#include "setmanager.h"
|
|
#include "jgmanager.h"
|
|
|
|
class VideoRenderer {
|
|
public:
|
|
VideoRenderer() = delete;
|
|
VideoRenderer(SettingManager& setmgr);
|
|
virtual ~VideoRenderer() {};
|
|
|
|
virtual void ogl_render() = 0;
|
|
virtual void ogl_refresh() = 0;
|
|
|
|
virtual void rehash(bool reset_shaders = false) = 0;
|
|
|
|
static void text_print(const char *text, int xpos, int ypos, int seconds, bool bg);
|
|
|
|
void get_pixeldata(std::vector<uint8_t>& pixeldata);
|
|
|
|
protected:
|
|
static void text_draw(const char *text, int xpos, int ypos, bool bg);
|
|
static void text_print_time(const char *timebuf, bool drawtime);
|
|
static void text_match(const char *text, int *xpos, int *ypos, int strpos);
|
|
|
|
SettingManager &setmgr;
|
|
|
|
GLuint gl_texture_id{0};
|
|
|
|
// Triangle and Texture vertices
|
|
float vertices[16]{
|
|
-1.0, -1.0, // Vertex 1 (X, Y) Left Bottom
|
|
-1.0, 1.0, // Vertex 2 (X, Y) Left Top
|
|
1.0, -1.0, // Vertex 3 (X, Y) Right Bottom
|
|
1.0, 1.0, // Vertex 4 (X, Y) Right Top
|
|
0.0, 0.0, // Texture 2 (X, Y) Left Top
|
|
0.0, 1.0, // Texture 1 (X, Y) Left Bottom
|
|
1.0, 0.0, // Texture 4 (X, Y) Right Top
|
|
1.0, 1.0, // Texture 3 (X, Y) Right Bottom
|
|
};
|
|
};
|
|
|
|
class VideoRendererLegacy : public VideoRenderer {
|
|
public:
|
|
VideoRendererLegacy() = delete;
|
|
VideoRendererLegacy(SettingManager& setmgr);
|
|
~VideoRendererLegacy() override;
|
|
|
|
void ogl_render() override;
|
|
void ogl_refresh() override;
|
|
|
|
void rehash(bool reset_shaders = false) override;
|
|
};
|
|
|
|
class VideoRendererModern : public VideoRenderer {
|
|
public:
|
|
VideoRendererModern() = delete;
|
|
VideoRendererModern(SettingManager& setmgr, const std::string ver);
|
|
~VideoRendererModern() override;
|
|
|
|
void ogl_render() override;
|
|
void ogl_refresh() override;
|
|
|
|
void rehash(bool reset_shaders = false) override;
|
|
|
|
private:
|
|
GLuint shader_create(const std::string& vs, const std::string& fs);
|
|
void shader_setup(void);
|
|
|
|
static constexpr size_t NUMPASSES = 2;
|
|
|
|
std::string glslver{};
|
|
|
|
GLuint vao[NUMPASSES];
|
|
GLuint vbo[NUMPASSES];
|
|
GLuint shaderprog[NUMPASSES];
|
|
GLuint tex[NUMPASSES];
|
|
GLuint texfilter[NUMPASSES];
|
|
GLuint framebuf; // Framebuffer for rendering offscreen
|
|
};
|
|
|
|
class VideoManager {
|
|
public:
|
|
VideoManager() = delete;
|
|
VideoManager(JGManager& jgm, SettingManager& setmgr);
|
|
~VideoManager();
|
|
|
|
void get_dimensions(int *w, int *h);
|
|
void set_dimensions();
|
|
void set_dpiscale(float dpiscale);
|
|
|
|
void get_scaled_coords(int x, int y, int *xcoord, int *ycoord);
|
|
|
|
void rehash(bool reset_shaders = false);
|
|
void resize(int w, int h);
|
|
void set_aspect();
|
|
|
|
void renderer_init();
|
|
void renderer_deinit();
|
|
void render();
|
|
|
|
void screenshot(std::string& sspath);
|
|
|
|
private:
|
|
JGManager &jgm;
|
|
SettingManager &setmgr;
|
|
|
|
VideoRenderer *renderer{nullptr};
|
|
|
|
double aspect{1.0};
|
|
};
|