/** * Copyright (c) 2025 Dominic Masters * * This software is released under the MIT License. * https://opensource.org/licenses/MIT */ #include "dusksdl2input.h" #include "render.h" #include "renderbackbuffer.h" #include "display/scene/renderscene.h" #include "display/spritebatch/spritebatch.h" #include "display/ui/renderui.h" SDL_Window *RENDER_WINDOW; 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 if(SDL_Init(flags) != 0) { errorThrow( "SDL Failed to Initialize: %s", SDL_GetError() ); } // Set OpenGL attributes (Needs to be done now or later?) SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1); // Create window with OpenGL flag. RENDER_WINDOW = SDL_CreateWindow( "DuskSDL2", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, RENDER_WINDOW_WIDTH_DEFAULT, RENDER_WINDOW_HEIGHT_DEFAULT, SDL_WINDOW_SHOWN | SDL_WINDOW_RESIZABLE | SDL_WINDOW_ALLOW_HIGHDPI | SDL_WINDOW_OPENGL ); if(!RENDER_WINDOW) { errorThrow("SDL_CreateWindow failed: %s", SDL_GetError()); } // Create OpenGL context RENDER_GL_CONTEXT = SDL_GL_CreateContext(RENDER_WINDOW); if(!RENDER_GL_CONTEXT) { errorThrow("SDL_GL_CreateContext failed: %s", SDL_GetError()); } SDL_GL_SetSwapInterval(1); glDisable(GL_DEPTH_TEST); glDisable(GL_CULL_FACE); glDisable(GL_LIGHTING);// PSP defaults this on? glShadeModel(GL_SMOOTH); // Fixes color on PSP? glEnable(GL_BLEND); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); glPixelStorei(GL_UNPACK_ALIGNMENT, 1); glEnableClientState(GL_COLOR_ARRAY);// To confirm: every frame on PSP? glEnableClientState(GL_TEXTURE_COORD_ARRAY); glEnableClientState(GL_VERTEX_ARRAY); spriteBatchInit(); renderBackBufferInit(); renderSceneInit(); renderUIInit(); RENDER_RUNNING = true; errorOk(); } errorret_t renderDraw(void) { SDL_Event event; while(SDL_PollEvent(&event)) { switch(event.type) { case SDL_QUIT: RENDER_RUNNING = false; break; default: break; } } // Reset the state spriteBatchClear(); renderBackBufferBind(); renderSceneDraw(); renderUIDraw(); // Finish rendering, now render back buffer. renderBackBufferUnbind(); renderBackBufferDraw(); textureBind(NULL); SDL_GL_SwapWindow(RENDER_WINDOW); errorOk(); } errorret_t renderDispose(void) { renderUIDispose(); renderSceneDispose(); renderBackBufferDispose(); spriteBatchDispose(); // Destroy OpenGL context SDL_GL_DeleteContext(RENDER_GL_CONTEXT); SDL_DestroyWindow(RENDER_WINDOW); SDL_Quit(); errorOk(); }