X-Git-Url: http://deadsoftware.ru/gitweb?a=blobdiff_plain;f=src%2Fgame%2Fopengl%2Fr_render.pas;h=bea15e65fd69381263c4714dbef9e9fab47d2719;hb=842d9be737f296941302d4dd727d95ded3aa2e16;hp=9f8b754e4e494424548e5685c57fc6df9b147598;hpb=fbb649f409620a55ae48f1bffd655c5a04489371;p=d2df-sdl.git diff --git a/src/game/opengl/r_render.pas b/src/game/opengl/r_render.pas index 9f8b754..bea15e6 100644 --- a/src/game/opengl/r_render.pas +++ b/src/game/opengl/r_render.pas @@ -19,16 +19,61 @@ interface procedure r_Render_Initialize; procedure r_Render_Finalize; + procedure r_Render_Resize (w, h: Integer); + + procedure r_Render_Apply; implementation - uses SysUtils, Classes, g_system, g_game, g_options, r_window, r_graphics, r_console, r_playermodel; + uses + {$INCLUDE ../../nogl/noGLuses.inc} + SysUtils, Classes, Math, + e_log, g_system, + g_game, g_options, g_console, + r_window, r_graphics, r_console, r_playermodel + ; + + var + LoadedGL: Boolean = false; + + procedure LoadGL; + begin + if LoadedGL = false then + begin + {$IFDEF NOGL_INIT} + nogl_Init; + if glRenderToFBO and (not nogl_ExtensionSupported('GL_OES_framebuffer_object')) then + begin + e_LogWriteln('GL: framebuffer objects not supported; disabling FBO rendering'); + glRenderToFBO := false + end; + {$ELSE} + if glRenderToFBO and (not Load_GL_ARB_framebuffer_object) then + begin + e_LogWriteln('GL: framebuffer objects not supported; disabling FBO rendering'); + glRenderToFBO := false + end; + {$ENDIF} + LoadedGL := true + end + end; + + procedure FreeGL; + begin + if LoadedGL = true then + begin + {$IFDEF NOGL_INIT} + nogl_Quit + {$ENDIF} + LoadedGL := false + end + end; procedure r_Render_Initialize; begin if sys_SetDisplayMode(gRC_Width, gRC_Height, gBPP, gRC_FullScreen, gRC_Maximized) = False then raise Exception.Create('Failed to set videomode on startup.'); - + LoadGL; r_Window_Initialize; r_Console_Init; r_PlayerModel_Initialize; @@ -36,8 +81,44 @@ implementation procedure r_Render_Finalize; begin + FreeGL; r_PlayerModel_Finalize; e_ReleaseEngine end; + procedure r_Render_Resize (w, h: Integer); + begin + LoadGL; + gWinSizeX := w; + gWinSizeY := h; + gRC_Width := w; + gRC_Height := h; + if glRenderToFBO then + begin + // store real window size in gWinSize, downscale resolution now + w := round(w / r_pixel_scale); + h := round(h / r_pixel_scale); + if not e_ResizeFramebuffer(w, h) then + begin + e_LogWriteln('GL: could not create framebuffer, falling back to --no-fbo'); + glRenderToFBO := False; + w := gWinSizeX; + h := gWinSizeY; + end; + end; + gScreenWidth := w; + gScreenHeight := h; + e_ResizeWindow(w, h); + e_InitGL + end; + + procedure r_Render_Apply; + begin + if sys_SetDisplayMode(Max(1, gRC_Width), Max(1, gRC_Height), Max(1, gBPP), gRC_FullScreen, gRC_Maximized) then + e_LogWriteln('resolution changed') + else + e_LogWriteln('resolution not changed'); + sys_EnableVSync(gVSync) + end; + end.