]> de.git.xonotic.org Git - xonotic/netradiant.git/blob - radiant/plugin.cpp
Merge branch 'fix-fast' into 'master'
[xonotic/netradiant.git] / radiant / plugin.cpp
1 /*
2    Copyright (C) 2001-2006, William Joseph.
3    All Rights Reserved.
4
5    This file is part of GtkRadiant.
6
7    GtkRadiant is free software; you can redistribute it and/or modify
8    it under the terms of the GNU General Public License as published by
9    the Free Software Foundation; either version 2 of the License, or
10    (at your option) any later version.
11
12    GtkRadiant is distributed in the hope that it will be useful,
13    but WITHOUT ANY WARRANTY; without even the implied warranty of
14    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15    GNU General Public License for more details.
16
17    You should have received a copy of the GNU General Public License
18    along with GtkRadiant; if not, write to the Free Software
19    Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
20  */
21
22 #include "plugin.h"
23
24 #include "debugging/debugging.h"
25
26 #include "qerplugin.h"
27 #include "ifilesystem.h"
28 #include "ishaders.h"
29 #include "ientity.h"
30 #include "ieclass.h"
31 #include "irender.h"
32 #include "iscenegraph.h"
33 #include "iselection.h"
34 #include "ifilter.h"
35 #include "iscriplib.h"
36 #include "igl.h"
37 #include "iundo.h"
38 #include "itextures.h"
39 #include "ireference.h"
40 #include "ifiletypes.h"
41 #include "preferencesystem.h"
42 #include "ibrush.h"
43 #include "ipatch.h"
44 #include "iimage.h"
45 #include "itoolbar.h"
46 #include "iplugin.h"
47 #include "imap.h"
48 #include "namespace.h"
49
50 #include "gtkutil/messagebox.h"
51 #include "gtkutil/filechooser.h"
52 #include "maplib.h"
53
54 #include "error.h"
55 #include "map.h"
56 #include "qe3.h"
57 #include "entityinspector.h"
58 #include "entitylist.h"
59 #include "points.h"
60 #include "gtkmisc.h"
61 #include "texwindow.h"
62 #include "mainframe.h"
63 #include "build.h"
64 #include "mru.h"
65 #include "multimon.h"
66 #include "surfacedialog.h"
67 #include "groupdialog.h"
68 #include "patchdialog.h"
69 #include "camwindow.h"
70 #include "watchbsp.h"
71 #include "xywindow.h"
72 #include "entity.h"
73 #include "select.h"
74 #include "preferences.h"
75 #include "autosave.h"
76 #include "plugintoolbar.h"
77 #include "findtexturedialog.h"
78 #include "nullmodel.h"
79 #include "grid.h"
80
81 #include "modulesystem/modulesmap.h"
82 #include "modulesystem/singletonmodule.h"
83
84 #include "generic/callback.h"
85
86 const char *GameDescription_getKeyValue(const char *key)
87 {
88     return g_pGameDescription->getKeyValue(key);
89 }
90
91 const char *GameDescription_getRequiredKeyValue(const char *key)
92 {
93     return g_pGameDescription->getRequiredKeyValue(key);
94 }
95
96 const char *getMapName()
97 {
98     return Map_Name(g_map);
99 }
100
101 scene::Node &getMapWorldEntity()
102 {
103     return Map_FindOrInsertWorldspawn(g_map);
104 }
105
106 VIEWTYPE XYWindow_getViewType()
107 {
108     return g_pParentWnd->GetXYWnd()->GetViewType();
109 }
110
111 Vector3 XYWindow_windowToWorld(const WindowVector &position)
112 {
113     Vector3 result(0, 0, 0);
114     g_pParentWnd->GetXYWnd()->XY_ToPoint(static_cast<int>( position.x()), static_cast<int>( position.y()), result);
115     return result;
116 }
117
118 const char *TextureBrowser_getSelectedShader()
119 {
120     return TextureBrowser_GetSelectedShader(GlobalTextureBrowser());
121 }
122
123 const char *getGameFile()
124 {
125     return g_GamesDialog.m_sGameFile.c_str();
126 }
127
128 class RadiantCoreAPI {
129     _QERFuncTable_1 m_radiantcore;
130 public:
131     typedef _QERFuncTable_1 Type;
132
133     STRING_CONSTANT(Name, "*");
134
135     RadiantCoreAPI()
136     {
137         m_radiantcore.getEnginePath = &EnginePath_get;
138         m_radiantcore.getLocalRcPath = &LocalRcPath_get;
139         m_radiantcore.getAppPath = &AppPath_get;
140         m_radiantcore.getGameToolsPath = &GameToolsPath_get;
141         m_radiantcore.getSettingsPath = &SettingsPath_get;
142         m_radiantcore.getMapsPath = &getMapsPath;
143
144         m_radiantcore.getGameFile = &getGameFile;
145         m_radiantcore.getGameName = &gamename_get;
146         m_radiantcore.getGameMode = &gamemode_get;
147
148         m_radiantcore.getMapName = &getMapName;
149         m_radiantcore.getMapWorldEntity = getMapWorldEntity;
150         m_radiantcore.getGridSize = GetGridSize;
151
152         m_radiantcore.getGameDescriptionKeyValue = &GameDescription_getKeyValue;
153         m_radiantcore.getRequiredGameDescriptionKeyValue = &GameDescription_getRequiredKeyValue;
154
155         m_radiantcore.XYWindowDestroyed_connect = XYWindowDestroyed_connect;
156         m_radiantcore.XYWindowDestroyed_disconnect = XYWindowDestroyed_disconnect;
157         m_radiantcore.XYWindowMouseDown_connect = XYWindowMouseDown_connect;
158         m_radiantcore.XYWindowMouseDown_disconnect = XYWindowMouseDown_disconnect;
159         m_radiantcore.XYWindow_getViewType = XYWindow_getViewType;
160         m_radiantcore.XYWindow_windowToWorld = XYWindow_windowToWorld;
161         m_radiantcore.TextureBrowser_getSelectedShader = TextureBrowser_getSelectedShader;
162
163         m_radiantcore.m_pfnMessageBox = &gtk_MessageBox;
164         m_radiantcore.m_pfnFileDialog = &file_dialog;
165         m_radiantcore.m_pfnColorDialog = &color_dialog;
166         m_radiantcore.m_pfnDirDialog = &dir_dialog;
167         m_radiantcore.m_pfnNewImage = &new_plugin_image;
168     }
169
170     _QERFuncTable_1 *getTable()
171     {
172         return &m_radiantcore;
173     }
174 };
175
176 typedef SingletonModule<RadiantCoreAPI> RadiantCoreModule;
177 typedef Static<RadiantCoreModule> StaticRadiantCoreModule;
178 StaticRegisterModule staticRegisterRadiantCore(StaticRadiantCoreModule::instance());
179
180
181 class RadiantDependencies :
182         public GlobalRadiantModuleRef,
183         public GlobalFileSystemModuleRef,
184         public GlobalEntityModuleRef,
185         public GlobalShadersModuleRef,
186         public GlobalBrushModuleRef,
187         public GlobalSceneGraphModuleRef,
188         public GlobalShaderCacheModuleRef,
189         public GlobalFiletypesModuleRef,
190         public GlobalSelectionModuleRef,
191         public GlobalReferenceModuleRef,
192         public GlobalOpenGLModuleRef,
193         public GlobalEntityClassManagerModuleRef,
194         public GlobalUndoModuleRef,
195         public GlobalScripLibModuleRef,
196         public GlobalNamespaceModuleRef {
197     ImageModulesRef m_image_modules;
198     MapModulesRef m_map_modules;
199     ToolbarModulesRef m_toolbar_modules;
200     PluginModulesRef m_plugin_modules;
201
202 public:
203     RadiantDependencies() :
204             GlobalEntityModuleRef(GlobalRadiant().getRequiredGameDescriptionKeyValue("entities")),
205             GlobalShadersModuleRef(GlobalRadiant().getRequiredGameDescriptionKeyValue("shaders")),
206             GlobalBrushModuleRef(GlobalRadiant().getRequiredGameDescriptionKeyValue("brushtypes")),
207             GlobalEntityClassManagerModuleRef(GlobalRadiant().getRequiredGameDescriptionKeyValue("entityclass")),
208             m_image_modules(GlobalRadiant().getRequiredGameDescriptionKeyValue("texturetypes")),
209             m_map_modules(GlobalRadiant().getRequiredGameDescriptionKeyValue("maptypes")),
210             m_toolbar_modules("*"),
211             m_plugin_modules("*")
212     {
213     }
214
215     ImageModules &getImageModules()
216     {
217         return m_image_modules.get();
218     }
219
220     MapModules &getMapModules()
221     {
222         return m_map_modules.get();
223     }
224
225     ToolbarModules &getToolbarModules()
226     {
227         return m_toolbar_modules.get();
228     }
229
230     PluginModules &getPluginModules()
231     {
232         return m_plugin_modules.get();
233     }
234 };
235
236 class Radiant : public TypeSystemRef {
237 public:
238     Radiant()
239     {
240         Preferences_Init();
241
242         GlobalFiletypes().addType("sound", "wav", filetype_t("PCM sound files", "*.wav"));
243
244         Selection_construct();
245         HomePaths_Construct();
246         VFS_Construct();
247         Grid_construct();
248         MultiMon_Construct();
249         MRU_Construct();
250         Pointfile_Construct();
251         GLWindow_Construct();
252         BuildMenu_Construct();
253         Map_Construct();
254         EntityList_Construct();
255         MainFrame_Construct();
256         GroupDialog_Construct();
257         SurfaceInspector_Construct();
258         PatchInspector_Construct();
259         CamWnd_Construct();
260         XYWindow_Construct();
261         BuildMonitor_Construct();
262         TextureBrowser_Construct();
263         Entity_Construct();
264         Autosave_Construct();
265         EntityInspector_construct();
266         FindTextureDialog_Construct();
267         NullModel_construct();
268         MapRoot_construct();
269
270         EnginePath_verify();
271         EnginePath_Realise();
272     }
273
274     ~Radiant()
275     {
276         EnginePath_Unrealise();
277
278         MapRoot_destroy();
279         NullModel_destroy();
280         FindTextureDialog_Destroy();
281         EntityInspector_destroy();
282         Autosave_Destroy();
283         Entity_Destroy();
284         TextureBrowser_Destroy();
285         BuildMonitor_Destroy();
286         XYWindow_Destroy();
287         CamWnd_Destroy();
288         PatchInspector_Destroy();
289         SurfaceInspector_Destroy();
290         GroupDialog_Destroy();
291         MainFrame_Destroy();
292         EntityList_Destroy();
293         Map_Destroy();
294         BuildMenu_Destroy();
295         GLWindow_Destroy();
296         Pointfile_Destroy();
297         MRU_Destroy();
298         MultiMon_Destroy();
299         Grid_destroy();
300         VFS_Destroy();
301         HomePaths_Destroy();
302         Selection_destroy();
303     }
304 };
305
306 namespace {
307     bool g_RadiantInitialised = false;
308     RadiantDependencies *g_RadiantDependencies;
309     Radiant *g_Radiant;
310 }
311
312
313 bool Radiant_Construct(ModuleServer &server)
314 {
315     GlobalModuleServer::instance().set(server);
316     StaticModuleRegistryList().instance().registerModules();
317
318     g_RadiantDependencies = new RadiantDependencies();
319
320     g_RadiantInitialised = !server.getError();
321
322     if (g_RadiantInitialised) {
323         g_Radiant = new Radiant;
324     }
325
326     return g_RadiantInitialised;
327 }
328
329 void Radiant_Destroy()
330 {
331     if (g_RadiantInitialised) {
332         delete g_Radiant;
333     }
334
335     delete g_RadiantDependencies;
336 }
337
338 ImageModules &Radiant_getImageModules()
339 {
340     return g_RadiantDependencies->getImageModules();
341 }
342
343 MapModules &Radiant_getMapModules()
344 {
345     return g_RadiantDependencies->getMapModules();
346 }
347
348 ToolbarModules &Radiant_getToolbarModules()
349 {
350     return g_RadiantDependencies->getToolbarModules();
351 }
352
353 PluginModules &Radiant_getPluginModules()
354 {
355     return g_RadiantDependencies->getPluginModules();
356 }