diff --git a/basegraph.cpp b/basegraph.cpp index 7a419718..019ab1fe 100644 --- a/basegraph.cpp +++ b/basegraph.cpp @@ -32,7 +32,7 @@ TTF_Font *font[256]; #endif #if CAP_SDL -SDL_Surface *s; +SDL_Surface *s, *s_screen; int qpixel_pixel_outside; @@ -220,13 +220,13 @@ void selectEyeMask(int ed) { } } -void setGLProjection() { +void setGLProjection(int col) { DEBB(DF_GRAPH, (debugfile,"setGLProjection\n")); glMatrixMode(GL_PROJECTION); glLoadIdentity(); - unsigned char *c = (unsigned char*) (&backcolor); + unsigned char *c = (unsigned char*) (&col); glClearColor(c[2] / 255.0, c[1] / 255.0, c[0]/255.0, 1); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); @@ -956,7 +956,7 @@ void IMAGESAVE(SDL_Surface *s, const char *fname) { } #endif -hookset *hooks_hqshot; +hookset *hooks_hqshot; #if CAP_SDL void saveHighQualityShot(const char *fname, const char *caption, int fade) { @@ -988,26 +988,30 @@ void saveHighQualityShot(const char *fname, const char *caption, int fade) { while(vid.xres & 15) vid.xres++; } - vid.usingGL = false; // if(vid.pmodel == 0) vid.scale = 0.99; calcparam(); #if CAP_ROGUEVIZ rogueviz::fixparam(); #endif - // printf("format = %d, %d x %d\n", pngformat, vid.xres, vid.yres); + renderbuffer glbuf(vid.xres, vid.yres, vid.usingGL); + glbuf.enable(); - dynamicval v5(s, SDL_CreateRGBSurface(SDL_SWSURFACE,vid.xres,vid.yres,32,0,0,0,0)); + // printf("format = %d, %d x %d\n", pngformat, vid.xres, vid.yres); darken = 0; int numi = (fname?1:2); for(int i=0; i void eliminate_if(vector& data, U pred) { bool is_cell_removed(cell *c); void set_if_removed(cell*& c, cell *val); + +struct renderbuffer { + int x, y, tx, ty; + GLuint FramebufferName; + GLuint renderedTexture; + GLuint depth_stencil_rb; + SDL_Surface *srf; + Uint32 *expanded_data; + + void make_surface(); + renderbuffer(int x, int y, bool gl); + ~renderbuffer(); + void enable(); + void disable(); + SDL_Surface *render(); + void use_as_texture(); + void clear(int col); + }; diff --git a/rug.cpp b/rug.cpp index 21868f21..1c7dfe45 100644 --- a/rug.cpp +++ b/rug.cpp @@ -9,28 +9,6 @@ #define TEXTURESIZE (texturesize) #define HTEXTURESIZE (texturesize/2) -#if !CAP_GLEW -#if ISLINUX -extern "C" { -GLAPI void APIENTRY glGenFramebuffers (GLsizei n, GLuint *framebuffers); -GLAPI void APIENTRY glBindFramebuffer (GLenum target, GLuint framebuffer); -GLAPI void APIENTRY glFramebufferTexture (GLenum target, GLenum attachment, GLuint texture, GLint level); -GLAPI GLenum APIENTRY glCheckFramebufferStatus (GLenum target); -GLAPI void APIENTRY glDrawBuffers (GLsizei n, const GLenum *bufs); -GLAPI void APIENTRY glGenRenderbuffers (GLsizei n, GLuint *renderbuffers); -GLAPI void APIENTRY glBindRenderbuffer (GLenum target, GLuint renderbuffer); -GLAPI void APIENTRY glRenderbufferStorage (GLenum target, GLenum internalformat, GLsizei width, GLsizei height); -GLAPI void APIENTRY glFramebufferRenderbuffer (GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer); -GLAPI void APIENTRY glDeleteRenderbuffers (GLsizei n, const GLuint *renderbuffers); -GLAPI void APIENTRY glDeleteFramebuffers (GLsizei n, const GLuint *framebuffers); -} -#endif - -#if ISMAC -#define glFramebufferTexture glFramebufferTextureEXT -#endif -#endif - namespace rug { struct rug_exception { }; @@ -1083,114 +1061,32 @@ void drawTriangle(triangle& t) { } } -GLuint FramebufferName = 0; -GLuint renderedTexture = 0; -GLuint depth_stencil_rb = 0; - -SDL_Surface *texture; -Uint32 *expanded_data; - -void initTexture() { - - if(!rendernogl) { -#if !ISPANDORA - FramebufferName = 0; - glGenFramebuffers(1, &FramebufferName); - glBindFramebuffer(GL_FRAMEBUFFER, FramebufferName); - - glGenTextures(1, &renderedTexture); - glBindTexture(GL_TEXTURE_2D, renderedTexture); - glTexImage2D(GL_TEXTURE_2D, 0,GL_RGB, TEXTURESIZE, TEXTURESIZE, 0,GL_RGB, GL_UNSIGNED_BYTE, 0); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); - -#ifdef TEX - glFramebufferTexture(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, renderedTexture, 0); -#else - glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, renderedTexture, 0); -#endif - GLenum DrawBuffers[1] = {GL_COLOR_ATTACHMENT0}; - glDrawBuffers(1, DrawBuffers); - - glGenRenderbuffers(1, &depth_stencil_rb); - glBindRenderbuffer(GL_RENDERBUFFER, depth_stencil_rb); - glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH24_STENCIL8, TEXTURESIZE, TEXTURESIZE); - glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, depth_stencil_rb); - glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_STENCIL_ATTACHMENT, GL_RENDERBUFFER, depth_stencil_rb); - - if(glCheckFramebufferStatus(GL_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE) { - addMessage("Failed to initialize the framebuffer"); - rugged = false; - } -#endif - } - else { - texture = SDL_CreateRGBSurface(SDL_SWSURFACE,TEXTURESIZE,TEXTURESIZE,32,0,0,0,0); - glGenTextures( 1, &renderedTexture ); - glBindTexture( GL_TEXTURE_2D, renderedTexture); - glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR); - glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR); - expanded_data = new Uint32[TEXTURESIZE * TEXTURESIZE]; - } - } +renderbuffer *glbuf; void prepareTexture() { videopar svid = vid; setVidParam(); - if(rendernogl) { - vid.usingGL = false; - SDL_Surface *sav = s; - s = texture; - SDL_FillRect(s, NULL, 0); - - drawfullmap(); - s = sav; - for(int y=0; yenable(); - setGLProjection(); - ptds.clear(); - drawthemap(); - if(mousing && !renderonce) { - for(int i=0; ih); - queuechr(V, 0.5, 'X', 0xFFFFFFFF, 2); - for(int i=0; i<72; i++) - queueline(tC0(V * spin(i*M_PI/32) * xpush(finger_range)), tC0(V * spin((i+1)*M_PI/32) * xpush(finger_range)), 0xFFFFFFFF, 0); - } - drawqueue(); - glBindFramebuffer(GL_FRAMEBUFFER, 0); -#endif - } - vid = svid; - if(!rendernogl) glViewport(0,0,vid.xres,vid.yres); - } + glbuf->clear(0); -void closeTexture() { - if(rendernogl) { - SDL_FreeSurface(texture); - glDeleteTextures(1, &renderedTexture); - delete[] expanded_data; + ptds.clear(); + drawthemap(); + if(mousing && !renderonce) { + for(int i=0; ih); + queuechr(V, 0.5, 'X', 0xFFFFFFFF, 2); + for(int i=0; i<72; i++) + queueline(tC0(V * spin(i*M_PI/32) * xpush(finger_range)), tC0(V * spin((i+1)*M_PI/32) * xpush(finger_range)), 0xFFFFFFFF, 0); } + drawqueue(); + vid = svid; + glbuf->disable(); } double xview, yview; @@ -1214,8 +1110,8 @@ void drawRugScene() { glEnable(GL_LIGHTING); glEnable(GL_LIGHT0); - - glBindTexture(GL_TEXTURE_2D, renderedTexture); + + glbuf->use_as_texture(); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); @@ -1310,20 +1206,10 @@ void drawRugScene() { transmatrix currentrot; void init() { -#if CAP_GLEW - if(!glew) { - glew = true; - GLenum err = glewInit(); - if (GLEW_OK != err) { - addMessage("Failed to initialize GLEW"); - return; - } - } -#endif if(rugged) return; rugged = true; if(scale < .01 || scale > 100) scale = 1; - initTexture(); + glbuf = new renderbuffer(TEXTURESIZE, TEXTURESIZE, vid.usingGL && !rendernogl); if(renderonce) prepareTexture(); if(!rugged) return; @@ -1364,7 +1250,7 @@ void init() { void close() { if(!rugged) return; rugged = false; - closeTexture(); + delete glbuf; triangles.clear(); for(int i=0; i