/** * Copyright (c) 2025 Dominic Masters * * This software is released under the MIT License. * https://opensource.org/licenses/MIT */ #include "renderbackbuffer.h" #include "render.h" #include "display/spritebatch/spritebatch.h" #include "display/camera/camera.h" #if RENDER_USE_FRAMEBUFFER framebuffer_t RENDER_BACKBUFFER; #endif errorret_t renderBackBufferInit(void) { #if RENDER_USE_FRAMEBUFFER frameBufferInit( &RENDER_BACKBUFFER, RENDER_WIDTH, RENDER_HEIGHT ); #else // No back buffer needed for window rendering #endif errorOk(); } void renderBackBufferBind(void) { #if RENDER_USE_FRAMEBUFFER frameBufferBind(&RENDER_BACKBUFFER); #endif // Fill background with cornflower blue. glClearColor(0.392f, 0.584f, 0.929f, 1.0f); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); } void renderBackBufferUnbind(void) { #if RENDER_USE_FRAMEBUFFER frameBufferBind(NULL); #endif } void renderBackBufferDraw(void) { #if RENDER_USE_FRAMEBUFFER int32_t windowWidth, windowHeight; SDL_GetWindowSize(RENDER_WINDOW, &windowWidth, &windowHeight); // Set viewport to match window size cameraScreenPush(); glClearColor(0.0f, 0.0f, 0.0f, 1.0f); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // Create a quad that is scaled to fit but maintain original aspect ratio int32_t renderWidth, renderHeight, renderX, renderY; if(RENDER_WIDTH * windowHeight > RENDER_HEIGHT * windowWidth) { renderWidth = windowWidth; renderHeight = (RENDER_HEIGHT * windowWidth) / RENDER_WIDTH; renderX = 0; renderY = (windowHeight - renderHeight) / 2; } else { renderWidth = (RENDER_WIDTH * windowHeight) / RENDER_HEIGHT; renderHeight = windowHeight; renderX = (windowWidth - renderWidth) / 2; renderY = 0; } // Draw the back buffer texture spriteBatchClear(); spriteBatchPush( &RENDER_BACKBUFFER.texture, renderX, renderY, renderX+renderWidth, renderY+renderHeight, 0xFF, 0xFF, 0xFF, 0xFF, 0, 1, 1, 0 ); spriteBatchFlush(); cameraScreenPop(); #else // No back buffer to draw #endif } errorret_t renderBackBufferDispose(void) { #if RENDER_USE_FRAMEBUFFER frameBufferDispose(&RENDER_BACKBUFFER); #endif errorOk(); }