X-Git-Url: http://deadsoftware.ru/gitweb?a=blobdiff_plain;f=src%2Fgame%2Fopengl%2Fr_render.pas;h=2eba7b282439ec1dff864cc11afedfd423ab8311;hb=6338d3fa6f58068fbde836957e6d8cfb654bb195;hp=668fb901f4e850dcd843a09ce3342daaecdccda2;hpb=f8c006bbcbec547e9a3beda8372076a10ed049ae;p=d2df-sdl.git diff --git a/src/game/opengl/r_render.pas b/src/game/opengl/r_render.pas index 668fb90..2eba7b2 100644 --- a/src/game/opengl/r_render.pas +++ b/src/game/opengl/r_render.pas @@ -17,32 +17,150 @@ unit r_render; interface + uses g_base; // TRectWH + procedure r_Render_Initialize; procedure r_Render_Finalize; + + procedure r_Render_Load; + procedure r_Render_Free; + + procedure r_Render_LoadTextures; + procedure r_Render_FreeTextures; + + procedure r_Render_Update; + procedure r_Render_Draw; + procedure r_Render_Resize (w, h: Integer); + procedure r_Render_Apply; + + function r_Render_WriteScreenShot (filename: String): Boolean; + + function r_Render_GetGibRect (m, id: Integer): TRectWH; + procedure r_Render_QueueEffect (AnimType, X, Y: Integer); + + procedure r_Render_DrawLoading (force: Boolean); // !!! remove it implementation - uses SysUtils, Classes, e_log, 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, utils, + g_game, g_options, g_console, + r_window, r_graphics, r_console, r_playermodel, r_textures, r_animations, + r_weapons, r_items, r_gfx, r_monsters, r_map, r_player, r_game + ; + + 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_LoadTextures; + begin + r_Game_LoadTextures; + r_Map_LoadTextures; + end; + + procedure r_Render_FreeTextures; + begin + r_Map_FreeTextures; + r_Game_FreeTextures; + end; + + procedure r_Render_Load; + begin + r_Game_Load; // load first! + r_Player_Load; + r_Map_Load; + 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; + r_Map_Free; + r_Player_Free; + r_Game_Free; + g_Texture_DeleteAll; + g_Frames_DeleteAll; + 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; + r_Map_Initialize; end; procedure r_Render_Finalize; begin + r_Map_Finalize; r_PlayerModel_Finalize; + FreeGL; e_ReleaseEngine end; + procedure r_Render_Update; + begin + r_GFX_Update; + r_Map_Update; + r_PlayerModel_Update; + r_Console_Update; + end; + + procedure r_Render_Draw; + begin + r_Game_Draw; + end; + procedure r_Render_Resize (w, h: Integer); begin + LoadGL; gWinSizeX := w; gWinSizeY := h; gRC_Width := w; @@ -63,7 +181,49 @@ implementation gScreenWidth := w; gScreenHeight := h; e_ResizeWindow(w, h); - e_InitGL + e_InitGL; + r_Game_SetupScreenSize; + 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; + + function r_Render_WriteScreenShot (filename: String): Boolean; + var s: TStream; + begin + Result := False; + try + s := CreateDiskFile(filename); + try + e_MakeScreenshot(s, gScreenWidth, gScreenHeight); + Result := True; + except + DeleteFile(filename) + end; + s.Free; + finally + end + end; + + function r_Render_GetGibRect (m, id: Integer): TRectWH; + begin + Result := r_PlayerModel_GetGibRect(m, id) + end; + + procedure r_Render_QueueEffect (AnimType, X, Y: Integer); + begin + r_GFX_OnceAnim(AnimType, X, Y) + end; + + procedure r_Render_DrawLoading (force: Boolean); + begin + r_Window_DrawLoading(force) end; end.