Framebuffer first

This commit is contained in:
2025-08-15 18:39:19 -05:00
parent 3c908dc1ed
commit cbdc271a5e
4 changed files with 84 additions and 51 deletions

View File

@@ -7,6 +7,8 @@
#include "renderbackbuffer.h"
#include "render.h"
#include "display/spritebatch/spritebatch.h"
#include "display/camera/camera.h"
#if RENDER_USE_FRAMEBUFFER
SDL_Texture *RENDER_BACKBUFFER;
@@ -16,20 +18,20 @@
errorret_t renderBackBufferInit(void) {
#if RENDER_USE_FRAMEBUFFER
RENDER_BACKBUFFER = SDL_CreateTexture(
RENDER_RENDERER,
SDL_PIXELFORMAT_RGBA8888,
SDL_TEXTUREACCESS_TARGET,
RENDER_WIDTH,
RENDER_HEIGHT
);
// RENDER_BACKBUFFER = SDL_CreateTexture(
// RENDER_RENDERER,
// SDL_PIXELFORMAT_RGBA8888,
// SDL_TEXTUREACCESS_TARGET,
// RENDER_WIDTH,
// RENDER_HEIGHT
// );
if(!RENDER_BACKBUFFER) {
errorThrow("SDL_CreateTexture failed: %s", SDL_GetError());
}
// Make sure we unbind the back buffer after creation
SDL_SetRenderTarget(RENDER_RENDERER, NULL);
// SDL_SetRenderTarget(RENDER_RENDERER, NULL);
#else
// No back buffer needed for window rendering
#endif
@@ -39,30 +41,31 @@ errorret_t renderBackBufferInit(void) {
void renderBackBufferBind(void) {
#if RENDER_USE_FRAMEBUFFER
SDL_SetRenderTarget(RENDER_RENDERER, RENDER_BACKBUFFER);
// SDL_SetRenderTarget(RENDER_RENDERER, RENDER_BACKBUFFER);
#endif
// Fill background with cornflower blue.
SDL_SetRenderDrawColor(RENDER_RENDERER, 100, 149, 237, 255);
SDL_RenderClear(RENDER_RENDERER);
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
SDL_SetRenderTarget(RENDER_RENDERER, NULL);
// SDL_SetRenderTarget(RENDER_RENDERER, NULL);
#endif
}
void renderBackBufferDraw(void) {
#if RENDER_USE_FRAMEBUFFER
// Clear background black
SDL_SetRenderDrawColor(RENDER_RENDERER, 0, 0, 0, 255);
SDL_RenderClear(RENDER_RENDERER);
// Create a quad that is scaled to fit but maintain original aspect ratio
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;
@@ -77,8 +80,16 @@ void renderBackBufferDraw(void) {
}
// Draw the back buffer texture
SDL_Rect destRect = { renderX, renderY, renderWidth, renderHeight };
SDL_RenderCopy(RENDER_RENDERER, RENDER_BACKBUFFER, NULL, &destRect);
spriteBatchClear();
spriteBatchPush(
NULL,
renderX, renderY,
renderX+renderWidth, renderY+renderHeight,
0xFF, 0x00, 0xFF, 0xFF,
0, 0, 1, 1
);
spriteBatchFlush();
cameraScreenPop();
#else
// No back buffer to draw
#endif