transfer from internal tree r5311 branches/1.4-gpl
[xonotic/netradiant.git] / contrib / gtkgensurf / gendlgs.cpp
1 /*\r
2 GenSurf plugin for GtkRadiant\r
3 Copyright (C) 2001 David Hyde, Loki software and qeradiant.com\r
4 \r
5 This library is free software; you can redistribute it and/or\r
6 modify it under the terms of the GNU Lesser General Public\r
7 License as published by the Free Software Foundation; either\r
8 version 2.1 of the License, or (at your option) any later version.\r
9 \r
10 This library is distributed in the hope that it will be useful,\r
11 but WITHOUT ANY WARRANTY; without even the implied warranty of\r
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\r
13 Lesser General Public License for more details.\r
14 \r
15 You should have received a copy of the GNU Lesser General Public\r
16 License along with this library; if not, write to the Free Software\r
17 Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\r
18 */\r
19 \r
20 #include <gtk/gtk.h>\r
21 #include <stdio.h>\r
22 #include <stdlib.h>\r
23 #include <string.h>\r
24 #include <math.h>\r
25 #include "gensurf.h"\r
26 \r
27 #define GENERAL_TAB   0\r
28 #define EXTENTS_TAB   1\r
29 #define BITMAP_TAB    2\r
30 #define FIXPOINTS_TAB 3\r
31 #define TEXTURE_TAB   4\r
32 //#define BUFF_SIZE     32768\r
33 \r
34 #define ENABLE_WIDGET(name,enable) \\r
35   gtk_widget_set_sensitive (GTK_WIDGET (g_object_get_data (G_OBJECT (g_pWnd), (name))), (enable))\r
36 #define CHECK_WIDGET(name,check) \\r
37   gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (g_object_get_data (G_OBJECT (g_pWnd), name)), check)\r
38 \r
39 static GtkWidget *game_radios[NUMGAMES];\r
40 static GtkWidget *wave_radios[5];\r
41 static GtkWidget *plane_radios[6];\r
42 static guint current_tab;\r
43 static int OldPreview;\r
44 static int WasDetail;\r
45 static GtkTooltips *tooltips;\r
46 static int FirstPassComplete = 0;\r
47 \r
48 void About (GtkWidget *parent)\r
49 {\r
50 /*\r
51   char *icon_xpm[] = {\r
52 "32 32 4 1",\r
53 "       c None",\r
54 ".      c #000000",\r
55 "+      c #FFFFFF",\r
56 "@      c #838183",\r
57 "................................",\r
58 "................................",\r
59 "................................",\r
60 "................................",\r
61 "................................",\r
62 "................................",\r
63 "................................",\r
64 "...............++...............",\r
65 ".............++++++.............",\r
66 "............++@+++@+............",\r
67 "..........+++..++..+++..........",\r
68 "........++.+.++..++.+.@+........",\r
69 ".......+..+..+.++.+..+..++......",\r
70 ".....++..++.+..++..+.++..++.....",\r
71 "...++..++...+.+..+.++..++..++...",\r
72 "..++.+.++....++..++....++.+..+..",\r
73 ".+.+..+..++....++....++..++.+.+.",\r
74 "..+++....+.++++++++++.+....+++..",\r
75 "....++.@@+++++.++.++++@++.++....",\r
76 "......+++++++......++@+++++.....",\r
77 ".......+++.+.++..++.+..++.......",\r
78 ".........++..+.++.+..++.........",\r
79 "...........++..++..++...........",\r
80 ".............++..+.+............",\r
81 "..............+..+@.............",\r
82 "...............@@...............",\r
83 "................................",\r
84 "................................",\r
85 "................................",\r
86 "................................",\r
87 "................................",\r
88 "................................"\r
89 };\r
90 */\r
91   // leo: I'm too lazy to create a nice about box\r
92         // ^Fishman - I am lazy too :P.\r
93   g_FuncTable.m_pfnMessageBox (parent, "GtkGenSurf 1.05\n\n"\r
94                                "Original version\n"\r
95                                                                                                                          "David Hyde (rascal@vicksburg.com)\n\n"\r
96                                                                                                                          "Porting\n"\r
97                                "Leonardo Zide (leo@lokigames.com)\n\n"\r
98                                                                                                                          "Enhancements\n"\r
99                                                                                                                          "Pablo Zurita (pablo@qeradiant.com)\n"\r
100                                                                                                                          "Hydra (hydra@hydras-world.com)",\r
101                                "About GtkGenSurf", MB_OK);\r
102 }\r
103 \r
104 // =============================================================================\r
105 // main dialog\r
106 \r
107 static void SetupControls ()\r
108 {\r
109   switch (current_tab)\r
110   {\r
111   case GENERAL_TAB:\r
112     break;\r
113 \r
114   case EXTENTS_TAB:\r
115     if (Game != QUAKE3)\r
116     {\r
117       gtk_widget_hide (GTK_WIDGET (g_object_get_data (G_OBJECT (g_pWnd), "use_patches")));\r
118       ENABLE_WIDGET ("use_patches", FALSE);\r
119     }\r
120     else\r
121     {\r
122       gtk_widget_show (GTK_WIDGET (g_object_get_data (G_OBJECT (g_pWnd), "use_patches")));\r
123       ENABLE_WIDGET ("use_patches", TRUE);\r
124     }\r
125 \r
126     if (Game == QUAKE3 && UsePatches != 0)\r
127     {\r
128       ENABLE_WIDGET ("decimate", FALSE);\r
129     }\r
130                 gtk_label_set_text (GTK_LABEL (g_object_get_data (G_OBJECT (g_pWnd), "snap_text")), "Snap to grid:"); // ^Fishman - Snap to grid.\r
131     break;\r
132 \r
133   case BITMAP_TAB:\r
134     if (WaveType != WAVE_BITMAP)\r
135     {\r
136       ENABLE_WIDGET ("bmp_file", FALSE);\r
137       ENABLE_WIDGET ("bmp_file_browse", FALSE);\r
138       ENABLE_WIDGET ("bmp_black", FALSE);\r
139       ENABLE_WIDGET ("bmp_white", FALSE);\r
140       ENABLE_WIDGET ("bmp_text1", FALSE);\r
141       ENABLE_WIDGET ("bmp_text2", FALSE);\r
142       ENABLE_WIDGET ("bmp_text3", FALSE);\r
143       ENABLE_WIDGET ("bmp_reload", FALSE);\r
144       gtk_label_set_text (GTK_LABEL (g_object_get_data (G_OBJECT (g_pWnd), "bmp_note")),\r
145                           "These options are disabled unless \"From Bitmap\"\n"\r
146                           "is selected as the Waveform on the General tab.");\r
147     }\r
148     else\r
149     {\r
150       ENABLE_WIDGET ("bmp_file", TRUE);\r
151       ENABLE_WIDGET ("bmp_file_browse", TRUE);\r
152       ENABLE_WIDGET ("bmp_black", TRUE);\r
153       ENABLE_WIDGET ("bmp_white", TRUE);\r
154       ENABLE_WIDGET ("bmp_text1", TRUE);\r
155       ENABLE_WIDGET ("bmp_text2", TRUE);\r
156       ENABLE_WIDGET ("bmp_text3", TRUE);\r
157       ENABLE_WIDGET ("bmp_reload", strlen(gbmp.name) != 0);\r
158       gtk_label_set_text (GTK_LABEL (g_object_get_data (G_OBJECT (g_pWnd), "bmp_note")),\r
159                           "GenSurf works only with 8-bit bitmaps. Color indices are\n"\r
160                           "mapped to values for each vertex. Generally, gray scale\n"\r
161                           "images are stored with black as color 0, white as color 255.");\r
162     }\r
163     break;\r
164 \r
165   case FIXPOINTS_TAB:\r
166     ENABLE_WIDGET ("fix_value", (NumVerticesSelected != 0));\r
167     ENABLE_WIDGET ("fix_value_text", (NumVerticesSelected != 0));\r
168     ENABLE_WIDGET ("fix_free", (NumVerticesSelected != 0));\r
169     ENABLE_WIDGET ("fix_range", ((NumVerticesSelected != 0) && (WaveType != WAVE_ROUGH_ONLY)));\r
170     ENABLE_WIDGET ("fix_range_text", ((NumVerticesSelected != 0) && (WaveType != WAVE_ROUGH_ONLY)));\r
171     ENABLE_WIDGET ("fix_rate", ((NumVerticesSelected != 0) && (WaveType != WAVE_ROUGH_ONLY)));\r
172     ENABLE_WIDGET ("fix_rate_text", ((NumVerticesSelected != 0) && (WaveType != WAVE_ROUGH_ONLY)));\r
173     break;\r
174 \r
175   case TEXTURE_TAB:\r
176     ENABLE_WIDGET ("texture2", (UsePatches == 0));\r
177     ENABLE_WIDGET ("texture3", (UsePatches == 0));\r
178     ENABLE_WIDGET ("tex_slant", (UsePatches == 0));\r
179     ENABLE_WIDGET ("detail", (UsePatches == 0));\r
180     if (Game != QUAKE3 )\r
181                 {\r
182                         ENABLE_WIDGET ("terrain_ent", FALSE); // ^Fishman - Adds terrain key to func_group.\r
183       ENABLE_WIDGET ("hint", (UsePatches == 0));\r
184                 }\r
185     break;\r
186   }\r
187 \r
188   switch (WaveType)\r
189   {\r
190   case WAVE_HCYLINDER:\r
191   case WAVE_VCYLINDER:\r
192     ENABLE_WIDGET ("amplitude", TRUE);\r
193     ENABLE_WIDGET ("wavelength", TRUE);\r
194     ENABLE_WIDGET ("z00", TRUE);\r
195     ENABLE_WIDGET ("z01", TRUE);\r
196     ENABLE_WIDGET ("z10", TRUE);\r
197     ENABLE_WIDGET ("z11", TRUE);\r
198     ENABLE_WIDGET ("linearborder", TRUE);\r
199     ENABLE_WIDGET ("go", TRUE);\r
200     break;\r
201   case WAVE_BITMAP:\r
202     ENABLE_WIDGET ("amplitude", FALSE);\r
203     ENABLE_WIDGET ("wavelength", FALSE);\r
204     ENABLE_WIDGET ("z00", FALSE);\r
205     ENABLE_WIDGET ("z01", FALSE);\r
206     ENABLE_WIDGET ("z10", FALSE);\r
207     ENABLE_WIDGET ("z11", FALSE);\r
208     ENABLE_WIDGET ("linearborder", FALSE);\r
209     ENABLE_WIDGET ("go", (gbmp.colors != NULL ? TRUE : FALSE));\r
210     break;\r
211   case WAVE_ROUGH_ONLY:\r
212     ENABLE_WIDGET ("amplitude", FALSE);\r
213     ENABLE_WIDGET ("wavelength", FALSE);\r
214     ENABLE_WIDGET ("z00", TRUE);\r
215     ENABLE_WIDGET ("z01", TRUE);\r
216     ENABLE_WIDGET ("z10", TRUE);\r
217     ENABLE_WIDGET ("z11", TRUE);\r
218     ENABLE_WIDGET ("linearborder", TRUE);\r
219     ENABLE_WIDGET ("go", TRUE);\r
220     break;\r
221   default:\r
222     ENABLE_WIDGET ("amplitude", TRUE);\r
223     ENABLE_WIDGET ("wavelength", TRUE);\r
224     ENABLE_WIDGET ("z00", TRUE);\r
225     ENABLE_WIDGET ("z01", TRUE);\r
226     ENABLE_WIDGET ("z10", TRUE);\r
227     ENABLE_WIDGET ("z11", TRUE);\r
228     ENABLE_WIDGET ("linearborder", TRUE);\r
229     ENABLE_WIDGET ("go", TRUE);\r
230   }\r
231 \r
232   switch (Plane)\r
233   {\r
234   case PLANE_XZ0:\r
235   case PLANE_XZ1:\r
236     gtk_label_set_text (GTK_LABEL (g_object_get_data (G_OBJECT (g_pWnd), "hmin_text")), "X:");\r
237     gtk_label_set_text (GTK_LABEL (g_object_get_data (G_OBJECT (g_pWnd), "hmax_text")), "X:");\r
238     gtk_label_set_text (GTK_LABEL (g_object_get_data (G_OBJECT (g_pWnd), "vmin_text")), "Z:");\r
239     gtk_label_set_text (GTK_LABEL (g_object_get_data (G_OBJECT (g_pWnd), "vmax_text")), "Z:");\r
240     gtk_label_set_text (GTK_LABEL (g_object_get_data (G_OBJECT (g_pWnd), "nh_text")), "X:");\r
241     gtk_label_set_text (GTK_LABEL (g_object_get_data (G_OBJECT (g_pWnd), "nv_text")), "Z:");\r
242     break;\r
243   case PLANE_YZ0:\r
244   case PLANE_YZ1:\r
245     gtk_label_set_text (GTK_LABEL (g_object_get_data (G_OBJECT (g_pWnd), "hmin_text")), "Y:");\r
246     gtk_label_set_text (GTK_LABEL (g_object_get_data (G_OBJECT (g_pWnd), "hmax_text")), "Y:");\r
247     gtk_label_set_text (GTK_LABEL (g_object_get_data (G_OBJECT (g_pWnd), "vmin_text")), "Z:");\r
248     gtk_label_set_text (GTK_LABEL (g_object_get_data (G_OBJECT (g_pWnd), "vmax_text")), "Z:");\r
249     gtk_label_set_text (GTK_LABEL (g_object_get_data (G_OBJECT (g_pWnd), "nh_text")), "Y:");\r
250     gtk_label_set_text (GTK_LABEL (g_object_get_data (G_OBJECT (g_pWnd), "nv_text")), "Z:");\r
251     break;\r
252   default:\r
253     gtk_label_set_text (GTK_LABEL (g_object_get_data (G_OBJECT (g_pWnd), "hmin_text")), "X:");\r
254     gtk_label_set_text (GTK_LABEL (g_object_get_data (G_OBJECT (g_pWnd), "hmax_text")), "X:");\r
255     gtk_label_set_text (GTK_LABEL (g_object_get_data (G_OBJECT (g_pWnd), "vmin_text")), "Y:");\r
256     gtk_label_set_text (GTK_LABEL (g_object_get_data (G_OBJECT (g_pWnd), "vmax_text")), "Y:");\r
257     gtk_label_set_text (GTK_LABEL (g_object_get_data (G_OBJECT (g_pWnd), "nh_text")), "X:");\r
258     gtk_label_set_text (GTK_LABEL (g_object_get_data (G_OBJECT (g_pWnd), "nv_text")), "Y:");\r
259     break;\r
260   }\r
261 }\r
262 \r
263 // SetDlgValues fills in text boxes and initializes other input controls\r
264 static void SetDlgValues (int tab)\r
265 {\r
266   char Text[256];\r
267   char RForm[16] = "%.5g";\r
268   int i;\r
269 \r
270   switch (tab)\r
271   {\r
272   case GENERAL_TAB:\r
273     // Hell if I know why, but in the release build the 2nd pass thru the\r
274     // set_sensitive loop for game_radios crashes. No need to do this more\r
275     // than once anyhow.\r
276     if (!FirstPassComplete)\r
277     {\r
278       for (i = 0; i < NUMGAMES; i++)\r
279         gtk_widget_set_sensitive (game_radios[i], (i == Game ? TRUE : FALSE));\r
280       for (i = 0; i < 6; i++)\r
281         gtk_widget_set_sensitive (plane_radios[i], (i == Plane ? TRUE : FALSE));\r
282     }\r
283     gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (game_radios[Game]), TRUE);\r
284     gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (plane_radios[Plane]), TRUE);\r
285     gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (wave_radios[WaveType]), TRUE);\r
286     gtk_spin_button_set_value (GTK_SPIN_BUTTON (g_object_get_data (G_OBJECT (g_pWnd), "random")),\r
287                                RandomSeed);\r
288     sprintf (Text, RForm, WaveLength);\r
289     gtk_entry_set_text (GTK_ENTRY (g_object_get_data (G_OBJECT (g_pWnd), "wavelength")), Text);\r
290     sprintf (Text, RForm, Amplitude);\r
291     gtk_entry_set_text (GTK_ENTRY (g_object_get_data (G_OBJECT (g_pWnd), "amplitude")), Text);\r
292     sprintf (Text, RForm, Roughness);\r
293     gtk_entry_set_text (GTK_ENTRY (g_object_get_data (G_OBJECT (g_pWnd), "roughness")), Text);\r
294                 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (g_object_get_data\r
295                                                      (G_OBJECT (g_pWnd), "main_antialiasing")), Antialiasing);\r
296     break;\r
297 \r
298   case EXTENTS_TAB:\r
299     sprintf (Text,RForm,Hll);\r
300     gtk_entry_set_text (GTK_ENTRY (g_object_get_data (G_OBJECT (g_pWnd), "hmin")), Text);\r
301     sprintf (Text,RForm,Vll);\r
302     gtk_entry_set_text (GTK_ENTRY (g_object_get_data (G_OBJECT (g_pWnd), "vmin")), Text);\r
303     sprintf (Text,RForm,Hur);\r
304     gtk_entry_set_text (GTK_ENTRY (g_object_get_data (G_OBJECT (g_pWnd), "hmax")), Text);\r
305     sprintf (Text,RForm,Vur);\r
306     gtk_entry_set_text (GTK_ENTRY (g_object_get_data (G_OBJECT (g_pWnd), "vmax")), Text);\r
307     sprintf (Text,RForm,Z00);\r
308     gtk_entry_set_text (GTK_ENTRY (g_object_get_data (G_OBJECT (g_pWnd), "z00")), Text);\r
309     sprintf (Text,RForm,Z01);\r
310     gtk_entry_set_text (GTK_ENTRY (g_object_get_data (G_OBJECT (g_pWnd), "z01")), Text);\r
311     sprintf (Text,RForm,Z10);\r
312     gtk_entry_set_text (GTK_ENTRY (g_object_get_data (G_OBJECT (g_pWnd), "z10")), Text);\r
313     sprintf (Text,RForm,Z11);\r
314     gtk_entry_set_text (GTK_ENTRY (g_object_get_data (G_OBJECT (g_pWnd), "z11")), Text);\r
315     gtk_spin_button_set_value (GTK_SPIN_BUTTON (g_object_get_data (G_OBJECT (g_pWnd), "nh")), NH);\r
316     gtk_spin_button_set_value (GTK_SPIN_BUTTON (g_object_get_data (G_OBJECT (g_pWnd), "nv")), NV);\r
317                 gtk_spin_button_set_value (GTK_SPIN_BUTTON (g_object_get_data (G_OBJECT (g_pWnd), "sp")), SP); // ^Fishman - Snap to grid.\r
318 \r
319     gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (g_object_get_data\r
320                                                      (G_OBJECT (g_pWnd), "linearborder")), FixBorders);\r
321     gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (g_object_get_data\r
322                                                      (G_OBJECT (g_pWnd), "use_patches")), UsePatches);\r
323     gtk_adjustment_set_value (GTK_ADJUSTMENT (g_object_get_data (G_OBJECT (g_pWnd), "decimate_adj")),\r
324                               Decimate);\r
325 \r
326     if (Game == QUAKE3 && UsePatches)\r
327     {\r
328       gtk_widget_set_sensitive (GTK_WIDGET (g_object_get_data (G_OBJECT (g_pWnd), "decimate")), FALSE);\r
329 \r
330       if (NH % 2)\r
331       {\r
332         NH++;\r
333         if (NH > MAX_ROWS) NH -= 2;\r
334         SetDlgValues (current_tab);\r
335       }\r
336 \r
337       if (NV % 2)\r
338       {\r
339         NV++;\r
340         if (NV > MAX_ROWS) NV -= 2;\r
341         SetDlgValues (current_tab);\r
342       }\r
343       if (NH % 2 ) NH++;\r
344       if (NH < 2 ) NH = 2;\r
345       if (NH > MAX_ROWS) NH = MAX_ROWS;\r
346       if (NV % 2 ) NV++;\r
347       if (NV < 2 ) NV = 2;\r
348       if (NV > MAX_ROWS) NV = MAX_ROWS;\r
349 \r
350       gpointer spin = g_object_get_data (G_OBJECT (g_pWnd), "nh");\r
351       GtkAdjustment *adj = gtk_spin_button_get_adjustment (GTK_SPIN_BUTTON (spin));\r
352       adj->lower = 2;\r
353       gtk_adjustment_changed (adj);\r
354       spin = g_object_get_data (G_OBJECT (g_pWnd), "nv");\r
355       adj = gtk_spin_button_get_adjustment (GTK_SPIN_BUTTON (spin));\r
356       adj->lower = 2;\r
357       gtk_adjustment_changed (adj);\r
358     }\r
359     else\r
360     {\r
361       gtk_widget_set_sensitive (GTK_WIDGET (g_object_get_data (G_OBJECT (g_pWnd), "decimate")), TRUE);\r
362 \r
363       gpointer spin = g_object_get_data (G_OBJECT (g_pWnd), "nh");\r
364       GtkAdjustment *adj = gtk_spin_button_get_adjustment (GTK_SPIN_BUTTON (spin));\r
365       adj->lower = 1;\r
366       gtk_adjustment_changed (adj);\r
367       spin = g_object_get_data (G_OBJECT (g_pWnd), "nv");\r
368       adj = gtk_spin_button_get_adjustment (GTK_SPIN_BUTTON (spin));\r
369       adj->lower = 1;\r
370       gtk_adjustment_changed (adj);\r
371     }\r
372 \r
373     gtk_spin_button_set_value (GTK_SPIN_BUTTON (g_object_get_data (G_OBJECT (g_pWnd), "nh")), NH);\r
374     gtk_spin_button_set_value (GTK_SPIN_BUTTON (g_object_get_data (G_OBJECT (g_pWnd), "nv")), NV);\r
375 \r
376     break;\r
377 \r
378   case BITMAP_TAB:\r
379     gtk_entry_set_text (GTK_ENTRY (g_object_get_data (G_OBJECT (g_pWnd), "bmp_file")), gbmp.name);\r
380     sprintf(Text,"%g",gbmp.black_value);\r
381     gtk_entry_set_text (GTK_ENTRY (g_object_get_data (G_OBJECT (g_pWnd), "bmp_black")), Text);\r
382     sprintf(Text,"%g",gbmp.white_value);\r
383     gtk_entry_set_text (GTK_ENTRY (g_object_get_data (G_OBJECT (g_pWnd), "bmp_white")), Text);\r
384     break;\r
385 \r
386   case FIXPOINTS_TAB:\r
387     break;\r
388 \r
389   case TEXTURE_TAB:\r
390     gtk_entry_set_text (GTK_ENTRY (g_object_get_data (G_OBJECT (g_pWnd), "texture1")), Texture[Game][0]);\r
391     gtk_entry_set_text (GTK_ENTRY (g_object_get_data (G_OBJECT (g_pWnd), "texture2")), Texture[Game][1]);\r
392     gtk_entry_set_text (GTK_ENTRY (g_object_get_data (G_OBJECT (g_pWnd), "texture3")), Texture[Game][2]);\r
393     gtk_spin_button_set_value (GTK_SPIN_BUTTON (g_object_get_data (G_OBJECT (g_pWnd), "tex_slant")),\r
394                                SlantAngle);\r
395     sprintf(Text,RForm,TexOffset[0]);\r
396     gtk_entry_set_text (GTK_ENTRY (g_object_get_data (G_OBJECT (g_pWnd), "texoffsetx")), Text);\r
397     sprintf(Text,RForm,TexOffset[1]);\r
398     gtk_entry_set_text (GTK_ENTRY (g_object_get_data (G_OBJECT (g_pWnd), "texoffsety")), Text);\r
399     sprintf(Text,RForm,TexScale[0]);\r
400     gtk_entry_set_text (GTK_ENTRY (g_object_get_data (G_OBJECT (g_pWnd), "texscalex")), Text);\r
401     sprintf(Text,RForm,TexScale[1]);\r
402     gtk_entry_set_text (GTK_ENTRY (g_object_get_data (G_OBJECT (g_pWnd), "texscaley")), Text);\r
403     CHECK_WIDGET ("detail", UseDetail);\r
404 \r
405     if (Game==QUAKE3)\r
406     {\r
407       ENABLE_WIDGET ("hint", FALSE);\r
408       AddHints=0;\r
409     }\r
410     else\r
411       ENABLE_WIDGET ("hint", TRUE);\r
412     CHECK_WIDGET ("hint", AddHints);\r
413 \r
414     /*\r
415     if (Game==SIN)\r
416     {\r
417       // ArghRad doesn't currently support SiN\r
418       EnableWindow(GetDlgItem(hwndDisplay,DLG_ARGHRAD2),       0);\r
419       EnableWindow(GetDlgItem(hwndDisplay,DLG_ARGHRAD2_SPIN),  0);\r
420       ShowWindow(GetDlgItem(hwndDisplay,DLG_ARGHRAD2_TEXT),  SW_HIDE);\r
421       ShowWindow(GetDlgItem(hwndDisplay,DLG_ARGHRAD2),       SW_HIDE);\r
422       ShowWindow(GetDlgItem(hwndDisplay,DLG_ARGHRAD2_SPIN),  SW_HIDE);\r
423       SetDlgItemText(hwndDisplay,DLG_TEX_USEPAK,"Use sin file");\r
424       SetDlgItemText(hwndDisplay,DLG_TEX_PAK_TEXT,"Sin:");\r
425     }\r
426     */\r
427 \r
428     if(Game==QUAKE3)\r
429     {\r
430       /*\r
431       // ArghRad sun is inapplicable (so far)\r
432       EnableWindow(GetDlgItem(hwndDisplay,DLG_ARGHRAD2),       0);\r
433       EnableWindow(GetDlgItem(hwndDisplay,DLG_ARGHRAD2_SPIN),  0);\r
434       ShowWindow(GetDlgItem(hwndDisplay,DLG_ARGHRAD2_TEXT),  SW_HIDE);\r
435       ShowWindow(GetDlgItem(hwndDisplay,DLG_ARGHRAD2),       SW_HIDE);\r
436       ShowWindow(GetDlgItem(hwndDisplay,DLG_ARGHRAD2_SPIN),  SW_HIDE);\r
437       // No ladders in Q3\r
438       EnableWindow(GetDlgItem(hwndDisplay,DLG_LADDER),         0);\r
439       ShowWindow(GetDlgItem(hwndDisplay,DLG_LADDER),         SW_HIDE);\r
440       SetDlgItemText(hwndDisplay,DLG_TEX_USEPAK,"Use pk3 file");\r
441       SetDlgItemText(hwndDisplay,DLG_TEX_PAK_TEXT,"PK3:");\r
442       */\r
443     }\r
444 \r
445 /*trix  if(Game==HERETIC2)\r
446                 {\r
447                         // ArghRad doesn't currently support Heretic2\r
448                         EnableWindow(GetDlgItem(hwndDisplay,DLG_ARGHRAD2),       0);\r
449                         EnableWindow(GetDlgItem(hwndDisplay,DLG_ARGHRAD2_SPIN),  0);\r
450                         ShowWindow(GetDlgItem(hwndDisplay,DLG_ARGHRAD2_TEXT),  SW_HIDE);\r
451                         ShowWindow(GetDlgItem(hwndDisplay,DLG_ARGHRAD2),       SW_HIDE);\r
452                         ShowWindow(GetDlgItem(hwndDisplay,DLG_ARGHRAD2_SPIN),  SW_HIDE);\r
453 \r
454                         SetDlgItemText(hwndDisplay,DLG_TEX_USEPAK,"Use pak file");\r
455                         SetDlgItemText(hwndDisplay,DLG_TEX_PAK_TEXT,"Pak:");\r
456                 } */\r
457     /*\r
458                 if(Game==HALFLIFE)\r
459                 {\r
460                         // A bunch of controls aren't applicable to HL\r
461                         EnableWindow(GetDlgItem(hwndDisplay,DLG_TEXTURE_BROWSE), 0);\r
462                         EnableWindow(GetDlgItem(hwndDisplay,DLG_TEXTURE2_BROWSE),0);\r
463                         EnableWindow(GetDlgItem(hwndDisplay,DLG_TEXTURE3_BROWSE),0);\r
464                         EnableWindow(GetDlgItem(hwndDisplay,DLG_DETAIL),         0);\r
465                         EnableWindow(GetDlgItem(hwndDisplay,DLG_LADDER),         0);\r
466                         EnableWindow(GetDlgItem(hwndDisplay,DLG_ARGHRAD2),       0);\r
467                         EnableWindow(GetDlgItem(hwndDisplay,DLG_ARGHRAD2_SPIN),  0);\r
468                         ShowWindow(GetDlgItem(hwndDisplay,DLG_TEXTURE_BROWSE), SW_HIDE);\r
469                         ShowWindow(GetDlgItem(hwndDisplay,DLG_TEXTURE2_BROWSE),SW_HIDE);\r
470                         ShowWindow(GetDlgItem(hwndDisplay,DLG_TEXTURE3_BROWSE),SW_HIDE);\r
471                         ShowWindow(GetDlgItem(hwndDisplay,DLG_DETAIL),         SW_HIDE);\r
472                         ShowWindow(GetDlgItem(hwndDisplay,DLG_LADDER),         SW_HIDE);\r
473                         ShowWindow(GetDlgItem(hwndDisplay,DLG_ARGHRAD2_TEXT),  SW_HIDE);\r
474                         ShowWindow(GetDlgItem(hwndDisplay,DLG_ARGHRAD2),       SW_HIDE);\r
475                         ShowWindow(GetDlgItem(hwndDisplay,DLG_ARGHRAD2_SPIN),  SW_HIDE);\r
476 \r
477                         SetDlgItemText(hwndDisplay,DLG_TEX_USEPAK,"Use wad file");\r
478                         SetDlgItemText(hwndDisplay,DLG_TEX_PAK_TEXT,"Wad:");\r
479                         SetDlgItemText(hwndDisplay,DLG_HINT,"Hint brushes");\r
480                 }\r
481 \r
482                 if(Game==GENESIS3D)\r
483                 {\r
484                         // No Q2-type compilers support Genesis3D (including ArghRad)\r
485                         EnableWindow(GetDlgItem(hwndDisplay,DLG_ARGHRAD2),       0);\r
486                         EnableWindow(GetDlgItem(hwndDisplay,DLG_ARGHRAD2_SPIN),  0);\r
487                         ShowWindow(GetDlgItem(hwndDisplay,DLG_ARGHRAD2_TEXT),  SW_HIDE);\r
488                         ShowWindow(GetDlgItem(hwndDisplay,DLG_ARGHRAD2),       SW_HIDE);\r
489                         ShowWindow(GetDlgItem(hwndDisplay,DLG_ARGHRAD2_SPIN),  SW_HIDE);\r
490 \r
491                         SetDlgItemText(hwndDisplay,DLG_TEX_USEPAK,"Use sin file");\r
492                         SetDlgItemText(hwndDisplay,DLG_TEX_PAK_TEXT,"Sin:");\r
493                 }\r
494     */\r
495     break;\r
496   }\r
497   SetupControls ();\r
498 }\r
499 \r
500 static void ReadDlgValues (int tab)\r
501 {\r
502   //  char Text[256];\r
503   //  int i;\r
504 \r
505   switch (tab)\r
506   {\r
507   case GENERAL_TAB:\r
508     gpointer spin;\r
509     Roughness  = atof ( gtk_entry_get_text (GTK_ENTRY (g_object_get_data (G_OBJECT (g_pWnd), "roughness"))));\r
510     WaveLength = atof ( gtk_entry_get_text (GTK_ENTRY (g_object_get_data (G_OBJECT (g_pWnd), "wavelength"))));\r
511     Amplitude  = atof ( gtk_entry_get_text (GTK_ENTRY (g_object_get_data (G_OBJECT (g_pWnd), "amplitude"))));\r
512     spin = g_object_get_data (G_OBJECT (g_pWnd), "random");\r
513     RandomSeed = gtk_spin_button_get_value_as_int (GTK_SPIN_BUTTON (spin));\r
514     break;\r
515 \r
516   case EXTENTS_TAB:\r
517                 SP = atoi (gtk_entry_get_text (GTK_ENTRY (g_object_get_data (G_OBJECT (g_pWnd), "sp"))));\r
518     NH = atoi (gtk_entry_get_text (GTK_ENTRY (g_object_get_data (G_OBJECT (g_pWnd), "nh"))));\r
519     NV = atoi (gtk_entry_get_text (GTK_ENTRY (g_object_get_data (G_OBJECT (g_pWnd), "nv"))));\r
520 \r
521     if (Game == QUAKE3 && UsePatches != 0)\r
522     {\r
523       if (NH % 2 ) NH++;\r
524       if (NH < 2 ) NH = 2;\r
525       if (NH > MAX_ROWS) NH = MAX_ROWS;\r
526       if (NV % 2 ) NV++;\r
527       if (NV < 2 ) NV = 2;\r
528       if (NV > MAX_ROWS) NV = MAX_ROWS;\r
529     }\r
530     break;\r
531 \r
532 #if 0\r
533   case BITMAP_TAB:\r
534 \r
535     if (WaveType == WAVE_BITMAP)\r
536     {\r
537       GetDlgItemText(hwnd,DLG_BMP_FILE,gbmp.name,sizeof(gbmp.name));\r
538       CheckValidDIB(hwnd);\r
539       GetDlgItemText(hwnd,DLG_BMP_BLACK,Text,sizeof(Text));\r
540       gbmp.black_value = atof(Text);\r
541       GetDlgItemText(hwnd,DLG_BMP_WHITE,Text,sizeof(Text));\r
542       gbmp.white_value = atof(Text);\r
543       UpdatePreview(TRUE);\r
544     }\r
545     break;\r
546 \r
547   case FIXPOINTS_TAB:\r
548     GetDlgItemText(hwnd,DLG_FIX_VALUE,Text,sizeof(Text));\r
549     temp.fixed_value = atoi(Text);\r
550     GetDlgItemText(hwnd,DLG_FIX_RANGE,Text,sizeof(Text));\r
551     temp.range = atoi(Text);\r
552     GetDlgItemText(hwnd,DLG_FIX_RATE, Text,sizeof(Text));\r
553     temp.rate = atof(Text);\r
554     for(k=0; k<NumVerticesSelected; k++)\r
555     {\r
556       xyz[Vertex[k].i][Vertex[k].j].fixed_value = temp.fixed_value;\r
557       xyz[Vertex[k].i][Vertex[k].j].range       = temp.range;\r
558       xyz[Vertex[k].i][Vertex[k].j].rate        = temp.rate;\r
559     }\r
560     if(!OldPreview)\r
561     {\r
562       Preview = 0;\r
563       CheckDlgButton(ghwnd,DLG_PREVIEW,0);\r
564       SendMessage(ghwnd,WM_COMMAND,DLG_PREVIEW,0);\r
565     }\r
566     VertexMode = 0;\r
567     UpdatePreview(TRUE);\r
568     break;\r
569 \r
570   case TEXTURE_TAB:\r
571     if(UsePak[Game])\r
572     {\r
573       i = SendDlgItemMessage( hwndDisplay, DLG_TEX_LIST1, CB_GETCURSEL, 0, 0 );\r
574       if(i == CB_ERR)\r
575         Texture[Game][0][0] = '\0';\r
576       else\r
577         SendDlgItemMessage( hwndDisplay, DLG_TEX_LIST1, CB_GETLBTEXT, i,\r
578           (LPARAM)(LPCSTR)Texture[Game][0]);\r
579 \r
580       i = SendDlgItemMessage( hwndDisplay, DLG_TEX_LIST2, CB_GETCURSEL, 0, 0 );\r
581       if(i == CB_ERR)\r
582         Texture[Game][1][0] = '\0';\r
583       else\r
584         SendDlgItemMessage( hwndDisplay, DLG_TEX_LIST2, CB_GETLBTEXT, i,\r
585           (LPARAM)(LPCSTR)Texture[Game][1]);\r
586 \r
587       i = SendDlgItemMessage( hwndDisplay, DLG_TEX_LIST3, CB_GETCURSEL, 0, 0 );\r
588       if(i == CB_ERR)\r
589         Texture[Game][2][0] = '\0';\r
590       else\r
591         SendDlgItemMessage( hwndDisplay, DLG_TEX_LIST3, CB_GETLBTEXT, i,\r
592           (LPARAM)(LPCSTR)Texture[Game][2]);\r
593     }\r
594     else\r
595     {\r
596       GetDlgItemText(hwndDisplay,DLG_TEXTURE, Texture[Game][0],sizeof(Texture[Game][0]));\r
597       GetDlgItemText(hwndDisplay,DLG_TEXTURE2,Texture[Game][1],sizeof(Texture[Game][1]));\r
598       GetDlgItemText(hwndDisplay,DLG_TEXTURE3,Texture[Game][2],sizeof(Texture[Game][2]));\r
599     }\r
600     GetDlgItemText(hwndDisplay,DLG_TEX_SLANT,Text,sizeof(Text));\r
601     SlantAngle = atoi(Text);\r
602     SlantAngle = max(0,min(SlantAngle,90));\r
603     GetDlgItemText(hwndDisplay,DLG_TEXOFFSETX,Text,sizeof(Text));\r
604     TexOffset[0] = atof(Text);\r
605     GetDlgItemText(hwndDisplay,DLG_TEXOFFSETY,Text,sizeof(Text));\r
606     TexOffset[1] = atof(Text);\r
607     GetDlgItemText(hwndDisplay,DLG_TEXSCALEX,Text,sizeof(Text));\r
608     TexScale[0] = atof(Text);\r
609     if(TexScale[0] == 0.) TexScale[0] = 1.0;\r
610     GetDlgItemText(hwndDisplay,DLG_TEXSCALEY,Text,sizeof(Text));\r
611     TexScale[1] = atof(Text);\r
612     if(TexScale[1] == 0.) TexScale[1] = 1.0;\r
613     GetDlgItemText(hwndDisplay,DLG_ARGHRAD2,Text,sizeof(Text));\r
614     ArghRad2 = atoi(Text);\r
615     break;\r
616 #endif\r
617   }\r
618 }\r
619 \r
620 // =============================================================================\r
621 // main dialog callbacks\r
622 \r
623 static void switch_page (GtkNotebook *notebook, GtkNotebookPage *page, guint page_num, gpointer data)\r
624 {\r
625   if (current_tab != page_num)\r
626   {\r
627     if (page_num == FIXPOINTS_TAB)\r
628     {\r
629       OldPreview = Preview;\r
630       gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (g_object_get_data (G_OBJECT (g_pWnd),\r
631                                                                             "main_preview")), TRUE);\r
632       VertexMode = 1;\r
633       UpdatePreview (true);\r
634       NumVerticesSelected = 0;\r
635     }\r
636 \r
637     if (current_tab == FIXPOINTS_TAB)\r
638     {\r
639       if (!OldPreview)\r
640         gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (g_object_get_data (G_OBJECT (g_pWnd),\r
641                                                                               "main_preview")), FALSE);\r
642       VertexMode = 0;\r
643       UpdatePreview (true);\r
644       NumVerticesSelected = 0;\r
645     }\r
646 \r
647     if (page_num == TEXTURE_TAB)\r
648     {\r
649       WasDetail = UseDetail;\r
650       if (AddHints)\r
651       {\r
652         UseDetail = 1;\r
653         ENABLE_WIDGET ("detail", FALSE);\r
654       }\r
655     }\r
656 \r
657     ReadDlgValues (current_tab);\r
658     current_tab = page_num;\r
659     SetDlgValues (current_tab);\r
660   }\r
661 }\r
662 \r
663 static gint main_close (GtkWidget *widget, gpointer data)\r
664 {\r
665   gtk_widget_hide (g_pWnd);\r
666   gtk_widget_hide (g_pWndPreview);\r
667 \r
668   return TRUE;\r
669 }\r
670 \r
671 static void main_save (GtkWidget *widget, gpointer data)\r
672 {\r
673   ReadDlgValues (current_tab);\r
674   SaveSetup (g_pWnd);\r
675 }\r
676 \r
677 static void main_open (GtkWidget *widget, gpointer data)\r
678 {\r
679   OpenSetup (g_pWnd, 0);\r
680   for (int i = 0; i < 5; i++)\r
681     SetDlgValues (i);\r
682   ShowPreview ();\r
683 }\r
684 \r
685 static void main_defaults (GtkWidget *widget, gpointer data)\r
686 {\r
687   OpenSetup (g_pWnd, 1);\r
688   for (int i = 0; i < 5; i++)\r
689     SetDlgValues (i);\r
690   ShowPreview ();\r
691 }\r
692 \r
693 static void main_preview (GtkWidget *widget, gpointer data)\r
694 {\r
695   Preview = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (widget));\r
696   ShowPreview ();\r
697 }\r
698 \r
699 // ^Fishman - Antializing for the preview window.\r
700 static void main_antialiasing (GtkWidget *widget, gpointer data)\r
701 {\r
702         Antialiasing = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (widget));\r
703         UpdatePreview (true);\r
704 }\r
705 \r
706 static void main_about (GtkWidget *widget, gpointer data)\r
707 {\r
708   About (g_pWnd);\r
709 }\r
710 \r
711 static void main_go (GtkWidget *widget, gpointer data)\r
712 {\r
713   GtkWidget *notebook = GTK_WIDGET (g_object_get_data (G_OBJECT (g_pWnd), "notebook"));\r
714   char Text[256];\r
715 \r
716   ReadDlgValues (current_tab);\r
717   if (NH < 1 || NH > MAX_ROWS)\r
718   {\r
719     sprintf (Text, "The number of divisions must be > 0 and no greater than %d.", MAX_ROWS);\r
720     g_FuncTable.m_pfnMessageBox (g_pWnd, Text, "GenSurf", MB_ICONEXCLAMATION);\r
721     gtk_notebook_set_page (GTK_NOTEBOOK (notebook), EXTENTS_TAB);\r
722     return;\r
723   }\r
724 \r
725   if (NV < 1 || NV > MAX_ROWS)\r
726   {\r
727     sprintf (Text, "The number of divisions must be > 0 and no greater than %d.", MAX_ROWS);\r
728     g_FuncTable.m_pfnMessageBox (g_pWnd, Text, "GenSurf", MB_ICONEXCLAMATION);\r
729     gtk_notebook_set_page (GTK_NOTEBOOK (notebook), EXTENTS_TAB);\r
730     return;\r
731   }\r
732 \r
733   if (Hll >= Hur)\r
734   {\r
735     g_FuncTable.m_pfnMessageBox (g_pWnd, "The \"lower-left\" values must be less than "\r
736                                  "the corresponding \"upper-right\" values in "\r
737                                  "the \"Extent\" box.","GenSurf", MB_OK | MB_ICONEXCLAMATION);\r
738     gtk_notebook_set_page (GTK_NOTEBOOK (notebook), EXTENTS_TAB);\r
739     return;\r
740   }\r
741 \r
742   if (Vll >= Vur)\r
743   {\r
744     g_FuncTable.m_pfnMessageBox (g_pWnd,"The \"lower-left\" values must be less than "\r
745                                  "the corresponding \"upper-right\" values in "\r
746                                  "the \"Extent\" box.","GenSurf", MB_OK | MB_ICONEXCLAMATION);\r
747     gtk_notebook_set_page (GTK_NOTEBOOK (notebook), EXTENTS_TAB);\r
748     return;\r
749   }\r
750 \r
751   if (!strlen (Texture[Game][0]))\r
752   {\r
753     g_FuncTable.m_pfnMessageBox (g_pWnd, "You must supply a texture name.", "GenSurf", MB_ICONEXCLAMATION);\r
754     gtk_notebook_set_page (GTK_NOTEBOOK (notebook), EXTENTS_TAB);\r
755     return;\r
756   }\r
757 \r
758 /*  if (Decimate>0 && GimpHints!=0)\r
759   {\r
760     MessageBox(hwnd,"You've elected to use a decimated grid and gimp's non-detail hint brushes. "\r
761                "This combination usually produces bizarre visual errors in the game, "\r
762                "so GenSurf has turned off the hint brush option.",\r
763                "GenSurf",MB_ICONEXCLAMATION);\r
764     GimpHints = 0;\r
765   } */\r
766 \r
767   gtk_widget_hide (g_pWnd);\r
768   if (g_pWndPreview)\r
769     gtk_widget_hide (g_pWndPreview);\r
770 \r
771   GenerateMap();\r
772   WriteIniFile(gszIni);\r
773 }\r
774 \r
775 // =============================================================================\r
776 // general tab callbacks\r
777 \r
778 static void general_game (GtkToggleButton *widget, gpointer data)\r
779 {\r
780   if (gtk_toggle_button_get_active (widget))\r
781   {\r
782     Game = GPOINTER_TO_INT (data);\r
783     UpdatePreview (TRUE);\r
784   }\r
785 }\r
786 \r
787 static void general_plane (GtkToggleButton *widget, gpointer data)\r
788 {\r
789   if (gtk_toggle_button_get_active (widget))\r
790   {\r
791     Plane = GPOINTER_TO_INT (data);\r
792     SetupControls ();\r
793     UpdatePreview (TRUE);\r
794   }\r
795 }\r
796 \r
797 static void general_wave (GtkToggleButton *widget, gpointer data)\r
798 {\r
799   if (gtk_toggle_button_get_active (widget))\r
800   {\r
801     WaveType = GPOINTER_TO_INT (data);\r
802     SetupControls ();\r
803     UpdatePreview (TRUE);\r
804   }\r
805 }\r
806 \r
807 static void general_random (GtkAdjustment *adj, gpointer data)\r
808 {\r
809   int nPos = (int)adj->value;\r
810 \r
811   if (RandomSeed != nPos)\r
812   {\r
813     RandomSeed = nPos;\r
814     UpdatePreview (true);\r
815   }\r
816 }\r
817 \r
818 // =============================================================================\r
819 // extents tab callbacks\r
820 \r
821 static void extents_linearborder (GtkToggleButton *check, gpointer data)\r
822 {\r
823   FixBorders = gtk_toggle_button_get_active (check);\r
824   UpdatePreview (true);\r
825 }\r
826 \r
827 static void extents_use_patches (GtkToggleButton *check, gpointer data)\r
828 {\r
829   if (Game != QUAKE3)\r
830     return;\r
831 \r
832   UsePatches = gtk_toggle_button_get_active (check);\r
833   SetDlgValues (current_tab);\r
834   SetupControls ();\r
835   UpdatePreview (true);\r
836 }\r
837 \r
838 static void extents_nhnv_spin (GtkAdjustment *adj, int *data)\r
839 {\r
840   int nPos = (int)adj->value;\r
841 \r
842   if (*data != nPos)\r
843   {\r
844     if (Game==QUAKE3 && UsePatches && (nPos % 2))\r
845     {\r
846       if (*data < nPos)\r
847         *data += 2;\r
848       else\r
849         *data -= 2;\r
850       gtk_adjustment_set_value (adj, *data);\r
851     }\r
852     else\r
853       *data = nPos;\r
854     UpdatePreview (true);\r
855   }\r
856 }\r
857 \r
858 static void extents_decimate (GtkAdjustment *adj, gpointer data)\r
859 {\r
860   int nPos = (int)adj->value;\r
861 \r
862   Decimate = nPos;\r
863   UpdatePreview (true);\r
864 }\r
865 \r
866 // Hydra : snap to grid begin\r
867 /*static void extents_snaptogrid (GtkAdjustment *adj, gpointer data)\r
868 {\r
869   int nPos = (int)adj->value;\r
870 \r
871   SnapToGrid = nPos;\r
872   UpdatePreview (true);\r
873 }*/\r
874 \r
875 // ^Fishman - Modified version of Hydra's snap to grid code.\r
876 static void extents_snaptogrid_spin (GtkAdjustment *adj, int *data)\r
877 {\r
878         int nPos = (int)adj->value;\r
879         SnapToGrid = nPos;\r
880         UpdatePreview (true);\r
881 }\r
882 \r
883 // =============================================================================\r
884 // bitmap tab callbacks\r
885 \r
886 static gint bitmap_file_entryfocusout(GtkWidget* widget, GdkEventFocus* event, gpointer data)\r
887 {\r
888   char filename[NAME_MAX];\r
889 \r
890   strcpy (filename, gtk_entry_get_text (GTK_ENTRY(widget)));\r
891   if(strcmp (filename,gbmp.name))\r
892   {\r
893     if (gbmp.colors)\r
894     {\r
895       free(gbmp.colors);\r
896       gbmp.colors=NULL;\r
897     }\r
898     strcpy (gbmp.name,filename);\r
899     if (strlen(gbmp.name) )\r
900       OpenBitmap ();\r
901     ENABLE_WIDGET ("go", (gbmp.colors != NULL ? TRUE : FALSE));\r
902   }\r
903   return FALSE;\r
904 }\r
905 \r
906 static void bitmap_browse (GtkWidget *widget, gpointer data)\r
907 {\r
908   const char *filename;\r
909   char *ptr;\r
910 \r
911   filename = g_FuncTable.m_pfnFileDialog (g_pWnd, TRUE, "Bitmap File", gbmp.defpath);\r
912 \r
913   if (filename != NULL)\r
914   {\r
915     strcpy (gbmp.name, filename);\r
916 \r
917     ptr = strrchr (filename, G_DIR_SEPARATOR);\r
918     if (ptr != NULL)\r
919     {\r
920       *(ptr+1) = '\0';\r
921       strcpy (gbmp.defpath, filename);\r
922     }\r
923 \r
924     OpenBitmap ();\r
925     ENABLE_WIDGET ("go", (gbmp.colors != NULL ? TRUE : FALSE));\r
926   }\r
927 }\r
928 \r
929 static void bitmap_reload (GtkWidget *widget, gpointer data)\r
930 {\r
931   strcpy (gbmp.name, gtk_entry_get_text (GTK_ENTRY (g_object_get_data (G_OBJECT (g_pWnd), "bmp_file"))));\r
932   if(strlen (gbmp.name) )\r
933   {\r
934     OpenBitmap ();\r
935     ENABLE_WIDGET ("go", (gbmp.colors != NULL ? TRUE : FALSE));\r
936   }\r
937   else\r
938     ENABLE_WIDGET ("go", FALSE );\r
939 }\r
940 \r
941 // =============================================================================\r
942 // fix points tab callbacks\r
943 \r
944 static gint fix_value_entryfocusout (GtkWidget* widget, GdkEventFocus *event, gpointer data)\r
945 {\r
946   int i = atoi (gtk_entry_get_text (GTK_ENTRY(widget))), k;\r
947   char Text[32];\r
948 \r
949   if (i < -65536 || i > 65536)\r
950   {\r
951     gdk_beep ();\r
952     g_FuncTable.m_pfnMessageBox (g_pWnd, "The value must be between -65536 and 65536, inclusive.",\r
953                                  "GenSurf", MB_OK | MB_ICONEXCLAMATION);\r
954     sprintf (Text, "%d", (int)xyz[Vertex[0].i][Vertex[0].j].fixed_value);\r
955     gtk_entry_set_text (GTK_ENTRY(widget), Text);\r
956     gtk_window_set_focus (GTK_WINDOW (gtk_widget_get_toplevel (widget)), widget);\r
957   }\r
958   else if (i != xyz[Vertex[0].i][Vertex[0].j].fixed_value)\r
959   {\r
960     for(k=0; k<NumVerticesSelected; k++)\r
961       xyz[Vertex[k].i][Vertex[k].j].fixed_value = i;\r
962 \r
963     gtk_spin_button_set_value (GTK_SPIN_BUTTON (g_object_get_data (G_OBJECT (g_pWnd), "fix_value")),\r
964                                (int)xyz[Vertex[0].i][Vertex[0].j].fixed_value);\r
965     UpdatePreview (true);\r
966   }\r
967   return FALSE;\r
968 }\r
969 \r
970 static void fix_value_changed (GtkAdjustment *adj, gpointer data)\r
971 {\r
972   int k, i = (int)adj->value;\r
973 \r
974   if (xyz[Vertex[0].i][Vertex[0].j].fixed_value != i)\r
975   {\r
976     for(k=0; k<NumVerticesSelected; k++)\r
977       xyz[Vertex[k].i][Vertex[k].j].fixed_value = i;\r
978     UpdatePreview(true);\r
979   }\r
980 }\r
981 \r
982 static gint fix_range_entryfocusout (GtkWidget *widget, GdkEventFocus *event, gpointer data)\r
983 {\r
984   int i = atoi (gtk_entry_get_text (GTK_ENTRY(widget))), k;\r
985 \r
986   if (i != xyz[Vertex[0].i][Vertex[0].j].range)\r
987   {\r
988     for (k=0; k<NumVerticesSelected; k++)\r
989       xyz[Vertex[k].i][Vertex[k].j].range = i;\r
990     UpdatePreview (true);\r
991   }\r
992   return FALSE;\r
993 }\r
994 \r
995 static gint fix_rate_entryfocusout (GtkWidget *widget, GdkEventFocus *event, gpointer data)\r
996 {\r
997   double r = atof (gtk_entry_get_text (GTK_ENTRY(widget)));\r
998   int k;\r
999 \r
1000   if (r != xyz[Vertex[0].i][Vertex[0].j].rate)\r
1001   {\r
1002     for(k=0; k<NumVerticesSelected; k++)\r
1003       xyz[Vertex[k].i][Vertex[k].j].rate = r;\r
1004     UpdatePreview (true);\r
1005   }\r
1006   return FALSE;\r
1007 }\r
1008 \r
1009 static void fix_free (GtkWidget *widget, gpointer data)\r
1010 {\r
1011   int k;\r
1012 \r
1013   for (k=0; k<NumVerticesSelected; k++)\r
1014     xyz[Vertex[k].i][Vertex[k].j].fixed = 0;\r
1015   NumVerticesSelected = 0;\r
1016   SetupControls ();\r
1017   UpdatePreview (true);\r
1018 }\r
1019 \r
1020 static void fix_freeall (GtkWidget *widget, gpointer data)\r
1021 {\r
1022   int i, j;\r
1023 \r
1024   for (i=0; i<=NH; i++)\r
1025   {\r
1026     for(j=0; j<=NV; j++)\r
1027       xyz[i][j].fixed = 0;\r
1028   }\r
1029   fix_free (NULL, data); // keep these together\r
1030 }\r
1031 \r
1032 void vertex_selected ()\r
1033 {\r
1034   char Text[32];\r
1035   int k;\r
1036 \r
1037   SetupControls ();\r
1038 \r
1039   switch(Plane)\r
1040   {\r
1041   case PLANE_XZ0:\r
1042   case PLANE_XZ1:\r
1043     for(k=0; k<NumVerticesSelected; k++)\r
1044       xyz[Vertex[k].i][Vertex[k].j].fixed_value = xyz[Vertex[0].i][Vertex[0].j].p[1];\r
1045     break;\r
1046   case PLANE_YZ0:\r
1047   case PLANE_YZ1:\r
1048     for(k=0; k<NumVerticesSelected; k++)\r
1049       xyz[Vertex[k].i][Vertex[k].j].fixed_value = xyz[Vertex[0].i][Vertex[0].j].p[0];\r
1050     break;\r
1051   default:\r
1052     for(k=0; k<NumVerticesSelected; k++)\r
1053       xyz[Vertex[k].i][Vertex[k].j].fixed_value = xyz[Vertex[0].i][Vertex[0].j].p[2];\r
1054     break;\r
1055   }\r
1056 \r
1057   gtk_spin_button_set_value (GTK_SPIN_BUTTON (g_object_get_data (G_OBJECT (g_pWnd), "fix_value")),\r
1058                              (int)xyz[Vertex[0].i][Vertex[0].j].fixed_value);\r
1059 \r
1060   sprintf(Text,"%d",(int)xyz[Vertex[0].i][Vertex[0].j].range);\r
1061   gtk_entry_set_text (GTK_ENTRY (g_object_get_data (G_OBJECT (g_pWnd), "fix_range")), Text);\r
1062   sprintf(Text,"%.5g",xyz[Vertex[0].i][Vertex[0].j].rate);\r
1063   gtk_entry_set_text (GTK_ENTRY (g_object_get_data (G_OBJECT (g_pWnd), "fix_rate")), Text);\r
1064 \r
1065   for (k=0; k<NumVerticesSelected; k++)\r
1066     xyz[Vertex[k].i][Vertex[k].j].fixed = 1;\r
1067 \r
1068   UpdatePreview (true);\r
1069 }\r
1070 \r
1071 // =============================================================================\r
1072 // texture tab callbacks\r
1073 \r
1074 static void texture_detail (GtkToggleButton *check, gpointer data)\r
1075 {\r
1076   UseDetail = gtk_toggle_button_get_active (check);\r
1077   WasDetail = UseDetail;\r
1078 }\r
1079 \r
1080 static void texture_hint (GtkToggleButton *check, gpointer data)\r
1081 {\r
1082   AddHints = gtk_toggle_button_get_active (check);\r
1083   if (AddHints == 1)\r
1084   {\r
1085     UseDetail = 1;\r
1086     ENABLE_WIDGET ("detail", FALSE);\r
1087   }\r
1088   else\r
1089   {\r
1090     UseDetail = WasDetail;\r
1091     ENABLE_WIDGET ("detail", FALSE);\r
1092   }\r
1093   CHECK_WIDGET ("detail", UseDetail);\r
1094 }\r
1095 \r
1096 // ^Fishman - Add terrain key to func_group.\r
1097 static void texture_terrainent (GtkToggleButton *check, gpointer data)\r
1098 {\r
1099         AddTerrainKey = gtk_toggle_button_get_active (check);\r
1100 }\r
1101 \r
1102 static void texture_set(int index, const char* name)\r
1103 {\r
1104   strcpy(Texture[Game][index], name);\r
1105 }\r
1106 \r
1107 static gint texture_entryfocusout(GtkWidget* widget, GdkEventFocus* event, gpointer data)\r
1108 {\r
1109   texture_set(GPOINTER_TO_INT(data), gtk_entry_get_text(GTK_ENTRY(widget)));\r
1110   return FALSE;\r
1111 }\r
1112 \r
1113 // =============================================================================\r
1114 // misc stuff\r
1115 \r
1116 static void UpdateVariable (GtkEntry *entry, GdkEventFocus *event, double *data)\r
1117 {\r
1118   double x = atof (gtk_entry_get_text (entry));\r
1119 \r
1120   if (x != *data)\r
1121   {\r
1122     *data = x;\r
1123     UpdatePreview (true);\r
1124   }\r
1125 }\r
1126 \r
1127 static gint doublevariable_entryfocusout(GtkWidget* widget, GdkEventFocus* event, gpointer data)\r
1128 {\r
1129   UpdateVariable(GTK_ENTRY(widget), event, reinterpret_cast<double*>(data));\r
1130   return FALSE;\r
1131 }\r
1132 \r
1133 // =============================================================================\r
1134 // create tooltips\r
1135 \r
1136 void create_tooltips ()\r
1137 {\r
1138   tooltips = gtk_tooltips_new ();\r
1139 \r
1140   // Main\r
1141   gtk_tooltips_set_tip(GTK_TOOLTIPS (tooltips),\r
1142         GTK_WIDGET (g_object_get_data (G_OBJECT (g_pWnd), "go")),\r
1143         "Accept all input and generate a surface in Q3Radiant",\r
1144         "");\r
1145   gtk_tooltips_set_tip(GTK_TOOLTIPS (tooltips),\r
1146         GTK_WIDGET (g_object_get_data (G_OBJECT (g_pWnd), "open")),\r
1147         "Open a previously saved GenSurf settings file.",\r
1148         "");\r
1149   gtk_tooltips_set_tip(GTK_TOOLTIPS (tooltips),\r
1150         GTK_WIDGET (g_object_get_data (G_OBJECT (g_pWnd), "save")),\r
1151         "Save all settings to a file.",\r
1152         "");\r
1153   gtk_tooltips_set_tip(GTK_TOOLTIPS (tooltips),\r
1154         GTK_WIDGET (g_object_get_data (G_OBJECT (g_pWnd), "defaults")),\r
1155         "Restore default values from DEFAULTS.SRF. If this file does not exist, GenSurf "\r
1156         "initializes all input parameters to reasonable values. You can create your own "\r
1157         "default surface by setting all parameters to your liking, then saving a settings "\r
1158         "file as DEFAULTS.SRF with the Save As button.",\r
1159         "");\r
1160 \r
1161   gtk_tooltips_set_tip(GTK_TOOLTIPS (tooltips),\r
1162         GTK_WIDGET (g_object_get_data (G_OBJECT (g_pWnd), "main_preview")),\r
1163         "View a wire-frame representation of the surface",\r
1164         "");\r
1165 \r
1166         gtk_tooltips_set_tip(GTK_TOOLTIPS (tooltips),\r
1167         GTK_WIDGET (g_object_get_data (G_OBJECT (g_pWnd), "main_antialiasing")),\r
1168         "The lines in the preview window are antialiased for better quality",\r
1169         ""); \r
1170 \r
1171   // General tab\r
1172   gtk_tooltips_set_tip(GTK_TOOLTIPS (tooltips),\r
1173         GTK_WIDGET (wave_radios[0]),\r
1174         "Builds a surface with alternating hills and valleys. Uses the general form Z=cos(X) "\r
1175         "x sin(Y)",\r
1176         "");\r
1177   gtk_tooltips_set_tip(GTK_TOOLTIPS (tooltips),\r
1178         GTK_WIDGET (wave_radios[1]),\r
1179         "Builds a surface with ridges parallel to the vertical axis.",\r
1180         "");\r
1181   gtk_tooltips_set_tip(GTK_TOOLTIPS (tooltips),\r
1182         GTK_WIDGET (wave_radios[2]),\r
1183         "Builds a surface with ridges parallel to the horizontal axis.",\r
1184         "");\r
1185   gtk_tooltips_set_tip(GTK_TOOLTIPS (tooltips),\r
1186         GTK_WIDGET (wave_radios[3]),\r
1187         "Builds a map from a bitmap image representing a contour plot. Click the \"Bitmap\" "\r
1188         "tab to select the image. GenSurf only supports 256-color (8 bit) "\r
1189         "bitmaps. GenSurf will work with any 256-color bitmap, but gray scale bitmaps are a bit "\r
1190         "more intuitive.",\r
1191         "" ); \r
1192   gtk_tooltips_set_tip(GTK_TOOLTIPS (tooltips),\r
1193         GTK_WIDGET (wave_radios[4]),\r
1194         "Builds a random surface using the Plasma Cloud technique. Variance is controlled "\r
1195         "by the Roughness input. To build a surface with completely random values not "\r
1196         "dependent on neighboring vertices, use one of the other waveforms with 0 amplitude.",\r
1197         "");\r
1198   gtk_tooltips_set_tip(GTK_TOOLTIPS (tooltips),\r
1199         GTK_WIDGET (g_object_get_data (G_OBJECT (g_pWnd), "wavelength")),\r
1200         "Enter the wavelength (distance between crests). NOTE: Wavelengths equal to the grid "\r
1201         "size or 2 times the grid size will result in 0 amplitudes. For best results, the "\r
1202         "wavelength value should be at least 4 times the grid size (extents divided by the "\r
1203         "number of divisions",\r
1204         "");\r
1205   gtk_tooltips_set_tip(GTK_TOOLTIPS (tooltips),\r
1206         GTK_WIDGET (g_object_get_data (G_OBJECT (g_pWnd), "amplitude")),\r
1207         "Enter the height of hills/ridges.",\r
1208         "");\r
1209   gtk_tooltips_set_tip(GTK_TOOLTIPS (tooltips),\r
1210         GTK_WIDGET (g_object_get_data (G_OBJECT (g_pWnd), "roughness")),\r
1211         "Enter the roughness value (noise) for the surface. For fractal surfaces, this value "\r
1212         "is used as a variance in the fractal calculations.",\r
1213         "");\r
1214   gtk_tooltips_set_tip(GTK_TOOLTIPS (tooltips),\r
1215         GTK_WIDGET (g_object_get_data (G_OBJECT (g_pWnd), "random")),\r
1216         "Seed value for the pseudo-random number generator.",\r
1217         "");\r
1218   // Extents tab\r
1219   gtk_tooltips_set_tip(GTK_TOOLTIPS (tooltips),\r
1220         GTK_WIDGET (g_object_get_data (G_OBJECT (g_pWnd), "hmin")),\r
1221         "Minimum horizontal coordinate of the surface, i.e. X for a surface parallel to "\r
1222         "the XY or XZ planes, Y for a surface parallel to the YZ plane. For best results, "\r
1223         "the extents (maximum-minimum values) in a given direction should be evenly "\r
1224         "divisible by the number of divisions in that direction.",\r
1225         "");\r
1226   gtk_tooltips_set_tip(GTK_TOOLTIPS (tooltips),\r
1227         GTK_WIDGET (g_object_get_data (G_OBJECT (g_pWnd), "hmax")),\r
1228         "Maximum horizontal coordinate of the surface, i.e. X for a surface parallel to "\r
1229         "the XY or XZ planes, Y for a surface parallel to the YZ plane. For best results, "\r
1230         "the extents (maximum-minimum values) in a given direction should be evenly "\r
1231         "divisible by the number of divisions in that direction.",\r
1232         "");\r
1233   gtk_tooltips_set_tip(GTK_TOOLTIPS (tooltips),\r
1234         GTK_WIDGET (g_object_get_data (G_OBJECT (g_pWnd), "vmin")),\r
1235         "Minimum vertical coordinate of the surface, i.e. Y for a surface parallel to "\r
1236         "the XY plane, Z for a surface parallel to the XZ or YZ planes. For best results, "\r
1237         "the extents (maximum-minimum values) in a given direction should be evenly "\r
1238         "divisible by the number of divisions in that direction.",\r
1239         "");\r
1240   gtk_tooltips_set_tip(GTK_TOOLTIPS (tooltips),\r
1241         GTK_WIDGET (g_object_get_data (G_OBJECT (g_pWnd), "vmax")),\r
1242         "Maximum vertical coordinate of the surface, i.e. Y for a surface parallel to "\r
1243         "the XY plane, Z for a surface parallel to the XZ or YZ planes. For best results, "\r
1244         "the extents (maximum-minimum values) in a given direction should be evenly "\r
1245         "divisible by the number of divisions in that direction.",\r
1246         "");\r
1247   gtk_tooltips_set_tip(GTK_TOOLTIPS (tooltips),\r
1248         GTK_WIDGET (g_object_get_data (G_OBJECT (g_pWnd), "nh")),\r
1249         "Number of divisions in the horizontal direction. For best results, the extents "\r
1250         "in a given direction should be evenly divisible by the number of divisions in "\r
1251         "that direction.",\r
1252         "");\r
1253   gtk_tooltips_set_tip(GTK_TOOLTIPS (tooltips),\r
1254         GTK_WIDGET (g_object_get_data (G_OBJECT (g_pWnd), "nv")),\r
1255         "Number of divisions in the vertical direction. For best results, the extents "\r
1256         "in a given direction should be evenly divisible by the number of divisions in "\r
1257         "that direction.",\r
1258         "");\r
1259   gtk_tooltips_set_tip(GTK_TOOLTIPS (tooltips),\r
1260         GTK_WIDGET (g_object_get_data (G_OBJECT (g_pWnd), "use_patches")),\r
1261         "Produce one or more curved patches in the shape of your selected surface rather "\r
1262         "than producing solid brushes. Depending on the size of your surface (and the "\r
1263         "user's graphic detail settings, which you cannot control), curved surfaces will "\r
1264         "be represented in the game by a very large number of polygons. Read the warnings "\r
1265         "concerning curved surfaces on the GenSurf web page before using this feature.",\r
1266         "");\r
1267   gtk_tooltips_set_tip(GTK_TOOLTIPS (tooltips),\r
1268         GTK_WIDGET (g_object_get_data (G_OBJECT (g_pWnd), "decimate")),\r
1269         "Use the slider to control the number of vertices discarded by GenSurf. For many "\r
1270         "surfaces, you can produce roughly the same shape surface with a high decimation "\r
1271         "value. This will generally result in a map with lower polygon counts (and better "\r
1272         "in-game performance). However, this feature should NOT be used for large terrain "\r
1273         "surfaces in Q3",\r
1274         "");\r
1275   gtk_tooltips_set_tip(GTK_TOOLTIPS (tooltips),\r
1276         GTK_WIDGET (g_object_get_data (G_OBJECT (g_pWnd), "z00")),\r
1277         "Enter the height of the surface at the lower left corner. This value will likely "\r
1278         "be modified unless \"Linear Borders\" is checked.",\r
1279         "");\r
1280   gtk_tooltips_set_tip(GTK_TOOLTIPS (tooltips),\r
1281         GTK_WIDGET (g_object_get_data (G_OBJECT (g_pWnd), "z01")),\r
1282         "Enter the height of the surface at the upper left corner. This value will likely "\r
1283         "be modified unless \"Linear Borders\" is checked.",\r
1284         "");\r
1285   gtk_tooltips_set_tip(GTK_TOOLTIPS (tooltips),\r
1286         GTK_WIDGET (g_object_get_data (G_OBJECT (g_pWnd), "z10")),\r
1287         "Enter the height of the surface at the lower right corner. This value will likely "\r
1288         "be modified unless \"Linear Borders\" is checked.",\r
1289         "");\r
1290   gtk_tooltips_set_tip(GTK_TOOLTIPS (tooltips),\r
1291         GTK_WIDGET (g_object_get_data (G_OBJECT (g_pWnd), "z11")),\r
1292         "Enter the height of the surface at the upper right corner. This value will likely "\r
1293         "be modified unless \"Linear Borders\" is checked.",\r
1294         "");\r
1295   gtk_tooltips_set_tip(GTK_TOOLTIPS (tooltips),\r
1296         GTK_WIDGET (g_object_get_data (G_OBJECT (g_pWnd), "linearborder")),\r
1297         "Restrict the edges of the surface to a straight line. This will help match up "\r
1298         "brush edges if you drop this surface into another map.",\r
1299         "");\r
1300   // Bitmap tab\r
1301   gtk_tooltips_set_tip(GTK_TOOLTIPS (tooltips),\r
1302         GTK_WIDGET (g_object_get_data (G_OBJECT (g_pWnd), "bmp_file")),\r
1303         "Type the name of an 8-bit bitmap image file, or click Browse to select an image "\r
1304         "from a list of those available on your system.",\r
1305         "");\r
1306   gtk_tooltips_set_tip(GTK_TOOLTIPS (tooltips),\r
1307         GTK_WIDGET (g_object_get_data (G_OBJECT (g_pWnd), "bmp_file_browse")),\r
1308         "Select a bitmap image file from a list of those available on your system.",\r
1309         "");\r
1310   gtk_tooltips_set_tip(GTK_TOOLTIPS (tooltips),\r
1311         GTK_WIDGET (g_object_get_data (G_OBJECT (g_pWnd), "bmp_reload")),\r
1312         "Reload the selected bitmap file after making changes in an external image editor.",\r
1313         "");\r
1314   gtk_tooltips_set_tip(GTK_TOOLTIPS (tooltips),\r
1315         GTK_WIDGET (g_object_get_data (G_OBJECT (g_pWnd), "bmp_black")),\r
1316         "Enter the value corresponding to color index 0 in the bitmap file. For gray scale "\r
1317         "images, color 0 is normally black.",\r
1318         "");\r
1319   gtk_tooltips_set_tip(GTK_TOOLTIPS (tooltips),\r
1320         GTK_WIDGET (g_object_get_data (G_OBJECT (g_pWnd), "bmp_white")),\r
1321         "Enter the value corresponding to color index 255 in the bitmap file. For gray scale "\r
1322         "images, color 255 is normally white.",\r
1323         "");\r
1324   // Fixpoints tab\r
1325   gtk_tooltips_set_tip(GTK_TOOLTIPS (tooltips),\r
1326         GTK_WIDGET (g_object_get_data (G_OBJECT (g_pWnd), "fix_value")),\r
1327         "Enter a value for the selected vertex. This value will not be adjusted when applying "\r
1328         "a waveform or roughness to the surface. Unlock this vertex (so that it will be "\r
1329         "adjusted normally) by clicking \"Free\". This vertex will influence vertices within "\r
1330         "the \"Range affected\" of this vertex.",\r
1331         "");\r
1332   gtk_tooltips_set_tip(GTK_TOOLTIPS (tooltips),\r
1333         GTK_WIDGET (g_object_get_data (G_OBJECT (g_pWnd), "fix_range")),\r
1334         "Enter the range away from the selected vertex that other vertices will be affected. "\r
1335         "Use 0 if you don't want other vertices to be influenced by the currently selected "\r
1336         "one. Note: this box is disabled if you've chosen the fractal generator, as it uses "\r
1337         "a completely different method for determining values.",\r
1338         "");\r
1339   gtk_tooltips_set_tip(GTK_TOOLTIPS (tooltips),\r
1340         GTK_WIDGET (g_object_get_data (G_OBJECT (g_pWnd), "fix_rate")),\r
1341         "Enter a rate of change for the surface affected by the fixed value. 0 gives a smooth "\r
1342         "sinusoidal curve, values less than 0 give progressively sharper spikes, and values "\r
1343         "greater than 0 take on a square shape. Values less than -30 or greater than 30 are "\r
1344         "set to -30 and 30, respectively. Note that this entry will have no effect unless "\r
1345         "you also specify a \"range affected\".",\r
1346         "");\r
1347   gtk_tooltips_set_tip(GTK_TOOLTIPS (tooltips),\r
1348         GTK_WIDGET (g_object_get_data (G_OBJECT (g_pWnd), "fix_free")),\r
1349         "Click this to free (unlock the value of) the currently selected vertex.",\r
1350         "");\r
1351   gtk_tooltips_set_tip(GTK_TOOLTIPS (tooltips),\r
1352         GTK_WIDGET (g_object_get_data (G_OBJECT (g_pWnd), "fix_freeall")),\r
1353         "Click this to free (unlock the values of) all vertices.",\r
1354         "");\r
1355   // Texture tab\r
1356   gtk_tooltips_set_tip(GTK_TOOLTIPS (tooltips),\r
1357         GTK_WIDGET (g_object_get_data (G_OBJECT (g_pWnd), "texture1")),\r
1358         "Enter the name of the texture or shader used for the surface faces.",\r
1359         "");\r
1360   gtk_tooltips_set_tip(GTK_TOOLTIPS (tooltips),\r
1361         GTK_WIDGET (g_object_get_data (G_OBJECT (g_pWnd), "texture2")),\r
1362         "Enter the name of the texture or shader used for faces other than the surface. Under "\r
1363         "normal circumstances this should be \"common/caulk\"",\r
1364         "");\r
1365   gtk_tooltips_set_tip(GTK_TOOLTIPS (tooltips),\r
1366         GTK_WIDGET (g_object_get_data (G_OBJECT (g_pWnd), "texture3")),\r
1367         "Enter the name of the texture or shader used for \"steep\" surface faces, where \"steep\" "\r
1368         "is the angle specified below. If this entry is left blank or if the \"steep\" angle is 0, "\r
1369         "all surface faces will use the texture specified by \"Surface\".",\r
1370         "");\r
1371 \r
1372   gtk_tooltips_set_tip(GTK_TOOLTIPS (tooltips),\r
1373         GTK_WIDGET (g_object_get_data (G_OBJECT (g_pWnd), "detail")),\r
1374         "Check this box to use the detail content property on the generated brushes. Compile "\r
1375         "times will be considerably shorter if the detail property is used, though the surface "\r
1376         "will not block visibility at all. If you use the detail property, you should make sure "\r
1377         "that \"common/caulk\" is used for the non-surface faces, or the polygon count will be "\r
1378         "much higher than necessary.",\r
1379         "");\r
1380 }\r
1381 \r
1382 // =============================================================================\r
1383 // create main dialog\r
1384 \r
1385 GtkWidget* create_main_dialog ()\r
1386 {\r
1387   GtkWidget *dlg, *vbox, *hbox, *hbox2, *button, *notebook, *frame, *table, *table2;\r
1388   GtkWidget *check, *spin, *radio, *label, *entry, *scale;\r
1389   GtkObject *adj;\r
1390   GSList *group;\r
1391   int i;\r
1392   char *games[] = { "Quake 2", "Half-Life", "SiN", "Heretic 2", "Kingpin", "Genesis3D", "Quake 3 Arena" };\r
1393   char *waveforms[] = { "Alternating hill/valley", "Cylindrical left-to-right", "Cylindrical top-to-bottom",\r
1394                         "From bitmap", "Fractal" };\r
1395   char *orientations[] = { "Ground surface", "Ceiling", "Wall facing 0", "Wall facing 90",\r
1396                            "Wall facing 180","Wall facing 270" }; \r
1397 \r
1398   g_pWnd = dlg = gtk_window_new (GTK_WINDOW_TOPLEVEL);\r
1399   gtk_window_set_title (GTK_WINDOW (dlg), gszCaption);\r
1400   g_signal_connect (G_OBJECT (dlg), "delete_event", G_CALLBACK (main_close), NULL);\r
1401   //  g_signal_connect (G_OBJECT (dlg), "destroy", G_CALLBACK (gtk_widget_destroy), NULL);\r
1402   gtk_window_set_transient_for (GTK_WINDOW (dlg), GTK_WINDOW (g_pRadiantWnd));\r
1403 \r
1404   hbox = gtk_hbox_new (FALSE, 5);\r
1405   gtk_widget_show (hbox);\r
1406   gtk_container_add (GTK_CONTAINER (dlg), hbox);\r
1407   gtk_container_set_border_width (GTK_CONTAINER (hbox), 5);\r
1408 \r
1409   notebook = gtk_notebook_new ();\r
1410   gtk_widget_show (notebook);\r
1411   gtk_box_pack_start (GTK_BOX (hbox), notebook, TRUE, TRUE, 0);\r
1412   g_signal_connect (G_OBJECT (notebook), "switch_page",\r
1413                       G_CALLBACK (switch_page), NULL);\r
1414   gtk_notebook_set_tab_pos (GTK_NOTEBOOK (notebook), GTK_POS_TOP);\r
1415   g_object_set_data (G_OBJECT (dlg), "notebook", notebook);\r
1416 \r
1417   table = gtk_table_new (2, 2, FALSE);\r
1418   gtk_widget_show (table);\r
1419   gtk_container_set_border_width (GTK_CONTAINER (table), 5);\r
1420   gtk_table_set_row_spacings (GTK_TABLE (table), 5);\r
1421   gtk_table_set_col_spacings (GTK_TABLE (table), 5);\r
1422 \r
1423   label = gtk_label_new ("General");\r
1424   gtk_widget_show (label);\r
1425   gtk_notebook_append_page (GTK_NOTEBOOK (notebook), table, label);\r
1426 \r
1427   frame = gtk_frame_new ("Game");\r
1428   gtk_widget_show (frame);\r
1429   gtk_table_attach (GTK_TABLE (table), frame, 0, 1, 0, 1,\r
1430                     (GtkAttachOptions) (GTK_EXPAND|GTK_FILL),\r
1431                     (GtkAttachOptions) (GTK_EXPAND|GTK_FILL), 0, 0);\r
1432 \r
1433   vbox = gtk_vbox_new (TRUE, 5);\r
1434   gtk_widget_show (vbox);\r
1435   gtk_container_add (GTK_CONTAINER (frame), vbox);\r
1436   gtk_container_set_border_width (GTK_CONTAINER (vbox), 5);\r
1437 \r
1438   for (i = 0, group = NULL; i < NUMGAMES; i++)\r
1439   {\r
1440     radio = gtk_radio_button_new_with_label (group, games[i]);\r
1441     gtk_widget_show (radio);\r
1442     gtk_box_pack_start (GTK_BOX (vbox), radio, TRUE, TRUE, 0);\r
1443     group = gtk_radio_button_group (GTK_RADIO_BUTTON (radio));\r
1444     game_radios[i] = radio;\r
1445     g_signal_connect (G_OBJECT (radio), "toggled", G_CALLBACK (general_game), GINT_TO_POINTER (i));\r
1446   }\r
1447 \r
1448   frame = gtk_frame_new ("Waveform");\r
1449   gtk_widget_show (frame);\r
1450   gtk_table_attach (GTK_TABLE (table), frame, 1, 2, 0, 1,\r
1451                     (GtkAttachOptions) (GTK_EXPAND|GTK_FILL),\r
1452                     (GtkAttachOptions) (GTK_EXPAND|GTK_FILL), 0, 0);\r
1453 \r
1454   vbox = gtk_vbox_new (TRUE, 5);\r
1455   gtk_widget_show (vbox);\r
1456   gtk_container_add (GTK_CONTAINER (frame), vbox);\r
1457   gtk_container_set_border_width (GTK_CONTAINER (vbox), 5);\r
1458 \r
1459   for (i = 0, group = NULL; i < 5; i++)\r
1460   {\r
1461     radio = gtk_radio_button_new_with_label (group, waveforms[i]);\r
1462     gtk_widget_show (radio);\r
1463     gtk_box_pack_start (GTK_BOX (vbox), radio, TRUE, TRUE, 0);\r
1464     group = gtk_radio_button_group (GTK_RADIO_BUTTON (radio));\r
1465     wave_radios[i] = radio;\r
1466     g_signal_connect (G_OBJECT (radio), "toggled", G_CALLBACK (general_wave), GINT_TO_POINTER (i));\r
1467   }\r
1468 \r
1469   frame = gtk_frame_new ("Orientation");\r
1470   gtk_widget_show (frame);\r
1471   gtk_table_attach (GTK_TABLE (table), frame, 0, 1, 1, 2,\r
1472                     (GtkAttachOptions) (GTK_EXPAND|GTK_FILL),\r
1473                     (GtkAttachOptions) (GTK_EXPAND|GTK_FILL), 0, 0);\r
1474 \r
1475   vbox = gtk_vbox_new (TRUE, 5);\r
1476   gtk_widget_show (vbox);\r
1477   gtk_container_add (GTK_CONTAINER (frame), vbox);\r
1478   gtk_container_set_border_width (GTK_CONTAINER (vbox), 5);\r
1479 \r
1480   for (i = 0, group = NULL; i < 6; i++)\r
1481   {\r
1482     radio = gtk_radio_button_new_with_label (group, orientations[i]);\r
1483     gtk_widget_show (radio);\r
1484     gtk_box_pack_start (GTK_BOX (vbox), radio, TRUE, TRUE, 0);\r
1485     group = gtk_radio_button_group (GTK_RADIO_BUTTON (radio));\r
1486     plane_radios[i] = radio;\r
1487     g_signal_connect (G_OBJECT (radio), "toggled", G_CALLBACK (general_plane), GINT_TO_POINTER (i));\r
1488   }\r
1489 \r
1490   table2 = gtk_table_new (4, 2, FALSE);\r
1491   gtk_widget_show (table2);\r
1492   gtk_table_set_row_spacings (GTK_TABLE (table2), 5);\r
1493   gtk_table_set_col_spacings (GTK_TABLE (table2), 5);\r
1494   gtk_table_attach (GTK_TABLE (table), table2, 1, 2, 1, 2,\r
1495                     (GtkAttachOptions) (GTK_EXPAND|GTK_FILL),\r
1496                     (GtkAttachOptions) (GTK_EXPAND|GTK_FILL), 0, 0);\r
1497 \r
1498   label = gtk_label_new ("Wavelength:");\r
1499   gtk_widget_show (label);\r
1500   gtk_table_attach (GTK_TABLE (table2), label, 0, 1, 0, 1,\r
1501                     (GtkAttachOptions) (GTK_EXPAND|GTK_FILL),\r
1502                     (GtkAttachOptions) (GTK_EXPAND|GTK_FILL), 0, 0);\r
1503   gtk_misc_set_alignment (GTK_MISC (label), 1, 0.5);\r
1504   gtk_label_set_justify (GTK_LABEL (label), GTK_JUSTIFY_RIGHT);\r
1505 \r
1506   label = gtk_label_new ("Max. amplitude:");\r
1507   gtk_widget_show (label);\r
1508   gtk_table_attach (GTK_TABLE (table2), label, 0, 1, 1, 2,\r
1509                     (GtkAttachOptions) (GTK_EXPAND|GTK_FILL),\r
1510                     (GtkAttachOptions) (GTK_EXPAND|GTK_FILL), 0, 0);\r
1511   gtk_misc_set_alignment (GTK_MISC (label), 1, 0.5);\r
1512   gtk_label_set_justify (GTK_LABEL (label), GTK_JUSTIFY_RIGHT);\r
1513 \r
1514   label = gtk_label_new ("Roughness:");\r
1515   gtk_widget_show (label);\r
1516   gtk_table_attach (GTK_TABLE (table2), label, 0, 1, 2, 3,\r
1517                     (GtkAttachOptions) (GTK_EXPAND|GTK_FILL),\r
1518                     (GtkAttachOptions) (GTK_EXPAND|GTK_FILL), 0, 0);\r
1519   gtk_misc_set_alignment (GTK_MISC (label), 1, 0.5);\r
1520   gtk_label_set_justify (GTK_LABEL (label), GTK_JUSTIFY_RIGHT);\r
1521 \r
1522   label = gtk_label_new ("Random seed:");\r
1523   gtk_widget_show (label);\r
1524   gtk_table_attach (GTK_TABLE (table2), label, 0, 1, 3, 4,\r
1525                     (GtkAttachOptions) (GTK_EXPAND|GTK_FILL),\r
1526                     (GtkAttachOptions) (GTK_EXPAND|GTK_FILL), 0, 0);\r
1527   gtk_misc_set_alignment (GTK_MISC (label), 1, 0.5);\r
1528   gtk_label_set_justify (GTK_LABEL (label), GTK_JUSTIFY_RIGHT);\r
1529 \r
1530   entry = gtk_entry_new ();\r
1531   gtk_widget_show (entry);\r
1532   gtk_table_attach (GTK_TABLE (table2), entry, 1, 2, 0, 1,\r
1533                     (GtkAttachOptions) (GTK_EXPAND|GTK_FILL),\r
1534                     (GtkAttachOptions) (GTK_EXPAND|GTK_FILL), 0, 0);\r
1535   gtk_widget_set_usize (entry, 50, -2);\r
1536   g_object_set_data (G_OBJECT (dlg), "wavelength", entry);\r
1537   g_signal_connect (G_OBJECT (entry), "focus_out_event", G_CALLBACK (doublevariable_entryfocusout), &WaveLength);\r
1538 \r
1539   entry = gtk_entry_new ();\r
1540   gtk_widget_show (entry);\r
1541   gtk_table_attach (GTK_TABLE (table2), entry, 1, 2, 1, 2,\r
1542                     (GtkAttachOptions) (GTK_EXPAND|GTK_FILL),\r
1543                     (GtkAttachOptions) (GTK_EXPAND|GTK_FILL), 0, 0);\r
1544   gtk_widget_set_usize (entry, 50, -2);\r
1545   g_object_set_data (G_OBJECT (dlg), "amplitude", entry);\r
1546   g_signal_connect (G_OBJECT (entry), "focus_out_event", G_CALLBACK (doublevariable_entryfocusout), &Amplitude);\r
1547 \r
1548   entry = gtk_entry_new ();\r
1549   gtk_widget_show (entry);\r
1550   gtk_table_attach (GTK_TABLE (table2), entry, 1, 2, 2, 3,\r
1551                     (GtkAttachOptions) (GTK_EXPAND|GTK_FILL),\r
1552                     (GtkAttachOptions) (GTK_EXPAND|GTK_FILL), 0, 0);\r
1553   gtk_widget_set_usize (entry, 50, -2);\r
1554   g_object_set_data (G_OBJECT (dlg), "roughness", entry);\r
1555   g_signal_connect (G_OBJECT (entry), "focus_out_event", G_CALLBACK (doublevariable_entryfocusout), &Roughness);\r
1556 \r
1557   adj = gtk_adjustment_new (1, 1, 32767, 1, 10, 10);\r
1558   g_signal_connect (G_OBJECT (adj), "value_changed", G_CALLBACK (general_random), NULL);\r
1559   spin = gtk_spin_button_new (GTK_ADJUSTMENT (adj), 1, 0);\r
1560   gtk_widget_show (spin);\r
1561   gtk_table_attach (GTK_TABLE (table2), spin, 1, 2, 3, 4,\r
1562                     (GtkAttachOptions) (GTK_EXPAND|GTK_FILL),\r
1563                     (GtkAttachOptions) (GTK_EXPAND|GTK_FILL), 0, 0);\r
1564   gtk_widget_set_usize (spin, 60, -2);\r
1565   g_object_set_data (G_OBJECT (dlg), "random", spin);\r
1566 \r
1567   vbox = gtk_vbox_new (FALSE, 5);\r
1568   gtk_widget_show (vbox);\r
1569   gtk_container_set_border_width (GTK_CONTAINER (vbox), 5);\r
1570 \r
1571   label = gtk_label_new ("Extents");\r
1572   gtk_widget_show (label);\r
1573   gtk_notebook_append_page (GTK_NOTEBOOK (notebook), vbox, label);\r
1574 \r
1575   hbox2 = gtk_hbox_new (FALSE, 5);\r
1576   gtk_widget_show (hbox2);\r
1577   gtk_box_pack_start (GTK_BOX (vbox), hbox2, FALSE, TRUE, 0);\r
1578 \r
1579   frame = gtk_frame_new ("Extents");\r
1580   gtk_widget_show (frame);\r
1581   gtk_box_pack_start (GTK_BOX (hbox2), frame, TRUE, TRUE, 0);\r
1582 \r
1583   table = gtk_table_new (3, 4, FALSE);\r
1584   gtk_widget_show (table);\r
1585   gtk_container_set_border_width (GTK_CONTAINER (table), 5);\r
1586   gtk_container_add (GTK_CONTAINER (frame), table);\r
1587   gtk_table_set_row_spacings (GTK_TABLE (table), 5);\r
1588   gtk_table_set_col_spacings (GTK_TABLE (table), 5);\r
1589 \r
1590   label = gtk_label_new ("X:");\r
1591   gtk_widget_show (label);\r
1592   gtk_table_attach (GTK_TABLE (table), label, 0, 1, 1, 2,\r
1593                     (GtkAttachOptions) (GTK_FILL),\r
1594                     (GtkAttachOptions) (GTK_FILL), 0, 0);\r
1595   g_object_set_data (G_OBJECT (dlg), "hmin_text", label);\r
1596 \r
1597   label = gtk_label_new ("X:");\r
1598   gtk_widget_show (label);\r
1599   gtk_table_attach (GTK_TABLE (table), label, 2, 3, 1, 2,\r
1600                     (GtkAttachOptions) (GTK_FILL),\r
1601                     (GtkAttachOptions) (GTK_FILL), 0, 0);\r
1602   g_object_set_data (G_OBJECT (dlg), "hmax_text", label);\r
1603 \r
1604   label = gtk_label_new ("Y:");\r
1605   gtk_widget_show (label);\r
1606   gtk_table_attach (GTK_TABLE (table), label, 0, 1, 2, 3,\r
1607                     (GtkAttachOptions) (GTK_FILL),\r
1608                     (GtkAttachOptions) (GTK_FILL), 0, 0);\r
1609   g_object_set_data (G_OBJECT (dlg), "vmin_text", label);\r
1610 \r
1611   label = gtk_label_new ("Y:");\r
1612   gtk_widget_show (label);\r
1613   gtk_table_attach (GTK_TABLE (table), label, 2, 3, 2, 3,\r
1614                     (GtkAttachOptions) (GTK_FILL),\r
1615                     (GtkAttachOptions) (GTK_FILL), 0, 0);\r
1616   g_object_set_data (G_OBJECT (dlg), "vmax_text", label);\r
1617 \r
1618   label = gtk_label_new ("Lower-left");\r
1619   gtk_widget_show (label);\r
1620   gtk_table_attach (GTK_TABLE (table), label, 1, 2, 0, 1,\r
1621                     (GtkAttachOptions) (GTK_FILL),\r
1622                     (GtkAttachOptions) (GTK_FILL), 0, 0);\r
1623 \r
1624   label = gtk_label_new ("Upper-right");\r
1625   gtk_widget_show (label);\r
1626   gtk_table_attach (GTK_TABLE (table), label, 3, 4, 0, 1,\r
1627                     (GtkAttachOptions) (GTK_FILL),\r
1628                     (GtkAttachOptions) (GTK_FILL), 0, 0);\r
1629 \r
1630   entry = gtk_entry_new ();\r
1631   gtk_widget_show (entry);\r
1632   gtk_table_attach (GTK_TABLE (table), entry, 1, 2, 1, 2,\r
1633                     (GtkAttachOptions) (GTK_EXPAND|GTK_FILL),\r
1634                     (GtkAttachOptions) (GTK_EXPAND|GTK_FILL), 0, 0);\r
1635   gtk_widget_set_usize (entry, 50, -2);\r
1636   g_object_set_data (G_OBJECT (dlg), "hmin", entry);\r
1637   g_signal_connect (G_OBJECT (entry), "focus_out_event", G_CALLBACK (doublevariable_entryfocusout), &Hll);\r
1638 \r
1639   entry = gtk_entry_new ();\r
1640   gtk_widget_show (entry);\r
1641   gtk_table_attach (GTK_TABLE (table), entry, 3, 4, 1, 2,\r
1642                     (GtkAttachOptions) (GTK_EXPAND|GTK_FILL),\r
1643                     (GtkAttachOptions) (GTK_EXPAND|GTK_FILL), 0, 0);\r
1644   gtk_widget_set_usize (entry, 50, -2);\r
1645   g_object_set_data (G_OBJECT (dlg), "hmax", entry);\r
1646   g_signal_connect (G_OBJECT (entry), "focus_out_event", G_CALLBACK (doublevariable_entryfocusout), &Hur);\r
1647 \r
1648   entry = gtk_entry_new ();\r
1649   gtk_widget_show (entry);\r
1650   gtk_table_attach (GTK_TABLE (table), entry, 1, 2, 2, 3,\r
1651                     (GtkAttachOptions) (GTK_EXPAND|GTK_FILL),\r
1652                     (GtkAttachOptions) (GTK_EXPAND|GTK_FILL), 0, 0);\r
1653   gtk_widget_set_usize (entry, 50, -2);\r
1654   g_object_set_data (G_OBJECT (dlg), "vmin", entry);\r
1655   g_signal_connect (G_OBJECT (entry), "focus_out_event", G_CALLBACK (doublevariable_entryfocusout), &Vll);\r
1656 \r
1657   entry = gtk_entry_new ();\r
1658   gtk_widget_show (entry);\r
1659   gtk_table_attach (GTK_TABLE (table), entry, 3, 4, 2, 3,\r
1660                     (GtkAttachOptions) (GTK_EXPAND|GTK_FILL),\r
1661                     (GtkAttachOptions) (GTK_EXPAND|GTK_FILL), 0, 0);\r
1662   gtk_widget_set_usize (entry, 50, -2);\r
1663   g_object_set_data (G_OBJECT (dlg), "vmax", entry);\r
1664   g_signal_connect (G_OBJECT (entry), "focus_out_event", G_CALLBACK (doublevariable_entryfocusout), &Vur);\r
1665 \r
1666   frame = gtk_frame_new ("Divisions");\r
1667   gtk_widget_show (frame);\r
1668   gtk_box_pack_start (GTK_BOX (hbox2), frame, TRUE, TRUE, 0);\r
1669 \r
1670   table = gtk_table_new (2, 2, FALSE);\r
1671   gtk_widget_show (table);\r
1672   gtk_container_set_border_width (GTK_CONTAINER (table), 5);\r
1673   gtk_container_add (GTK_CONTAINER (frame), table);\r
1674   gtk_table_set_row_spacings (GTK_TABLE (table), 5);\r
1675   gtk_table_set_col_spacings (GTK_TABLE (table), 5);\r
1676 \r
1677   label = gtk_label_new ("X:");\r
1678   gtk_widget_show (label);\r
1679   gtk_table_attach (GTK_TABLE (table), label, 0, 1, 0, 1,\r
1680                     (GtkAttachOptions) (GTK_FILL),\r
1681                     (GtkAttachOptions) (GTK_EXPAND|GTK_FILL), 0, 0);\r
1682   g_object_set_data (G_OBJECT (dlg), "nh_text", label);\r
1683 \r
1684   label = gtk_label_new ("Y:");\r
1685   gtk_widget_show (label);\r
1686   gtk_table_attach (GTK_TABLE (table), label, 0, 1, 1, 2,\r
1687                     (GtkAttachOptions) (GTK_FILL),\r
1688                     (GtkAttachOptions) (GTK_EXPAND|GTK_FILL), 0, 0);\r
1689   g_object_set_data (G_OBJECT (dlg), "nv_text", label);\r
1690 \r
1691   adj = gtk_adjustment_new (8, 1, MAX_ROWS, 1, 10, 10);\r
1692   g_signal_connect (G_OBJECT (adj), "value_changed", G_CALLBACK (extents_nhnv_spin), &NH);\r
1693   spin = gtk_spin_button_new (GTK_ADJUSTMENT (adj), 1, 0);\r
1694   gtk_widget_show (spin);\r
1695   gtk_table_attach (GTK_TABLE (table), spin, 1, 2, 0, 1,\r
1696                     (GtkAttachOptions) (GTK_EXPAND|GTK_FILL),\r
1697                     (GtkAttachOptions) (GTK_EXPAND|GTK_FILL), 0, 0);\r
1698   gtk_widget_set_usize (spin, 60, -2);\r
1699   g_object_set_data (G_OBJECT (dlg), "nh", spin);\r
1700 \r
1701   adj = gtk_adjustment_new (8, 1, MAX_ROWS, 1, 10, 10);\r
1702   g_signal_connect (G_OBJECT (adj), "value_changed", G_CALLBACK (extents_nhnv_spin), &NV);\r
1703   spin = gtk_spin_button_new (GTK_ADJUSTMENT (adj), 1, 0);\r
1704   gtk_widget_show (spin);\r
1705   gtk_table_attach (GTK_TABLE (table), spin, 1, 2, 1, 2,\r
1706                     (GtkAttachOptions) (GTK_EXPAND|GTK_FILL),\r
1707                     (GtkAttachOptions) (GTK_EXPAND|GTK_FILL), 0, 0);\r
1708   gtk_widget_set_usize (spin, 60, -2);\r
1709   g_object_set_data (G_OBJECT (dlg), "nv", spin);\r
1710 \r
1711   check = gtk_check_button_new_with_label ("Use Bezier patches");\r
1712   gtk_widget_show (check);\r
1713   gtk_box_pack_start (GTK_BOX (vbox), check, FALSE, TRUE, 0);\r
1714   g_object_set_data (G_OBJECT (dlg), "use_patches", check);\r
1715   g_signal_connect (G_OBJECT (check), "toggled", G_CALLBACK (extents_use_patches), NULL);\r
1716 \r
1717         // ^Fishman - Snap to grid, replaced scroll bar with a texbox.\r
1718         label = gtk_label_new ("Snap to grid:");\r
1719   gtk_widget_show (label);\r
1720         gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, TRUE, 0);\r
1721   gtk_object_set_data (GTK_OBJECT (dlg), "snap_text", label);\r
1722 \r
1723         adj = gtk_adjustment_new (8, 0, 256, 1, 10, 10);\r
1724   g_signal_connect (G_OBJECT (adj), "value_changed", G_CALLBACK (extents_snaptogrid_spin), &SP);\r
1725   spin = gtk_spin_button_new (GTK_ADJUSTMENT (adj), 1, 0);\r
1726   gtk_widget_show (spin);\r
1727         gtk_box_pack_start (GTK_BOX (vbox), spin, FALSE, TRUE, 0);\r
1728   gtk_widget_set_usize (spin, 60, -2);\r
1729   g_object_set_data (G_OBJECT (dlg), "sp", spin);\r
1730         // ^Fishman - End of Snap to grid code.\r
1731 \r
1732   hbox2 = gtk_hbox_new (FALSE, 5);\r
1733   gtk_widget_show (hbox2);\r
1734   gtk_box_pack_start (GTK_BOX (vbox), hbox2, FALSE, TRUE, 10);\r
1735 \r
1736   label = gtk_label_new ("Decimate:");\r
1737   gtk_widget_show (label);\r
1738   gtk_box_pack_start (GTK_BOX (hbox2), label, FALSE, TRUE, 0);\r
1739 \r
1740   adj = gtk_adjustment_new (0, 0, 110, 1, 10, 10);\r
1741   g_signal_connect (G_OBJECT (adj), "value_changed", G_CALLBACK (extents_decimate), NULL);\r
1742   g_object_set_data (G_OBJECT (dlg), "decimate_adj", adj);\r
1743   scale = gtk_hscale_new (GTK_ADJUSTMENT (adj));\r
1744   gtk_widget_show (scale);\r
1745   gtk_box_pack_start (GTK_BOX (hbox2), scale, TRUE, TRUE, 0);\r
1746   gtk_scale_set_value_pos (GTK_SCALE (scale), GTK_POS_RIGHT);\r
1747   gtk_scale_set_digits (GTK_SCALE (scale), 0);\r
1748   g_object_set_data (G_OBJECT (dlg), "decimate", scale);\r
1749 \r
1750   frame = gtk_frame_new ("Corner values");\r
1751   gtk_widget_show (frame);\r
1752   gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, TRUE, 0);\r
1753 \r
1754   table = gtk_table_new (3, 4, FALSE);\r
1755   gtk_widget_show (table);\r
1756   gtk_container_set_border_width (GTK_CONTAINER (table), 5);\r
1757   gtk_container_add (GTK_CONTAINER (frame), table);\r
1758   gtk_table_set_row_spacings (GTK_TABLE (table), 5);\r
1759   gtk_table_set_col_spacings (GTK_TABLE (table), 5);\r
1760 \r
1761   label = gtk_label_new ("Upper-left:");\r
1762   gtk_widget_show (label);\r
1763   gtk_table_attach (GTK_TABLE (table), label, 0, 1, 0, 1,\r
1764                     (GtkAttachOptions) (GTK_FILL),\r
1765                     (GtkAttachOptions) (GTK_FILL), 0, 0);\r
1766 \r
1767   label = gtk_label_new ("Lower-left:");\r
1768   gtk_widget_show (label);\r
1769   gtk_table_attach (GTK_TABLE (table), label, 0, 1, 1, 2,\r
1770                     (GtkAttachOptions) (GTK_FILL),\r
1771                     (GtkAttachOptions) (GTK_FILL), 0, 0);\r
1772 \r
1773   label = gtk_label_new ("Upper-right:");\r
1774   gtk_widget_show (label);\r
1775   gtk_table_attach (GTK_TABLE (table), label, 2, 3, 0, 1,\r
1776                     (GtkAttachOptions) (GTK_FILL),\r
1777                     (GtkAttachOptions) (GTK_FILL), 0, 0);\r
1778 \r
1779   label = gtk_label_new ("Lower-right:");\r
1780   gtk_widget_show (label);\r
1781   gtk_table_attach (GTK_TABLE (table), label, 2, 3, 1, 2,\r
1782                     (GtkAttachOptions) (GTK_FILL),\r
1783                     (GtkAttachOptions) (GTK_FILL), 0, 0);\r
1784 \r
1785   entry = gtk_entry_new ();\r
1786   gtk_widget_show (entry);\r
1787   gtk_table_attach (GTK_TABLE (table), entry, 1, 2, 0, 1,\r
1788                     (GtkAttachOptions) (GTK_EXPAND|GTK_FILL),\r
1789                     (GtkAttachOptions) (GTK_EXPAND|GTK_FILL), 0, 0);\r
1790   gtk_widget_set_usize (entry, 50, -2);\r
1791   g_object_set_data (G_OBJECT (dlg), "z01", entry);\r
1792   g_signal_connect (G_OBJECT (entry), "focus_out_event", G_CALLBACK (doublevariable_entryfocusout), &Z01);\r
1793 \r
1794   entry = gtk_entry_new ();\r
1795   gtk_widget_show (entry);\r
1796   gtk_table_attach (GTK_TABLE (table), entry, 1, 2, 1, 2,\r
1797                     (GtkAttachOptions) (GTK_EXPAND|GTK_FILL),\r
1798                     (GtkAttachOptions) (GTK_EXPAND|GTK_FILL), 0, 0);\r
1799   gtk_widget_set_usize (entry, 50, -2);\r
1800   g_object_set_data (G_OBJECT (dlg), "z00", entry);\r
1801   g_signal_connect (G_OBJECT (entry), "focus_out_event", G_CALLBACK (doublevariable_entryfocusout), &Z00);\r
1802 \r
1803   entry = gtk_entry_new ();\r
1804   gtk_widget_show (entry);\r
1805   gtk_table_attach (GTK_TABLE (table), entry, 3, 4, 0, 1,\r
1806                     (GtkAttachOptions) (GTK_EXPAND|GTK_FILL),\r
1807                     (GtkAttachOptions) (GTK_EXPAND|GTK_FILL), 0, 0);\r
1808   gtk_widget_set_usize (entry, 50, -2);\r
1809   g_object_set_data (G_OBJECT (dlg), "z11", entry);\r
1810   g_signal_connect (G_OBJECT (entry), "focus_out_event", G_CALLBACK (doublevariable_entryfocusout), &Z11);\r
1811 \r
1812   entry = gtk_entry_new ();\r
1813   gtk_widget_show (entry);\r
1814   gtk_table_attach (GTK_TABLE (table), entry, 3, 4, 1, 2,\r
1815                     (GtkAttachOptions) (GTK_EXPAND|GTK_FILL),\r
1816                     (GtkAttachOptions) (GTK_EXPAND|GTK_FILL), 0, 0);\r
1817   gtk_widget_set_usize (entry, 50, -2);\r
1818   g_object_set_data (G_OBJECT (dlg), "z10", entry);\r
1819   g_signal_connect (G_OBJECT (entry), "focus_out_event", G_CALLBACK (doublevariable_entryfocusout), &Z10);\r
1820 \r
1821   check = gtk_check_button_new_with_label ("Linear borders");\r
1822   gtk_widget_show (check);\r
1823   gtk_table_attach (GTK_TABLE (table), check, 0, 4, 2, 3,\r
1824                     (GtkAttachOptions) (GTK_EXPAND|GTK_FILL),\r
1825                     (GtkAttachOptions) (GTK_EXPAND|GTK_FILL), 0, 0);\r
1826   g_object_set_data (G_OBJECT (dlg), "linearborder", check);\r
1827   g_signal_connect (G_OBJECT (check), "toggled", G_CALLBACK (extents_linearborder), NULL);\r
1828 \r
1829   vbox = gtk_vbox_new (FALSE, 10);\r
1830   gtk_widget_show (vbox);\r
1831   gtk_container_set_border_width (GTK_CONTAINER (vbox), 5);\r
1832 \r
1833   label = gtk_label_new ("Bitmap");\r
1834   gtk_widget_show (label);\r
1835   gtk_notebook_append_page (GTK_NOTEBOOK (notebook), vbox, label);\r
1836 \r
1837   label = gtk_label_new ("");\r
1838   gtk_widget_show (label);\r
1839   gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, TRUE, 0);\r
1840   g_object_set_data (G_OBJECT (dlg), "bmp_note", label);\r
1841 \r
1842   table = gtk_table_new (2, 2, FALSE);\r
1843   gtk_widget_show (table);\r
1844   gtk_container_set_border_width (GTK_CONTAINER (table), 5);\r
1845   gtk_box_pack_start (GTK_BOX (vbox), table, FALSE, TRUE, 0);\r
1846   gtk_table_set_row_spacings (GTK_TABLE (table), 5);\r
1847   gtk_table_set_col_spacings (GTK_TABLE (table), 5);\r
1848 \r
1849   label = gtk_label_new ("Filename:");\r
1850   gtk_widget_show (label);\r
1851   gtk_table_attach (GTK_TABLE (table), label, 0, 1, 0, 1,\r
1852                     (GtkAttachOptions) (GTK_FILL),\r
1853                     (GtkAttachOptions) (GTK_FILL), 0, 0);\r
1854   g_object_set_data (G_OBJECT (dlg), "bmp_text1", label);\r
1855 \r
1856   entry = gtk_entry_new ();\r
1857   gtk_widget_show (entry);\r
1858   gtk_table_attach (GTK_TABLE (table), entry, 1, 2, 0, 1,\r
1859                     (GtkAttachOptions) (GTK_EXPAND|GTK_FILL),\r
1860                     (GtkAttachOptions) (GTK_FILL), 0, 0);\r
1861   g_object_set_data (G_OBJECT (dlg), "bmp_file", entry);\r
1862   g_signal_connect (G_OBJECT (entry), "focus_out_event", G_CALLBACK (bitmap_file_entryfocusout), NULL);\r
1863 \r
1864   hbox2 = gtk_hbox_new (TRUE, 5);\r
1865   gtk_widget_show (hbox2);\r
1866   gtk_table_attach (GTK_TABLE (table), hbox2, 1, 2, 1, 2,\r
1867                     (GtkAttachOptions) (0),\r
1868                     (GtkAttachOptions) (GTK_EXPAND|GTK_FILL), 0, 0);\r
1869 \r
1870   button = gtk_button_new_with_label ("Browse...");\r
1871   gtk_widget_show (button);\r
1872   gtk_box_pack_start (GTK_BOX (hbox2), button, FALSE, FALSE, 0);\r
1873   gtk_widget_set_usize (button, 60, -2);\r
1874   g_object_set_data (G_OBJECT (dlg), "bmp_file_browse", button);\r
1875   g_signal_connect (G_OBJECT (button), "clicked", G_CALLBACK (bitmap_browse), NULL);\r
1876 \r
1877   button = gtk_button_new_with_label ("Reload");\r
1878   gtk_widget_show (button);\r
1879   gtk_box_pack_start (GTK_BOX (hbox2), button, FALSE, FALSE, 0);\r
1880   gtk_widget_set_usize (button, 60, -2);\r
1881   g_object_set_data (G_OBJECT (dlg), "bmp_reload", button);\r
1882   g_signal_connect (G_OBJECT (button), "clicked", G_CALLBACK (bitmap_reload), NULL);\r
1883 \r
1884   table = gtk_table_new (2, 2, TRUE);\r
1885   gtk_widget_show (table);\r
1886   gtk_container_set_border_width (GTK_CONTAINER (table), 5);\r
1887   gtk_box_pack_start (GTK_BOX (vbox), table, FALSE, TRUE, 0);\r
1888   gtk_table_set_row_spacings (GTK_TABLE (table), 5);\r
1889   gtk_table_set_col_spacings (GTK_TABLE (table), 5);\r
1890 \r
1891   label = gtk_label_new ("Map color 0 to:");\r
1892   gtk_widget_show (label);\r
1893   gtk_table_attach (GTK_TABLE (table), label, 0, 1, 0, 1,\r
1894                     (GtkAttachOptions) (GTK_FILL|GTK_EXPAND),\r
1895                     (GtkAttachOptions) (GTK_FILL), 0, 0);\r
1896   g_object_set_data (G_OBJECT (dlg), "bmp_text2", label);\r
1897   gtk_misc_set_alignment (GTK_MISC (label), 1, 0.5);\r
1898   gtk_label_set_justify (GTK_LABEL (label), GTK_JUSTIFY_RIGHT);\r
1899 \r
1900   label = gtk_label_new ("Map color 255 to:");\r
1901   gtk_widget_show (label);\r
1902   gtk_table_attach (GTK_TABLE (table), label, 0, 1, 1, 2,\r
1903                     (GtkAttachOptions) (GTK_FILL|GTK_EXPAND),\r
1904                     (GtkAttachOptions) (GTK_FILL), 0, 0);\r
1905   g_object_set_data (G_OBJECT (dlg), "bmp_text3", label);\r
1906   gtk_misc_set_alignment (GTK_MISC (label), 1, 0.5);\r
1907   gtk_label_set_justify (GTK_LABEL (label), GTK_JUSTIFY_RIGHT);\r
1908 \r
1909   hbox2 = gtk_hbox_new (FALSE, 5);\r
1910   gtk_widget_show (hbox2);\r
1911   gtk_table_attach (GTK_TABLE (table), hbox2, 1, 2, 0, 1,\r
1912                     (GtkAttachOptions) (GTK_EXPAND|GTK_FILL),\r
1913                     (GtkAttachOptions) (GTK_EXPAND|GTK_FILL), 0, 0);\r
1914 \r
1915   entry = gtk_entry_new ();\r
1916   gtk_widget_show (entry);\r
1917   gtk_box_pack_start (GTK_BOX (hbox2), entry, FALSE, FALSE, 0);\r
1918   gtk_widget_set_usize (entry, 50, -2);\r
1919   g_object_set_data (G_OBJECT (dlg), "bmp_black", entry);\r
1920   g_signal_connect (G_OBJECT (entry), "focus_out_event", G_CALLBACK (doublevariable_entryfocusout), &gbmp.black_value);\r
1921 \r
1922   hbox2 = gtk_hbox_new (FALSE, 5);\r
1923   gtk_widget_show (hbox2);\r
1924   gtk_table_attach (GTK_TABLE (table), hbox2, 1, 2, 1, 2,\r
1925                     (GtkAttachOptions) (GTK_EXPAND|GTK_FILL),\r
1926                     (GtkAttachOptions) (GTK_EXPAND|GTK_FILL), 0, 0);\r
1927 \r
1928   entry = gtk_entry_new ();\r
1929   gtk_widget_show (entry);\r
1930   gtk_box_pack_start (GTK_BOX (hbox2), entry, FALSE, FALSE, 0);\r
1931   gtk_widget_set_usize (entry, 50, -2);\r
1932   g_object_set_data (G_OBJECT (dlg), "bmp_white", entry);\r
1933   g_signal_connect (G_OBJECT (entry), "focus_out_event", G_CALLBACK (doublevariable_entryfocusout), &gbmp.white_value);\r
1934 \r
1935   vbox = gtk_vbox_new (FALSE, 10);\r
1936   gtk_widget_show (vbox);\r
1937   gtk_container_set_border_width (GTK_CONTAINER (vbox), 5);\r
1938 \r
1939   label = gtk_label_new ("Fix Points");\r
1940   gtk_widget_show (label);\r
1941   gtk_notebook_append_page (GTK_NOTEBOOK (notebook), vbox, label);\r
1942 \r
1943   label = gtk_label_new ("Click on a vertex in the lower half of the preview window,\n"\r
1944                          "then use the arrow keys or text box to assign a value.\n"\r
1945                          "Use Ctrl+Click to select multiple vertices/toggle a\n"\r
1946                          "selection. Use Shift+Click to select a range of vertices.\n\n"\r
1947                          "Click \"Free\" to unlock a vertex. Vertices within \"Range\n"\r
1948                          "affected\" will be influenced by this vertex.");\r
1949   gtk_widget_show (label);\r
1950   gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, TRUE, 0);\r
1951 \r
1952   table = gtk_table_new (3, 3, FALSE);\r
1953   gtk_widget_show (table);\r
1954   gtk_container_set_border_width (GTK_CONTAINER (table), 5);\r
1955   gtk_box_pack_start (GTK_BOX (vbox), table, FALSE, TRUE, 0);\r
1956   gtk_table_set_row_spacings (GTK_TABLE (table), 5);\r
1957   gtk_table_set_col_spacings (GTK_TABLE (table), 5);\r
1958 \r
1959   label = gtk_label_new ("Value:");\r
1960   gtk_widget_show (label);\r
1961   gtk_table_attach (GTK_TABLE (table), label, 0, 1, 0, 1,\r
1962                     (GtkAttachOptions) (GTK_FILL),\r
1963                     (GtkAttachOptions) (GTK_FILL), 0, 0);\r
1964   gtk_misc_set_alignment (GTK_MISC (label), 1, 0.5);\r
1965   g_object_set_data (G_OBJECT (dlg), "fix_value_text", label);\r
1966 \r
1967   label = gtk_label_new ("Range affected:");\r
1968   gtk_widget_show (label);\r
1969   gtk_table_attach (GTK_TABLE (table), label, 0, 1, 1, 2,\r
1970                     (GtkAttachOptions) (GTK_FILL),\r
1971                     (GtkAttachOptions) (GTK_FILL), 0, 0);\r
1972   gtk_misc_set_alignment (GTK_MISC (label), 1, 0.5);\r
1973   g_object_set_data (G_OBJECT (dlg), "fix_range_text", label);\r
1974 \r
1975   label = gtk_label_new ("Rate of change:");\r
1976   gtk_widget_show (label);\r
1977   gtk_table_attach (GTK_TABLE (table), label, 0, 1, 2, 3,\r
1978                     (GtkAttachOptions) (GTK_FILL),\r
1979                     (GtkAttachOptions) (GTK_FILL), 0, 0);\r
1980   gtk_misc_set_alignment (GTK_MISC (label), 1, 0.5);\r
1981   g_object_set_data (G_OBJECT (dlg), "fix_rate_text", label);\r
1982 \r
1983   adj = gtk_adjustment_new (0, -65536, 65536, 1, 16, 16);\r
1984   g_signal_connect (G_OBJECT (adj), "value_changed", G_CALLBACK (fix_value_changed), NULL);\r
1985   spin = gtk_spin_button_new (GTK_ADJUSTMENT (adj), 1, 0);\r
1986   gtk_widget_show (spin);\r
1987   gtk_table_attach (GTK_TABLE (table), spin, 1, 2, 0, 1,\r
1988                     (GtkAttachOptions) (GTK_EXPAND),\r
1989                     (GtkAttachOptions) (GTK_EXPAND), 0, 0);\r
1990   gtk_widget_set_usize (spin, 60, -2);\r
1991   g_object_set_data (G_OBJECT (dlg), "fix_value", spin);\r
1992   g_signal_connect (G_OBJECT (spin), "focus_out_event", G_CALLBACK (fix_value_entryfocusout), NULL);\r
1993 \r
1994   entry = gtk_entry_new ();\r
1995   gtk_widget_show (entry);\r
1996   gtk_table_attach (GTK_TABLE (table), entry, 1, 2, 1, 2,\r
1997                     (GtkAttachOptions) (GTK_EXPAND),\r
1998                     (GtkAttachOptions) (GTK_FILL), 0, 0);\r
1999   gtk_widget_set_usize (entry, 60, -2);\r
2000   g_object_set_data (G_OBJECT (dlg), "fix_range", entry);\r
2001   g_signal_connect (G_OBJECT (entry), "focus_out_event", G_CALLBACK (fix_range_entryfocusout), NULL);\r
2002 \r
2003   entry = gtk_entry_new ();\r
2004   gtk_widget_show (entry);\r
2005   gtk_table_attach (GTK_TABLE (table), entry, 1, 2, 2, 3,\r
2006                     (GtkAttachOptions) (GTK_EXPAND),\r
2007                     (GtkAttachOptions) (GTK_FILL), 0, 0);\r
2008   gtk_widget_set_usize (entry, 60, -2);\r
2009   g_object_set_data (G_OBJECT (dlg), "fix_rate", entry);\r
2010   g_signal_connect (G_OBJECT (entry), "focus_out_event", G_CALLBACK (fix_rate_entryfocusout), NULL);\r
2011 \r
2012   button = gtk_button_new_with_label ("Free");\r
2013   gtk_widget_show (button);\r
2014   gtk_table_attach (GTK_TABLE (table), button, 2, 3, 0, 1,\r
2015                     (GtkAttachOptions) (GTK_EXPAND),\r
2016                     (GtkAttachOptions) (GTK_FILL), 0, 0);\r
2017   gtk_widget_set_usize (button, 60, -2);\r
2018   g_object_set_data (G_OBJECT (dlg), "fix_free", button);\r
2019   g_signal_connect (G_OBJECT (button), "clicked", G_CALLBACK (fix_free), NULL);\r
2020 \r
2021   button = gtk_button_new_with_label ("Free All");\r
2022   gtk_widget_show (button);\r
2023   gtk_table_attach (GTK_TABLE (table), button, 2, 3, 1, 2,\r
2024                     (GtkAttachOptions) (GTK_EXPAND),\r
2025                     (GtkAttachOptions) (GTK_FILL), 0, 0);\r
2026   gtk_widget_set_usize (button, 60, -2);\r
2027   g_object_set_data (G_OBJECT (dlg), "fix_freeall", button);\r
2028   g_signal_connect (G_OBJECT (button), "clicked", G_CALLBACK (fix_freeall), NULL);\r
2029 \r
2030   vbox = gtk_vbox_new (FALSE, 10);\r
2031   gtk_widget_show (vbox);\r
2032   gtk_container_set_border_width (GTK_CONTAINER (vbox), 5);\r
2033 \r
2034   label = gtk_label_new ("Texture");\r
2035   gtk_widget_show (label);\r
2036   gtk_notebook_append_page (GTK_NOTEBOOK (notebook), vbox, label);\r
2037 \r
2038         // ^Fishman - Modified to add more labels and textboxes.\r
2039         table = gtk_table_new (5, 2, FALSE);\r
2040   gtk_widget_show (table);\r
2041   gtk_box_pack_start (GTK_BOX (vbox), table, FALSE, TRUE, 0);\r
2042   gtk_table_set_row_spacings (GTK_TABLE (table), 5);\r
2043   gtk_table_set_col_spacings (GTK_TABLE (table), 5);\r
2044 \r
2045   label = gtk_label_new ("Surface:");\r
2046   gtk_widget_show (label);\r
2047   gtk_table_attach (GTK_TABLE (table), label, 0, 1, 0, 1,\r
2048                     (GtkAttachOptions) (GTK_FILL),\r
2049                     (GtkAttachOptions) (GTK_FILL), 0, 0);\r
2050   gtk_misc_set_alignment (GTK_MISC (label), 1, 0.5);\r
2051 \r
2052   label = gtk_label_new ("Other:");\r
2053   gtk_widget_show (label);\r
2054   gtk_table_attach (GTK_TABLE (table), label, 0, 1, 1, 2,\r
2055                     (GtkAttachOptions) (GTK_FILL),\r
2056                     (GtkAttachOptions) (GTK_FILL), 0, 0);\r
2057   gtk_misc_set_alignment (GTK_MISC (label), 1, 0.5);\r
2058 \r
2059   label = gtk_label_new ("Steep:");\r
2060   gtk_widget_show (label);\r
2061   gtk_table_attach (GTK_TABLE (table), label, 0, 1, 2, 3,\r
2062                     (GtkAttachOptions) (GTK_FILL),\r
2063                     (GtkAttachOptions) (GTK_FILL), 0, 0);\r
2064   gtk_misc_set_alignment (GTK_MISC (label), 1, 0.5);\r
2065 \r
2066   entry = gtk_entry_new ();\r
2067   gtk_widget_show (entry);\r
2068   gtk_table_attach (GTK_TABLE (table), entry, 1, 2, 0, 1,\r
2069                     (GtkAttachOptions) (GTK_EXPAND|GTK_FILL),\r
2070                     (GtkAttachOptions) (GTK_FILL), 0, 0);\r
2071   gtk_widget_set_usize (entry, 60, -2);\r
2072   g_object_set_data (G_OBJECT (dlg), "texture1", entry);\r
2073   g_signal_connect (G_OBJECT (entry), "focus_out_event", G_CALLBACK(texture_entryfocusout), GINT_TO_POINTER (0));\r
2074 \r
2075   entry = gtk_entry_new ();\r
2076   gtk_widget_show (entry);\r
2077   gtk_table_attach (GTK_TABLE (table), entry, 1, 2, 1, 2,\r
2078                     (GtkAttachOptions) (GTK_EXPAND|GTK_FILL),\r
2079                     (GtkAttachOptions) (GTK_FILL), 0, 0);\r
2080   gtk_widget_set_usize (entry, 60, -2);\r
2081   g_object_set_data (G_OBJECT (dlg), "texture2", entry);\r
2082   g_signal_connect (G_OBJECT (entry), "focus_out_event", G_CALLBACK(texture_entryfocusout), GINT_TO_POINTER (1));\r
2083 \r
2084   entry = gtk_entry_new ();\r
2085   gtk_widget_show (entry);\r
2086   gtk_table_attach (GTK_TABLE (table), entry, 1, 2, 2, 3,\r
2087                     (GtkAttachOptions) (GTK_EXPAND|GTK_FILL),\r
2088                     (GtkAttachOptions) (GTK_FILL), 0, 0);\r
2089   gtk_widget_set_usize (entry, 60, -2);\r
2090   g_object_set_data (G_OBJECT (dlg), "texture3", entry);\r
2091 \r
2092   hbox2 = gtk_hbox_new (FALSE, 5);\r
2093   gtk_widget_show (hbox2);\r
2094   gtk_box_pack_start (GTK_BOX (vbox), hbox2, FALSE, TRUE, 0);\r
2095 \r
2096   label = gtk_label_new ("\"Steep\" angle:");\r
2097   gtk_widget_show (label);\r
2098   gtk_box_pack_start (GTK_BOX (hbox2), label, FALSE, TRUE, 0);\r
2099 \r
2100   adj = gtk_adjustment_new (60, 0, 90, 1, 10, 10);\r
2101   spin = gtk_spin_button_new (GTK_ADJUSTMENT (adj), 1, 0);\r
2102   gtk_widget_show (spin);\r
2103   gtk_box_pack_start (GTK_BOX (hbox2), spin, FALSE, TRUE, 0);\r
2104   g_object_set_data (G_OBJECT (dlg), "tex_slant", spin);\r
2105 \r
2106   table = gtk_table_new (2, 4, TRUE);\r
2107   gtk_widget_show (table);\r
2108   gtk_box_pack_start (GTK_BOX (vbox), table, FALSE, TRUE, 0);\r
2109   gtk_table_set_row_spacings (GTK_TABLE (table), 5);\r
2110   gtk_table_set_col_spacings (GTK_TABLE (table), 5);\r
2111 \r
2112   label = gtk_label_new ("Offset <h,v>");\r
2113   gtk_widget_show (label);\r
2114   gtk_table_attach (GTK_TABLE (table), label, 0, 2, 0, 1,\r
2115                     (GtkAttachOptions) (GTK_FILL),\r
2116                     (GtkAttachOptions) (GTK_FILL), 0, 0);\r
2117 \r
2118   label = gtk_label_new ("Scale <h,v>");\r
2119   gtk_widget_show (label);\r
2120   gtk_table_attach (GTK_TABLE (table), label, 2, 4, 0, 1,\r
2121                     (GtkAttachOptions) (GTK_FILL),\r
2122                     (GtkAttachOptions) (GTK_FILL), 0, 0);\r
2123 \r
2124   entry = gtk_entry_new ();\r
2125   gtk_widget_show (entry);\r
2126   gtk_table_attach (GTK_TABLE (table), entry, 0, 1, 1, 2,\r
2127                     (GtkAttachOptions) (GTK_EXPAND|GTK_FILL),\r
2128                     (GtkAttachOptions) (GTK_FILL), 0, 0);\r
2129   gtk_widget_set_usize (entry, 60, -2);\r
2130   g_object_set_data (G_OBJECT (dlg), "texoffsetx", entry);\r
2131 \r
2132   entry = gtk_entry_new ();\r
2133   gtk_widget_show (entry);\r
2134   gtk_table_attach (GTK_TABLE (table), entry, 1, 2, 1, 2,\r
2135                     (GtkAttachOptions) (GTK_EXPAND|GTK_FILL),\r
2136                     (GtkAttachOptions) (GTK_FILL), 0, 0);\r
2137   gtk_widget_set_usize (entry, 60, -2);\r
2138   g_object_set_data (G_OBJECT (dlg), "texoffsety", entry);\r
2139 \r
2140   entry = gtk_entry_new ();\r
2141   gtk_widget_show (entry);\r
2142   gtk_table_attach (GTK_TABLE (table), entry, 2, 3, 1, 2,\r
2143                     (GtkAttachOptions) (GTK_EXPAND|GTK_FILL),\r
2144                     (GtkAttachOptions) (GTK_FILL), 0, 0);\r
2145   gtk_widget_set_usize (entry, 60, -2);\r
2146   g_object_set_data (G_OBJECT (dlg), "texscalex", entry);\r
2147 \r
2148   entry = gtk_entry_new ();\r
2149   gtk_widget_show (entry);\r
2150   gtk_table_attach (GTK_TABLE (table), entry, 3, 4, 1, 2,\r
2151                     (GtkAttachOptions) (GTK_EXPAND|GTK_FILL),\r
2152                     (GtkAttachOptions) (GTK_FILL), 0, 0);\r
2153   gtk_widget_set_usize (entry, 60, -2);\r
2154   g_object_set_data (G_OBJECT (dlg), "texscaley", entry);\r
2155 \r
2156 \r
2157 \r
2158   check = gtk_check_button_new_with_label ("Use detail brushes");\r
2159   gtk_widget_show (check);\r
2160   gtk_box_pack_start (GTK_BOX (vbox), check, FALSE, TRUE, 0);\r
2161   g_object_set_data (G_OBJECT (dlg), "detail", check);\r
2162   g_signal_connect (G_OBJECT (check), "toggled", G_CALLBACK (texture_detail), NULL);\r
2163 \r
2164   check = gtk_check_button_new_with_label ("Detail hint brushes");\r
2165   gtk_widget_show (check);\r
2166   gtk_box_pack_start (GTK_BOX (vbox), check, FALSE, TRUE, 0);\r
2167   g_object_set_data (G_OBJECT (dlg), "hint", check);\r
2168   g_signal_connect (G_OBJECT (check), "toggled", G_CALLBACK (texture_hint), NULL);\r
2169 \r
2170         // ^Fishman - Add terrain key to func_group.\r
2171         check = gtk_check_button_new_with_label ("Add terrain key");\r
2172   gtk_widget_show (check);\r
2173   gtk_box_pack_start (GTK_BOX (vbox), check, FALSE, TRUE, 0);\r
2174   g_object_set_data (G_OBJECT (dlg), "terrain_ent", check);\r
2175   g_signal_connect (G_OBJECT (check), "toggled", G_CALLBACK (texture_terrainent), NULL);\r
2176 \r
2177   vbox = gtk_vbox_new (FALSE, 5);\r
2178   gtk_widget_show (vbox);\r
2179   gtk_box_pack_start (GTK_BOX (hbox), vbox, FALSE, TRUE, 0);\r
2180 \r
2181   button = gtk_button_new_with_label ("OK");\r
2182   gtk_widget_show (button);\r
2183   gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, TRUE, 0);\r
2184   gtk_widget_set_usize (button, 60, -2);\r
2185   g_object_set_data (G_OBJECT (dlg), "go", button);\r
2186   g_signal_connect (G_OBJECT (button), "clicked", G_CALLBACK (main_go), NULL);\r
2187 \r
2188   label = gtk_label_new ("Settings:");\r
2189   gtk_widget_show (label);\r
2190   gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, TRUE, 0);\r
2191 \r
2192   button = gtk_button_new_with_label ("Open...");\r
2193   gtk_widget_show (button);\r
2194   gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, TRUE, 0);\r
2195   g_object_set_data (G_OBJECT (dlg), "open", button);\r
2196   g_signal_connect (G_OBJECT (button), "clicked", G_CALLBACK (main_open), NULL);\r
2197 \r
2198   button = gtk_button_new_with_label ("Save as...");\r
2199   gtk_widget_show (button);\r
2200   gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, TRUE, 0);\r
2201   g_object_set_data (G_OBJECT (dlg), "save", button);\r
2202   g_signal_connect (G_OBJECT (button), "clicked", G_CALLBACK (main_save), NULL);\r
2203 \r
2204   button = gtk_button_new_with_label ("Defaults");\r
2205   gtk_widget_show (button);\r
2206   gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, TRUE, 0);\r
2207   g_object_set_data (G_OBJECT (dlg), "defaults", button);\r
2208   g_signal_connect (G_OBJECT (button), "clicked", G_CALLBACK (main_defaults), NULL);\r
2209 \r
2210   button = gtk_button_new_with_label ("About...");\r
2211   gtk_widget_show (button);\r
2212   gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, TRUE, 0);\r
2213   g_signal_connect (G_OBJECT (button), "clicked", G_CALLBACK (main_about), NULL);\r
2214 \r
2215   check = gtk_check_button_new_with_label ("Preview");\r
2216   gtk_widget_show (check);\r
2217   gtk_box_pack_start (GTK_BOX (vbox), check, FALSE, TRUE, 0);\r
2218   g_signal_connect (G_OBJECT (check), "toggled", G_CALLBACK (main_preview), NULL);\r
2219   g_object_set_data (G_OBJECT (dlg), "main_preview", check);\r
2220 \r
2221         // ^Fishman - Antializing for the preview window.\r
2222   check = gtk_check_button_new_with_label ("Antialised lines");\r
2223   gtk_widget_show (check);\r
2224   gtk_box_pack_start (GTK_BOX (vbox), check, FALSE, TRUE, 0);\r
2225         g_object_set_data (G_OBJECT (dlg), "main_antialiasing", check);\r
2226   g_signal_connect (G_OBJECT (check), "toggled", G_CALLBACK (main_antialiasing), NULL);\r
2227 \r
2228   for (i = 0; i < 5; i++)\r
2229     SetDlgValues (i);\r
2230 \r
2231   CreateViewWindow ();\r
2232 \r
2233   create_tooltips();\r
2234 \r
2235   FirstPassComplete = 1;\r
2236 \r
2237   return dlg;\r
2238 }\r
2239 \r
2240 \r
2241 #if 0\r
2242 \r
2243 HWND hwndDisplay = (HWND)NULL;\r
2244 HWND ghwndTab    = (HWND)NULL;\r
2245 int  iTab=0;\r
2246 RECT rcTab;\r
2247 FILE *ftex;\r
2248 \r
2249 char GenSurfURL[40] = {"http://tarot.telefragged.com/gensurf"};\r
2250 char GenSurfBoard[40]={"http://tarot.telefragged.com/board"};\r
2251 \r
2252 /*\r
2253 * AboutDlgProc - processes messages for the about dialog.\r
2254 */\r
2255 \r
2256 qboolean CALLBACK AboutDlgProc( HWND hwnd, unsigned msg, UINT wparam, LONG lparam )\r
2257 {\r
2258         char           szText[256];\r
2259         DRAWITEMSTRUCT *dis;\r
2260         HDC            hdc;\r
2261         HPEN           hpen;\r
2262         HWND           hwndURL;\r
2263         RECT           rc;\r
2264         SIZE           size;\r
2265 \r
2266         lparam = lparam;                                        /* turn off warning */\r
2267 \r
2268         switch( msg ) {\r
2269         case WM_INITDIALOG:\r
2270                 strcpy(szText,"About " );\r
2271                 strcat(szText,gszCaption);\r
2272                 SetWindowText(hwnd,gszCaption);\r
2273                 SetDlgItemText(hwnd,DLG_ABOUT_APP,szText);\r
2274                 /*      Application icon: */\r
2275                 SendDlgItemMessage( hwnd, DLG_ABOUT_ICON,\r
2276                         STM_SETICON, (WPARAM)(HICON)LoadIcon(ghInst,"GENSURF"),\r
2277                         (LPARAM) NULL);\r
2278 \r
2279                 hwndURL = GetDlgItem(hwnd,DLG_ABOUT_URL);\r
2280                 hdc = GetDC(hwndURL);\r
2281                 GetTextExtentPoint(hdc,GenSurfURL,strlen(GenSurfURL),&size);\r
2282                 ReleaseDC(hwndURL,hdc);\r
2283                 GetWindowRect(hwndURL,&rc);\r
2284                 SetWindowPos(hwndURL,(HWND)NULL,0,0,size.cx,size.cy+2,\r
2285                         SWP_NOMOVE | SWP_NOZORDER);\r
2286 \r
2287                 hwndURL = GetDlgItem(hwnd,DLG_ABOUT_BOARD);\r
2288                 hdc = GetDC(hwndURL);\r
2289                 GetTextExtentPoint(hdc,GenSurfBoard,strlen(GenSurfBoard),&size);\r
2290                 ReleaseDC(hwndURL,hdc);\r
2291                 GetWindowRect(hwndURL,&rc);\r
2292                 SetWindowPos(hwndURL,(HWND)NULL,0,0,size.cx,size.cy+2,\r
2293                         SWP_NOMOVE | SWP_NOZORDER);\r
2294 \r
2295                 return TRUE;\r
2296 \r
2297         case WM_COMMAND:\r
2298                 switch(LOWORD(wparam))\r
2299                 {\r
2300                 case DLG_ABOUT_URL:\r
2301                         HTTP(GenSurfURL);\r
2302                         break;\r
2303                 case DLG_ABOUT_BOARD:\r
2304                         HTTP(GenSurfBoard);\r
2305                         break;\r
2306                 case IDOK:\r
2307                         EndDialog(hwnd,1);\r
2308                         return TRUE;\r
2309                 }\r
2310                 break;\r
2311 \r
2312         case WM_DRAWITEM:\r
2313                 if(wparam == DLG_ABOUT_URL)\r
2314                 {\r
2315                         dis = (LPDRAWITEMSTRUCT)lparam;\r
2316                         SetTextColor(dis->hDC,RGB(0,0,255));\r
2317                         TextOut(dis->hDC,0,0,GenSurfURL,strlen(GenSurfURL));\r
2318                         GetWindowRect(dis->hwndItem,&rc);\r
2319                         GetTextExtentPoint(dis->hDC,GenSurfURL,strlen(GenSurfURL),&size);\r
2320                         hpen = CreatePen(PS_SOLID,0,RGB(0,0,255));\r
2321                         SelectObject(dis->hDC,hpen);\r
2322                         MoveToEx(dis->hDC,0,size.cy,NULL);\r
2323                         LineTo(dis->hDC,size.cx,size.cy);\r
2324                         SelectObject(dis->hDC,GetStockObject(BLACK_PEN));\r
2325                         DeleteObject(hpen);\r
2326                 }\r
2327                 else if(wparam==DLG_ABOUT_BOARD)\r
2328                 {\r
2329                         dis = (LPDRAWITEMSTRUCT)lparam;\r
2330                         SetTextColor(dis->hDC,RGB(0,0,255));\r
2331                         TextOut(dis->hDC,0,0,GenSurfBoard,strlen(GenSurfBoard));\r
2332                         GetWindowRect(dis->hwndItem,&rc);\r
2333                         GetTextExtentPoint(dis->hDC,GenSurfBoard,strlen(GenSurfBoard),&size);\r
2334                         hpen = CreatePen(PS_SOLID,0,RGB(0,0,255));\r
2335                         SelectObject(dis->hDC,hpen);\r
2336                         MoveToEx(dis->hDC,0,size.cy,NULL);\r
2337                         LineTo(dis->hDC,size.cx,size.cy);\r
2338                         SelectObject(dis->hDC,GetStockObject(BLACK_PEN));\r
2339                         DeleteObject(hpen);\r
2340                 }\r
2341                 break;\r
2342 \r
2343         case WM_CLOSE:\r
2344                 EndDialog(hwnd,1);\r
2345                 return TRUE;\r
2346 \r
2347         default:\r
2348                 return FALSE;\r
2349         }\r
2350         return FALSE;\r
2351         \r
2352 } /* AboutDlgProc */\r
2353 \r
2354 void About()\r
2355 {\r
2356         if( DialogBox( ghInst,"About", ghwnd_main, (DLGPROC)AboutDlgProc ) < 0)\r
2357         {\r
2358                 char Text[256];\r
2359                 sprintf(Text,"In About(), GetLastError()=0x%08x",GetLastError());\r
2360                 MessageBox(ghwnd_main,Text,"GenSurf",MB_ICONEXCLAMATION);\r
2361         }\r
2362 }\r
2363 \r
2364 #endif \r