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

@@ -9,7 +9,6 @@
#include "display/render.h" #include "display/render.h"
void cameraUIPush(void) { void cameraUIPush(void) {
// Push the UI camera matrix onto the stack.
glPushMatrix(); glPushMatrix();
glLoadIdentity(); glLoadIdentity();
glOrtho( glOrtho(
@@ -20,6 +19,32 @@ void cameraUIPush(void) {
} }
void cameraUIPop(void) { void cameraUIPop(void) {
// Pop the UI camera matrix from the stack. glPopMatrix();
}
void cameraScreenPush(void) {
glPushMatrix();
glLoadIdentity();
#if RENDER_USE_FRAMEBUFFER
int32_t windowWidth, windowHeight;
SDL_GetWindowSize(RENDER_WINDOW, &windowWidth, &windowHeight);
glViewport(0, 0, windowWidth, windowHeight);
glOrtho(
0.0f, (float_t)windowWidth,
(float_t)windowHeight, 0.0f,
-1.0f, 1.0f
);
#else
glOrtho(
0.0f, (float_t)RENDER_WIDTH,
(float_t)RENDER_HEIGHT, 0.0f,
-1.0f, 1.0f
);
#endif
}
void cameraScreenPop(void) {
glPopMatrix(); glPopMatrix();
} }

View File

@@ -17,3 +17,13 @@ void cameraUIPush(void);
* Pops the UI camera matrix from the stack. * Pops the UI camera matrix from the stack.
*/ */
void cameraUIPop(void); void cameraUIPop(void);
/**
* Pushes the screen space camera matrix onto the stack.
*/
void cameraScreenPush(void);
/**
* Pops the screen space camera matrix.
*/
void cameraScreenPop(void);

View File

@@ -19,14 +19,12 @@
#include "display/camera/camera.h" #include "display/camera/camera.h"
SDL_Window *RENDER_WINDOW; SDL_Window *RENDER_WINDOW;
SDL_Renderer *RENDER_RENDERER;
SDL_GLContext RENDER_GL_CONTEXT; SDL_GLContext RENDER_GL_CONTEXT;
bool_t RENDER_RUNNING; bool_t RENDER_RUNNING;
errorret_t renderInit(void) { errorret_t renderInit(void) {
// Init SDL // Init SDL
uint32_t flags = SDL_INIT_VIDEO; uint32_t flags = SDL_INIT_VIDEO;
#if INPUT_SUPPORT_GAMEPAD #if INPUT_SUPPORT_GAMEPAD
flags |= SDL_INIT_GAMECONTROLLER; flags |= SDL_INIT_GAMECONTROLLER;
#endif #endif
@@ -38,7 +36,7 @@ errorret_t renderInit(void) {
); );
} }
// Set OpenGL attributes (optional, adjust as needed) // Set OpenGL attributes (Needs to be done now or later?)
SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1); SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1);
// Create window with OpenGL flag. // Create window with OpenGL flag.
@@ -48,7 +46,8 @@ errorret_t renderInit(void) {
SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED,
RENDER_WINDOW_WIDTH_DEFAULT, RENDER_WINDOW_WIDTH_DEFAULT,
RENDER_WINDOW_HEIGHT_DEFAULT, RENDER_WINDOW_HEIGHT_DEFAULT,
SDL_WINDOW_SHOWN | SDL_WINDOW_RESIZABLE | SDL_WINDOW_ALLOW_HIGHDPI | SDL_WINDOW_OPENGL SDL_WINDOW_SHOWN | SDL_WINDOW_RESIZABLE | SDL_WINDOW_ALLOW_HIGHDPI |
SDL_WINDOW_OPENGL
); );
if(!RENDER_WINDOW) { if(!RENDER_WINDOW) {
errorThrow("SDL_CreateWindow failed: %s", SDL_GetError()); errorThrow("SDL_CreateWindow failed: %s", SDL_GetError());
@@ -60,13 +59,7 @@ errorret_t renderInit(void) {
errorThrow("SDL_GL_CreateContext failed: %s", SDL_GetError()); errorThrow("SDL_GL_CreateContext failed: %s", SDL_GetError());
} }
// Enable VSync (optional)
SDL_GL_SetSwapInterval(1); SDL_GL_SetSwapInterval(1);
// No SDL_Renderer needed for OpenGL, set to NULL
RENDER_RENDERER = NULL;
// Disable GL crap we don't need
glDisable(GL_DEPTH_TEST); glDisable(GL_DEPTH_TEST);
glDisable(GL_CULL_FACE); glDisable(GL_CULL_FACE);
glEnable(GL_BLEND); glEnable(GL_BLEND);
@@ -74,24 +67,18 @@ errorret_t renderInit(void) {
glDisable(GL_LIGHTING);// PSP defaults this on? glDisable(GL_LIGHTING);// PSP defaults this on?
glEnable(GL_TEXTURE_2D); glEnable(GL_TEXTURE_2D);
glShadeModel(GL_SMOOTH); // Fixes color on PSP? glShadeModel(GL_SMOOTH); // Fixes color on PSP?
glEnableClientState(GL_COLOR_ARRAY);// To confirm: every frame on PSP?
// To confirm: does this need to be done every frame?
glEnableClientState(GL_COLOR_ARRAY);
glEnableClientState(GL_TEXTURE_COORD_ARRAY); glEnableClientState(GL_TEXTURE_COORD_ARRAY);
glEnableClientState(GL_VERTEX_ARRAY); glEnableClientState(GL_VERTEX_ARRAY);
spriteBatchInit(); spriteBatchInit();
renderTextInit();
// Create back buffer. renderBackBufferInit();
// renderBackBufferInit();
// Init other things // Init other things
renderTextInit(); renderSceneInit();
// renderSceneInit();
// Mark ready.
RENDER_RUNNING = true; RENDER_RUNNING = true;
errorOk(); errorOk();
} }
@@ -109,25 +96,25 @@ errorret_t renderDraw(void) {
} }
// Bind the backbuffer // Bind the backbuffer
// renderBackBufferBind(); renderBackBufferBind();
// Draw everything // Draw everything
// renderSceneDraw(); renderSceneDraw();
// Unbind the backbuffer
// renderBackBufferUnbind();
// renderBackBufferDraw();
glClearColor(0.392f, 0.584f, 0.929f, 1.0f);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
cameraUIPush(); cameraUIPush();
renderConsoleDraw(); renderConsoleDraw();
spriteBatchFlush(); spriteBatchFlush();
cameraUIPop(); cameraUIPop();
SDL_GL_SwapWindow(RENDER_WINDOW); // Finish rendering
spriteBatchFlush();
renderBackBufferUnbind();
// Draw the back buffer to the window
renderBackBufferDraw();
SDL_GL_SwapWindow(RENDER_WINDOW);
errorOk(); errorOk();
} }

