X-Git-Url: http://git.xonotic.org/?a=blobdiff_plain;f=r_modules.c;h=dd76b6cae9d4be1fcf74b17d74e09f2e85a0838e;hb=871cfdae9e48274eacb720e2423b9d8b3818bee9;hp=e3729796bad69bd58f1c884e5fa5292fed3a4d30;hpb=6f079ecb90e1e6b7597d4da1a98f95c5822aad8d;p=xonotic%2Fdarkplaces.git diff --git a/r_modules.c b/r_modules.c index e3729796..dd76b6ca 100644 --- a/r_modules.c +++ b/r_modules.c @@ -1,15 +1,17 @@ #include "quakedef.h" -#define MAXRENDERMODULES 64 +#define MAXRENDERMODULES 20 typedef struct rendermodule_s { int active; // set by start, cleared by shutdown - char *name; + const char *name; void(*start)(void); void(*shutdown)(void); void(*newmap)(void); + void(*devicelost)(void); + void(*devicerestored)(void); } rendermodule_t; @@ -17,10 +19,10 @@ rendermodule_t rendermodule[MAXRENDERMODULES]; void R_Modules_Init(void) { - Cmd_AddCommand("r_restart", R_Modules_Restart); + Cmd_AddCommand(CF_CLIENT, "r_restart", R_Modules_Restart_f, "restarts renderer"); } -void R_RegisterModule(char *name, void(*start)(void), void(*shutdown)(void), void(*newmap)(void)) +void R_RegisterModule(const char *name, void(*start)(void), void(*shutdown)(void), void(*newmap)(void), void(*devicelost)(void), void(*devicerestored)(void)) { int i; for (i = 0;i < MAXRENDERMODULES;i++) @@ -34,12 +36,14 @@ void R_RegisterModule(char *name, void(*start)(void), void(*shutdown)(void), voi } } if (i >= MAXRENDERMODULES) - Sys_Error("R_RegisterModule: ran out of renderer module slots (%i)\n", MAXRENDERMODULES); + Sys_Error("R_RegisterModule: ran out of renderer module slots (%i)", MAXRENDERMODULES); rendermodule[i].active = 0; rendermodule[i].name = name; rendermodule[i].start = start; rendermodule[i].shutdown = shutdown; rendermodule[i].newmap = newmap; + rendermodule[i].devicelost = devicelost; + rendermodule[i].devicerestored = devicerestored; } void R_Modules_Start(void) @@ -51,9 +55,10 @@ void R_Modules_Start(void) continue; if (rendermodule[i].active) { - Con_Printf ("R_StartModules: module \"%s\" already active\n", rendermodule[i].name); + Con_Printf ("R_Modules_Start: module \"%s\" already active\n", rendermodule[i].name); continue; } + Con_DPrintf("Starting render module \"%s\"\n", rendermodule[i].name); rendermodule[i].active = 1; rendermodule[i].start(); } @@ -69,14 +74,17 @@ void R_Modules_Shutdown(void) continue; if (!rendermodule[i].active) continue; + Con_DPrintf("Stopping render module \"%s\"\n", rendermodule[i].name); rendermodule[i].active = 0; rendermodule[i].shutdown(); } } -void R_Modules_Restart(void) +void R_Modules_Restart_f(cmd_state_t *cmd) { - Con_Print("restarting renderer\n"); + CL_StartVideo(); + Con_Print("Restarting renderer\n"); + SCR_BeginLoadingPlaque(false); R_Modules_Shutdown(); R_Modules_Start(); } @@ -84,6 +92,7 @@ void R_Modules_Restart(void) void R_Modules_NewMap(void) { int i; + R_SkinFrame_PrepareForPurge(); for (i = 0;i < MAXRENDERMODULES;i++) { if (rendermodule[i].name == NULL) @@ -92,5 +101,37 @@ void R_Modules_NewMap(void) continue; rendermodule[i].newmap(); } + R_SkinFrame_Purge(); +} + +void R_Modules_DeviceLost(void) +{ + int i; + for (i = 0;i < MAXRENDERMODULES;i++) + { + if (rendermodule[i].name == NULL) + continue; + if (!rendermodule[i].active) + continue; + if (!rendermodule[i].devicelost) + continue; + rendermodule[i].devicelost(); + } +} + + +void R_Modules_DeviceRestored(void) +{ + int i; + for (i = 0;i < MAXRENDERMODULES;i++) + { + if (rendermodule[i].name == NULL) + continue; + if (!rendermodule[i].active) + continue; + if (!rendermodule[i].devicerestored) + continue; + rendermodule[i].devicerestored(); + } }