2 PrtView plugin for GtkRadiant
3 Copyright (C) 2001 Geoffrey Dewan, Loki software and qeradiant.com
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.
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.
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
20 #include "ConfigDialog.h"
23 #include "gtkutil/pointer.h"
25 #include "iscenegraph.h"
30 static void dialog_button_callback (GtkWidget *widget, gpointer data)
35 parent = gtk_widget_get_toplevel (widget);
36 loop = (int*)g_object_get_data (G_OBJECT (parent), "loop");
37 ret = (int*)g_object_get_data (G_OBJECT (parent), "ret");
40 *ret = gpointer_to_int(data);
43 static gint dialog_delete_callback (GtkWidget *widget, GdkEvent* event, gpointer data)
47 gtk_widget_hide (widget);
48 loop = (int*)g_object_get_data (G_OBJECT (widget), "loop");
54 // =============================================================================
55 // Color selection dialog
57 static int DoColor (PackedColour *c)
61 int loop = 1, ret = IDCANCEL;
63 clr[0] = ((double)GetRValue (*c)) / 255.0;
64 clr[1] = ((double)GetGValue (*c)) / 255.0;
65 clr[2] = ((double)GetBValue (*c)) / 255.0;
67 dlg = gtk_color_selection_dialog_new ("Choose Color");
68 gtk_color_selection_set_color (GTK_COLOR_SELECTION (GTK_COLOR_SELECTION_DIALOG (dlg)->colorsel), clr);
69 gtk_signal_connect (GTK_OBJECT (dlg), "delete_event",
70 GTK_SIGNAL_FUNC (dialog_delete_callback), NULL);
71 gtk_signal_connect (GTK_OBJECT (dlg), "destroy",
72 GTK_SIGNAL_FUNC (gtk_widget_destroy), NULL);
73 gtk_signal_connect (GTK_OBJECT (GTK_COLOR_SELECTION_DIALOG (dlg)->ok_button), "clicked",
74 GTK_SIGNAL_FUNC (dialog_button_callback), GINT_TO_POINTER (IDOK));
75 gtk_signal_connect (GTK_OBJECT (GTK_COLOR_SELECTION_DIALOG (dlg)->cancel_button), "clicked",
76 GTK_SIGNAL_FUNC (dialog_button_callback), GINT_TO_POINTER (IDCANCEL));
77 g_object_set_data (G_OBJECT (dlg), "loop", &loop);
78 g_object_set_data (G_OBJECT (dlg), "ret", &ret);
84 gtk_main_iteration ();
86 gtk_color_selection_get_color (GTK_COLOR_SELECTION (GTK_COLOR_SELECTION_DIALOG (dlg)->colorsel), clr);
88 gtk_grab_remove (dlg);
89 gtk_widget_destroy (dlg);
93 *c = RGB (clr[0]*255, clr[1]*255, clr[2]*255);
99 static void Set2DText (GtkWidget* label)
103 sprintf(s, "Line Width = %6.3f", portals.width_2d * 0.5f);
105 gtk_label_set_text (GTK_LABEL (label), s);
108 static void Set3DText (GtkWidget* label)
112 sprintf(s, "Line Width = %6.3f", portals.width_3d * 0.5f);
114 gtk_label_set_text (GTK_LABEL (label), s);
117 static void Set3DTransText (GtkWidget* label)
121 sprintf(s, "Polygon transparency = %d%%", (int)portals.trans_3d);
123 gtk_label_set_text (GTK_LABEL (label), s);
126 static void SetClipText (GtkWidget* label)
130 sprintf(s, "Cubic clip range = %d", (int)portals.clip_range * 64);
132 gtk_label_set_text (GTK_LABEL (label), s);
135 static void OnScroll2d (GtkAdjustment *adj, gpointer data)
137 portals.width_2d = static_cast<float>(adj->value);
138 Set2DText (GTK_WIDGET (data));
140 Portals_shadersChanged();
144 static void OnScroll3d (GtkAdjustment *adj, gpointer data)
146 portals.width_3d = static_cast<float>(adj->value);
147 Set3DText (GTK_WIDGET (data));
152 static void OnScrollTrans (GtkAdjustment *adj, gpointer data)
154 portals.trans_3d = static_cast<float>(adj->value);
155 Set3DTransText (GTK_WIDGET (data));
160 static void OnScrollClip (GtkAdjustment *adj, gpointer data)
162 portals.clip_range = static_cast<float>(adj->value);
163 SetClipText (GTK_WIDGET (data));
168 static void OnAntiAlias2d (GtkWidget *widget, gpointer data)
170 portals.aa_2d = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (widget)) ? true : false;
172 Portals_shadersChanged();
177 static void OnConfig2d (GtkWidget *widget, gpointer data)
179 portals.show_2d = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (widget)) ? true : false;
184 static void OnColor2d (GtkWidget *widget, gpointer data)
186 if (DoColor (&portals.color_2d) == IDOK)
188 Portals_shadersChanged();
194 static void OnConfig3d (GtkWidget *widget, gpointer data)
196 portals.show_3d = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (widget)) ? true : false;
202 static void OnAntiAlias3d (GtkWidget *widget, gpointer data)
204 portals.aa_3d = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (widget)) ? true : false;
206 Portals_shadersChanged();
210 static void OnColor3d (GtkWidget *widget, gpointer data)
212 if (DoColor (&portals.color_3d) == IDOK)
214 Portals_shadersChanged();
220 static void OnColorFog (GtkWidget *widget, gpointer data)
222 if (DoColor (&portals.color_fog) == IDOK)
224 Portals_shadersChanged();
230 static void OnFog (GtkWidget *widget, gpointer data)
232 portals.fog = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (widget)) ? true : false;
234 Portals_shadersChanged();
238 static void OnSelchangeZbuffer (GtkWidget *widget, gpointer data)
240 portals.zbuffer = gpointer_to_int(data);
242 Portals_shadersChanged();
246 static void OnPoly (GtkWidget *widget, gpointer data)
248 portals.polygons = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (widget));
253 static void OnLines (GtkWidget *widget, gpointer data)
255 portals.lines = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (widget));
260 static void OnClip (GtkWidget *widget, gpointer data)
262 portals.clip = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (widget)) ? true : false;
267 void DoConfigDialog ()
269 GtkWidget *dlg, *hbox, *vbox, *vbox2, *button, *table, *frame;
270 GtkWidget *lw3slider, *lw3label, *lw2slider, *lw2label, *zlist, *menu, *item;
271 GtkWidget *aa2check, *aa3check, *depthcheck, *linescheck, *polyscheck;
272 GtkWidget *transslider, *translabel, *clipslider, *cliplabel;
273 GtkWidget *show2check, *show3check, *portalcheck;
274 int loop = 1, ret = IDCANCEL;
277 dlg = gtk_window_new (GTK_WINDOW_TOPLEVEL);
278 gtk_window_set_title (GTK_WINDOW (dlg), "Portal Viewer Configuration");
279 gtk_signal_connect (GTK_OBJECT (dlg), "delete_event",
280 GTK_SIGNAL_FUNC (dialog_delete_callback), NULL);
281 gtk_signal_connect (GTK_OBJECT (dlg), "destroy",
282 GTK_SIGNAL_FUNC (gtk_widget_destroy), NULL);
283 g_object_set_data (G_OBJECT (dlg), "loop", &loop);
284 g_object_set_data (G_OBJECT (dlg), "ret", &ret);
286 vbox = gtk_vbox_new (FALSE, 5);
287 gtk_widget_show (vbox);
288 gtk_container_add (GTK_CONTAINER (dlg), vbox);
289 gtk_container_set_border_width (GTK_CONTAINER (vbox), 5);
291 frame = gtk_frame_new ("3D View");
292 gtk_widget_show (frame);
293 gtk_box_pack_start (GTK_BOX (vbox), frame, TRUE, TRUE, 0);
295 vbox2 = gtk_vbox_new (FALSE, 5);
296 gtk_widget_show (vbox2);
297 gtk_container_add (GTK_CONTAINER (frame), vbox2);
298 gtk_container_set_border_width (GTK_CONTAINER (vbox2), 5);
300 hbox = gtk_hbox_new (FALSE, 5);
301 gtk_widget_show (hbox);
302 gtk_box_pack_start (GTK_BOX (vbox2), hbox, TRUE, TRUE, 0);
304 adj = gtk_adjustment_new (portals.width_3d, 2, 40, 1, 1, 0);
305 lw3slider = gtk_hscale_new (GTK_ADJUSTMENT (adj));
306 gtk_widget_show (lw3slider);
307 gtk_box_pack_start (GTK_BOX (hbox), lw3slider, TRUE, TRUE, 0);
308 gtk_scale_set_draw_value (GTK_SCALE (lw3slider), FALSE);
310 lw3label = gtk_label_new ("");
311 gtk_widget_show (lw3label);
312 gtk_box_pack_start (GTK_BOX (hbox), lw3label, FALSE, TRUE, 0);
313 gtk_signal_connect (adj, "value_changed", GTK_SIGNAL_FUNC (OnScroll3d), lw3label);
315 table = gtk_table_new (2, 4, FALSE);
316 gtk_widget_show (table);
317 gtk_box_pack_start (GTK_BOX (vbox2), table, TRUE, TRUE, 0);
318 gtk_table_set_row_spacings (GTK_TABLE (table), 5);
319 gtk_table_set_col_spacings (GTK_TABLE (table), 5);
321 button = gtk_button_new_with_label ("Color");
322 gtk_widget_show (button);
323 gtk_table_attach (GTK_TABLE (table), button, 0, 1, 0, 1,
324 (GtkAttachOptions) (GTK_FILL),
325 (GtkAttachOptions) (0), 0, 0);
326 gtk_signal_connect (GTK_OBJECT (button), "clicked", GTK_SIGNAL_FUNC (OnColor3d), NULL);
328 button = gtk_button_new_with_label ("Depth Color");
329 gtk_widget_show (button);
330 gtk_table_attach (GTK_TABLE (table), button, 0, 1, 1, 2,
331 (GtkAttachOptions) (GTK_FILL),
332 (GtkAttachOptions) (0), 0, 0);
333 gtk_signal_connect (GTK_OBJECT (button), "clicked", GTK_SIGNAL_FUNC (OnColorFog), NULL);
335 aa3check = gtk_check_button_new_with_label ("Anti-Alias (May not work on some video cards)");
336 gtk_widget_show (aa3check);
337 gtk_table_attach (GTK_TABLE (table), aa3check, 1, 4, 0, 1,
338 (GtkAttachOptions) (GTK_EXPAND|GTK_FILL),
339 (GtkAttachOptions) (0), 0, 0);
340 gtk_signal_connect (GTK_OBJECT (aa3check), "toggled", GTK_SIGNAL_FUNC (OnAntiAlias3d), NULL);
342 depthcheck = gtk_check_button_new_with_label ("Depth Cue");
343 gtk_widget_show (depthcheck);
344 gtk_table_attach (GTK_TABLE (table), depthcheck, 1, 2, 1, 2,
345 (GtkAttachOptions) (GTK_EXPAND|GTK_FILL),
346 (GtkAttachOptions) (0), 0, 0);
347 gtk_signal_connect (GTK_OBJECT (depthcheck), "toggled", GTK_SIGNAL_FUNC (OnFog), NULL);
349 linescheck = gtk_check_button_new_with_label ("Lines");
350 gtk_widget_show (linescheck);
351 gtk_table_attach (GTK_TABLE (table), linescheck, 2, 3, 1, 2,
352 (GtkAttachOptions) (GTK_EXPAND|GTK_FILL),
353 (GtkAttachOptions) (0), 0, 0);
354 gtk_signal_connect (GTK_OBJECT (linescheck), "toggled", GTK_SIGNAL_FUNC (OnLines), NULL);
356 polyscheck = gtk_check_button_new_with_label ("Polygons");
357 gtk_widget_show (polyscheck);
358 gtk_table_attach (GTK_TABLE (table), polyscheck, 3, 4, 1, 2,
359 (GtkAttachOptions) (GTK_EXPAND|GTK_FILL),
360 (GtkAttachOptions) (0), 0, 0);
361 gtk_signal_connect (GTK_OBJECT (polyscheck), "toggled", GTK_SIGNAL_FUNC (OnPoly), NULL);
363 zlist = gtk_option_menu_new ();
364 gtk_widget_show (zlist);
365 gtk_box_pack_start (GTK_BOX (vbox2), zlist, TRUE, FALSE, 0);
367 menu = gtk_menu_new ();
368 gtk_widget_show (menu);
369 gtk_option_menu_set_menu (GTK_OPTION_MENU (zlist), menu);
371 item = gtk_menu_item_new_with_label ("Z-Buffer Test and Write (recommended for solid or no polygons)");
372 gtk_widget_show (item);
373 gtk_signal_connect (GTK_OBJECT (item), "activate",
374 GTK_SIGNAL_FUNC (OnSelchangeZbuffer), GINT_TO_POINTER (0));
375 gtk_menu_append (GTK_MENU (menu), item);
377 item = gtk_menu_item_new_with_label ("Z-Buffer Test Only (recommended for transparent polygons)");
378 gtk_widget_show (item);
379 gtk_signal_connect (GTK_OBJECT (item), "activate",
380 GTK_SIGNAL_FUNC (OnSelchangeZbuffer), GINT_TO_POINTER (1));
381 gtk_menu_append (GTK_MENU (menu), item);
383 item = gtk_menu_item_new_with_label ("Z-Buffer Off");
384 gtk_widget_show (item);
385 gtk_signal_connect (GTK_OBJECT (item), "activate",
386 GTK_SIGNAL_FUNC (OnSelchangeZbuffer), GINT_TO_POINTER (2));
387 gtk_menu_append (GTK_MENU (menu), item);
389 table = gtk_table_new (2, 2, FALSE);
390 gtk_widget_show (table);
391 gtk_box_pack_start (GTK_BOX (vbox2), table, TRUE, TRUE, 0);
392 gtk_table_set_row_spacings (GTK_TABLE (table), 5);
393 gtk_table_set_col_spacings (GTK_TABLE (table), 5);
395 adj = gtk_adjustment_new (portals.trans_3d, 0, 100, 1, 1, 0);
396 transslider = gtk_hscale_new (GTK_ADJUSTMENT (adj));
397 gtk_widget_show (transslider);
398 gtk_table_attach (GTK_TABLE (table), transslider, 0, 1, 0, 1,
399 (GtkAttachOptions) (GTK_EXPAND|GTK_FILL),
400 (GtkAttachOptions) (0), 0, 0);
401 gtk_scale_set_draw_value (GTK_SCALE (transslider), FALSE);
403 translabel = gtk_label_new ("");
404 gtk_widget_show (translabel);
405 gtk_table_attach (GTK_TABLE (table), translabel, 1, 2, 0, 1,
406 (GtkAttachOptions) (GTK_FILL),
407 (GtkAttachOptions) (0), 0, 0);
408 gtk_misc_set_alignment (GTK_MISC (translabel), 0.0, 0.0);
409 gtk_signal_connect (adj, "value_changed", GTK_SIGNAL_FUNC (OnScrollTrans), translabel);
411 adj = gtk_adjustment_new (portals.clip_range, 1, 128, 1, 1, 0);
412 clipslider = gtk_hscale_new (GTK_ADJUSTMENT (adj));
413 gtk_widget_show (clipslider);
414 gtk_table_attach (GTK_TABLE (table), clipslider, 0, 1, 1, 2,
415 (GtkAttachOptions) (GTK_EXPAND|GTK_FILL),
416 (GtkAttachOptions) (0), 0, 0);
417 gtk_scale_set_draw_value (GTK_SCALE (clipslider), FALSE);
419 cliplabel = gtk_label_new ("");
420 gtk_widget_show (cliplabel);
421 gtk_table_attach (GTK_TABLE (table), cliplabel, 1, 2, 1, 2,
422 (GtkAttachOptions) (GTK_FILL),
423 (GtkAttachOptions) (0), 0, 0);
424 gtk_misc_set_alignment (GTK_MISC (cliplabel), 0.0, 0.0);
425 gtk_signal_connect (adj, "value_changed", GTK_SIGNAL_FUNC (OnScrollClip), cliplabel);
427 hbox = gtk_hbox_new (TRUE, 5);
428 gtk_widget_show (hbox);
429 gtk_box_pack_start (GTK_BOX (vbox2), hbox, TRUE, FALSE, 0);
431 show3check = gtk_check_button_new_with_label ("Show");
432 gtk_widget_show (show3check);
433 gtk_box_pack_start (GTK_BOX (hbox), show3check, TRUE, TRUE, 0);
434 gtk_signal_connect (GTK_OBJECT (show3check), "toggled", GTK_SIGNAL_FUNC (OnConfig3d), NULL);
436 portalcheck = gtk_check_button_new_with_label ("Portal cubic clipper");
437 gtk_widget_show (portalcheck);
438 gtk_box_pack_start (GTK_BOX (hbox), portalcheck, TRUE, TRUE, 0);
439 gtk_signal_connect (GTK_OBJECT (portalcheck), "toggled", GTK_SIGNAL_FUNC (OnClip), NULL);
441 frame = gtk_frame_new ("2D View");
442 gtk_widget_show (frame);
443 gtk_box_pack_start (GTK_BOX (vbox), frame, TRUE, TRUE, 0);
445 vbox2 = gtk_vbox_new (FALSE, 5);
446 gtk_widget_show (vbox2);
447 gtk_container_add (GTK_CONTAINER (frame), vbox2);
448 gtk_container_set_border_width (GTK_CONTAINER (vbox2), 5);
450 hbox = gtk_hbox_new (FALSE, 5);
451 gtk_widget_show (hbox);
452 gtk_box_pack_start (GTK_BOX (vbox2), hbox, TRUE, FALSE, 0);
454 adj = gtk_adjustment_new (portals.width_2d, 2, 40, 1, 1, 0);
455 lw2slider = gtk_hscale_new (GTK_ADJUSTMENT (adj));
456 gtk_widget_show (lw2slider);
457 gtk_box_pack_start (GTK_BOX (hbox), lw2slider, TRUE, TRUE, 0);
458 gtk_scale_set_draw_value (GTK_SCALE (lw2slider), FALSE);
460 lw2label = gtk_label_new ("");
461 gtk_widget_show (lw2label);
462 gtk_box_pack_start (GTK_BOX (hbox), lw2label, FALSE, TRUE, 0);
463 gtk_signal_connect (adj, "value_changed", GTK_SIGNAL_FUNC (OnScroll2d), lw2label);
465 hbox = gtk_hbox_new (FALSE, 5);
466 gtk_widget_show (hbox);
467 gtk_box_pack_start (GTK_BOX (vbox2), hbox, TRUE, FALSE, 0);
469 button = gtk_button_new_with_label ("Color");
470 gtk_widget_show (button);
471 gtk_box_pack_start (GTK_BOX (hbox), button, FALSE, FALSE, 0);
472 gtk_signal_connect (GTK_OBJECT (button), "clicked", GTK_SIGNAL_FUNC (OnColor2d), NULL);
473 gtk_widget_set_usize (button, 60, -2);
475 aa2check = gtk_check_button_new_with_label ("Anti-Alias (May not work on some video cards)");
476 gtk_widget_show (aa2check);
477 gtk_box_pack_start (GTK_BOX (hbox), aa2check, TRUE, TRUE, 0);
478 gtk_signal_connect (GTK_OBJECT (aa2check), "toggled", GTK_SIGNAL_FUNC (OnAntiAlias2d), NULL);
480 hbox = gtk_hbox_new (FALSE, 5);
481 gtk_widget_show (hbox);
482 gtk_box_pack_start (GTK_BOX (vbox2), hbox, TRUE, FALSE, 0);
484 show2check = gtk_check_button_new_with_label ("Show");
485 gtk_widget_show (show2check);
486 gtk_box_pack_start (GTK_BOX (hbox), show2check, FALSE, FALSE, 0);
487 gtk_signal_connect (GTK_OBJECT (show2check), "toggled", GTK_SIGNAL_FUNC (OnConfig2d), NULL);
489 hbox = gtk_hbox_new (FALSE, 5);
490 gtk_widget_show (hbox);
491 gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, FALSE, 0);
493 button = gtk_button_new_with_label ("OK");
494 gtk_widget_show (button);
495 gtk_box_pack_end (GTK_BOX (hbox), button, FALSE, FALSE, 0);
496 gtk_signal_connect (GTK_OBJECT (button), "clicked",
497 GTK_SIGNAL_FUNC (dialog_button_callback), GINT_TO_POINTER (IDOK));
498 gtk_widget_set_usize (button, 60, -2);
501 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (show2check), portals.show_2d);
502 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (aa2check), portals.aa_2d);
503 Set2DText (lw2label);
505 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (show3check), portals.show_3d);
506 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (depthcheck), portals.fog);
507 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (polyscheck), portals.polygons);
508 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (linescheck), portals.lines);
509 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (aa3check), portals.aa_3d);
510 gtk_option_menu_set_history (GTK_OPTION_MENU (zlist), portals.zbuffer);
511 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (portalcheck), portals.clip);
513 Set3DText (lw3label);
514 Set3DTransText (translabel);
515 SetClipText (cliplabel);
518 gtk_widget_show (dlg);
521 gtk_main_iteration ();
523 gtk_grab_remove (dlg);
524 gtk_widget_destroy (dlg);