X-Git-Url: https://git.ucc.asn.au/?p=ipdf%2Fcode.git;a=blobdiff_plain;f=src%2Fscreen.cpp;h=46a2b73b4068e66f0c4a77d5547790901f6b2c7f;hp=223f4a3e6c29d7a5d20f83f244eba27503bba650;hb=1d179b93f6a1b2a4fe3823c26fba862c24bc5d6e;hpb=6dd539966821debd18e0b86ed126742cd81d7fc9 diff --git a/src/screen.cpp b/src/screen.cpp index 223f4a3..46a2b73 100644 --- a/src/screen.cpp +++ b/src/screen.cpp @@ -24,16 +24,21 @@ static void opengl_debug_callback(GLenum source, GLenum type, GLuint id, GLenum } -Screen::Screen() +Screen::Screen(bool visible) { SDL_Init(SDL_INIT_VIDEO); + uint32_t flags = SDL_WINDOW_OPENGL | SDL_WINDOW_RESIZABLE; + if (!visible) + flags |= SDL_WINDOW_HIDDEN; + m_window = SDL_CreateWindow("IPDF", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, - 800, 600, SDL_WINDOW_OPENGL | SDL_WINDOW_RESIZABLE); + 800, 600, flags); if (!m_window) { - Fatal("Couldn't create window!"); + Error("Couldn't create window!"); + return; } SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, 3); @@ -48,17 +53,17 @@ Screen::Screen() // Why is this so horribly broken? if (ogl_IsVersionGEQ(3,0)) { - Fatal("We require OpenGL 3.1, but you have version %d.%d!",ogl_GetMajorVersion(), ogl_GetMinorVersion()); + Error("We require OpenGL 3.1, but you have version %d.%d!",ogl_GetMajorVersion(), ogl_GetMinorVersion()); } if (!SDL_GL_ExtensionSupported("GL_ARB_shading_language_420pack")) { - Fatal("Your system does not support the ARB_shading_language_420pack extension, which is required."); + Error("Your system does not support the ARB_shading_language_420pack extension, which is required."); } if (!SDL_GL_ExtensionSupported("GL_ARB_explicit_attrib_location")) { - Fatal("Your system does not support the ARB_explicit_attrib_location extension, which is required."); + Error("Your system does not support the ARB_explicit_attrib_location extension, which is required."); } m_frame_begin_time = SDL_GetPerformanceCounter(); @@ -93,9 +98,12 @@ Screen::Screen() m_debug_font_atlas = 0; m_no_quit_requested = true; + m_show_debug_font = true; m_view = NULL; ResizeViewport(800, 600); + + Clear(); Present(); @@ -104,6 +112,8 @@ Screen::Screen() Screen::~Screen() { + if (!Valid()) + return; SDL_GL_DeleteContext(m_gl_context); SDL_DestroyWindow(m_window); SDL_Quit(); @@ -111,6 +121,8 @@ Screen::~Screen() void Screen::Clear(float r, float g, float b, float a) { + if (!Valid()) + return; glClearColor(r,g,b,a); glClear(GL_COLOR_BUFFER_BIT); DebugFontClear(); @@ -127,6 +139,9 @@ void Screen::ResizeViewport(int width, int height) bool Screen::PumpEvents() { + if (!Valid()) + return true; + SDL_Event evt; while (SDL_PollEvent(&evt)) @@ -205,6 +220,8 @@ void Screen::SetMouseCursor(Screen::MouseCursors cursor) void Screen::Present() { + if (!Valid()) + return; if (m_debug_font_atlas) DebugFontFlush(); m_last_frame_time = SDL_GetPerformanceCounter() - m_frame_begin_time; @@ -220,7 +237,7 @@ void Screen::Present() double Screen::GetLastFrameTimeGPU() const { - if (!m_last_frame_gpu_timer) + if (!Valid() || !m_last_frame_gpu_timer) return 0; uint64_t frame_time_ns; glGetQueryObjectui64v(m_last_frame_gpu_timer, GL_QUERY_RESULT, &frame_time_ns); @@ -271,6 +288,7 @@ void Screen::RenderPixels(int x, int y, int w, int h, uint8_t *pixels) const void Screen::ScreenShot(const char * filename) const { + if (!Valid()) return; Debug("Attempting to save BMP to file %s", filename); int w = ViewportWidth(); @@ -309,6 +327,7 @@ void Screen::ScreenShot(const char * filename) const */ void Screen::RenderBMP(const char * filename) const { + if (!Valid()) return; if (access(filename, R_OK) == -1) { Error("No such file \"%s\" - Nothing to render - You might have done this deliberately?", filename); @@ -377,6 +396,8 @@ void Screen::RenderBMP(const char * filename) const void Screen::DebugFontInit(const char *name, float font_size) { + if (!Valid()) return; + unsigned char font_atlas_data[1024*1024]; FILE *font_file = fopen(name, "rb"); fseek(font_file, 0, SEEK_END); @@ -408,6 +429,7 @@ void Screen::DebugFontInit(const char *name, float font_size) void Screen::DebugFontClear() { + if (!Valid()) return; m_debug_font_x = m_debug_font_y = 0; if (!m_debug_font_atlas) return; DebugFontPrint("\n"); @@ -415,6 +437,7 @@ void Screen::DebugFontClear() void Screen::DebugFontFlush() { + if (!Valid()) return; glPushDebugGroup(GL_DEBUG_SOURCE_APPLICATION, 40, -1, "Screen::DebugFontFlush()"); glEnable(GL_BLEND); @@ -454,7 +477,8 @@ struct fontvertex void Screen::DebugFontPrint(const char* str) { - if (!m_debug_font_atlas) return; + if (!Valid()) return; + if (!m_debug_font_atlas || !m_show_debug_font) return; glPushDebugGroup(GL_DEBUG_SOURCE_APPLICATION, 41, -1, "Screen::DebugFontPrint()");