mirror of
https://github.com/zenorogue/hyperrogue.git
synced 2024-09-27 13:48:15 +00:00
renderbuffer should work without OpenGL
This commit is contained in:
parent
b3f047ea6a
commit
dcc3e11287
17
hyper.h
17
hyper.h
@ -2515,20 +2515,27 @@ bool is_cell_removed(cell *c);
|
|||||||
void set_if_removed(cell*& c, cell *val);
|
void set_if_removed(cell*& c, cell *val);
|
||||||
|
|
||||||
struct renderbuffer {
|
struct renderbuffer {
|
||||||
int x, y, tx, ty;
|
bool valid;
|
||||||
|
int x, y;
|
||||||
|
|
||||||
|
#if CAP_GL
|
||||||
|
int tx, ty;
|
||||||
GLuint FramebufferName;
|
GLuint FramebufferName;
|
||||||
GLuint renderedTexture;
|
GLuint renderedTexture;
|
||||||
GLuint depth_stencil_rb;
|
GLuint depth_stencil_rb;
|
||||||
SDL_Surface *srf;
|
|
||||||
Uint32 *expanded_data;
|
Uint32 *expanded_data;
|
||||||
|
void use_as_texture();
|
||||||
|
#endif
|
||||||
|
#if CAP_SDL
|
||||||
|
SDL_Surface *srf;
|
||||||
void make_surface();
|
void make_surface();
|
||||||
|
SDL_Surface *render();
|
||||||
|
#endif
|
||||||
|
|
||||||
renderbuffer(int x, int y, bool gl);
|
renderbuffer(int x, int y, bool gl);
|
||||||
~renderbuffer();
|
~renderbuffer();
|
||||||
void enable();
|
void enable();
|
||||||
void disable();
|
void disable();
|
||||||
SDL_Surface *render();
|
|
||||||
void use_as_texture();
|
|
||||||
void clear(int col);
|
void clear(int col);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -1,3 +1,4 @@
|
|||||||
|
#if CAP_GL
|
||||||
#if !CAP_GLEW
|
#if !CAP_GLEW
|
||||||
#if ISLINUX
|
#if ISLINUX
|
||||||
extern "C" {
|
extern "C" {
|
||||||
@ -19,12 +20,21 @@ GLAPI void APIENTRY glDeleteFramebuffers (GLsizei n, const GLuint *framebuffers)
|
|||||||
#define glFramebufferTexture glFramebufferTextureEXT
|
#define glFramebufferTexture glFramebufferTextureEXT
|
||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
renderbuffer::renderbuffer(int x, int y, bool gl) : x(x), y(y) {
|
renderbuffer::renderbuffer(int x, int y, bool gl) : x(x), y(y) {
|
||||||
|
|
||||||
FramebufferName = renderedTexture = depth_stencil_rb = 0;
|
valid = false;
|
||||||
srf = NULL; expanded_data = NULL;
|
|
||||||
|
|
||||||
|
#if CAP_GL
|
||||||
|
FramebufferName = renderedTexture = depth_stencil_rb = 0; expanded_data = NULL;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if CAP_SDL
|
||||||
|
srf = NULL;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
# if CAP_GL
|
||||||
if(gl) {
|
if(gl) {
|
||||||
tx = next_p2(x);
|
tx = next_p2(x);
|
||||||
ty = next_p2(y);
|
ty = next_p2(y);
|
||||||
@ -66,30 +76,65 @@ renderbuffer::renderbuffer(int x, int y, bool gl) : x(x), y(y) {
|
|||||||
|
|
||||||
if(glCheckFramebufferStatus(GL_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE)
|
if(glCheckFramebufferStatus(GL_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE)
|
||||||
FramebufferName = renderedTexture = 0;
|
FramebufferName = renderedTexture = 0;
|
||||||
|
else
|
||||||
|
valid = true;
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
if(!FramebufferName)
|
#if CAP_SDL
|
||||||
|
if(!valid)
|
||||||
make_surface();
|
make_surface();
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if CAP_SDL
|
||||||
void renderbuffer::make_surface() {
|
void renderbuffer::make_surface() {
|
||||||
if(!srf)
|
if(!srf)
|
||||||
srf = SDL_CreateRGBSurface(SDL_SWSURFACE, x, y, 32,0xff0000,0xff00,0xff,0xff000000);
|
srf = SDL_CreateRGBSurface(SDL_SWSURFACE, x, y, 32,0xff0000,0xff00,0xff,0xff000000);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
SDL_Surface *renderbuffer::render() {
|
||||||
|
make_surface();
|
||||||
|
if(FramebufferName) {
|
||||||
|
glReadPixels(0, 0, vid.xres, vid.yres, GL_BGRA, GL_UNSIGNED_BYTE, srf->pixels);
|
||||||
|
for(int y=0; y<vid.yres/2; y++)
|
||||||
|
for(int x=0; x<vid.xres; x++)
|
||||||
|
swap(qpixel(srf,x,y), qpixel(srf,x,vid.yres-1-y));
|
||||||
|
}
|
||||||
|
return srf;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
void renderbuffer::enable() {
|
void renderbuffer::enable() {
|
||||||
|
#if CAP_GL
|
||||||
if(FramebufferName) {
|
if(FramebufferName) {
|
||||||
glBindFramebuffer(GL_FRAMEBUFFER, FramebufferName);
|
glBindFramebuffer(GL_FRAMEBUFFER, FramebufferName);
|
||||||
glViewport(0,0,x,y);
|
glViewport(0,0,x,y);
|
||||||
vid.usingGL = true;
|
vid.usingGL = true;
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
else {
|
#endif
|
||||||
|
#if CAP_SDL
|
||||||
make_surface();
|
make_surface();
|
||||||
s = srf;
|
s = srf;
|
||||||
vid.usingGL = false;
|
vid.usingGL = false;
|
||||||
}
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void renderbuffer::disable() {
|
||||||
|
#if CAP_GL
|
||||||
|
if(FramebufferName) {
|
||||||
|
glBindFramebuffer(GL_FRAMEBUFFER, 0);
|
||||||
|
glViewport(0,0,s_screen->w,s_screen->h);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
#if CAP_SDL
|
||||||
|
s = s_screen;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
#if CAP_GL
|
||||||
void renderbuffer::use_as_texture() {
|
void renderbuffer::use_as_texture() {
|
||||||
if(!renderedTexture) {
|
if(!renderedTexture) {
|
||||||
glGenTextures( 1, &renderedTexture);
|
glGenTextures( 1, &renderedTexture);
|
||||||
@ -109,44 +154,33 @@ void renderbuffer::use_as_texture() {
|
|||||||
glTexImage2D( GL_TEXTURE_2D, 0, GL_RGBA, tx, ty, 0, GL_BGRA, GL_UNSIGNED_BYTE, expanded_data );
|
glTexImage2D( GL_TEXTURE_2D, 0, GL_RGBA, tx, ty, 0, GL_BGRA, GL_UNSIGNED_BYTE, expanded_data );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
void renderbuffer::disable() {
|
|
||||||
if(FramebufferName) {
|
|
||||||
glBindFramebuffer(GL_FRAMEBUFFER, 0);
|
|
||||||
glViewport(0,0,s_screen->w,s_screen->h);
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
s = s_screen;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
renderbuffer::~renderbuffer() {
|
renderbuffer::~renderbuffer() {
|
||||||
|
#if CAP_GL
|
||||||
if(renderedTexture)
|
if(renderedTexture)
|
||||||
glDeleteTextures(1, &renderedTexture);
|
glDeleteTextures(1, &renderedTexture);
|
||||||
if(FramebufferName) {
|
if(FramebufferName) {
|
||||||
glDeleteRenderbuffers(1, &depth_stencil_rb);
|
glDeleteRenderbuffers(1, &depth_stencil_rb);
|
||||||
glDeleteFramebuffers(1, &FramebufferName);
|
glDeleteFramebuffers(1, &FramebufferName);
|
||||||
}
|
}
|
||||||
if(srf)
|
|
||||||
SDL_FreeSurface(srf);
|
|
||||||
if(expanded_data)
|
if(expanded_data)
|
||||||
delete[] expanded_data;
|
delete[] expanded_data;
|
||||||
}
|
#endif
|
||||||
|
#if CAP_SDL
|
||||||
SDL_Surface *renderbuffer::render() {
|
if(srf)
|
||||||
make_surface();
|
SDL_FreeSurface(srf);
|
||||||
if(FramebufferName) {
|
#endif
|
||||||
glReadPixels(0, 0, vid.xres, vid.yres, GL_BGRA, GL_UNSIGNED_BYTE, srf->pixels);
|
|
||||||
for(int y=0; y<vid.yres/2; y++)
|
|
||||||
for(int x=0; x<vid.xres; x++)
|
|
||||||
swap(qpixel(srf,x,y), qpixel(srf,x,vid.yres-1-y));
|
|
||||||
}
|
|
||||||
return srf;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void renderbuffer::clear(int col) {
|
void renderbuffer::clear(int col) {
|
||||||
if(FramebufferName)
|
#if CAP_GL
|
||||||
|
if(FramebufferName) {
|
||||||
setGLProjection(0);
|
setGLProjection(0);
|
||||||
else
|
return;
|
||||||
SDL_FillRect(srf, NULL, col);
|
}
|
||||||
|
#endif
|
||||||
|
#if CAP_SDL
|
||||||
|
SDL_FillRect(srf, NULL, col);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
10
rug.cpp
10
rug.cpp
@ -1197,9 +1197,13 @@ transmatrix currentrot;
|
|||||||
|
|
||||||
void init() {
|
void init() {
|
||||||
if(rugged) return;
|
if(rugged) return;
|
||||||
rugged = true;
|
|
||||||
if(scale < .01 || scale > 100) scale = 1;
|
|
||||||
glbuf = new renderbuffer(TEXTURESIZE, TEXTURESIZE, vid.usingGL && !rendernogl);
|
glbuf = new renderbuffer(TEXTURESIZE, TEXTURESIZE, vid.usingGL && !rendernogl);
|
||||||
|
if(!glbuf->valid) {
|
||||||
|
addMessage(XLAT("Failed to enable"));
|
||||||
|
delete glbuf;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
rugged = true;
|
||||||
if(renderonce) prepareTexture();
|
if(renderonce) prepareTexture();
|
||||||
if(!rugged) return;
|
if(!rugged) return;
|
||||||
|
|
||||||
@ -1591,7 +1595,7 @@ void show() {
|
|||||||
#endif
|
#endif
|
||||||
else if(uni == 's' && !rug::rugged) {
|
else if(uni == 's' && !rug::rugged) {
|
||||||
texturesize *= 2;
|
texturesize *= 2;
|
||||||
if(texturesize == 8192) texturesize = 128;
|
if(texturesize == 8192) texturesize = 64;
|
||||||
}
|
}
|
||||||
else if(handlekeys(sym, uni)) ;
|
else if(handlekeys(sym, uni)) ;
|
||||||
else if(doexiton(sym, uni)) popScreen();
|
else if(doexiton(sym, uni)) popScreen();
|
||||||
|
Loading…
Reference in New Issue
Block a user