diff --git a/src/dusksdl2/display/camera/camera.c b/src/dusksdl2/display/camera/camera.c index 1989ec8..75e0f9d 100644 --- a/src/dusksdl2/display/camera/camera.c +++ b/src/dusksdl2/display/camera/camera.c @@ -9,7 +9,6 @@ #include "display/render.h" void cameraUIPush(void) { - // Push the UI camera matrix onto the stack. glPushMatrix(); glLoadIdentity(); glOrtho( @@ -20,6 +19,32 @@ void cameraUIPush(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(); } \ No newline at end of file diff --git a/src/dusksdl2/display/camera/camera.h b/src/dusksdl2/display/camera/camera.h index 3c72076..1001c50 100644 --- a/src/dusksdl2/display/camera/camera.h +++ b/src/dusksdl2/display/camera/camera.h @@ -16,4 +16,14 @@ void cameraUIPush(void); /** * Pops the UI camera matrix from the stack. */ -void cameraUIPop(void); \ No newline at end of file +void cameraUIPop(void); + +/** + * Pushes the screen space camera matrix onto the stack. + */ +void cameraScreenPush(void); + +/** + * Pops the screen space camera matrix. + */ +void cameraScreenPop(void); \ No newline at end of file diff --git a/src/dusksdl2/display/render.c b/src/dusksdl2/display/render.c index 16c7b94..8a47612 100644 --- a/src/dusksdl2/display/render.c +++ b/src/dusksdl2/display/render.c @@ -19,14 +19,12 @@ #include "display/camera/camera.h" SDL_Window *RENDER_WINDOW; -SDL_Renderer *RENDER_RENDERER; SDL_GLContext RENDER_GL_CONTEXT; bool_t RENDER_RUNNING; errorret_t renderInit(void) { // Init SDL uint32_t flags = SDL_INIT_VIDEO; - #if INPUT_SUPPORT_GAMEPAD flags |= SDL_INIT_GAMECONTROLLER; #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); // Create window with OpenGL flag. @@ -48,7 +46,8 @@ errorret_t renderInit(void) { SDL_WINDOWPOS_UNDEFINED, RENDER_WINDOW_WIDTH_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) { errorThrow("SDL_CreateWindow failed: %s", SDL_GetError()); @@ -60,13 +59,7 @@ errorret_t renderInit(void) { errorThrow("SDL_GL_CreateContext failed: %s", SDL_GetError()); } - // Enable VSync (optional) 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_CULL_FACE); glEnable(GL_BLEND); @@ -74,24 +67,18 @@ errorret_t renderInit(void) { glDisable(GL_LIGHTING);// PSP defaults this on? glEnable(GL_TEXTURE_2D); glShadeModel(GL_SMOOTH); // Fixes color on PSP? - - // To confirm: does this need to be done every frame? - glEnableClientState(GL_COLOR_ARRAY); + glEnableClientState(GL_COLOR_ARRAY);// To confirm: every frame on PSP? glEnableClientState(GL_TEXTURE_COORD_ARRAY); glEnableClientState(GL_VERTEX_ARRAY); spriteBatchInit(); - - // Create back buffer. - // renderBackBufferInit(); + renderTextInit(); + renderBackBufferInit(); // Init other things - renderTextInit(); - // renderSceneInit(); + renderSceneInit(); - // Mark ready. RENDER_RUNNING = true; - errorOk(); } @@ -109,25 +96,25 @@ errorret_t renderDraw(void) { } // Bind the backbuffer - // renderBackBufferBind(); + renderBackBufferBind(); // Draw everything - // renderSceneDraw(); - - // Unbind the backbuffer - // renderBackBufferUnbind(); - // renderBackBufferDraw(); + renderSceneDraw(); - glClearColor(0.392f, 0.584f, 0.929f, 1.0f); - glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); cameraUIPush(); renderConsoleDraw(); spriteBatchFlush(); cameraUIPop(); - SDL_GL_SwapWindow(RENDER_WINDOW); + // Finish rendering + spriteBatchFlush(); + renderBackBufferUnbind(); + // Draw the back buffer to the window + renderBackBufferDraw(); + + SDL_GL_SwapWindow(RENDER_WINDOW); errorOk(); } diff --git a/src/dusksdl2/display/renderbackbuffer.c b/src/dusksdl2/display/renderbackbuffer.c index 4adf425..b37f9b3 100644 --- a/src/dusksdl2/display/renderbackbuffer.c +++ b/src/dusksdl2/display/renderbackbuffer.c @@ -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