added newmap function to render modules (so explosions and other things are reset...
[divverent/darkplaces.git] / r_modules.c
1
2 #include "quakedef.h"
3
4 #define MAXRENDERMODULES 64
5
6 typedef struct rendermodule_s
7 {
8         int active; // set by start, cleared by shutdown
9         char *name;
10         void(*start)();
11         void(*shutdown)();
12         void(*newmap)();
13 }
14 rendermodule_t;
15
16 rendermodule_t rendermodule[MAXRENDERMODULES];
17
18 void R_Modules_Init()
19 {
20         int i;
21         for (i = 0;i < MAXRENDERMODULES;i++)
22                 rendermodule[i].name = NULL;
23 }
24
25 void R_RegisterModule(char *name, void(*start)(), void(*shutdown)(), void(*newmap)())
26 {
27         int i;
28         for (i = 0;i < MAXRENDERMODULES;i++)
29         {
30                 if (rendermodule[i].name == NULL)
31                         break;
32                 if (!strcmp(name, rendermodule[i].name))
33                         Sys_Error("R_RegisterModule: module \"%s\" registered twice\n", name);
34         }
35         if (i >= MAXRENDERMODULES)
36                 Sys_Error("R_RegisterModule: ran out of renderer module slots (%i)\n", MAXRENDERMODULES);
37         rendermodule[i].active = 0;
38         rendermodule[i].name = name;
39         rendermodule[i].start = start;
40         rendermodule[i].shutdown = shutdown;
41         rendermodule[i].newmap = newmap;
42 }
43
44 void R_Modules_Start ()
45 {
46         int i;
47         for (i = 0;i < MAXRENDERMODULES;i++)
48         {
49                 if (rendermodule[i].name == NULL)
50                         continue;
51                 if (rendermodule[i].active)
52                         Sys_Error("R_StartModules: module \"%s\" already active\n", rendermodule[i].name);
53                 rendermodule[i].active = 1;
54                 rendermodule[i].start();
55         }
56 }
57
58 void R_Modules_Shutdown ()
59 {
60         int i;
61         for (i = 0;i < MAXRENDERMODULES;i++)
62         {
63                 if (rendermodule[i].name == NULL)
64                         continue;
65                 if (!rendermodule[i].active)
66                         continue;
67                 rendermodule[i].active = 0;
68                 rendermodule[i].shutdown();
69         }
70 }
71
72 void R_Modules_Restart ()
73 {
74         R_Modules_Shutdown();
75         R_Modules_Start();
76 }
77
78 void R_Modules_NewMap ()
79 {
80         int i;
81         for (i = 0;i < MAXRENDERMODULES;i++)
82         {
83                 if (rendermodule[i].name == NULL)
84                         continue;
85                 if (!rendermodule[i].active)
86                         continue;
87                 rendermodule[i].newmap();
88         }
89 }