From bebf9547bd244727fa06a2ce1db2faf474ba23ad Mon Sep 17 00:00:00 2001 From: Jeffery Myers Date: Mon, 29 Jan 2024 12:10:23 -0800 Subject: [PATCH] [CORE,RLGL] Fix scale issues when ending a mode (#3746) * Only restore GL scale back to screen scale if we are returning to a screen, not a render texture. * blankspace * reset back to default screen scale when ending a render texture since we are back on the default fbo --- src/rcore.c | 15 ++++++++++----- src/rlgl.h | 12 ++++++++++++ 2 files changed, 22 insertions(+), 5 deletions(-) diff --git a/src/rcore.c b/src/rcore.c index bb06e9beedeb..b057fc05b05d 100644 --- a/src/rcore.c +++ b/src/rcore.c @@ -952,9 +952,6 @@ void BeginMode2D(Camera2D camera) // Apply 2d camera transformation to modelview rlMultMatrixf(MatrixToFloat(GetCameraMatrix2D(camera))); - - // Apply screen scaling if required - rlMultMatrixf(MatrixToFloat(CORE.Window.screenScale)); } // Ends 2D mode with custom camera @@ -963,7 +960,9 @@ void EndMode2D(void) rlDrawRenderBatchActive(); // Update and draw internal render batch rlLoadIdentity(); // Reset current matrix (modelview) - rlMultMatrixf(MatrixToFloat(CORE.Window.screenScale)); // Apply screen scaling if required + + if (rlGetActiveFramebuffer() == 0) + rlMultMatrixf(MatrixToFloat(CORE.Window.screenScale)); // Apply screen scaling if required } // Initializes 3D mode with custom camera (3D) @@ -1016,7 +1015,8 @@ void EndMode3D(void) rlMatrixMode(RL_MODELVIEW); // Switch back to modelview matrix rlLoadIdentity(); // Reset current matrix (modelview) - rlMultMatrixf(MatrixToFloat(CORE.Window.screenScale)); // Apply screen scaling if required + if (rlGetActiveFramebuffer() == 0) + rlMultMatrixf(MatrixToFloat(CORE.Window.screenScale)); // Apply screen scaling if required rlDisableDepthTest(); // Disable DEPTH_TEST for 2D } @@ -1062,6 +1062,11 @@ void EndTextureMode(void) // Set viewport to default framebuffer size SetupViewport(CORE.Window.render.width, CORE.Window.render.height); + // go back to the modelview state from BeginDrawing since we are back to the default FBO + rlMatrixMode(RL_MODELVIEW); // Switch back to modelview matrix + rlLoadIdentity(); // Reset current matrix (modelview) + rlMultMatrixf(MatrixToFloat(CORE.Window.screenScale)); // Apply screen scaling if required + // Reset current fbo to screen size CORE.Window.currentFbo.width = CORE.Window.render.width; CORE.Window.currentFbo.height = CORE.Window.render.height; diff --git a/src/rlgl.h b/src/rlgl.h index 6ad6394d0a5a..6dd3eb2c1b57 100644 --- a/src/rlgl.h +++ b/src/rlgl.h @@ -621,6 +621,7 @@ RLAPI void rlDisableShader(void); // Disable shader progra // Framebuffer state RLAPI void rlEnableFramebuffer(unsigned int id); // Enable render texture (fbo) RLAPI void rlDisableFramebuffer(void); // Disable render texture (fbo), return to default framebuffer +RLAPI unsigned int rlGetActiveFramebuffer(void); // Returns the active render texture (fbo), 0 for default framebuffer RLAPI void rlActiveDrawBuffers(int count); // Activate multiple draw color buffers RLAPI void rlBlitFramebuffer(int srcX, int srcY, int srcWidth, int srcHeight, int dstX, int dstY, int dstWidth, int dstHeight, int bufferMask); // Blit active framebuffer to main framebuffer RLAPI void rlBindFramebuffer(unsigned int target, unsigned int framebuffer); // Bind framebuffer (FBO) @@ -1725,6 +1726,17 @@ void rlEnableFramebuffer(unsigned int id) #endif } +// return the active render texture (fbo) +unsigned int rlGetActiveFramebuffer(void) +{ +#if (defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES3)) && defined(RLGL_RENDER_TEXTURES_HINT) + GLint fboId = 0; + glGetIntegerv(GL_DRAW_FRAMEBUFFER_BINDING, &fboId); + return fboId; +#endif + return 0; +} + // Disable rendering to texture void rlDisableFramebuffer(void) {