X-Git-Url: http://deadsoftware.ru/gitweb?p=d2df-sdl.git;a=blobdiff_plain;f=src%2Fgame%2Fopengl%2Fr_render.pas;h=b26d0ecbea851752387b952675dc49f0e074789a;hp=9f8b754e4e494424548e5685c57fc6df9b147598;hb=b07cc041c0c2cbb70ddddaddf81e3b03533d3ac8;hpb=fbb649f409620a55ae48f1bffd655c5a04489371 diff --git a/src/game/opengl/r_render.pas b/src/game/opengl/r_render.pas index 9f8b754..b26d0ec 100644 --- a/src/game/opengl/r_render.pas +++ b/src/game/opengl/r_render.pas @@ -20,15 +20,85 @@ interface procedure r_Render_Initialize; procedure r_Render_Finalize; + procedure r_Render_Resize (w, h: Integer); + + procedure r_Render_Load; + procedure r_Render_Free; + + procedure r_Render_Update; + + 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, + r_weapons, r_items, r_gfx, r_monsters + ; + + 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_Load; + begin + r_PlayerModel_Load; + r_Monsters_Load; + r_Weapon_Load; + r_Items_Load; + r_GFX_Load; + end; + + procedure r_Render_Free; + begin + r_GFX_Free; + r_Items_Free; + r_Weapon_Free; + r_Monsters_Free; + r_PlayerModel_Free; + 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; @@ -37,7 +107,48 @@ implementation procedure r_Render_Finalize; begin r_PlayerModel_Finalize; + FreeGL; e_ReleaseEngine end; + procedure r_Render_Update; + begin + r_PlayerModel_Update; + 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.