From 2f0e67433c624cd3e006ca3f789e36edc64a894f Mon Sep 17 00:00:00 2001 From: Simon Robertshaw Date: Wed, 15 Aug 2012 15:02:48 +0100 Subject: [PATCH] Ensure zoom is drawn after particles for OpenGL Rendering, draw walls onto the correct framebuffer --- src/graphics/OpenGLDrawMethods.inl | 8 ++-- src/graphics/Renderer.cpp | 65 ++++++++++++++++++++++-------- 2 files changed, 52 insertions(+), 21 deletions(-) diff --git a/src/graphics/OpenGLDrawMethods.inl b/src/graphics/OpenGLDrawMethods.inl index 173cb4bd9..02e03785b 100644 --- a/src/graphics/OpenGLDrawMethods.inl +++ b/src/graphics/OpenGLDrawMethods.inl @@ -228,7 +228,7 @@ void PIXELMETHODS_CLASS::xor_rect(int x, int y, int width, int height) void PIXELMETHODS_CLASS::xor_bitmap(unsigned char * bitmap, int x, int y, int w, int h) { - /* Rewriting until better method can be found + /* Rewriting until better method can be found */ //glEnable(GL_COLOR_LOGIC_OP); //glLogicOp(GL_XOR); glEnable(GL_TEXTURE_2D); @@ -254,8 +254,8 @@ void PIXELMETHODS_CLASS::xor_bitmap(unsigned char * bitmap, int x, int y, int w, glDisable(GL_TEXTURE_2D); //glDisable(GL_COLOR_LOGIC_OP); glPixelStorei(GL_UNPACK_ALIGNMENT, 4); - */ - float old_size; + + /*float old_size; glGetFloatv(GL_POINT_SIZE,&old_size); glPointSize(1.0); @@ -269,7 +269,7 @@ void PIXELMETHODS_CLASS::xor_bitmap(unsigned char * bitmap, int x, int y, int w, } } glEnd(); - glPointSize(old_size); + glPointSize(old_size);*/ } void PIXELMETHODS_CLASS::draw_line(int x, int y, int x2, int y2, int r, int g, int b, int a) diff --git a/src/graphics/Renderer.cpp b/src/graphics/Renderer.cpp index 399661d73..a2261f80b 100644 --- a/src/graphics/Renderer.cpp +++ b/src/graphics/Renderer.cpp @@ -47,10 +47,10 @@ void Renderer::RenderBegin() std::fill(warpVid, warpVid+(VIDXRES*VIDYRES), 0); } #endif - draw_air(); - draw_grav(); + //draw_air(); + //draw_grav(); render_parts(); - render_fire(); + //render_fire(); #ifndef OGLR if(display_mode & DISPLAY_PERS) { @@ -71,8 +71,8 @@ void Renderer::RenderBegin() } #endif DrawWalls(); - draw_grav_zones(); - DrawSigns(); + //draw_grav_zones(); + //DrawSigns(); #ifndef OGLR if(display_mode & DISPLAY_WARP) { @@ -86,9 +86,16 @@ void Renderer::RenderBegin() void Renderer::RenderEnd() { - RenderZoom(); #ifdef OGLI +#ifdef OGLR FinaliseParts(); + RenderZoom(); +#else + RenderZoom(); + FinaliseParts(); +#endif +#else + RenderZoom(); #endif } @@ -341,7 +348,7 @@ void Renderer::RenderZoom() glGetIntegerv(GL_BLEND_SRC, &origBlendSrc); glGetIntegerv(GL_BLEND_DST, &origBlendDst); - glBlendFunc(GL_ONE, GL_ZERO); + glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);//glBlendFunc(GL_ONE, GL_ZERO); glEnable( GL_TEXTURE_2D ); //glReadBuffer(GL_AUX0); @@ -576,6 +583,39 @@ VideoBuffer * Renderer::WallIcon(int wallID, int width, int height) void Renderer::DrawWalls() { +#ifdef OGLR + GLint prevFbo; + glGetIntegerv(GL_FRAMEBUFFER_BINDING, &prevFbo); + glBindFramebuffer(GL_DRAW_FRAMEBUFFER, partsFbo); + glTranslated(0, MENUSIZE, 0); + + int x, y, i, j, cr, cg, cb; + unsigned char wt; + pixel pc; + pixel gc; + unsigned char (*bmap)[XRES/CELL] = sim->bmap; + unsigned char (*emap)[XRES/CELL] = sim->emap; + wall_type *wtypes = sim->wtypes; + for (y=0; y=UI_WALLCOUNT) + continue; + pc = wtypes[wt].colour; + gc = wtypes[wt].eglow; + + cr = PIXR(pc); + cg = PIXG(pc); + cb = PIXB(pc); + + fillrect(x*CELL, y*CELL, CELL, CELL, cr, cg, cb, 255); + } + + glBindFramebuffer(GL_DRAW_FRAMEBUFFER, prevFbo); + glTranslated(0, -MENUSIZE, 0); +#else int x, y, i, j, cr, cg, cb; unsigned char wt; pixel pc; @@ -592,13 +632,6 @@ void Renderer::DrawWalls() continue; pc = wtypes[wt].colour; gc = wtypes[wt].eglow; -#ifdef OGLR - int r = PIXR(pc); - int g = PIXG(pc); - int b = PIXB(pc); - int a = 255; -#endif -#ifndef OGLR // standard wall patterns if (wtypes[wt].drawstyle==1) @@ -714,10 +747,8 @@ void Renderer::DrawWalls() fire_b[y][x] = cb; } -#else - this->fillrect(x*CELL, y*CELL, CELL, CELL, r, g, b, a); -#endif } +#endif } void Renderer::DrawSigns()