Framebuffer first
This commit is contained in:
@@ -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();
|
||||||
}
|
}
|
@@ -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);
|
@@ -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();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -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
|
||||||
|
Reference in New Issue
Block a user