]> de.git.xonotic.org Git - xonotic/netradiant.git/blob - contrib/prtview/prtview.cpp
contrib/prtview: center config window on main window
[xonotic/netradiant.git] / contrib / prtview / prtview.cpp
1 /*
2    PrtView plugin for GtkRadiant
3    Copyright (C) 2001 Geoffrey Dewan, Loki software and qeradiant.com
4
5    This library is free software; you can redistribute it and/or
6    modify it under the terms of the GNU Lesser General Public
7    License as published by the Free Software Foundation; either
8    version 2.1 of the License, or (at your option) any later version.
9
10    This library is distributed in the hope that it will be useful,
11    but WITHOUT ANY WARRANTY; without even the implied warranty of
12    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
13    Lesser General Public License for more details.
14
15    You should have received a copy of the GNU Lesser General Public
16    License along with this library; if not, write to the Free Software
17    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
18  */
19
20
21 #include "prtview.h"
22 #include <stdio.h>
23 #include <stdlib.h>
24
25 #include "profile/profile.h"
26
27 #include "qerplugin.h"
28 #include "iscenegraph.h"
29 #include "iglrender.h"
30 #include "iplugin.h"
31 #include "stream/stringstream.h"
32
33 #include "portals.h"
34 #include "ConfigDialog.h"
35 #include "LoadPortalFileDialog.h"
36
37 #define Q3R_CMD_SPLITTER "-"
38 #define Q3R_CMD_ABOUT "About..."
39 #define Q3R_CMD_LOAD "Load .prt file"
40 #define Q3R_CMD_RELEASE "Unload .prt file"
41 #define Q3R_CMD_SHOW_3D "Toggle portals (3D)"
42 #define Q3R_CMD_SHOW_2D "Toggle portals (2D)"
43 #define Q3R_CMD_OPTIONS "Configure..."
44
45 CopiedString INIfn;
46
47 /////////////////////////////////////////////////////////////////////////////
48 // CPrtViewApp construction
49
50 const char *RENDER_2D = "Render2D";
51 const char *WIDTH_2D = "Width2D";
52 const char *AA_2D = "AntiAlias2D";
53 const char *COLOR_2D = "Color2D";
54
55 const char *RENDER_3D = "Render3D";
56 const char *WIDTH_3D = "Width3D";
57 const char *AA_3D = "AntiAlias3D";
58 const char *COLOR_3D = "Color3D";
59 const char *COLOR_FOG = "ColorFog";
60 const char *FOG = "Fog";
61 const char *ZBUFFER = "ZBuffer";
62 const char *POLYGON = "Polygons";
63 const char *LINE = "Lines";
64 const char *TRANS_3D = "Transparency";
65 const char *CLIP_RANGE = "ClipRange";
66 const char *CLIP = "Clip";
67
68 static ui::Window main_window{ui::null};
69
70 void PrtView_construct(){
71         StringOutputStream tmp( 64 );
72         tmp << GlobalRadiant().getSettingsPath() << "prtview.ini";
73         INIfn = tmp.c_str();
74
75         portals.show_2d = INIGetInt( RENDER_2D, FALSE ) ? true : false;
76         portals.aa_2d = INIGetInt( AA_2D, FALSE ) ? true : false;
77         portals.width_2d = (float)INIGetInt( WIDTH_2D, 10 );
78         portals.color_2d = (PackedColour)INIGetInt( COLOR_2D, RGB( 0, 0, 255 ) ) & 0xFFFFFF;
79
80         if ( portals.width_2d > 40.0f ) {
81                 portals.width_2d = 40.0f;
82         }
83         else if ( portals.width_2d < 2.0f ) {
84                 portals.width_2d = 2.0f;
85         }
86
87         portals.show_3d = INIGetInt( RENDER_3D, TRUE ) ? true : false;
88
89         portals.zbuffer = INIGetInt( ZBUFFER, 1 );
90         portals.fog = INIGetInt( FOG, FALSE ) ? true : false;
91         portals.polygons = INIGetInt( POLYGON, TRUE );
92         portals.lines = INIGetInt( LINE, TRUE );
93         portals.aa_3d = INIGetInt( AA_3D, FALSE ) ? true : false;
94         portals.width_3d = (float)INIGetInt( WIDTH_3D, 4 );
95         portals.color_3d = (PackedColour)INIGetInt( COLOR_3D, RGB( 255, 255, 0 ) ) & 0xFFFFFF;
96         portals.color_fog = (PackedColour)INIGetInt( COLOR_FOG, RGB( 127, 127, 127 ) ) & 0xFFFFFF;
97         portals.trans_3d = (float)INIGetInt( TRANS_3D, 50 );
98         portals.clip = INIGetInt( CLIP, FALSE ) ? true : false;
99         portals.clip_range = (float)INIGetInt( CLIP_RANGE, 16 );
100
101         if ( portals.clip_range < 1 ) {
102                 portals.clip_range = 1;
103         }
104         else if ( portals.clip_range > 128 ) {
105                 portals.clip_range = 128;
106         }
107
108         if ( portals.zbuffer < 0 ) {
109                 portals.zbuffer = 0;
110         }
111         else if ( portals.zbuffer > 2 ) {
112                 portals.zbuffer = 0;
113         }
114
115         if ( portals.width_3d > 40.0f ) {
116                 portals.width_3d = 40.0f;
117         }
118         else if ( portals.width_3d < 2.0f ) {
119                 portals.width_3d = 2.0f;
120         }
121
122         if ( portals.trans_3d > 100.0f ) {
123                 portals.trans_3d = 100.0f;
124         }
125         else if ( portals.trans_3d < 0.0f ) {
126                 portals.trans_3d = 0.0f;
127         }
128
129         SaveConfig();
130
131         portals.FixColors();
132
133         Portals_constructShaders();
134         GlobalShaderCache().attachRenderable( render );
135 }
136
137 void PrtView_destroy(){
138         GlobalShaderCache().detachRenderable( render );
139         Portals_destroyShaders();
140 }
141
142 void SaveConfig(){
143         INISetInt( RENDER_2D, portals.show_2d, "Draw in 2D windows" );
144         INISetInt( WIDTH_2D, (int)portals.width_2d, "Width of lines in 2D windows (in units of 1/2)" );
145         INISetInt( COLOR_2D, (int)portals.color_2d, "Color of lines in 2D windows" );
146         INISetInt( AA_2D, portals.aa_2d, "Draw lines in 2D window anti-aliased" );
147
148         INISetInt( ZBUFFER, portals.zbuffer, "ZBuffer level in 3D window" );
149         INISetInt( FOG, portals.fog, "Use depth cueing in 3D window" );
150         INISetInt( POLYGON, portals.polygons, "Render using polygons polygons in 3D window" );
151         INISetInt( LINE, portals.polygons, "Render using lines in 3D window" );
152         INISetInt( RENDER_3D, portals.show_3d, "Draw in 3D windows" );
153         INISetInt( WIDTH_3D, (int)portals.width_3d, "Width of lines in 3D window (in units of 1/2)" );
154         INISetInt( COLOR_3D, (int)portals.color_3d, "Color of lines/polygons in 3D window" );
155         INISetInt( COLOR_FOG, (int)portals.color_fog, "Color of distant lines/polygons in 3D window" );
156         INISetInt( AA_3D, portals.aa_3d, "Draw lines in 3D window anti-aliased" );
157         INISetInt( TRANS_3D, (int)portals.trans_3d, "Transparency in 3d view (0 = solid, 100 = invisible)" );
158         INISetInt( CLIP, portals.clip, "Cubic clipper active for portal viewer" );
159         INISetInt( CLIP_RANGE, (int)portals.clip_range, "Portal viewer cubic clip distance (in units of 64)" );
160 }
161
162
163 const char *CONFIG_SECTION = "Configuration";
164
165 int INIGetInt( const char *key, int def ){
166         char value[1024];
167
168         if ( read_var( INIfn.c_str(), CONFIG_SECTION, key, value ) ) {
169                 return atoi( value );
170         }
171         else{
172                 return def;
173         }
174 }
175
176 void INISetInt( const char *key, int val, const char *comment /* = NULL */ ){
177         char s[1000];
178
179         if ( comment ) {
180                 sprintf( s, "%d        ; %s", val, comment );
181         }
182         else{
183                 sprintf( s, "%d", val );
184         }
185         save_var( INIfn.c_str(), CONFIG_SECTION, key, s );
186 }
187
188 // commands in the menu
189 static const char *PLUGIN_COMMANDS =
190         Q3R_CMD_ABOUT ";"
191         Q3R_CMD_SPLITTER ";"
192         Q3R_CMD_OPTIONS ";"
193         Q3R_CMD_SPLITTER ";"
194         Q3R_CMD_SHOW_2D ";"
195         Q3R_CMD_SHOW_3D ";"
196         Q3R_CMD_SPLITTER ";"
197         Q3R_CMD_RELEASE ";"
198         Q3R_CMD_LOAD;
199
200
201
202 const char* QERPlug_Init( void *hApp, void* pMainWidget ){
203         main_window = ui::Window::from(pMainWidget);
204         ASSERT_TRUE( main_window );
205
206         return PLUGIN_NAME " for " RADIANT_NAME;
207 }
208
209 const char* QERPlug_GetName(){
210         return PLUGIN_NAME;
211 }
212
213 const char* QERPlug_GetCommandList(){
214         return PLUGIN_COMMANDS;
215 }
216
217
218 const char* QERPlug_GetCommandTitleList(){
219         return "";
220 }
221
222
223 void QERPlug_Dispatch( const char* p, float* vMin, float* vMax, bool bSingleBrush ){
224         globalOutputStream() << MSG_PREFIX "Command \"" << p << "\"\n";
225
226         if ( !strcmp( p,Q3R_CMD_ABOUT ) ) {
227                 const char *label_text =
228                                 PLUGIN_NAME " " PLUGIN_VERSION " for "
229                                 RADIANT_NAME " " RADIANT_VERSION "\n\n"
230                                 "Gtk port by Leonardo Zide <leo@lokigames.com>\n"
231                                 "Written by Geoffrey DeWan <gdewan@prairienet.org>\n\n"
232                                 "Built against "
233                                 RADIANT_NAME " " RADIANT_VERSION_STRING "\n"
234                                 __DATE__;
235
236                 GlobalRadiant().m_pfnMessageBox( main_window, label_text,
237                                                                                 "About " PLUGIN_NAME,
238                                                                                 eMB_OK,
239                                                                                 eMB_ICONDEFAULT );
240         }
241         else if ( !strcmp( p,Q3R_CMD_LOAD ) ) {
242                 if ( DoLoadPortalFileDialog() == IDOK ) {
243                         portals.Load();
244                         SceneChangeNotify();
245                 }
246                 else
247                 {
248                         globalOutputStream() << MSG_PREFIX "Portal file load aborted.\n";
249                 }
250         }
251         else if ( !strcmp( p,Q3R_CMD_RELEASE ) ) {
252                 portals.Purge();
253
254                 SceneChangeNotify();
255
256                 globalOutputStream() << MSG_PREFIX "Portals unloaded.\n";
257         }
258         else if ( !strcmp( p,Q3R_CMD_SHOW_2D ) ) {
259                 portals.show_2d = !portals.show_2d;
260
261                 SceneChangeNotify();
262                 SaveConfig();
263
264                 if ( portals.show_2d ) {
265                         globalOutputStream() << MSG_PREFIX "Portals will be rendered in 2D view.\n";
266                 }
267                 else{
268                         globalOutputStream() << MSG_PREFIX "Portals will NOT be rendered in 2D view.\n";
269                 }
270         }
271         else if ( !strcmp( p,Q3R_CMD_SHOW_3D ) ) {
272                 portals.show_3d = !portals.show_3d;
273                 SaveConfig();
274
275                 SceneChangeNotify();
276
277                 if ( portals.show_3d ) {
278                         globalOutputStream() << MSG_PREFIX "Portals will be rendered in 3D view.\n";
279                 }
280                 else{
281                         globalOutputStream() << MSG_PREFIX "Portals will NOT be rendered in 3D view.\n";
282                 }
283         }
284         else if ( !strcmp( p,Q3R_CMD_OPTIONS ) ) {
285                 DoConfigDialog( main_window );
286                 SaveConfig();
287
288                 SceneChangeNotify();
289         }
290 }
291
292
293 #include "modulesystem/singletonmodule.h"
294
295 class PrtViewPluginDependencies :
296         public GlobalSceneGraphModuleRef,
297         public GlobalRadiantModuleRef,
298         public GlobalShaderCacheModuleRef,
299         public GlobalOpenGLModuleRef,
300         public GlobalOpenGLStateLibraryModuleRef
301 {
302 };
303
304 class PrtViewPluginModule
305 {
306 _QERPluginTable m_plugin;
307 public:
308 typedef _QERPluginTable Type;
309 STRING_CONSTANT( Name, PLUGIN_NAME );
310
311 PrtViewPluginModule(){
312         m_plugin.m_pfnQERPlug_Init = QERPlug_Init;
313         m_plugin.m_pfnQERPlug_GetName = QERPlug_GetName;
314         m_plugin.m_pfnQERPlug_GetCommandList = QERPlug_GetCommandList;
315         m_plugin.m_pfnQERPlug_GetCommandTitleList = QERPlug_GetCommandTitleList;
316         m_plugin.m_pfnQERPlug_Dispatch = QERPlug_Dispatch;
317
318         PrtView_construct();
319 }
320 ~PrtViewPluginModule(){
321         PrtView_destroy();
322 }
323 _QERPluginTable* getTable(){
324         return &m_plugin;
325 }
326 };
327
328 typedef SingletonModule<PrtViewPluginModule, PrtViewPluginDependencies> SingletonPrtViewPluginModule;
329
330 SingletonPrtViewPluginModule g_PrtViewPluginModule;
331
332
333 extern "C" void RADIANT_DLLEXPORT Radiant_RegisterModules( ModuleServer& server ){
334         initialiseModule( server );
335
336         g_PrtViewPluginModule.selfRegister();
337 }