diff options
author | James Canete <use.less01@gmail.com> | 2012-10-30 22:05:07 +0000 |
---|---|---|
committer | Tim Angus <tim@ngus.net> | 2013-01-12 21:23:56 +0000 |
commit | bb9e18b2e399cfbea383c99f135e4d5ad308870d (patch) | |
tree | 60cba81be52c9001ca4ed207c7a2c8d49c9ab17a | |
parent | 819fbad8191e8e646aa5b4c8dc4b79803126e5a5 (diff) |
Ensure the correct FBO is bound when drawing. (Fixes bug #5791.)
-rw-r--r-- | src/rend2/tr_backend.c | 18 | ||||
-rw-r--r-- | src/rend2/tr_fbo.c | 24 | ||||
-rw-r--r-- | src/rend2/tr_scene.c | 5 |
3 files changed, 33 insertions, 14 deletions
diff --git a/src/rend2/tr_backend.c b/src/rend2/tr_backend.c index 720cf1e9..678f9aa7 100644 --- a/src/rend2/tr_backend.c +++ b/src/rend2/tr_backend.c @@ -482,9 +482,17 @@ void RB_BeginDrawingView (void) { if (glRefConfig.framebufferObject) { // FIXME: HUGE HACK: render to the screen fbo if we've already postprocessed the frame and aren't drawing more world - if (backEnd.viewParms.targetFbo == tr.renderFbo && backEnd.framePostProcessed && (backEnd.refdef.rdflags & RDF_NOWORLDMODEL)) + // drawing more world check is in case of double renders, such as skyportals + if (backEnd.viewParms.targetFbo == NULL) { - FBO_Bind(tr.screenScratchFbo); + if (backEnd.framePostProcessed && (backEnd.refdef.rdflags & RDF_NOWORLDMODEL)) + { + FBO_Bind(tr.screenScratchFbo); + } + else + { + FBO_Bind(tr.renderFbo); + } } else { @@ -949,7 +957,7 @@ void RE_StretchRaw (int x, int y, int w, int h, int cols, int rows, const byte * } // FIXME: HUGE hack - if (glRefConfig.framebufferObject && !glState.currentFBO) + if (glRefConfig.framebufferObject) { if (backEnd.framePostProcessed) { @@ -1092,7 +1100,7 @@ const void *RB_StretchPic ( const void *data ) { cmd = (const stretchPicCommand_t *)data; // FIXME: HUGE hack - if (glRefConfig.framebufferObject && !glState.currentFBO) + if (glRefConfig.framebufferObject) { if (backEnd.framePostProcessed) { @@ -1570,7 +1578,7 @@ const void *RB_ClearDepth(const void *data) if (glRefConfig.framebufferObject) { - if (backEnd.framePostProcessed && (backEnd.refdef.rdflags & RDF_NOWORLDMODEL)) + if (backEnd.framePostProcessed) { FBO_Bind(tr.screenScratchFbo); } diff --git a/src/rend2/tr_fbo.c b/src/rend2/tr_fbo.c index c3b72e20..04f9ff26 100644 --- a/src/rend2/tr_fbo.c +++ b/src/rend2/tr_fbo.c @@ -661,6 +661,8 @@ void FBO_BlitFromTexture(struct image_s *src, vec4i_t inSrcBox, vec2_t inSrcTexS vec2_t texCoords[4]; vec2_t invTexRes; FBO_t *oldFbo = glState.currentFBO; + matrix_t projection; + int width, height; if (!src) return; @@ -726,11 +728,25 @@ void FBO_BlitFromTexture(struct image_s *src, vec4i_t inSrcBox, vec2_t inSrcTexS FBO_Bind(dst); - RB_SetGL2D(); + if (glState.currentFBO) + { + width = glState.currentFBO->width; + height = glState.currentFBO->height; + } + else + { + width = glConfig.vidWidth; + height = glConfig.vidHeight; + } + + qglViewport( 0, 0, width, height ); + qglScissor( 0, 0, width, height ); + + Matrix16Ortho(0, width, height, 0, 0, 1, projection); - GL_SelectTexture(TB_COLORMAP); + qglDisable( GL_CULL_FACE ); - GL_Bind(src); + GL_BindToTMU(src, TB_COLORMAP); VectorSet4(quadVerts[0], dstBox[0], dstBox[1], 0, 1); VectorSet4(quadVerts[1], dstBox[2], dstBox[1], 0, 1); @@ -749,7 +765,7 @@ void FBO_BlitFromTexture(struct image_s *src, vec4i_t inSrcBox, vec2_t inSrcTexS GLSL_BindProgram(shaderProgram); - GLSL_SetUniformMatrix16(shaderProgram, TEXTURECOLOR_UNIFORM_MODELVIEWPROJECTIONMATRIX, glState.modelviewProjection); + GLSL_SetUniformMatrix16(shaderProgram, TEXTURECOLOR_UNIFORM_MODELVIEWPROJECTIONMATRIX, projection); GLSL_SetUniformVec4(shaderProgram, TEXTURECOLOR_UNIFORM_COLOR, color); GLSL_SetUniformVec2(shaderProgram, TEXTURECOLOR_UNIFORM_INVTEXRES, invTexRes); GLSL_SetUniformVec2(shaderProgram, TEXTURECOLOR_UNIFORM_AUTOEXPOSUREMINMAX, tr.refdef.autoExposureMinMax); diff --git a/src/rend2/tr_scene.c b/src/rend2/tr_scene.c index eb58481e..f134c997 100644 --- a/src/rend2/tr_scene.c +++ b/src/rend2/tr_scene.c @@ -507,11 +507,6 @@ void RE_RenderScene( const refdef_t *fd ) { parms.stereoFrame = tr.refdef.stereoFrame; - if (glRefConfig.framebufferObject) - { - parms.targetFbo = tr.renderFbo; - } - VectorCopy( fd->vieworg, parms.or.origin ); VectorCopy( fd->viewaxis[0], parms.or.axis[0] ); VectorCopy( fd->viewaxis[1], parms.or.axis[1] ); |