93 lines
2.3 KiB
C
93 lines
2.3 KiB
C
/**
|
|
* 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();
|
|
} |