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 // ConfigDialog.cpp : implementation file
21 //
22 
23 #include "stdafx.h"
24 #include <stdio.h>
25 
26 #ifdef _DEBUG
27 #define new DEBUG_NEW
28 #undef THIS_FILE
29 //static char THIS_FILE[] = __FILE__;
30 #endif
31 
32 /////////////////////////////////////////////////////////////////////////////
33 // CConfigDialog dialog
34 
35 #ifdef GTK_PLUGIN
36 
dialog_button_callback(GtkWidget * widget,gpointer data)37 static void dialog_button_callback (GtkWidget *widget, gpointer data)
38 {
39   GtkWidget *parent;
40   int *loop, *ret;
41 
42   parent = gtk_widget_get_toplevel (widget);
43   loop = (int*)g_object_get_data (G_OBJECT (parent), "loop");
44   ret = (int*)g_object_get_data (G_OBJECT (parent), "ret");
45 
46   *loop = 0;
47   *ret = (int)data;
48 }
49 
dialog_delete_callback(GtkWidget * widget,GdkEvent * event,gpointer data)50 static gint dialog_delete_callback (GtkWidget *widget, GdkEvent* event, gpointer data)
51 {
52   int *loop;
53 
54   gtk_widget_hide (widget);
55   loop = (int*)g_object_get_data (G_OBJECT (widget), "loop");
56   *loop = 0;
57 
58   return TRUE;
59 }
60 
61 // =============================================================================
62 // Color selection dialog
63 
DoColor(COLORREF * c)64 static int DoColor (COLORREF *c)
65 {
66   GtkWidget* dlg;
67   double clr[3];
68   int loop = 1, ret = IDCANCEL;
69 
70   clr[0] = ((double)GetRValue (*c)) / 255.0;
71   clr[1] = ((double)GetGValue (*c)) / 255.0;
72   clr[2] = ((double)GetBValue (*c)) / 255.0;
73 
74   dlg = gtk_color_selection_dialog_new ("Choose Color");
75   gtk_color_selection_set_color (GTK_COLOR_SELECTION (GTK_COLOR_SELECTION_DIALOG (dlg)->colorsel), clr);
76   gtk_signal_connect (GTK_OBJECT (dlg), "delete_event",
77                       GTK_SIGNAL_FUNC (dialog_delete_callback), NULL);
78   gtk_signal_connect (GTK_OBJECT (dlg), "destroy",
79                       GTK_SIGNAL_FUNC (gtk_widget_destroy), NULL);
80   gtk_signal_connect (GTK_OBJECT (GTK_COLOR_SELECTION_DIALOG (dlg)->ok_button), "clicked",
81 		      GTK_SIGNAL_FUNC (dialog_button_callback), GINT_TO_POINTER (IDOK));
82   gtk_signal_connect (GTK_OBJECT (GTK_COLOR_SELECTION_DIALOG (dlg)->cancel_button), "clicked",
83 		      GTK_SIGNAL_FUNC (dialog_button_callback), GINT_TO_POINTER (IDCANCEL));
84   g_object_set_data (G_OBJECT (dlg), "loop", &loop);
85   g_object_set_data (G_OBJECT (dlg), "ret", &ret);
86 
87   gtk_widget_show(dlg);
88   gtk_grab_add(dlg);
89 
90   while (loop)
91     gtk_main_iteration ();
92 
93   gtk_color_selection_get_color (GTK_COLOR_SELECTION (GTK_COLOR_SELECTION_DIALOG (dlg)->colorsel), clr);
94 
95   gtk_grab_remove (dlg);
96   gtk_widget_destroy (dlg);
97 
98   if (ret == IDOK)
99   {
100     *c = RGB (clr[0]*255, clr[1]*255, clr[2]*255);
101   }
102 
103   return ret;
104 }
105 
Set2DText(GtkWidget * label)106 static void Set2DText (GtkWidget* label)
107 {
108   char s[40];
109 
110   sprintf(s, "Line Width = %6.3f", portals.width_2d * 0.5f);
111 
112   gtk_label_set_text (GTK_LABEL (label), s);
113 }
114 
Set3DText(GtkWidget * label)115 static void Set3DText (GtkWidget* label)
116 {
117   char s[40];
118 
119   sprintf(s, "Line Width = %6.3f", portals.width_3d * 0.5f);
120 
121   gtk_label_set_text (GTK_LABEL (label), s);
122 }
123 
Set3DTransText(GtkWidget * label)124 static void Set3DTransText (GtkWidget* label)
125 {
126   char s[40];
127 
128   sprintf(s, "Polygon transparency = %d%%", (int)portals.trans_3d);
129 
130   gtk_label_set_text (GTK_LABEL (label), s);
131 }
132 
SetClipText(GtkWidget * label)133 static void SetClipText (GtkWidget* label)
134 {
135   char s[40];
136 
137   sprintf(s, "Cubic clip range = %d", (int)portals.clip_range * 64);
138 
139   gtk_label_set_text (GTK_LABEL (label), s);
140 }
141 
OnScroll2d(GtkAdjustment * adj,gpointer data)142 static void OnScroll2d (GtkAdjustment *adj, gpointer data)
143 {
144   portals.width_2d = static_cast<float>(adj->value);
145   Set2DText (GTK_WIDGET (data));
146 
147   if(interfaces_started)
148     g_FuncTable.m_pfnSysUpdateWindows(UPDATE_2D);
149 }
150 
OnScroll3d(GtkAdjustment * adj,gpointer data)151 static void OnScroll3d (GtkAdjustment *adj, gpointer data)
152 {
153   portals.width_3d = static_cast<float>(adj->value);
154   Set3DText (GTK_WIDGET (data));
155 
156   if(interfaces_started)
157     g_FuncTable.m_pfnSysUpdateWindows(UPDATE_3D);
158 }
159 
OnScrollTrans(GtkAdjustment * adj,gpointer data)160 static void OnScrollTrans (GtkAdjustment *adj, gpointer data)
161 {
162   portals.trans_3d = static_cast<float>(adj->value);
163   Set3DTransText (GTK_WIDGET (data));
164 
165   if(interfaces_started)
166     g_FuncTable.m_pfnSysUpdateWindows(UPDATE_3D);
167 }
168 
OnScrollClip(GtkAdjustment * adj,gpointer data)169 static void OnScrollClip (GtkAdjustment *adj, gpointer data)
170 {
171   portals.clip_range = static_cast<float>(adj->value);
172   SetClipText (GTK_WIDGET (data));
173 
174   if(interfaces_started)
175     g_FuncTable.m_pfnSysUpdateWindows(UPDATE_3D);
176 }
177 
OnAntiAlias2d(GtkWidget * widget,gpointer data)178 static void OnAntiAlias2d (GtkWidget *widget, gpointer data)
179 {
180   portals.aa_2d = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (widget)) ? qtrue : qfalse;
181 
182   if(interfaces_started)
183     g_FuncTable.m_pfnSysUpdateWindows(UPDATE_2D);
184 }
185 
OnConfig2d(GtkWidget * widget,gpointer data)186 static void OnConfig2d (GtkWidget *widget, gpointer data)
187 {
188   portals.show_2d = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (widget)) ? qtrue : qfalse;
189 
190   if(interfaces_started)
191     g_FuncTable.m_pfnSysUpdateWindows(UPDATE_2D);
192 }
193 
OnColor2d(GtkWidget * widget,gpointer data)194 static void OnColor2d (GtkWidget *widget, gpointer data)
195 {
196   if (DoColor (&portals.color_2d) == IDOK)
197   {
198     portals.FixColors();
199 
200     if(interfaces_started)
201       g_FuncTable.m_pfnSysUpdateWindows(UPDATE_2D);
202   }
203 }
204 
OnConfig3d(GtkWidget * widget,gpointer data)205 static void OnConfig3d (GtkWidget *widget, gpointer data)
206 {
207   portals.show_3d = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (widget)) ? qtrue : qfalse;
208 
209   if(interfaces_started)
210     g_FuncTable.m_pfnSysUpdateWindows(UPDATE_3D);
211 }
212 
213 
OnAntiAlias3d(GtkWidget * widget,gpointer data)214 static void OnAntiAlias3d (GtkWidget *widget, gpointer data)
215 {
216   portals.aa_3d = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (widget)) ? qtrue : qfalse;
217 
218   if(interfaces_started)
219     g_FuncTable.m_pfnSysUpdateWindows(UPDATE_3D);
220 }
221 
OnColor3d(GtkWidget * widget,gpointer data)222 static void OnColor3d (GtkWidget *widget, gpointer data)
223 {
224   if (DoColor (&portals.color_3d) == IDOK)
225   {
226     portals.FixColors();
227 
228     if(interfaces_started)
229       g_FuncTable.m_pfnSysUpdateWindows(UPDATE_3D);
230   }
231 }
232 
OnColorFog(GtkWidget * widget,gpointer data)233 static void OnColorFog (GtkWidget *widget, gpointer data)
234 {
235   if (DoColor (&portals.color_fog) == IDOK)
236   {
237     portals.FixColors();
238 
239     if(interfaces_started)
240       g_FuncTable.m_pfnSysUpdateWindows(UPDATE_3D);
241   }
242 }
243 
OnFog(GtkWidget * widget,gpointer data)244 static void OnFog (GtkWidget *widget, gpointer data)
245 {
246   portals.fog = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (widget)) ? qtrue : qfalse;
247 
248   if(interfaces_started)
249     g_FuncTable.m_pfnSysUpdateWindows(UPDATE_3D);
250 }
251 
OnSelchangeZbuffer(GtkWidget * widget,gpointer data)252 static void OnSelchangeZbuffer (GtkWidget *widget, gpointer data)
253 {
254   portals.zbuffer = GPOINTER_TO_INT (data);
255 
256   if(interfaces_started)
257     g_FuncTable.m_pfnSysUpdateWindows(UPDATE_3D);
258 }
259 
OnPoly(GtkWidget * widget,gpointer data)260 static void OnPoly (GtkWidget *widget, gpointer data)
261 {
262   portals.polygons = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (widget));
263 
264   if(interfaces_started)
265     g_FuncTable.m_pfnSysUpdateWindows(UPDATE_3D);
266 }
267 
OnLines(GtkWidget * widget,gpointer data)268 static void OnLines (GtkWidget *widget, gpointer data)
269 {
270   portals.lines = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (widget));
271 
272   if(interfaces_started)
273     g_FuncTable.m_pfnSysUpdateWindows(UPDATE_3D);
274 }
275 
OnClip(GtkWidget * widget,gpointer data)276 static void OnClip (GtkWidget *widget, gpointer data)
277 {
278   portals.clip = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (widget)) ? qtrue : qfalse;
279 
280   if(interfaces_started)
281     g_FuncTable.m_pfnSysUpdateWindows(UPDATE_3D);
282 }
283 
DoConfigDialog()284 void DoConfigDialog ()
285 {
286   GtkWidget *dlg, *hbox, *vbox, *vbox2, *button, *table, *frame;
287   GtkWidget *lw3slider, *lw3label, *lw2slider, *lw2label, *zlist, *menu, *item;
288   GtkWidget *aa2check, *aa3check, *depthcheck, *linescheck, *polyscheck;
289   GtkWidget *transslider, *translabel, *clipslider, *cliplabel;
290   GtkWidget *show2check, *show3check, *portalcheck;
291   int loop = 1, ret = IDCANCEL;
292   GtkObject *adj;
293 
294   dlg = gtk_window_new (GTK_WINDOW_TOPLEVEL);
295   gtk_window_set_title (GTK_WINDOW (dlg), "Portal Viewer Configuration");
296   gtk_signal_connect (GTK_OBJECT (dlg), "delete_event",
297                       GTK_SIGNAL_FUNC (dialog_delete_callback), NULL);
298   gtk_signal_connect (GTK_OBJECT (dlg), "destroy",
299                       GTK_SIGNAL_FUNC (gtk_widget_destroy), NULL);
300   g_object_set_data (G_OBJECT (dlg), "loop", &loop);
301   g_object_set_data (G_OBJECT (dlg), "ret", &ret);
302 
303   vbox = gtk_vbox_new (FALSE, 5);
304   gtk_widget_show (vbox);
305   gtk_container_add (GTK_CONTAINER (dlg), vbox);
306   gtk_container_set_border_width (GTK_CONTAINER (vbox), 5);
307 
308   frame = gtk_frame_new ("3D View");
309   gtk_widget_show (frame);
310   gtk_box_pack_start (GTK_BOX (vbox), frame, TRUE, TRUE, 0);
311 
312   vbox2 = gtk_vbox_new (FALSE, 5);
313   gtk_widget_show (vbox2);
314   gtk_container_add (GTK_CONTAINER (frame), vbox2);
315   gtk_container_set_border_width (GTK_CONTAINER (vbox2), 5);
316 
317   hbox = gtk_hbox_new (FALSE, 5);
318   gtk_widget_show (hbox);
319   gtk_box_pack_start (GTK_BOX (vbox2), hbox, TRUE, TRUE, 0);
320 
321   adj = gtk_adjustment_new (portals.width_3d, 2, 40, 1, 1, 0);
322   lw3slider = gtk_hscale_new (GTK_ADJUSTMENT (adj));
323   gtk_widget_show (lw3slider);
324   gtk_box_pack_start (GTK_BOX (hbox), lw3slider, TRUE, TRUE, 0);
325   gtk_scale_set_draw_value (GTK_SCALE (lw3slider), FALSE);
326 
327   lw3label = gtk_label_new ("");
328   gtk_widget_show (lw3label);
329   gtk_box_pack_start (GTK_BOX (hbox), lw3label, FALSE, TRUE, 0);
330   gtk_signal_connect (adj, "value_changed", GTK_SIGNAL_FUNC (OnScroll3d), lw3label);
331 
332   table = gtk_table_new (2, 4, FALSE);
333   gtk_widget_show (table);
334   gtk_box_pack_start (GTK_BOX (vbox2), table, TRUE, TRUE, 0);
335   gtk_table_set_row_spacings (GTK_TABLE (table), 5);
336   gtk_table_set_col_spacings (GTK_TABLE (table), 5);
337 
338   button = gtk_button_new_with_label ("Color");
339   gtk_widget_show (button);
340   gtk_table_attach (GTK_TABLE (table), button, 0, 1, 0, 1,
341                     (GtkAttachOptions) (GTK_FILL),
342                     (GtkAttachOptions) (0), 0, 0);
343   gtk_signal_connect (GTK_OBJECT (button), "clicked", GTK_SIGNAL_FUNC (OnColor3d), NULL);
344 
345   button = gtk_button_new_with_label ("Depth Color");
346   gtk_widget_show (button);
347   gtk_table_attach (GTK_TABLE (table), button, 0, 1, 1, 2,
348                     (GtkAttachOptions) (GTK_FILL),
349                     (GtkAttachOptions) (0), 0, 0);
350   gtk_signal_connect (GTK_OBJECT (button), "clicked", GTK_SIGNAL_FUNC (OnColorFog), NULL);
351 
352   aa3check = gtk_check_button_new_with_label ("Anti-Alias (May not work on some video cards)");
353   gtk_widget_show (aa3check);
354   gtk_table_attach (GTK_TABLE (table), aa3check, 1, 4, 0, 1,
355                     (GtkAttachOptions) (GTK_EXPAND|GTK_FILL),
356                     (GtkAttachOptions) (0), 0, 0);
357   gtk_signal_connect (GTK_OBJECT (aa3check), "toggled", GTK_SIGNAL_FUNC (OnAntiAlias3d), NULL);
358 
359   depthcheck = gtk_check_button_new_with_label ("Depth Cue");
360   gtk_widget_show (depthcheck);
361   gtk_table_attach (GTK_TABLE (table), depthcheck, 1, 2, 1, 2,
362                     (GtkAttachOptions) (GTK_EXPAND|GTK_FILL),
363                     (GtkAttachOptions) (0), 0, 0);
364   gtk_signal_connect (GTK_OBJECT (depthcheck), "toggled", GTK_SIGNAL_FUNC (OnFog), NULL);
365 
366   linescheck = gtk_check_button_new_with_label ("Lines");
367   gtk_widget_show (linescheck);
368   gtk_table_attach (GTK_TABLE (table), linescheck, 2, 3, 1, 2,
369                     (GtkAttachOptions) (GTK_EXPAND|GTK_FILL),
370                     (GtkAttachOptions) (0), 0, 0);
371   gtk_signal_connect (GTK_OBJECT (linescheck), "toggled", GTK_SIGNAL_FUNC (OnLines), NULL);
372 
373   polyscheck = gtk_check_button_new_with_label ("Polygons");
374   gtk_widget_show (polyscheck);
375   gtk_table_attach (GTK_TABLE (table), polyscheck, 3, 4, 1, 2,
376                     (GtkAttachOptions) (GTK_EXPAND|GTK_FILL),
377                     (GtkAttachOptions) (0), 0, 0);
378   gtk_signal_connect (GTK_OBJECT (polyscheck), "toggled", GTK_SIGNAL_FUNC (OnPoly), NULL);
379 
380   zlist = gtk_option_menu_new ();
381   gtk_widget_show (zlist);
382   gtk_box_pack_start (GTK_BOX (vbox2), zlist, TRUE, FALSE, 0);
383 
384   menu = gtk_menu_new ();
385   gtk_widget_show (menu);
386   gtk_option_menu_set_menu (GTK_OPTION_MENU (zlist), menu);
387 
388   item = gtk_menu_item_new_with_label ("Z-Buffer Test and Write (recommended for solid or no polygons)");
389   gtk_widget_show (item);
390   gtk_signal_connect (GTK_OBJECT (item), "activate",
391 		      GTK_SIGNAL_FUNC (OnSelchangeZbuffer), GINT_TO_POINTER (0));
392   gtk_menu_append (GTK_MENU (menu), item);
393 
394   item = gtk_menu_item_new_with_label ("Z-Buffer Test Only (recommended for transparent polygons)");
395   gtk_widget_show (item);
396   gtk_signal_connect (GTK_OBJECT (item), "activate",
397 		      GTK_SIGNAL_FUNC (OnSelchangeZbuffer), GINT_TO_POINTER (1));
398   gtk_menu_append (GTK_MENU (menu), item);
399 
400   item = gtk_menu_item_new_with_label ("Z-Buffer Off");
401   gtk_widget_show (item);
402   gtk_signal_connect (GTK_OBJECT (item), "activate",
403 		      GTK_SIGNAL_FUNC (OnSelchangeZbuffer), GINT_TO_POINTER (2));
404   gtk_menu_append (GTK_MENU (menu), item);
405 
406   table = gtk_table_new (2, 2, FALSE);
407   gtk_widget_show (table);
408   gtk_box_pack_start (GTK_BOX (vbox2), table, TRUE, TRUE, 0);
409   gtk_table_set_row_spacings (GTK_TABLE (table), 5);
410   gtk_table_set_col_spacings (GTK_TABLE (table), 5);
411 
412   adj = gtk_adjustment_new (portals.trans_3d, 0, 100, 1, 1, 0);
413   transslider = gtk_hscale_new (GTK_ADJUSTMENT (adj));
414   gtk_widget_show (transslider);
415   gtk_table_attach (GTK_TABLE (table), transslider, 0, 1, 0, 1,
416                     (GtkAttachOptions) (GTK_EXPAND|GTK_FILL),
417                     (GtkAttachOptions) (0), 0, 0);
418   gtk_scale_set_draw_value (GTK_SCALE (transslider), FALSE);
419 
420   translabel = gtk_label_new ("");
421   gtk_widget_show (translabel);
422   gtk_table_attach (GTK_TABLE (table), translabel, 1, 2, 0, 1,
423                     (GtkAttachOptions) (GTK_FILL),
424                     (GtkAttachOptions) (0), 0, 0);
425   gtk_misc_set_alignment (GTK_MISC (translabel), 0.0, 0.0);
426   gtk_signal_connect (adj, "value_changed", GTK_SIGNAL_FUNC (OnScrollTrans), translabel);
427 
428   adj = gtk_adjustment_new (portals.clip_range, 1, 128, 1, 1, 0);
429   clipslider = gtk_hscale_new (GTK_ADJUSTMENT (adj));
430   gtk_widget_show (clipslider);
431   gtk_table_attach (GTK_TABLE (table), clipslider, 0, 1, 1, 2,
432                     (GtkAttachOptions) (GTK_EXPAND|GTK_FILL),
433                     (GtkAttachOptions) (0), 0, 0);
434   gtk_scale_set_draw_value (GTK_SCALE (clipslider), FALSE);
435 
436   cliplabel = gtk_label_new ("");
437   gtk_widget_show (cliplabel);
438   gtk_table_attach (GTK_TABLE (table), cliplabel, 1, 2, 1, 2,
439                     (GtkAttachOptions) (GTK_FILL),
440                     (GtkAttachOptions) (0), 0, 0);
441   gtk_misc_set_alignment (GTK_MISC (cliplabel), 0.0, 0.0);
442   gtk_signal_connect (adj, "value_changed", GTK_SIGNAL_FUNC (OnScrollClip), cliplabel);
443 
444   hbox = gtk_hbox_new (TRUE, 5);
445   gtk_widget_show (hbox);
446   gtk_box_pack_start (GTK_BOX (vbox2), hbox, TRUE, FALSE, 0);
447 
448   show3check = gtk_check_button_new_with_label ("Show");
449   gtk_widget_show (show3check);
450   gtk_box_pack_start (GTK_BOX (hbox), show3check, TRUE, TRUE, 0);
451   gtk_signal_connect (GTK_OBJECT (show3check), "toggled", GTK_SIGNAL_FUNC (OnConfig3d), NULL);
452 
453   portalcheck = gtk_check_button_new_with_label ("Portal cubic clipper");
454   gtk_widget_show (portalcheck);
455   gtk_box_pack_start (GTK_BOX (hbox), portalcheck, TRUE, TRUE, 0);
456   gtk_signal_connect (GTK_OBJECT (portalcheck), "toggled", GTK_SIGNAL_FUNC (OnClip), NULL);
457 
458   frame = gtk_frame_new ("2D View");
459   gtk_widget_show (frame);
460   gtk_box_pack_start (GTK_BOX (vbox), frame, TRUE, TRUE, 0);
461 
462   vbox2 = gtk_vbox_new (FALSE, 5);
463   gtk_widget_show (vbox2);
464   gtk_container_add (GTK_CONTAINER (frame), vbox2);
465   gtk_container_set_border_width (GTK_CONTAINER (vbox2), 5);
466 
467   hbox = gtk_hbox_new (FALSE, 5);
468   gtk_widget_show (hbox);
469   gtk_box_pack_start (GTK_BOX (vbox2), hbox, TRUE, FALSE, 0);
470 
471   adj = gtk_adjustment_new (portals.width_2d, 2, 40, 1, 1, 0);
472   lw2slider = gtk_hscale_new (GTK_ADJUSTMENT (adj));
473   gtk_widget_show (lw2slider);
474   gtk_box_pack_start (GTK_BOX (hbox), lw2slider, TRUE, TRUE, 0);
475   gtk_scale_set_draw_value (GTK_SCALE (lw2slider), FALSE);
476 
477   lw2label = gtk_label_new ("");
478   gtk_widget_show (lw2label);
479   gtk_box_pack_start (GTK_BOX (hbox), lw2label, FALSE, TRUE, 0);
480   gtk_signal_connect (adj, "value_changed", GTK_SIGNAL_FUNC (OnScroll2d), lw2label);
481 
482   hbox = gtk_hbox_new (FALSE, 5);
483   gtk_widget_show (hbox);
484   gtk_box_pack_start (GTK_BOX (vbox2), hbox, TRUE, FALSE, 0);
485 
486   button = gtk_button_new_with_label ("Color");
487   gtk_widget_show (button);
488   gtk_box_pack_start (GTK_BOX (hbox), button, FALSE, FALSE, 0);
489   gtk_signal_connect (GTK_OBJECT (button), "clicked", GTK_SIGNAL_FUNC (OnColor2d), NULL);
490   gtk_widget_set_usize (button, 60, -2);
491 
492   aa2check = gtk_check_button_new_with_label ("Anti-Alias (May not work on some video cards)");
493   gtk_widget_show (aa2check);
494   gtk_box_pack_start (GTK_BOX (hbox), aa2check, TRUE, TRUE, 0);
495   gtk_signal_connect (GTK_OBJECT (aa2check), "toggled", GTK_SIGNAL_FUNC (OnAntiAlias2d), NULL);
496 
497   hbox = gtk_hbox_new (FALSE, 5);
498   gtk_widget_show (hbox);
499   gtk_box_pack_start (GTK_BOX (vbox2), hbox, TRUE, FALSE, 0);
500 
501   show2check = gtk_check_button_new_with_label ("Show");
502   gtk_widget_show (show2check);
503   gtk_box_pack_start (GTK_BOX (hbox), show2check, FALSE, FALSE, 0);
504   gtk_signal_connect (GTK_OBJECT (show2check), "toggled", GTK_SIGNAL_FUNC (OnConfig2d), NULL);
505 
506   hbox = gtk_hbox_new (FALSE, 5);
507   gtk_widget_show (hbox);
508   gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, FALSE, 0);
509 
510   button = gtk_button_new_with_label ("OK");
511   gtk_widget_show (button);
512   gtk_box_pack_end (GTK_BOX (hbox), button, FALSE, FALSE, 0);
513   gtk_signal_connect (GTK_OBJECT (button), "clicked",
514 		      GTK_SIGNAL_FUNC (dialog_button_callback), GINT_TO_POINTER (IDOK));
515   gtk_widget_set_usize (button, 60, -2);
516 
517   // initialize dialog
518   gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (show2check), portals.show_2d);
519   gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (aa2check), portals.aa_2d);
520   Set2DText (lw2label);
521 
522   gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (show3check), portals.show_3d);
523   gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (depthcheck), portals.fog);
524   gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (polyscheck), portals.polygons);
525   gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (linescheck), portals.lines);
526   gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (aa3check), portals.aa_3d);
527   gtk_option_menu_set_history (GTK_OPTION_MENU (zlist), portals.zbuffer);
528   gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (portalcheck), portals.clip);
529 
530   Set3DText (lw3label);
531   Set3DTransText (translabel);
532   SetClipText (cliplabel);
533 
534   gtk_grab_add (dlg);
535   gtk_widget_show (dlg);
536 
537   while (loop)
538     gtk_main_iteration ();
539 
540   gtk_grab_remove (dlg);
541   gtk_widget_destroy (dlg);
542 }
543 
544 #else // GTK_PLUGIN
545 
CConfigDialog(CWnd * pParent)546 CConfigDialog::CConfigDialog(CWnd* pParent /*=NULL*/)
547 	: CDialog(CConfigDialog::IDD, pParent)
548 {
549 	//{{AFX_DATA_INIT(CConfigDialog)
550 	//}}AFX_DATA_INIT
551 }
552 
553 
DoDataExchange(CDataExchange * pDX)554 void CConfigDialog::DoDataExchange(CDataExchange* pDX)
555 {
556 	CDialog::DoDataExchange(pDX);
557 	//{{AFX_DATA_MAP(CConfigDialog)
558 	DDX_Control(pDX, IDC_CLIP, m_clip_ctrl);
559 	DDX_Control(pDX, IDC_CUBIC, m_cubic_ctrl);
560 	DDX_Control(pDX, IDC_SCROLL_CUBIC, m_scroll_cubic_ctrl);
561 	DDX_Control(pDX, IDC_LINES, m_line_ctrl);
562 	DDX_Control(pDX, IDC_SCROLL_3D_TRANS, m_scroll_3d_trans_ctrl);
563 	DDX_Control(pDX, IDC_3D_TRANS, m_3d_trans_ctrl);
564 	DDX_Control(pDX, IDC_POLY, m_poly_ctrl);
565 	DDX_Control(pDX, IDC_FOG, m_fog_ctrl);
566 	DDX_Control(pDX, IDC_ZBUFFER, m_z_ctrl);
567 	DDX_Control(pDX, IDC_SCROLL_3D_WIDTH, m_scroll_3d_width_ctrl);
568 	DDX_Control(pDX, IDC_ANTI_ALIAS_3D, m_aa_3d_ctrl);
569 	DDX_Control(pDX, IDC_3D_WIDTH, m_3d_width_ctrl);
570 	DDX_Control(pDX, IDC_ANTI_ALIAS_2D, m_aa_2d_ctrl);
571 	DDX_Control(pDX, IDC_SCROLL_2D_WIDTH, m_scroll_2d_width_ctrl);
572 	DDX_Control(pDX, IDC_2D_WIDTH, m_2d_width_ctrl);
573 	DDX_Control(pDX, IDC_CONFIG_3D, m_3d_ctrl);
574 	DDX_Control(pDX, IDC_CONFIG_2D, m_2d_ctrl);
575 	//}}AFX_DATA_MAP
576 }
577 
578 
BEGIN_MESSAGE_MAP(CConfigDialog,CDialog)579 BEGIN_MESSAGE_MAP(CConfigDialog, CDialog)
580 	//{{AFX_MSG_MAP(CConfigDialog)
581 	ON_WM_HSCROLL()
582 	ON_BN_CLICKED(IDC_ANTI_ALIAS_2D, OnAntiAlias2d)
583 	ON_BN_CLICKED(IDC_CONFIG_2D, OnConfig2d)
584 	ON_BN_CLICKED(IDC_CONFIG_3D, OnConfig3d)
585 	ON_BN_CLICKED(IDC_COLOR_2D, OnColor2d)
586 	ON_BN_CLICKED(IDC_ANTI_ALIAS_3D, OnAntiAlias3d)
587 	ON_BN_CLICKED(IDC_COLOR_3D, OnColor3d)
588 	ON_BN_CLICKED(IDC_COLOR_FOG, OnColorFog)
589 	ON_BN_CLICKED(IDC_FOG, OnFog)
590 	ON_CBN_SELCHANGE(IDC_ZBUFFER, OnSelchangeZbuffer)
591 	ON_BN_CLICKED(IDC_POLY, OnPoly)
592 	ON_BN_CLICKED(IDC_LINES, OnLines)
593 	ON_BN_CLICKED(IDC_CLIP, OnClip)
594 	//}}AFX_MSG_MAP
595 END_MESSAGE_MAP()
596 
597 /////////////////////////////////////////////////////////////////////////////
598 // CConfigDialog message handlers
599 
600 void CConfigDialog::Set2DText()
601 {
602 	char s[40];
603 
604 	sprintf(s, "Line Width = %6.3f", portals.width_2d * 0.5f);
605 
606 	m_2d_width_ctrl.SetWindowText(s);
607 }
608 
Set3DText()609 void CConfigDialog::Set3DText()
610 {
611 	char s[40];
612 
613 	sprintf(s, "Line Width = %6.3f", portals.width_3d * 0.5f);
614 
615 	m_3d_width_ctrl.SetWindowText(s);
616 }
617 
Set3DTransText()618 void CConfigDialog::Set3DTransText()
619 {
620 	char s[40];
621 
622 	sprintf(s, "Polygon transparency = %d%%", (int)portals.trans_3d);
623 
624 	m_3d_trans_ctrl.SetWindowText(s);
625 }
626 
SetClipText()627 void CConfigDialog::SetClipText()
628 {
629 	char s[40];
630 
631 	sprintf(s, "Cubic clip range = %d", (int)portals.clip_range * 64);
632 
633 	m_cubic_ctrl.SetWindowText(s);
634 }
635 
OnInitDialog()636 bool CConfigDialog::OnInitDialog()
637 {
638 	CDialog::OnInitDialog();
639 
640 	m_2d_ctrl.SetCheck(portals.show_2d);
641 	m_aa_2d_ctrl.SetCheck(portals.aa_2d);
642 	Set2DText();
643 
644 	m_scroll_2d_width_ctrl.SetScrollRange(2, 40, FALSE);
645 	m_scroll_2d_width_ctrl.SetScrollPos((int)portals.width_2d, TRUE);
646 
647 	m_3d_ctrl.SetCheck(portals.show_3d);
648 	m_fog_ctrl.SetCheck(portals.fog);
649 	m_poly_ctrl.SetCheck(portals.polygons);
650 	m_line_ctrl.SetCheck(portals.lines);
651 	m_aa_3d_ctrl.SetCheck(portals.aa_3d);
652 	m_z_ctrl.SetCurSel(portals.zbuffer);
653 	m_clip_ctrl.SetCheck(portals.clip);
654 
655 	Set3DText();
656 	Set3DTransText();
657 	SetClipText();
658 
659 	m_scroll_3d_width_ctrl.SetScrollRange(2, 40, FALSE);
660 	m_scroll_3d_width_ctrl.SetScrollPos((int)portals.width_3d, TRUE);
661 	m_scroll_3d_trans_ctrl.SetScrollRange(0, 100, FALSE);
662 	m_scroll_3d_trans_ctrl.SetScrollPos((int)portals.trans_3d, TRUE);
663 	m_scroll_cubic_ctrl.SetScrollRange(1, 128, FALSE);
664 	m_scroll_cubic_ctrl.SetScrollPos((int)portals.clip_range, TRUE);
665 
666 	return true;  // return TRUE unless you set the focus to a control
667 	              // EXCEPTION: OCX Property Pages should return FALSE
668 }
669 
OnHScroll(UINT nSBCode,UINT nPos,CScrollBar * pScrollBar)670 void CConfigDialog::OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)
671 {
672 	float *adj;
673 	float scr_min, scr_max, scr_big;
674 
675 	if(nSBCode == SB_THUMBPOSITION)
676 	{
677 		CDialog::OnHScroll(nSBCode, nPos, pScrollBar);
678 		return;
679 	}
680 
681 	if(pScrollBar == &m_scroll_2d_width_ctrl)
682 	{
683 		scr_min = 2.0f;
684 		scr_max = 40.0f;
685 		scr_big = 4.0f;
686 
687 		adj = &portals.width_2d;
688 	}
689 	else if(pScrollBar == &m_scroll_3d_width_ctrl)
690 	{
691 		scr_min = 2.0f;
692 		scr_max = 40.0f;
693 		scr_big = 4.0f;
694 
695 		adj = &portals.width_3d;
696 	}
697 	else if(pScrollBar == &m_scroll_3d_trans_ctrl)
698 	{
699 		scr_min = 0.0f;
700 		scr_max = 100.0f;
701 		scr_big = 10.0f;
702 
703 		adj = &portals.trans_3d;
704 	}
705 	else if(pScrollBar == &m_scroll_cubic_ctrl)
706 	{
707 		scr_min = 1.0f;
708 		scr_max = 128.0f;
709 		scr_big = 8.0f;
710 
711 		adj = &portals.clip_range;
712 	}
713 	else
714 	{
715 		CDialog::OnHScroll(nSBCode, nPos, pScrollBar);
716 		return;
717 	}
718 
719 	switch(nSBCode)
720 	{
721 	case SB_LEFT:
722 		*adj = scr_min;
723 		pScrollBar->SetScrollPos((int)scr_min, TRUE);
724 		break;
725 	case SB_RIGHT:
726 		*adj = scr_max;
727 		pScrollBar->SetScrollPos((int)scr_max, TRUE);
728 		break;
729 	case SB_LINELEFT:
730 		*adj -= 1.0f;
731 
732 		if(*adj < scr_min)
733 			*adj = scr_min;
734 
735 		pScrollBar->SetScrollPos((int)(*adj), TRUE);
736 
737 		break;
738 	case SB_LINERIGHT:
739 		*adj += 1.0f;
740 
741 		if(*adj > scr_max)
742 			*adj = scr_max;
743 
744 		pScrollBar->SetScrollPos((int)(*adj), TRUE);
745 
746 		break;
747 	case SB_PAGELEFT:
748 		*adj -= scr_big;
749 
750 		if(*adj < scr_min)
751 			*adj = scr_min;
752 
753 		pScrollBar->SetScrollPos((int)(*adj), TRUE);
754 
755 		break;
756 	case SB_PAGERIGHT:
757 		*adj += scr_big;
758 
759 		if(*adj > scr_max)
760 			*adj = scr_max;
761 
762 		pScrollBar->SetScrollPos((int)(*adj), TRUE);
763 
764 		break;
765 	case SB_THUMBTRACK:
766 		*adj = (float)nPos;
767 
768 		break;
769 	case SB_ENDSCROLL:
770 		pScrollBar->SetScrollPos((int)(*adj), TRUE);
771 
772 		break;
773 	default:
774 		CDialog::OnHScroll(nSBCode, nPos, pScrollBar);
775 	}
776 
777 	if(pScrollBar == &m_scroll_2d_width_ctrl)
778 	{
779 		Set2DText();
780 
781 		if(interfaces_started)
782 			g_FuncTable.m_pfnSysUpdateWindows(UPDATE_2D);
783 	}
784 	else if(pScrollBar == &m_scroll_3d_width_ctrl)
785 	{
786 		Set3DText();
787 
788 		if(interfaces_started)
789 			g_FuncTable.m_pfnSysUpdateWindows(UPDATE_3D);
790 	}
791 	else if(pScrollBar == &m_scroll_3d_trans_ctrl)
792 	{
793 		Set3DTransText();
794 
795 		if(interfaces_started)
796 			g_FuncTable.m_pfnSysUpdateWindows(UPDATE_3D);
797 	}
798 	else if(pScrollBar == &m_scroll_cubic_ctrl)
799 	{
800 		SetClipText();
801 
802 		if(interfaces_started)
803 			g_FuncTable.m_pfnSysUpdateWindows(UPDATE_3D);
804 	}
805 }
806 
OnAntiAlias2d()807 void CConfigDialog::OnAntiAlias2d()
808 {
809 	portals.aa_2d = m_aa_2d_ctrl.GetCheck();
810 
811 	if(interfaces_started)
812 		g_FuncTable.m_pfnSysUpdateWindows(UPDATE_2D);
813 }
814 
OnConfig2d()815 void CConfigDialog::OnConfig2d()
816 {
817 	portals.show_2d = m_2d_ctrl.GetCheck();
818 
819 	if(interfaces_started)
820 		g_FuncTable.m_pfnSysUpdateWindows(UPDATE_2D);
821 }
822 
OnColor2d()823 void CConfigDialog::OnColor2d()
824 {
825 	CColorDialog dlg(portals.color_2d, CC_ANYCOLOR, this);
826 
827 	if(dlg.DoModal() == IDOK)
828 	{
829 		portals.color_2d = dlg.GetColor();
830 
831 		portals.FixColors();
832 
833 		if(interfaces_started)
834 			g_FuncTable.m_pfnSysUpdateWindows(UPDATE_2D);
835 	}
836 }
837 
OnConfig3d()838 void CConfigDialog::OnConfig3d()
839 {
840 	portals.show_3d = m_3d_ctrl.GetCheck();
841 
842 	if(interfaces_started)
843 		g_FuncTable.m_pfnSysUpdateWindows(UPDATE_3D);
844 }
845 
846 
OnAntiAlias3d()847 void CConfigDialog::OnAntiAlias3d()
848 {
849 	portals.aa_3d = m_aa_3d_ctrl.GetCheck();
850 
851 	if(interfaces_started)
852 		g_FuncTable.m_pfnSysUpdateWindows(UPDATE_3D);
853 }
854 
OnColor3d()855 void CConfigDialog::OnColor3d()
856 {
857 	CColorDialog dlg(portals.color_3d, CC_ANYCOLOR, this);
858 
859 	if(dlg.DoModal() == IDOK)
860 	{
861 		portals.color_3d = dlg.GetColor();
862 
863 		portals.FixColors();
864 
865 		if(interfaces_started)
866 			g_FuncTable.m_pfnSysUpdateWindows(UPDATE_3D);
867 	}
868 }
869 
OnColorFog()870 void CConfigDialog::OnColorFog()
871 {
872 	CColorDialog dlg(portals.color_fog, CC_ANYCOLOR, this);
873 
874 	if(dlg.DoModal() == IDOK)
875 	{
876 		portals.color_fog = dlg.GetColor();
877 
878 		portals.FixColors();
879 
880 		if(interfaces_started)
881 			g_FuncTable.m_pfnSysUpdateWindows(UPDATE_3D);
882 	}
883 }
884 
OnFog()885 void CConfigDialog::OnFog()
886 {
887 	portals.fog = m_fog_ctrl.GetCheck();
888 
889 	if(interfaces_started)
890 		g_FuncTable.m_pfnSysUpdateWindows(UPDATE_3D);
891 }
892 
OnSelchangeZbuffer()893 void CConfigDialog::OnSelchangeZbuffer()
894 {
895 	portals.zbuffer = m_z_ctrl.GetCurSel();
896 
897 	if(interfaces_started)
898 		g_FuncTable.m_pfnSysUpdateWindows(UPDATE_3D);
899 }
900 
OnPoly()901 void CConfigDialog::OnPoly()
902 {
903 	portals.polygons = m_poly_ctrl.GetCheck();
904 
905 	if(interfaces_started)
906 		g_FuncTable.m_pfnSysUpdateWindows(UPDATE_3D);
907 }
908 
OnLines()909 void CConfigDialog::OnLines()
910 {
911 	portals.lines = m_line_ctrl.GetCheck();
912 
913 	if(interfaces_started)
914 		g_FuncTable.m_pfnSysUpdateWindows(UPDATE_3D);
915 }
916 
OnClip()917 void CConfigDialog::OnClip()
918 {
919 	portals.clip = m_clip_ctrl.GetCheck();
920 
921 	if(interfaces_started)
922 		g_FuncTable.m_pfnSysUpdateWindows(UPDATE_3D);
923 }
924 
925 #endif // GTK_PLUGIN
926