View File

@@ -7,6 +7,8 @@
#include "renderbackbuffer.h" #include "renderbackbuffer.h"
#include "render.h" #include "render.h"
#include "display/spritebatch/spritebatch.h"
#include "display/camera/camera.h"
#if RENDER_USE_FRAMEBUFFER #if RENDER_USE_FRAMEBUFFER
SDL_Texture *RENDER_BACKBUFFER; SDL_Texture *RENDER_BACKBUFFER;
@@ -16,20 +18,20 @@
errorret_t renderBackBufferInit(void) { errorret_t renderBackBufferInit(void) {
#if RENDER_USE_FRAMEBUFFER #if RENDER_USE_FRAMEBUFFER
RENDER_BACKBUFFER = SDL_CreateTexture( // RENDER_BACKBUFFER = SDL_CreateTexture(
RENDER_RENDERER, // RENDER_RENDERER,
SDL_PIXELFORMAT_RGBA8888, // SDL_PIXELFORMAT_RGBA8888,
SDL_TEXTUREACCESS_TARGET, // SDL_TEXTUREACCESS_TARGET,
RENDER_WIDTH, // RENDER_WIDTH,
RENDER_HEIGHT // RENDER_HEIGHT
); // );
if(!RENDER_BACKBUFFER) { if(!RENDER_BACKBUFFER) {
errorThrow("SDL_CreateTexture failed: %s", SDL_GetError()); errorThrow("SDL_CreateTexture failed: %s", SDL_GetError());
} }
// Make sure we unbind the back buffer after creation // Make sure we unbind the back buffer after creation
SDL_SetRenderTarget(RENDER_RENDERER, NULL); // SDL_SetRenderTarget(RENDER_RENDERER, NULL);
#else #else
// No back buffer needed for window rendering // No back buffer needed for window rendering
#endif #endif
@@ -39,30 +41,31 @@ errorret_t renderBackBufferInit(void) {
void renderBackBufferBind(void) { void renderBackBufferBind(void) {
#if RENDER_USE_FRAMEBUFFER #if RENDER_USE_FRAMEBUFFER
SDL_SetRenderTarget(RENDER_RENDERER, RENDER_BACKBUFFER); // SDL_SetRenderTarget(RENDER_RENDERER, RENDER_BACKBUFFER);
#endif #endif
// Fill background with cornflower blue. // Fill background with cornflower blue.
SDL_SetRenderDrawColor(RENDER_RENDERER, 100, 149, 237, 255); glClearColor(0.392f, 0.584f, 0.929f, 1.0f);
SDL_RenderClear(RENDER_RENDERER); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
} }
void renderBackBufferUnbind(void) { void renderBackBufferUnbind(void) {
#if RENDER_USE_FRAMEBUFFER #if RENDER_USE_FRAMEBUFFER
SDL_SetRenderTarget(RENDER_RENDERER, NULL); // SDL_SetRenderTarget(RENDER_RENDERER, NULL);
#endif #endif
} }
void renderBackBufferDraw(void) { void renderBackBufferDraw(void) {
#if RENDER_USE_FRAMEBUFFER #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; int32_t windowWidth, windowHeight;
SDL_GetWindowSize(RENDER_WINDOW, &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; int32_t renderWidth, renderHeight, renderX, renderY;
if(RENDER_WIDTH * windowHeight > RENDER_HEIGHT * windowWidth) { if(RENDER_WIDTH * windowHeight > RENDER_HEIGHT * windowWidth) {
renderWidth = windowWidth; renderWidth = windowWidth;
@@ -77,8 +80,16 @@ void renderBackBufferDraw(void) {
} }
// Draw the back buffer texture // Draw the back buffer texture
SDL_Rect destRect = { renderX, renderY, renderWidth, renderHeight }; spriteBatchClear();
SDL_RenderCopy(RENDER_RENDERER, RENDER_BACKBUFFER, NULL, &destRect); spriteBatchPush(
NULL,
renderX, renderY,
renderX+renderWidth, renderY+renderHeight,
0xFF, 0x00, 0xFF, 0xFF,
0, 0, 1, 1
);
spriteBatchFlush();
cameraScreenPop();
#else #else
// No back buffer to draw // No back buffer to draw
#endif #endif