X-Git-Url: http://de.git.xonotic.org/?a=blobdiff_plain;f=r_modules.c;h=0899b880d4cc2e71ed3d2e42a3a23dcbef2b8b70;hb=75ed014650cc6c57abc48b854fb60f78bc249eab;hp=1c30a4caf638fcb347205fcc74c9b9d1eed244e7;hpb=855932aeb5707c5efb2858c3e51b913d8203ebbe;p=xonotic%2Fdarkplaces.git diff --git a/r_modules.c b/r_modules.c index 1c30a4ca..0899b880 100644 --- a/r_modules.c +++ b/r_modules.c @@ -1,46 +1,51 @@ #include "quakedef.h" +#define MAXRENDERMODULES 64 + typedef struct rendermodule_s { int active; // set by start, cleared by shutdown char *name; - void(*start)(); - void(*shutdown)(); + void(*start)(void); + void(*shutdown)(void); + void(*newmap)(void); } rendermodule_t; -rendermodule_t rendermodule[64]; +rendermodule_t rendermodule[MAXRENDERMODULES]; -void R_Modules_Init() +void R_Modules_Init(void) { int i; - for (i = 0;i < 64;i++) + Cmd_AddCommand("r_restart", R_Modules_Restart); + for (i = 0;i < MAXRENDERMODULES;i++) rendermodule[i].name = NULL; } -void R_RegisterModule(char *name, void(*start)(), void(*shutdown)()) +void R_RegisterModule(char *name, void(*start)(void), void(*shutdown)(void), void(*newmap)(void)) { int i; - for (i = 0;i < 64;i++) + for (i = 0;i < MAXRENDERMODULES;i++) { if (rendermodule[i].name == NULL) break; if (!strcmp(name, rendermodule[i].name)) Sys_Error("R_RegisterModule: module \"%s\" registered twice\n", name); } - if (i >= 64) - Sys_Error("R_RegisterModule: ran out of renderer module slots (64)\n"); + if (i >= MAXRENDERMODULES) + Sys_Error("R_RegisterModule: ran out of renderer module slots (%i)\n", MAXRENDERMODULES); rendermodule[i].active = 0; rendermodule[i].name = name; rendermodule[i].start = start; rendermodule[i].shutdown = shutdown; + rendermodule[i].newmap = newmap; } -void R_StartModules () +void R_Modules_Start(void) { int i; - for (i = 0;i < 64;i++) + for (i = 0;i < MAXRENDERMODULES;i++) { if (rendermodule[i].name == NULL) continue; @@ -51,10 +56,11 @@ void R_StartModules () } } -void R_ShutdownModules () +void R_Modules_Shutdown(void) { int i; - for (i = 0;i < 64;i++) + // shutdown in reverse + for (i = MAXRENDERMODULES - 1;i >= 0;i--) { if (rendermodule[i].name == NULL) continue; @@ -65,8 +71,23 @@ void R_ShutdownModules () } } -void R_Restart () +void R_Modules_Restart(void) +{ + Con_Print("restarting renderer\n"); + R_Modules_Shutdown(); + R_Modules_Start(); +} + +void R_Modules_NewMap(void) { - R_ShutdownModules(); - R_StartModules(); + int i; + for (i = 0;i < MAXRENDERMODULES;i++) + { + if (rendermodule[i].name == NULL) + continue; + if (!rendermodule[i].active) + continue; + rendermodule[i].newmap(); + } } +