2 GenSurf plugin for GtkRadiant
3 Copyright (C) 2001 David Hyde, Loki software and qeradiant.com
5 This library is free software; you can redistribute it and/or
6 modify it under the terms of the GNU Lesser General Public
7 License as published by the Free Software Foundation; either
8 version 2.1 of the License, or (at your option) any later version.
10 This library is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 Lesser General Public License for more details.
15 You should have received a copy of the GNU Lesser General Public
16 License along with this library; if not, write to the Free Software
17 Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
30 #define FIXPOINTS_TAB 3
32 //#define BUFF_SIZE 32768
34 #define ENABLE_WIDGET(name,enable) \
35 gtk_widget_set_sensitive (GTK_WIDGET (g_object_get_data (G_OBJECT (g_pWnd), (name))), (enable))
36 #define CHECK_WIDGET(name,check) \
37 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (g_object_get_data (G_OBJECT (g_pWnd), name)), check)
39 static GtkWidget *game_radios[NUMGAMES];
40 static GtkWidget *wave_radios[5];
41 static GtkWidget *plane_radios[6];
42 static guint current_tab;
43 static int OldPreview;
45 static GtkTooltips *tooltips;
46 static int FirstPassComplete = 0;
48 void About (GtkWidget *parent)
57 "................................",
58 "................................",
59 "................................",
60 "................................",
61 "................................",
62 "................................",
63 "................................",
64 "...............++...............",
65 ".............++++++.............",
66 "............++@+++@+............",
67 "..........+++..++..+++..........",
68 "........++.+.++..++.+.@+........",
69 ".......+..+..+.++.+..+..++......",
70 ".....++..++.+..++..+.++..++.....",
71 "...++..++...+.+..+.++..++..++...",
72 "..++.+.++....++..++....++.+..+..",
73 ".+.+..+..++....++....++..++.+.+.",
74 "..+++....+.++++++++++.+....+++..",
75 "....++.@@+++++.++.++++@++.++....",
76 "......+++++++......++@+++++.....",
77 ".......+++.+.++..++.+..++.......",
78 ".........++..+.++.+..++.........",
79 "...........++..++..++...........",
80 ".............++..+.+............",
81 "..............+..+@.............",
82 "...............@@...............",
83 "................................",
84 "................................",
85 "................................",
86 "................................",
87 "................................",
88 "................................"
91 // leo: I'm too lazy to create a nice about box
92 // ^Fishman - I am lazy too :P.
93 g_FuncTable.m_pfnMessageBox (parent, "GtkGenSurf 1.05\n\n"
95 "David Hyde (rascal@vicksburg.com)\n\n"
97 "Leonardo Zide (leo@lokigames.com)\n\n"
99 "Pablo Zurita (pablo@qeradiant.com)\n"
100 "Hydra (hydra@hydras-world.com)",
101 "About GtkGenSurf", MB_OK, NULL);
104 // =============================================================================
107 static void SetupControls ()
117 gtk_widget_hide (GTK_WIDGET (g_object_get_data (G_OBJECT (g_pWnd), "use_patches")));
118 ENABLE_WIDGET ("use_patches", FALSE);
122 gtk_widget_show (GTK_WIDGET (g_object_get_data (G_OBJECT (g_pWnd), "use_patches")));
123 ENABLE_WIDGET ("use_patches", TRUE);
126 if (Game == QUAKE3 && UsePatches != 0)
128 ENABLE_WIDGET ("decimate", FALSE);
130 gtk_label_set_text (GTK_LABEL (g_object_get_data (G_OBJECT (g_pWnd), "snap_text")), "Snap to grid:"); // ^Fishman - Snap to grid.
134 if (WaveType != WAVE_BITMAP)
136 ENABLE_WIDGET ("bmp_file", FALSE);
137 ENABLE_WIDGET ("bmp_file_browse", FALSE);
138 ENABLE_WIDGET ("bmp_black", FALSE);
139 ENABLE_WIDGET ("bmp_white", FALSE);
140 ENABLE_WIDGET ("bmp_text1", FALSE);
141 ENABLE_WIDGET ("bmp_text2", FALSE);
142 ENABLE_WIDGET ("bmp_text3", FALSE);
143 ENABLE_WIDGET ("bmp_reload", FALSE);
144 gtk_label_set_text (GTK_LABEL (g_object_get_data (G_OBJECT (g_pWnd), "bmp_note")),
145 "These options are disabled unless \"From Bitmap\"\n"
146 "is selected as the Waveform on the General tab.");
150 ENABLE_WIDGET ("bmp_file", TRUE);
151 ENABLE_WIDGET ("bmp_file_browse", TRUE);
152 ENABLE_WIDGET ("bmp_black", TRUE);
153 ENABLE_WIDGET ("bmp_white", TRUE);
154 ENABLE_WIDGET ("bmp_text1", TRUE);
155 ENABLE_WIDGET ("bmp_text2", TRUE);
156 ENABLE_WIDGET ("bmp_text3", TRUE);
157 ENABLE_WIDGET ("bmp_reload", strlen(gbmp.name) != 0);
158 gtk_label_set_text (GTK_LABEL (g_object_get_data (G_OBJECT (g_pWnd), "bmp_note")),
159 "GenSurf works only with 8-bit bitmaps. Color indices are\n"
160 "mapped to values for each vertex. Generally, gray scale\n"
161 "images are stored with black as color 0, white as color 255.");
166 ENABLE_WIDGET ("fix_value", (NumVerticesSelected != 0));
167 ENABLE_WIDGET ("fix_value_text", (NumVerticesSelected != 0));
168 ENABLE_WIDGET ("fix_free", (NumVerticesSelected != 0));
169 ENABLE_WIDGET ("fix_range", ((NumVerticesSelected != 0) && (WaveType != WAVE_ROUGH_ONLY)));
170 ENABLE_WIDGET ("fix_range_text", ((NumVerticesSelected != 0) && (WaveType != WAVE_ROUGH_ONLY)));
171 ENABLE_WIDGET ("fix_rate", ((NumVerticesSelected != 0) && (WaveType != WAVE_ROUGH_ONLY)));
172 ENABLE_WIDGET ("fix_rate_text", ((NumVerticesSelected != 0) && (WaveType != WAVE_ROUGH_ONLY)));
176 ENABLE_WIDGET ("texture2", (UsePatches == 0));
177 ENABLE_WIDGET ("texture3", (UsePatches == 0));
178 ENABLE_WIDGET ("tex_slant", (UsePatches == 0));
179 ENABLE_WIDGET ("detail", (UsePatches == 0));
182 ENABLE_WIDGET ("terrain_ent", FALSE); // ^Fishman - Adds terrain key to func_group.
183 ENABLE_WIDGET ("hint", (UsePatches == 0));
192 ENABLE_WIDGET ("amplitude", TRUE);
193 ENABLE_WIDGET ("wavelength", TRUE);
194 ENABLE_WIDGET ("z00", TRUE);
195 ENABLE_WIDGET ("z01", TRUE);
196 ENABLE_WIDGET ("z10", TRUE);
197 ENABLE_WIDGET ("z11", TRUE);
198 ENABLE_WIDGET ("linearborder", TRUE);
199 ENABLE_WIDGET ("go", TRUE);
202 ENABLE_WIDGET ("amplitude", FALSE);
203 ENABLE_WIDGET ("wavelength", FALSE);
204 ENABLE_WIDGET ("z00", FALSE);
205 ENABLE_WIDGET ("z01", FALSE);
206 ENABLE_WIDGET ("z10", FALSE);
207 ENABLE_WIDGET ("z11", FALSE);
208 ENABLE_WIDGET ("linearborder", FALSE);
209 ENABLE_WIDGET ("go", (gbmp.colors != NULL ? TRUE : FALSE));
211 case WAVE_ROUGH_ONLY:
212 ENABLE_WIDGET ("amplitude", FALSE);
213 ENABLE_WIDGET ("wavelength", FALSE);
214 ENABLE_WIDGET ("z00", TRUE);
215 ENABLE_WIDGET ("z01", TRUE);
216 ENABLE_WIDGET ("z10", TRUE);
217 ENABLE_WIDGET ("z11", TRUE);
218 ENABLE_WIDGET ("linearborder", TRUE);
219 ENABLE_WIDGET ("go", TRUE);
222 ENABLE_WIDGET ("amplitude", TRUE);
223 ENABLE_WIDGET ("wavelength", TRUE);
224 ENABLE_WIDGET ("z00", TRUE);
225 ENABLE_WIDGET ("z01", TRUE);
226 ENABLE_WIDGET ("z10", TRUE);
227 ENABLE_WIDGET ("z11", TRUE);
228 ENABLE_WIDGET ("linearborder", TRUE);
229 ENABLE_WIDGET ("go", TRUE);
236 gtk_label_set_text (GTK_LABEL (g_object_get_data (G_OBJECT (g_pWnd), "hmin_text")), "X:");
237 gtk_label_set_text (GTK_LABEL (g_object_get_data (G_OBJECT (g_pWnd), "hmax_text")), "X:");
238 gtk_label_set_text (GTK_LABEL (g_object_get_data (G_OBJECT (g_pWnd), "vmin_text")), "Z:");
239 gtk_label_set_text (GTK_LABEL (g_object_get_data (G_OBJECT (g_pWnd), "vmax_text")), "Z:");
240 gtk_label_set_text (GTK_LABEL (g_object_get_data (G_OBJECT (g_pWnd), "nh_text")), "X:");
241 gtk_label_set_text (GTK_LABEL (g_object_get_data (G_OBJECT (g_pWnd), "nv_text")), "Z:");
245 gtk_label_set_text (GTK_LABEL (g_object_get_data (G_OBJECT (g_pWnd), "hmin_text")), "Y:");
246 gtk_label_set_text (GTK_LABEL (g_object_get_data (G_OBJECT (g_pWnd), "hmax_text")), "Y:");
247 gtk_label_set_text (GTK_LABEL (g_object_get_data (G_OBJECT (g_pWnd), "vmin_text")), "Z:");
248 gtk_label_set_text (GTK_LABEL (g_object_get_data (G_OBJECT (g_pWnd), "vmax_text")), "Z:");
249 gtk_label_set_text (GTK_LABEL (g_object_get_data (G_OBJECT (g_pWnd), "nh_text")), "Y:");
250 gtk_label_set_text (GTK_LABEL (g_object_get_data (G_OBJECT (g_pWnd), "nv_text")), "Z:");
253 gtk_label_set_text (GTK_LABEL (g_object_get_data (G_OBJECT (g_pWnd), "hmin_text")), "X:");
254 gtk_label_set_text (GTK_LABEL (g_object_get_data (G_OBJECT (g_pWnd), "hmax_text")), "X:");
255 gtk_label_set_text (GTK_LABEL (g_object_get_data (G_OBJECT (g_pWnd), "vmin_text")), "Y:");
256 gtk_label_set_text (GTK_LABEL (g_object_get_data (G_OBJECT (g_pWnd), "vmax_text")), "Y:");
257 gtk_label_set_text (GTK_LABEL (g_object_get_data (G_OBJECT (g_pWnd), "nh_text")), "X:");
258 gtk_label_set_text (GTK_LABEL (g_object_get_data (G_OBJECT (g_pWnd), "nv_text")), "Y:");
263 // SetDlgValues fills in text boxes and initializes other input controls
264 static void SetDlgValues (int tab)
267 char RForm[16] = "%.5g";
273 // mattn: Deactivated because one wasn't able to switch the gametype or orientation
275 // Hell if I know why, but in the release build the 2nd pass thru the
276 // set_sensitive loop for game_radios crashes. No need to do this more
278 if (!FirstPassComplete)
280 for (i = 0; i < NUMGAMES; i++)
281 gtk_widget_set_sensitive (game_radios[i], (i == Game ? TRUE : FALSE));
282 for (i = 0; i < 6; i++)
283 gtk_widget_set_sensitive (plane_radios[i], (i == Plane ? TRUE : FALSE));
286 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (game_radios[Game]), TRUE);
287 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (plane_radios[Plane]), TRUE);
288 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (wave_radios[WaveType]), TRUE);
289 gtk_spin_button_set_value (GTK_SPIN_BUTTON (g_object_get_data (G_OBJECT (g_pWnd), "random")),
291 sprintf (Text, RForm, WaveLength);
292 gtk_entry_set_text (GTK_ENTRY (g_object_get_data (G_OBJECT (g_pWnd), "wavelength")), Text);
293 sprintf (Text, RForm, Amplitude);
294 gtk_entry_set_text (GTK_ENTRY (g_object_get_data (G_OBJECT (g_pWnd), "amplitude")), Text);
295 sprintf (Text, RForm, Roughness);
296 gtk_entry_set_text (GTK_ENTRY (g_object_get_data (G_OBJECT (g_pWnd), "roughness")), Text);
297 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (g_object_get_data
298 (G_OBJECT (g_pWnd), "main_antialiasing")), Antialiasing);
302 sprintf (Text,RForm,Hll);
303 gtk_entry_set_text (GTK_ENTRY (g_object_get_data (G_OBJECT (g_pWnd), "hmin")), Text);
304 sprintf (Text,RForm,Vll);
305 gtk_entry_set_text (GTK_ENTRY (g_object_get_data (G_OBJECT (g_pWnd), "vmin")), Text);
306 sprintf (Text,RForm,Hur);
307 gtk_entry_set_text (GTK_ENTRY (g_object_get_data (G_OBJECT (g_pWnd), "hmax")), Text);
308 sprintf (Text,RForm,Vur);
309 gtk_entry_set_text (GTK_ENTRY (g_object_get_data (G_OBJECT (g_pWnd), "vmax")), Text);
310 sprintf (Text,RForm,Z00);
311 gtk_entry_set_text (GTK_ENTRY (g_object_get_data (G_OBJECT (g_pWnd), "z00")), Text);
312 sprintf (Text,RForm,Z01);
313 gtk_entry_set_text (GTK_ENTRY (g_object_get_data (G_OBJECT (g_pWnd), "z01")), Text);
314 sprintf (Text,RForm,Z10);
315 gtk_entry_set_text (GTK_ENTRY (g_object_get_data (G_OBJECT (g_pWnd), "z10")), Text);
316 sprintf (Text,RForm,Z11);
317 gtk_entry_set_text (GTK_ENTRY (g_object_get_data (G_OBJECT (g_pWnd), "z11")), Text);
318 gtk_spin_button_set_value (GTK_SPIN_BUTTON (g_object_get_data (G_OBJECT (g_pWnd), "nh")), NH);
319 gtk_spin_button_set_value (GTK_SPIN_BUTTON (g_object_get_data (G_OBJECT (g_pWnd), "nv")), NV);
320 gtk_spin_button_set_value (GTK_SPIN_BUTTON (g_object_get_data (G_OBJECT (g_pWnd), "sp")), SP); // ^Fishman - Snap to grid.
322 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (g_object_get_data
323 (G_OBJECT (g_pWnd), "linearborder")), FixBorders);
324 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (g_object_get_data
325 (G_OBJECT (g_pWnd), "use_patches")), UsePatches);
326 gtk_adjustment_set_value (GTK_ADJUSTMENT (g_object_get_data (G_OBJECT (g_pWnd), "decimate_adj")),
329 if (Game == QUAKE3 && UsePatches)
331 gtk_widget_set_sensitive (GTK_WIDGET (g_object_get_data (G_OBJECT (g_pWnd), "decimate")), FALSE);
336 if (NH > MAX_ROWS) NH -= 2;
337 SetDlgValues (current_tab);
343 if (NV > MAX_ROWS) NV -= 2;
344 SetDlgValues (current_tab);
348 if (NH > MAX_ROWS) NH = MAX_ROWS;
351 if (NV > MAX_ROWS) NV = MAX_ROWS;
353 gpointer spin = g_object_get_data (G_OBJECT (g_pWnd), "nh");
354 GtkAdjustment *adj = gtk_spin_button_get_adjustment (GTK_SPIN_BUTTON (spin));
356 gtk_adjustment_changed (adj);
357 spin = g_object_get_data (G_OBJECT (g_pWnd), "nv");
358 adj = gtk_spin_button_get_adjustment (GTK_SPIN_BUTTON (spin));
360 gtk_adjustment_changed (adj);
364 gtk_widget_set_sensitive (GTK_WIDGET (g_object_get_data (G_OBJECT (g_pWnd), "decimate")), TRUE);
366 gpointer spin = g_object_get_data (G_OBJECT (g_pWnd), "nh");
367 GtkAdjustment *adj = gtk_spin_button_get_adjustment (GTK_SPIN_BUTTON (spin));
369 gtk_adjustment_changed (adj);
370 spin = g_object_get_data (G_OBJECT (g_pWnd), "nv");
371 adj = gtk_spin_button_get_adjustment (GTK_SPIN_BUTTON (spin));
373 gtk_adjustment_changed (adj);
376 gtk_spin_button_set_value (GTK_SPIN_BUTTON (g_object_get_data (G_OBJECT (g_pWnd), "nh")), NH);
377 gtk_spin_button_set_value (GTK_SPIN_BUTTON (g_object_get_data (G_OBJECT (g_pWnd), "nv")), NV);
382 gtk_entry_set_text (GTK_ENTRY (g_object_get_data (G_OBJECT (g_pWnd), "bmp_file")), gbmp.name);
383 sprintf(Text,"%g",gbmp.black_value);
384 gtk_entry_set_text (GTK_ENTRY (g_object_get_data (G_OBJECT (g_pWnd), "bmp_black")), Text);
385 sprintf(Text,"%g",gbmp.white_value);
386 gtk_entry_set_text (GTK_ENTRY (g_object_get_data (G_OBJECT (g_pWnd), "bmp_white")), Text);
393 gtk_entry_set_text (GTK_ENTRY (g_object_get_data (G_OBJECT (g_pWnd), "texture1")), Texture[Game][0]);
394 gtk_entry_set_text (GTK_ENTRY (g_object_get_data (G_OBJECT (g_pWnd), "texture2")), Texture[Game][1]);
395 gtk_entry_set_text (GTK_ENTRY (g_object_get_data (G_OBJECT (g_pWnd), "texture3")), Texture[Game][2]);
396 gtk_spin_button_set_value (GTK_SPIN_BUTTON (g_object_get_data (G_OBJECT (g_pWnd), "tex_slant")),
398 sprintf(Text,RForm,TexOffset[0]);
399 gtk_entry_set_text (GTK_ENTRY (g_object_get_data (G_OBJECT (g_pWnd), "texoffsetx")), Text);
400 sprintf(Text,RForm,TexOffset[1]);
401 gtk_entry_set_text (GTK_ENTRY (g_object_get_data (G_OBJECT (g_pWnd), "texoffsety")), Text);
402 sprintf(Text,RForm,TexScale[0]);
403 gtk_entry_set_text (GTK_ENTRY (g_object_get_data (G_OBJECT (g_pWnd), "texscalex")), Text);
404 sprintf(Text,RForm,TexScale[1]);
405 gtk_entry_set_text (GTK_ENTRY (g_object_get_data (G_OBJECT (g_pWnd), "texscaley")), Text);
406 CHECK_WIDGET ("detail", UseDetail);
410 ENABLE_WIDGET ("hint", FALSE);
414 ENABLE_WIDGET ("hint", TRUE);
415 CHECK_WIDGET ("hint", AddHints);
420 // ArghRad doesn't currently support SiN
421 EnableWindow(GetDlgItem(hwndDisplay,DLG_ARGHRAD2), 0);
422 EnableWindow(GetDlgItem(hwndDisplay,DLG_ARGHRAD2_SPIN), 0);
423 ShowWindow(GetDlgItem(hwndDisplay,DLG_ARGHRAD2_TEXT), SW_HIDE);
424 ShowWindow(GetDlgItem(hwndDisplay,DLG_ARGHRAD2), SW_HIDE);
425 ShowWindow(GetDlgItem(hwndDisplay,DLG_ARGHRAD2_SPIN), SW_HIDE);
426 SetDlgItemText(hwndDisplay,DLG_TEX_USEPAK,"Use sin file");
427 SetDlgItemText(hwndDisplay,DLG_TEX_PAK_TEXT,"Sin:");
434 // ArghRad sun is inapplicable (so far)
435 EnableWindow(GetDlgItem(hwndDisplay,DLG_ARGHRAD2), 0);
436 EnableWindow(GetDlgItem(hwndDisplay,DLG_ARGHRAD2_SPIN), 0);
437 ShowWindow(GetDlgItem(hwndDisplay,DLG_ARGHRAD2_TEXT), SW_HIDE);
438 ShowWindow(GetDlgItem(hwndDisplay,DLG_ARGHRAD2), SW_HIDE);
439 ShowWindow(GetDlgItem(hwndDisplay,DLG_ARGHRAD2_SPIN), SW_HIDE);
441 EnableWindow(GetDlgItem(hwndDisplay,DLG_LADDER), 0);
442 ShowWindow(GetDlgItem(hwndDisplay,DLG_LADDER), SW_HIDE);
443 SetDlgItemText(hwndDisplay,DLG_TEX_USEPAK,"Use pk3 file");
444 SetDlgItemText(hwndDisplay,DLG_TEX_PAK_TEXT,"PK3:");
448 /*trix if(Game==HERETIC2)
450 // ArghRad doesn't currently support Heretic2
451 EnableWindow(GetDlgItem(hwndDisplay,DLG_ARGHRAD2), 0);
452 EnableWindow(GetDlgItem(hwndDisplay,DLG_ARGHRAD2_SPIN), 0);
453 ShowWindow(GetDlgItem(hwndDisplay,DLG_ARGHRAD2_TEXT), SW_HIDE);
454 ShowWindow(GetDlgItem(hwndDisplay,DLG_ARGHRAD2), SW_HIDE);
455 ShowWindow(GetDlgItem(hwndDisplay,DLG_ARGHRAD2_SPIN), SW_HIDE);
457 SetDlgItemText(hwndDisplay,DLG_TEX_USEPAK,"Use pak file");
458 SetDlgItemText(hwndDisplay,DLG_TEX_PAK_TEXT,"Pak:");
463 // A bunch of controls aren't applicable to HL
464 EnableWindow(GetDlgItem(hwndDisplay,DLG_TEXTURE_BROWSE), 0);
465 EnableWindow(GetDlgItem(hwndDisplay,DLG_TEXTURE2_BROWSE),0);
466 EnableWindow(GetDlgItem(hwndDisplay,DLG_TEXTURE3_BROWSE),0);
467 EnableWindow(GetDlgItem(hwndDisplay,DLG_DETAIL), 0);
468 EnableWindow(GetDlgItem(hwndDisplay,DLG_LADDER), 0);
469 EnableWindow(GetDlgItem(hwndDisplay,DLG_ARGHRAD2), 0);
470 EnableWindow(GetDlgItem(hwndDisplay,DLG_ARGHRAD2_SPIN), 0);
471 ShowWindow(GetDlgItem(hwndDisplay,DLG_TEXTURE_BROWSE), SW_HIDE);
472 ShowWindow(GetDlgItem(hwndDisplay,DLG_TEXTURE2_BROWSE),SW_HIDE);
473 ShowWindow(GetDlgItem(hwndDisplay,DLG_TEXTURE3_BROWSE),SW_HIDE);
474 ShowWindow(GetDlgItem(hwndDisplay,DLG_DETAIL), SW_HIDE);
475 ShowWindow(GetDlgItem(hwndDisplay,DLG_LADDER), SW_HIDE);
476 ShowWindow(GetDlgItem(hwndDisplay,DLG_ARGHRAD2_TEXT), SW_HIDE);
477 ShowWindow(GetDlgItem(hwndDisplay,DLG_ARGHRAD2), SW_HIDE);
478 ShowWindow(GetDlgItem(hwndDisplay,DLG_ARGHRAD2_SPIN), SW_HIDE);
480 SetDlgItemText(hwndDisplay,DLG_TEX_USEPAK,"Use wad file");
481 SetDlgItemText(hwndDisplay,DLG_TEX_PAK_TEXT,"Wad:");
482 SetDlgItemText(hwndDisplay,DLG_HINT,"Hint brushes");
487 // No Q2-type compilers support Genesis3D (including ArghRad)
488 EnableWindow(GetDlgItem(hwndDisplay,DLG_ARGHRAD2), 0);
489 EnableWindow(GetDlgItem(hwndDisplay,DLG_ARGHRAD2_SPIN), 0);
490 ShowWindow(GetDlgItem(hwndDisplay,DLG_ARGHRAD2_TEXT), SW_HIDE);
491 ShowWindow(GetDlgItem(hwndDisplay,DLG_ARGHRAD2), SW_HIDE);
492 ShowWindow(GetDlgItem(hwndDisplay,DLG_ARGHRAD2_SPIN), SW_HIDE);
494 SetDlgItemText(hwndDisplay,DLG_TEX_USEPAK,"Use sin file");
495 SetDlgItemText(hwndDisplay,DLG_TEX_PAK_TEXT,"Sin:");
503 static void ReadDlgValues (int tab)
512 Roughness = atof ( gtk_entry_get_text (GTK_ENTRY (g_object_get_data (G_OBJECT (g_pWnd), "roughness"))));
513 WaveLength = atof ( gtk_entry_get_text (GTK_ENTRY (g_object_get_data (G_OBJECT (g_pWnd), "wavelength"))));
514 Amplitude = atof ( gtk_entry_get_text (GTK_ENTRY (g_object_get_data (G_OBJECT (g_pWnd), "amplitude"))));
515 spin = g_object_get_data (G_OBJECT (g_pWnd), "random");
516 RandomSeed = gtk_spin_button_get_value_as_int (GTK_SPIN_BUTTON (spin));
520 SP = atoi (gtk_entry_get_text (GTK_ENTRY (g_object_get_data (G_OBJECT (g_pWnd), "sp"))));
521 NH = atoi (gtk_entry_get_text (GTK_ENTRY (g_object_get_data (G_OBJECT (g_pWnd), "nh"))));
522 NV = atoi (gtk_entry_get_text (GTK_ENTRY (g_object_get_data (G_OBJECT (g_pWnd), "nv"))));
524 if (Game == QUAKE3 && UsePatches != 0)
528 if (NH > MAX_ROWS) NH = MAX_ROWS;
531 if (NV > MAX_ROWS) NV = MAX_ROWS;
538 if (WaveType == WAVE_BITMAP)
540 GetDlgItemText(hwnd,DLG_BMP_FILE,gbmp.name,sizeof(gbmp.name));
542 GetDlgItemText(hwnd,DLG_BMP_BLACK,Text,sizeof(Text));
543 gbmp.black_value = atof(Text);
544 GetDlgItemText(hwnd,DLG_BMP_WHITE,Text,sizeof(Text));
545 gbmp.white_value = atof(Text);
551 GetDlgItemText(hwnd,DLG_FIX_VALUE,Text,sizeof(Text));
552 temp.fixed_value = atoi(Text);
553 GetDlgItemText(hwnd,DLG_FIX_RANGE,Text,sizeof(Text));
554 temp.range = atoi(Text);
555 GetDlgItemText(hwnd,DLG_FIX_RATE, Text,sizeof(Text));
556 temp.rate = atof(Text);
557 for(k=0; k<NumVerticesSelected; k++)
559 xyz[Vertex[k].i][Vertex[k].j].fixed_value = temp.fixed_value;
560 xyz[Vertex[k].i][Vertex[k].j].range = temp.range;
561 xyz[Vertex[k].i][Vertex[k].j].rate = temp.rate;
566 CheckDlgButton(ghwnd,DLG_PREVIEW,0);
567 SendMessage(ghwnd,WM_COMMAND,DLG_PREVIEW,0);
576 i = SendDlgItemMessage( hwndDisplay, DLG_TEX_LIST1, CB_GETCURSEL, 0, 0 );
578 Texture[Game][0][0] = '\0';
580 SendDlgItemMessage( hwndDisplay, DLG_TEX_LIST1, CB_GETLBTEXT, i,
581 (LPARAM)(LPCSTR)Texture[Game][0]);
583 i = SendDlgItemMessage( hwndDisplay, DLG_TEX_LIST2, CB_GETCURSEL, 0, 0 );
585 Texture[Game][1][0] = '\0';
587 SendDlgItemMessage( hwndDisplay, DLG_TEX_LIST2, CB_GETLBTEXT, i,
588 (LPARAM)(LPCSTR)Texture[Game][1]);
590 i = SendDlgItemMessage( hwndDisplay, DLG_TEX_LIST3, CB_GETCURSEL, 0, 0 );
592 Texture[Game][2][0] = '\0';
594 SendDlgItemMessage( hwndDisplay, DLG_TEX_LIST3, CB_GETLBTEXT, i,
595 (LPARAM)(LPCSTR)Texture[Game][2]);
599 GetDlgItemText(hwndDisplay,DLG_TEXTURE, Texture[Game][0],sizeof(Texture[Game][0]));
600 GetDlgItemText(hwndDisplay,DLG_TEXTURE2,Texture[Game][1],sizeof(Texture[Game][1]));
601 GetDlgItemText(hwndDisplay,DLG_TEXTURE3,Texture[Game][2],sizeof(Texture[Game][2]));
603 GetDlgItemText(hwndDisplay,DLG_TEX_SLANT,Text,sizeof(Text));
604 SlantAngle = atoi(Text);
605 SlantAngle = max(0,min(SlantAngle,90));
606 GetDlgItemText(hwndDisplay,DLG_TEXOFFSETX,Text,sizeof(Text));
607 TexOffset[0] = atof(Text);
608 GetDlgItemText(hwndDisplay,DLG_TEXOFFSETY,Text,sizeof(Text));
609 TexOffset[1] = atof(Text);
610 GetDlgItemText(hwndDisplay,DLG_TEXSCALEX,Text,sizeof(Text));
611 TexScale[0] = atof(Text);
612 if(TexScale[0] == 0.) TexScale[0] = 1.0;
613 GetDlgItemText(hwndDisplay,DLG_TEXSCALEY,Text,sizeof(Text));
614 TexScale[1] = atof(Text);
615 if(TexScale[1] == 0.) TexScale[1] = 1.0;
616 GetDlgItemText(hwndDisplay,DLG_ARGHRAD2,Text,sizeof(Text));
617 ArghRad2 = atoi(Text);
623 // =============================================================================
624 // main dialog callbacks
626 static void switch_page (GtkNotebook *notebook, GtkNotebookPage *page, guint page_num, gpointer data)
628 if (current_tab != page_num)
630 if (page_num == FIXPOINTS_TAB)
632 OldPreview = Preview;
633 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (g_object_get_data (G_OBJECT (g_pWnd),
634 "main_preview")), TRUE);
636 UpdatePreview (true);
637 NumVerticesSelected = 0;
640 if (current_tab == FIXPOINTS_TAB)
643 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (g_object_get_data (G_OBJECT (g_pWnd),
644 "main_preview")), FALSE);
646 UpdatePreview (true);
647 NumVerticesSelected = 0;
650 if (page_num == TEXTURE_TAB)
652 WasDetail = UseDetail;
656 ENABLE_WIDGET ("detail", FALSE);
660 ReadDlgValues (current_tab);
661 current_tab = page_num;
662 SetDlgValues (current_tab);
666 static gint main_close (GtkWidget *widget, gpointer data)
668 gtk_widget_hide (g_pWnd);
669 gtk_widget_hide (g_pWndPreview);
674 static void main_save (GtkWidget *widget, gpointer data)
676 ReadDlgValues (current_tab);
680 static void main_open (GtkWidget *widget, gpointer data)
682 OpenSetup (g_pWnd, 0);
683 for (int i = 0; i < 5; i++)
688 static void main_defaults (GtkWidget *widget, gpointer data)
690 OpenSetup (g_pWnd, 1);
691 for (int i = 0; i < 5; i++)
696 static void main_preview (GtkWidget *widget, gpointer data)
698 Preview = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (widget));
702 // ^Fishman - Antializing for the preview window.
703 static void main_antialiasing (GtkWidget *widget, gpointer data)
705 Antialiasing = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (widget));
706 UpdatePreview (true);
709 static void main_about (GtkWidget *widget, gpointer data)
714 static void main_go (GtkWidget *widget, gpointer data)
716 GtkWidget *notebook = GTK_WIDGET (g_object_get_data (G_OBJECT (g_pWnd), "notebook"));
719 ReadDlgValues (current_tab);
720 if (NH < 1 || NH > MAX_ROWS)
722 sprintf (Text, "The number of divisions must be > 0 and no greater than %d.", MAX_ROWS);
723 g_FuncTable.m_pfnMessageBox (g_pWnd, Text, "GenSurf", MB_ICONEXCLAMATION, NULL);
724 gtk_notebook_set_page (GTK_NOTEBOOK (notebook), EXTENTS_TAB);
728 if (NV < 1 || NV > MAX_ROWS)
730 sprintf (Text, "The number of divisions must be > 0 and no greater than %d.", MAX_ROWS);
731 g_FuncTable.m_pfnMessageBox (g_pWnd, Text, "GenSurf", MB_ICONEXCLAMATION, NULL);
732 gtk_notebook_set_page (GTK_NOTEBOOK (notebook), EXTENTS_TAB);
738 g_FuncTable.m_pfnMessageBox (g_pWnd, "The \"lower-left\" values must be less than "
739 "the corresponding \"upper-right\" values in "
740 "the \"Extent\" box.","GenSurf", MB_OK | MB_ICONEXCLAMATION, NULL);
741 gtk_notebook_set_page (GTK_NOTEBOOK (notebook), EXTENTS_TAB);
747 g_FuncTable.m_pfnMessageBox (g_pWnd,"The \"lower-left\" values must be less than "
748 "the corresponding \"upper-right\" values in "
749 "the \"Extent\" box.","GenSurf", MB_OK | MB_ICONEXCLAMATION, NULL);
750 gtk_notebook_set_page (GTK_NOTEBOOK (notebook), EXTENTS_TAB);
754 if (!strlen (Texture[Game][0]))
756 g_FuncTable.m_pfnMessageBox (g_pWnd, "You must supply a texture name.", "GenSurf", MB_ICONEXCLAMATION, NULL);
757 gtk_notebook_set_page (GTK_NOTEBOOK (notebook), EXTENTS_TAB);
761 /* if (Decimate>0 && GimpHints!=0)
763 MessageBox(hwnd,"You've elected to use a decimated grid and gimp's non-detail hint brushes. "
764 "This combination usually produces bizarre visual errors in the game, "
765 "so GenSurf has turned off the hint brush option.",
766 "GenSurf",MB_ICONEXCLAMATION);
770 gtk_widget_hide (g_pWnd);
772 gtk_widget_hide (g_pWndPreview);
775 WriteIniFile(gszIni);
778 // =============================================================================
779 // general tab callbacks
781 static void general_game (GtkToggleButton *widget, gpointer data)
783 if (gtk_toggle_button_get_active (widget))
785 Game = GPOINTER_TO_INT (data);
786 UpdatePreview (TRUE);
790 static void general_plane (GtkToggleButton *widget, gpointer data)
792 if (gtk_toggle_button_get_active (widget))
794 Plane = GPOINTER_TO_INT (data);
796 UpdatePreview (TRUE);
800 static void general_wave (GtkToggleButton *widget, gpointer data)
802 if (gtk_toggle_button_get_active (widget))
804 WaveType = GPOINTER_TO_INT (data);
806 UpdatePreview (TRUE);
810 static void general_random (GtkAdjustment *adj, gpointer data)
812 int nPos = (int)adj->value;
814 if (RandomSeed != nPos)
817 UpdatePreview (true);
821 // =============================================================================
822 // extents tab callbacks
824 static void extents_linearborder (GtkToggleButton *check, gpointer data)
826 FixBorders = gtk_toggle_button_get_active (check);
827 UpdatePreview (true);
830 static void extents_use_patches (GtkToggleButton *check, gpointer data)
835 UsePatches = gtk_toggle_button_get_active (check);
836 SetDlgValues (current_tab);
838 UpdatePreview (true);
841 static void extents_nhnv_spin (GtkAdjustment *adj, int *data)
843 int nPos = (int)adj->value;
847 if (Game==QUAKE3 && UsePatches && (nPos % 2))
853 gtk_adjustment_set_value (adj, *data);
857 UpdatePreview (true);
861 static void extents_decimate (GtkAdjustment *adj, gpointer data)
863 int nPos = (int)adj->value;
866 UpdatePreview (true);
869 // Hydra : snap to grid begin
870 /*static void extents_snaptogrid (GtkAdjustment *adj, gpointer data)
872 int nPos = (int)adj->value;
875 UpdatePreview (true);
878 // ^Fishman - Modified version of Hydra's snap to grid code.
879 static void extents_snaptogrid_spin (GtkAdjustment *adj, int *data)
881 int nPos = (int)adj->value;
883 UpdatePreview (true);
886 // =============================================================================
887 // bitmap tab callbacks
889 static gint bitmap_file_entryfocusout(GtkWidget* widget, GdkEventFocus* event, gpointer data)
891 char filename[NAME_MAX];
893 strcpy (filename, gtk_entry_get_text (GTK_ENTRY(widget)));
894 if(strcmp (filename,gbmp.name))
901 strcpy (gbmp.name,filename);
902 if (strlen(gbmp.name) )
904 ENABLE_WIDGET ("go", (gbmp.colors != NULL ? TRUE : FALSE));
909 static void bitmap_browse (GtkWidget *widget, gpointer data)
911 const char *filename;
914 filename = g_FuncTable.m_pfnFileDialog (g_pWnd, TRUE, "Bitmap File", gbmp.defpath, "gtkgensurf");
916 if (filename != NULL)
918 strcpy (gbmp.name, filename);
920 ptr = strrchr (filename, G_DIR_SEPARATOR);
924 strcpy (gbmp.defpath, filename);
928 ENABLE_WIDGET ("go", (gbmp.colors != NULL ? TRUE : FALSE));
932 static void bitmap_reload (GtkWidget *widget, gpointer data)
934 strcpy (gbmp.name, gtk_entry_get_text (GTK_ENTRY (g_object_get_data (G_OBJECT (g_pWnd), "bmp_file"))));
935 if(strlen (gbmp.name) )
938 ENABLE_WIDGET ("go", (gbmp.colors != NULL ? TRUE : FALSE));
941 ENABLE_WIDGET ("go", FALSE );
944 // =============================================================================
945 // fix points tab callbacks
947 static gint fix_value_entryfocusout (GtkWidget* widget, GdkEventFocus *event, gpointer data)
949 int i = atoi (gtk_entry_get_text (GTK_ENTRY(widget))), k;
952 if (i < -65536 || i > 65536)
955 g_FuncTable.m_pfnMessageBox (g_pWnd, "The value must be between -65536 and 65536, inclusive.",
956 "GenSurf", MB_OK | MB_ICONEXCLAMATION, NULL);
957 sprintf (Text, "%d", (int)xyz[Vertex[0].i][Vertex[0].j].fixed_value);
958 gtk_entry_set_text (GTK_ENTRY(widget), Text);
959 gtk_window_set_focus (GTK_WINDOW (gtk_widget_get_toplevel (widget)), widget);
961 else if (i != xyz[Vertex[0].i][Vertex[0].j].fixed_value)
963 for(k=0; k<NumVerticesSelected; k++)
964 xyz[Vertex[k].i][Vertex[k].j].fixed_value = i;
966 gtk_spin_button_set_value (GTK_SPIN_BUTTON (g_object_get_data (G_OBJECT (g_pWnd), "fix_value")),
967 (int)xyz[Vertex[0].i][Vertex[0].j].fixed_value);
968 UpdatePreview (true);
973 static void fix_value_changed (GtkAdjustment *adj, gpointer data)
975 int k, i = (int)adj->value;
977 if (xyz[Vertex[0].i][Vertex[0].j].fixed_value != i)
979 for(k=0; k<NumVerticesSelected; k++)
980 xyz[Vertex[k].i][Vertex[k].j].fixed_value = i;
985 static gint fix_range_entryfocusout (GtkWidget *widget, GdkEventFocus *event, gpointer data)
987 int i = atoi (gtk_entry_get_text (GTK_ENTRY(widget))), k;
989 if (i != xyz[Vertex[0].i][Vertex[0].j].range)
991 for (k=0; k<NumVerticesSelected; k++)
992 xyz[Vertex[k].i][Vertex[k].j].range = i;
993 UpdatePreview (true);
998 static gint fix_rate_entryfocusout (GtkWidget *widget, GdkEventFocus *event, gpointer data)
1000 double r = atof (gtk_entry_get_text (GTK_ENTRY(widget)));
1003 if (r != xyz[Vertex[0].i][Vertex[0].j].rate)
1005 for(k=0; k<NumVerticesSelected; k++)
1006 xyz[Vertex[k].i][Vertex[k].j].rate = r;
1007 UpdatePreview (true);
1012 static void fix_free (GtkWidget *widget, gpointer data)
1016 for (k=0; k<NumVerticesSelected; k++)
1017 xyz[Vertex[k].i][Vertex[k].j].fixed = 0;
1018 NumVerticesSelected = 0;
1020 UpdatePreview (true);
1023 static void fix_freeall (GtkWidget *widget, gpointer data)
1027 for (i=0; i<=NH; i++)
1029 for(j=0; j<=NV; j++)
1030 xyz[i][j].fixed = 0;
1032 fix_free (NULL, data); // keep these together
1035 void vertex_selected ()
1046 for(k=0; k<NumVerticesSelected; k++)
1047 xyz[Vertex[k].i][Vertex[k].j].fixed_value = xyz[Vertex[0].i][Vertex[0].j].p[1];
1051 for(k=0; k<NumVerticesSelected; k++)
1052 xyz[Vertex[k].i][Vertex[k].j].fixed_value = xyz[Vertex[0].i][Vertex[0].j].p[0];
1055 for(k=0; k<NumVerticesSelected; k++)
1056 xyz[Vertex[k].i][Vertex[k].j].fixed_value = xyz[Vertex[0].i][Vertex[0].j].p[2];
1060 gtk_spin_button_set_value (GTK_SPIN_BUTTON (g_object_get_data (G_OBJECT (g_pWnd), "fix_value")),
1061 (int)xyz[Vertex[0].i][Vertex[0].j].fixed_value);
1063 sprintf(Text,"%d",(int)xyz[Vertex[0].i][Vertex[0].j].range);
1064 gtk_entry_set_text (GTK_ENTRY (g_object_get_data (G_OBJECT (g_pWnd), "fix_range")), Text);
1065 sprintf(Text,"%.5g",xyz[Vertex[0].i][Vertex[0].j].rate);
1066 gtk_entry_set_text (GTK_ENTRY (g_object_get_data (G_OBJECT (g_pWnd), "fix_rate")), Text);
1068 for (k=0; k<NumVerticesSelected; k++)
1069 xyz[Vertex[k].i][Vertex[k].j].fixed = 1;
1071 UpdatePreview (true);
1074 // =============================================================================
1075 // texture tab callbacks
1077 static void texture_detail (GtkToggleButton *check, gpointer data)
1079 UseDetail = gtk_toggle_button_get_active (check);
1080 WasDetail = UseDetail;
1083 static void texture_hint (GtkToggleButton *check, gpointer data)
1085 AddHints = gtk_toggle_button_get_active (check);
1089 ENABLE_WIDGET ("detail", FALSE);
1093 UseDetail = WasDetail;
1094 ENABLE_WIDGET ("detail", FALSE);
1096 CHECK_WIDGET ("detail", UseDetail);
1099 // ^Fishman - Add terrain key to func_group.
1100 static void texture_terrainent (GtkToggleButton *check, gpointer data)
1102 AddTerrainKey = gtk_toggle_button_get_active (check);
1105 static void texture_set(int index, const char* name)
1107 strcpy(Texture[Game][index], name);
1110 static gint texture_entryfocusout(GtkWidget* widget, GdkEventFocus* event, gpointer data)
1112 texture_set(GPOINTER_TO_INT(data), gtk_entry_get_text(GTK_ENTRY(widget)));
1116 // =============================================================================
1119 static void UpdateVariable (GtkEntry *entry, GdkEventFocus *event, double *data)
1121 double x = atof (gtk_entry_get_text (entry));
1126 UpdatePreview (true);
1130 static gint doublevariable_entryfocusout(GtkWidget* widget, GdkEventFocus* event, gpointer data)
1132 UpdateVariable(GTK_ENTRY(widget), event, reinterpret_cast<double*>(data));
1136 // =============================================================================
1139 void create_tooltips ()
1141 tooltips = gtk_tooltips_new ();
1144 gtk_tooltips_set_tip(GTK_TOOLTIPS (tooltips),
1145 GTK_WIDGET (g_object_get_data (G_OBJECT (g_pWnd), "go")),
1146 "Accept all input and generate a surface in Q3Radiant",
1148 gtk_tooltips_set_tip(GTK_TOOLTIPS (tooltips),
1149 GTK_WIDGET (g_object_get_data (G_OBJECT (g_pWnd), "open")),
1150 "Open a previously saved GenSurf settings file.",
1152 gtk_tooltips_set_tip(GTK_TOOLTIPS (tooltips),
1153 GTK_WIDGET (g_object_get_data (G_OBJECT (g_pWnd), "save")),
1154 "Save all settings to a file.",
1156 gtk_tooltips_set_tip(GTK_TOOLTIPS (tooltips),
1157 GTK_WIDGET (g_object_get_data (G_OBJECT (g_pWnd), "defaults")),
1158 "Restore default values from DEFAULTS.SRF. If this file does not exist, GenSurf "
1159 "initializes all input parameters to reasonable values. You can create your own "
1160 "default surface by setting all parameters to your liking, then saving a settings "
1161 "file as DEFAULTS.SRF with the Save As button.",
1164 gtk_tooltips_set_tip(GTK_TOOLTIPS (tooltips),
1165 GTK_WIDGET (g_object_get_data (G_OBJECT (g_pWnd), "main_preview")),
1166 "View a wire-frame representation of the surface",
1169 gtk_tooltips_set_tip(GTK_TOOLTIPS (tooltips),
1170 GTK_WIDGET (g_object_get_data (G_OBJECT (g_pWnd), "main_antialiasing")),
1171 "The lines in the preview window are antialiased for better quality",
1175 gtk_tooltips_set_tip(GTK_TOOLTIPS (tooltips),
1176 GTK_WIDGET (wave_radios[0]),
1177 "Builds a surface with alternating hills and valleys. Uses the general form Z=cos(X) "
1180 gtk_tooltips_set_tip(GTK_TOOLTIPS (tooltips),
1181 GTK_WIDGET (wave_radios[1]),
1182 "Builds a surface with ridges parallel to the vertical axis.",
1184 gtk_tooltips_set_tip(GTK_TOOLTIPS (tooltips),
1185 GTK_WIDGET (wave_radios[2]),
1186 "Builds a surface with ridges parallel to the horizontal axis.",
1188 gtk_tooltips_set_tip(GTK_TOOLTIPS (tooltips),
1189 GTK_WIDGET (wave_radios[3]),
1190 "Builds a map from a bitmap image representing a contour plot. Click the \"Bitmap\" "
1191 "tab to select the image. GenSurf only supports 256-color (8 bit) "
1192 "bitmaps. GenSurf will work with any 256-color bitmap, but gray scale bitmaps are a bit "
1195 gtk_tooltips_set_tip(GTK_TOOLTIPS (tooltips),
1196 GTK_WIDGET (wave_radios[4]),
1197 "Builds a random surface using the Plasma Cloud technique. Variance is controlled "
1198 "by the Roughness input. To build a surface with completely random values not "
1199 "dependent on neighboring vertices, use one of the other waveforms with 0 amplitude.",
1201 gtk_tooltips_set_tip(GTK_TOOLTIPS (tooltips),
1202 GTK_WIDGET (g_object_get_data (G_OBJECT (g_pWnd), "wavelength")),
1203 "Enter the wavelength (distance between crests). NOTE: Wavelengths equal to the grid "
1204 "size or 2 times the grid size will result in 0 amplitudes. For best results, the "
1205 "wavelength value should be at least 4 times the grid size (extents divided by the "
1206 "number of divisions",
1208 gtk_tooltips_set_tip(GTK_TOOLTIPS (tooltips),
1209 GTK_WIDGET (g_object_get_data (G_OBJECT (g_pWnd), "amplitude")),
1210 "Enter the height of hills/ridges.",
1212 gtk_tooltips_set_tip(GTK_TOOLTIPS (tooltips),
1213 GTK_WIDGET (g_object_get_data (G_OBJECT (g_pWnd), "roughness")),
1214 "Enter the roughness value (noise) for the surface. For fractal surfaces, this value "
1215 "is used as a variance in the fractal calculations.",
1217 gtk_tooltips_set_tip(GTK_TOOLTIPS (tooltips),
1218 GTK_WIDGET (g_object_get_data (G_OBJECT (g_pWnd), "random")),
1219 "Seed value for the pseudo-random number generator.",
1222 gtk_tooltips_set_tip(GTK_TOOLTIPS (tooltips),
1223 GTK_WIDGET (g_object_get_data (G_OBJECT (g_pWnd), "hmin")),
1224 "Minimum horizontal coordinate of the surface, i.e. X for a surface parallel to "
1225 "the XY or XZ planes, Y for a surface parallel to the YZ plane. For best results, "
1226 "the extents (maximum-minimum values) in a given direction should be evenly "
1227 "divisible by the number of divisions in that direction.",
1229 gtk_tooltips_set_tip(GTK_TOOLTIPS (tooltips),
1230 GTK_WIDGET (g_object_get_data (G_OBJECT (g_pWnd), "hmax")),
1231 "Maximum horizontal coordinate of the surface, i.e. X for a surface parallel to "
1232 "the XY or XZ planes, Y for a surface parallel to the YZ plane. For best results, "
1233 "the extents (maximum-minimum values) in a given direction should be evenly "
1234 "divisible by the number of divisions in that direction.",
1236 gtk_tooltips_set_tip(GTK_TOOLTIPS (tooltips),
1237 GTK_WIDGET (g_object_get_data (G_OBJECT (g_pWnd), "vmin")),
1238 "Minimum vertical coordinate of the surface, i.e. Y for a surface parallel to "
1239 "the XY plane, Z for a surface parallel to the XZ or YZ planes. For best results, "
1240 "the extents (maximum-minimum values) in a given direction should be evenly "
1241 "divisible by the number of divisions in that direction.",
1243 gtk_tooltips_set_tip(GTK_TOOLTIPS (tooltips),
1244 GTK_WIDGET (g_object_get_data (G_OBJECT (g_pWnd), "vmax")),
1245 "Maximum vertical coordinate of the surface, i.e. Y for a surface parallel to "
1246 "the XY plane, Z for a surface parallel to the XZ or YZ planes. For best results, "
1247 "the extents (maximum-minimum values) in a given direction should be evenly "
1248 "divisible by the number of divisions in that direction.",
1250 gtk_tooltips_set_tip(GTK_TOOLTIPS (tooltips),
1251 GTK_WIDGET (g_object_get_data (G_OBJECT (g_pWnd), "nh")),
1252 "Number of divisions in the horizontal direction. For best results, the extents "
1253 "in a given direction should be evenly divisible by the number of divisions in "
1256 gtk_tooltips_set_tip(GTK_TOOLTIPS (tooltips),
1257 GTK_WIDGET (g_object_get_data (G_OBJECT (g_pWnd), "nv")),
1258 "Number of divisions in the vertical direction. For best results, the extents "
1259 "in a given direction should be evenly divisible by the number of divisions in "
1262 gtk_tooltips_set_tip(GTK_TOOLTIPS (tooltips),
1263 GTK_WIDGET (g_object_get_data (G_OBJECT (g_pWnd), "use_patches")),
1264 "Produce one or more curved patches in the shape of your selected surface rather "
1265 "than producing solid brushes. Depending on the size of your surface (and the "
1266 "user's graphic detail settings, which you cannot control), curved surfaces will "
1267 "be represented in the game by a very large number of polygons. Read the warnings "
1268 "concerning curved surfaces on the GenSurf web page before using this feature.",
1270 gtk_tooltips_set_tip(GTK_TOOLTIPS (tooltips),
1271 GTK_WIDGET (g_object_get_data (G_OBJECT (g_pWnd), "decimate")),
1272 "Use the slider to control the number of vertices discarded by GenSurf. For many "
1273 "surfaces, you can produce roughly the same shape surface with a high decimation "
1274 "value. This will generally result in a map with lower polygon counts (and better "
1275 "in-game performance). However, this feature should NOT be used for large terrain "
1278 gtk_tooltips_set_tip(GTK_TOOLTIPS (tooltips),
1279 GTK_WIDGET (g_object_get_data (G_OBJECT (g_pWnd), "z00")),
1280 "Enter the height of the surface at the lower left corner. This value will likely "
1281 "be modified unless \"Linear Borders\" is checked.",
1283 gtk_tooltips_set_tip(GTK_TOOLTIPS (tooltips),
1284 GTK_WIDGET (g_object_get_data (G_OBJECT (g_pWnd), "z01")),
1285 "Enter the height of the surface at the upper left corner. This value will likely "
1286 "be modified unless \"Linear Borders\" is checked.",
1288 gtk_tooltips_set_tip(GTK_TOOLTIPS (tooltips),
1289 GTK_WIDGET (g_object_get_data (G_OBJECT (g_pWnd), "z10")),
1290 "Enter the height of the surface at the lower right corner. This value will likely "
1291 "be modified unless \"Linear Borders\" is checked.",
1293 gtk_tooltips_set_tip(GTK_TOOLTIPS (tooltips),
1294 GTK_WIDGET (g_object_get_data (G_OBJECT (g_pWnd), "z11")),
1295 "Enter the height of the surface at the upper right corner. This value will likely "
1296 "be modified unless \"Linear Borders\" is checked.",
1298 gtk_tooltips_set_tip(GTK_TOOLTIPS (tooltips),
1299 GTK_WIDGET (g_object_get_data (G_OBJECT (g_pWnd), "linearborder")),
1300 "Restrict the edges of the surface to a straight line. This will help match up "
1301 "brush edges if you drop this surface into another map.",
1304 gtk_tooltips_set_tip(GTK_TOOLTIPS (tooltips),
1305 GTK_WIDGET (g_object_get_data (G_OBJECT (g_pWnd), "bmp_file")),
1306 "Type the name of an 8-bit bitmap image file, or click Browse to select an image "
1307 "from a list of those available on your system.",
1309 gtk_tooltips_set_tip(GTK_TOOLTIPS (tooltips),
1310 GTK_WIDGET (g_object_get_data (G_OBJECT (g_pWnd), "bmp_file_browse")),
1311 "Select a bitmap image file from a list of those available on your system.",
1313 gtk_tooltips_set_tip(GTK_TOOLTIPS (tooltips),
1314 GTK_WIDGET (g_object_get_data (G_OBJECT (g_pWnd), "bmp_reload")),
1315 "Reload the selected bitmap file after making changes in an external image editor.",
1317 gtk_tooltips_set_tip(GTK_TOOLTIPS (tooltips),
1318 GTK_WIDGET (g_object_get_data (G_OBJECT (g_pWnd), "bmp_black")),
1319 "Enter the value corresponding to color index 0 in the bitmap file. For gray scale "
1320 "images, color 0 is normally black.",
1322 gtk_tooltips_set_tip(GTK_TOOLTIPS (tooltips),
1323 GTK_WIDGET (g_object_get_data (G_OBJECT (g_pWnd), "bmp_white")),
1324 "Enter the value corresponding to color index 255 in the bitmap file. For gray scale "
1325 "images, color 255 is normally white.",
1328 gtk_tooltips_set_tip(GTK_TOOLTIPS (tooltips),
1329 GTK_WIDGET (g_object_get_data (G_OBJECT (g_pWnd), "fix_value")),
1330 "Enter a value for the selected vertex. This value will not be adjusted when applying "
1331 "a waveform or roughness to the surface. Unlock this vertex (so that it will be "
1332 "adjusted normally) by clicking \"Free\". This vertex will influence vertices within "
1333 "the \"Range affected\" of this vertex.",
1335 gtk_tooltips_set_tip(GTK_TOOLTIPS (tooltips),
1336 GTK_WIDGET (g_object_get_data (G_OBJECT (g_pWnd), "fix_range")),
1337 "Enter the range away from the selected vertex that other vertices will be affected. "
1338 "Use 0 if you don't want other vertices to be influenced by the currently selected "
1339 "one. Note: this box is disabled if you've chosen the fractal generator, as it uses "
1340 "a completely different method for determining values.",
1342 gtk_tooltips_set_tip(GTK_TOOLTIPS (tooltips),
1343 GTK_WIDGET (g_object_get_data (G_OBJECT (g_pWnd), "fix_rate")),
1344 "Enter a rate of change for the surface affected by the fixed value. 0 gives a smooth "
1345 "sinusoidal curve, values less than 0 give progressively sharper spikes, and values "
1346 "greater than 0 take on a square shape. Values less than -30 or greater than 30 are "
1347 "set to -30 and 30, respectively. Note that this entry will have no effect unless "
1348 "you also specify a \"range affected\".",
1350 gtk_tooltips_set_tip(GTK_TOOLTIPS (tooltips),
1351 GTK_WIDGET (g_object_get_data (G_OBJECT (g_pWnd), "fix_free")),
1352 "Click this to free (unlock the value of) the currently selected vertex.",
1354 gtk_tooltips_set_tip(GTK_TOOLTIPS (tooltips),
1355 GTK_WIDGET (g_object_get_data (G_OBJECT (g_pWnd), "fix_freeall")),
1356 "Click this to free (unlock the values of) all vertices.",
1359 gtk_tooltips_set_tip(GTK_TOOLTIPS (tooltips),
1360 GTK_WIDGET (g_object_get_data (G_OBJECT (g_pWnd), "texture1")),
1361 "Enter the name of the texture or shader used for the surface faces.",
1363 gtk_tooltips_set_tip(GTK_TOOLTIPS (tooltips),
1364 GTK_WIDGET (g_object_get_data (G_OBJECT (g_pWnd), "texture2")),
1365 "Enter the name of the texture or shader used for faces other than the surface. Under "
1366 "normal circumstances this should be \"common/caulk\"",
1368 gtk_tooltips_set_tip(GTK_TOOLTIPS (tooltips),
1369 GTK_WIDGET (g_object_get_data (G_OBJECT (g_pWnd), "texture3")),
1370 "Enter the name of the texture or shader used for \"steep\" surface faces, where \"steep\" "
1371 "is the angle specified below. If this entry is left blank or if the \"steep\" angle is 0, "
1372 "all surface faces will use the texture specified by \"Surface\".",
1375 gtk_tooltips_set_tip(GTK_TOOLTIPS (tooltips),
1376 GTK_WIDGET (g_object_get_data (G_OBJECT (g_pWnd), "detail")),
1377 "Check this box to use the detail content property on the generated brushes. Compile "
1378 "times will be considerably shorter if the detail property is used, though the surface "
1379 "will not block visibility at all. If you use the detail property, you should make sure "
1380 "that \"common/caulk\" is used for the non-surface faces, or the polygon count will be "
1381 "much higher than necessary.",
1385 // =============================================================================
1386 // create main dialog
1388 GtkWidget* create_main_dialog ()
1390 GtkWidget *dlg, *vbox, *hbox, *hbox2, *button, *notebook, *frame, *table, *table2;
1391 GtkWidget *check, *spin, *radio, *label, *entry, *scale;
1395 char *games[] = { "Quake 2", "Half-Life", "SiN", "Heretic 2", "Kingpin", "Genesis3D", "Quake 3 Arena" };
1396 char *waveforms[] = { "Alternating hill/valley", "Cylindrical left-to-right", "Cylindrical top-to-bottom",
1397 "From bitmap", "Fractal" };
1398 char *orientations[] = { "Ground surface", "Ceiling", "Wall facing 0", "Wall facing 90",
1399 "Wall facing 180","Wall facing 270" };
1401 g_pWnd = dlg = gtk_window_new (GTK_WINDOW_TOPLEVEL);
1402 gtk_window_set_title (GTK_WINDOW (dlg), gszCaption);
1403 g_signal_connect (G_OBJECT (dlg), "delete_event", G_CALLBACK (main_close), NULL);
1404 // g_signal_connect (G_OBJECT (dlg), "destroy", G_CALLBACK (gtk_widget_destroy), NULL);
1405 gtk_window_set_transient_for (GTK_WINDOW (dlg), GTK_WINDOW (g_pRadiantWnd));
1407 hbox = gtk_hbox_new (FALSE, 5);
1408 gtk_widget_show (hbox);
1409 gtk_container_add (GTK_CONTAINER (dlg), hbox);
1410 gtk_container_set_border_width (GTK_CONTAINER (hbox), 5);
1412 notebook = gtk_notebook_new ();
1413 gtk_widget_show (notebook);
1414 gtk_box_pack_start (GTK_BOX (hbox), notebook, TRUE, TRUE, 0);
1415 g_signal_connect (G_OBJECT (notebook), "switch_page",
1416 G_CALLBACK (switch_page), NULL);
1417 gtk_notebook_set_tab_pos (GTK_NOTEBOOK (notebook), GTK_POS_TOP);
1418 g_object_set_data (G_OBJECT (dlg), "notebook", notebook);
1420 table = gtk_table_new (2, 2, FALSE);
1421 gtk_widget_show (table);
1422 gtk_container_set_border_width (GTK_CONTAINER (table), 5);
1423 gtk_table_set_row_spacings (GTK_TABLE (table), 5);
1424 gtk_table_set_col_spacings (GTK_TABLE (table), 5);
1426 label = gtk_label_new ("General");
1427 gtk_widget_show (label);
1428 gtk_notebook_append_page (GTK_NOTEBOOK (notebook), table, label);
1430 frame = gtk_frame_new ("Game");
1431 gtk_widget_show (frame);
1432 gtk_table_attach (GTK_TABLE (table), frame, 0, 1, 0, 1,
1433 (GtkAttachOptions) (GTK_EXPAND|GTK_FILL),
1434 (GtkAttachOptions) (GTK_EXPAND|GTK_FILL), 0, 0);
1436 vbox = gtk_vbox_new (TRUE, 5);
1437 gtk_widget_show (vbox);
1438 gtk_container_add (GTK_CONTAINER (frame), vbox);
1439 gtk_container_set_border_width (GTK_CONTAINER (vbox), 5);
1441 for (i = 0, group = NULL; i < NUMGAMES; i++)
1443 radio = gtk_radio_button_new_with_label (group, games[i]);
1444 gtk_widget_show (radio);
1445 gtk_box_pack_start (GTK_BOX (vbox), radio, TRUE, TRUE, 0);
1446 group = gtk_radio_button_group (GTK_RADIO_BUTTON (radio));
1447 game_radios[i] = radio;
1448 g_signal_connect (G_OBJECT (radio), "toggled", G_CALLBACK (general_game), GINT_TO_POINTER (i));
1451 frame = gtk_frame_new ("Waveform");
1452 gtk_widget_show (frame);
1453 gtk_table_attach (GTK_TABLE (table), frame, 1, 2, 0, 1,
1454 (GtkAttachOptions) (GTK_EXPAND|GTK_FILL),
1455 (GtkAttachOptions) (GTK_EXPAND|GTK_FILL), 0, 0);
1457 vbox = gtk_vbox_new (TRUE, 5);
1458 gtk_widget_show (vbox);
1459 gtk_container_add (GTK_CONTAINER (frame), vbox);
1460 gtk_container_set_border_width (GTK_CONTAINER (vbox), 5);
1462 for (i = 0, group = NULL; i < 5; i++)
1464 radio = gtk_radio_button_new_with_label (group, waveforms[i]);
1465 gtk_widget_show (radio);
1466 gtk_box_pack_start (GTK_BOX (vbox), radio, TRUE, TRUE, 0);
1467 group = gtk_radio_button_group (GTK_RADIO_BUTTON (radio));
1468 wave_radios[i] = radio;
1469 g_signal_connect (G_OBJECT (radio), "toggled", G_CALLBACK (general_wave), GINT_TO_POINTER (i));
1472 frame = gtk_frame_new ("Orientation");
1473 gtk_widget_show (frame);
1474 gtk_table_attach (GTK_TABLE (table), frame, 0, 1, 1, 2,
1475 (GtkAttachOptions) (GTK_EXPAND|GTK_FILL),
1476 (GtkAttachOptions) (GTK_EXPAND|GTK_FILL), 0, 0);
1478 vbox = gtk_vbox_new (TRUE, 5);
1479 gtk_widget_show (vbox);
1480 gtk_container_add (GTK_CONTAINER (frame), vbox);
1481 gtk_container_set_border_width (GTK_CONTAINER (vbox), 5);
1483 for (i = 0, group = NULL; i < 6; i++)
1485 radio = gtk_radio_button_new_with_label (group, orientations[i]);
1486 gtk_widget_show (radio);
1487 gtk_box_pack_start (GTK_BOX (vbox), radio, TRUE, TRUE, 0);
1488 group = gtk_radio_button_group (GTK_RADIO_BUTTON (radio));
1489 plane_radios[i] = radio;
1490 g_signal_connect (G_OBJECT (radio), "toggled", G_CALLBACK (general_plane), GINT_TO_POINTER (i));
1493 table2 = gtk_table_new (4, 2, FALSE);
1494 gtk_widget_show (table2);
1495 gtk_table_set_row_spacings (GTK_TABLE (table2), 5);
1496 gtk_table_set_col_spacings (GTK_TABLE (table2), 5);
1497 gtk_table_attach (GTK_TABLE (table), table2, 1, 2, 1, 2,
1498 (GtkAttachOptions) (GTK_EXPAND|GTK_FILL),
1499 (GtkAttachOptions) (GTK_EXPAND|GTK_FILL), 0, 0);
1501 label = gtk_label_new ("Wavelength:");
1502 gtk_widget_show (label);
1503 gtk_table_attach (GTK_TABLE (table2), label, 0, 1, 0, 1,
1504 (GtkAttachOptions) (GTK_EXPAND|GTK_FILL),
1505 (GtkAttachOptions) (GTK_EXPAND|GTK_FILL), 0, 0);
1506 gtk_misc_set_alignment (GTK_MISC (label), 1, 0.5);
1507 gtk_label_set_justify (GTK_LABEL (label), GTK_JUSTIFY_RIGHT);
1509 label = gtk_label_new ("Max. amplitude:");
1510 gtk_widget_show (label);
1511 gtk_table_attach (GTK_TABLE (table2), label, 0, 1, 1, 2,
1512 (GtkAttachOptions) (GTK_EXPAND|GTK_FILL),
1513 (GtkAttachOptions) (GTK_EXPAND|GTK_FILL), 0, 0);
1514 gtk_misc_set_alignment (GTK_MISC (label), 1, 0.5);
1515 gtk_label_set_justify (GTK_LABEL (label), GTK_JUSTIFY_RIGHT);
1517 label = gtk_label_new ("Roughness:");
1518 gtk_widget_show (label);
1519 gtk_table_attach (GTK_TABLE (table2), label, 0, 1, 2, 3,
1520 (GtkAttachOptions) (GTK_EXPAND|GTK_FILL),
1521 (GtkAttachOptions) (GTK_EXPAND|GTK_FILL), 0, 0);
1522 gtk_misc_set_alignment (GTK_MISC (label), 1, 0.5);
1523 gtk_label_set_justify (GTK_LABEL (label), GTK_JUSTIFY_RIGHT);
1525 label = gtk_label_new ("Random seed:");
1526 gtk_widget_show (label);
1527 gtk_table_attach (GTK_TABLE (table2), label, 0, 1, 3, 4,
1528 (GtkAttachOptions) (GTK_EXPAND|GTK_FILL),
1529 (GtkAttachOptions) (GTK_EXPAND|GTK_FILL), 0, 0);
1530 gtk_misc_set_alignment (GTK_MISC (label), 1, 0.5);
1531 gtk_label_set_justify (GTK_LABEL (label), GTK_JUSTIFY_RIGHT);
1533 entry = gtk_entry_new ();
1534 gtk_widget_show (entry);
1535 gtk_table_attach (GTK_TABLE (table2), entry, 1, 2, 0, 1,
1536 (GtkAttachOptions) (GTK_EXPAND|GTK_FILL),
1537 (GtkAttachOptions) (GTK_EXPAND|GTK_FILL), 0, 0);
1538 gtk_widget_set_usize (entry, 50, -2);
1539 g_object_set_data (G_OBJECT (dlg), "wavelength", entry);
1540 g_signal_connect (G_OBJECT (entry), "focus_out_event", G_CALLBACK (doublevariable_entryfocusout), &WaveLength);
1542 entry = gtk_entry_new ();
1543 gtk_widget_show (entry);
1544 gtk_table_attach (GTK_TABLE (table2), entry, 1, 2, 1, 2,
1545 (GtkAttachOptions) (GTK_EXPAND|GTK_FILL),
1546 (GtkAttachOptions) (GTK_EXPAND|GTK_FILL), 0, 0);
1547 gtk_widget_set_usize (entry, 50, -2);
1548 g_object_set_data (G_OBJECT (dlg), "amplitude", entry);
1549 g_signal_connect (G_OBJECT (entry), "focus_out_event", G_CALLBACK (doublevariable_entryfocusout), &Amplitude);
1551 entry = gtk_entry_new ();
1552 gtk_widget_show (entry);
1553 gtk_table_attach (GTK_TABLE (table2), entry, 1, 2, 2, 3,
1554 (GtkAttachOptions) (GTK_EXPAND|GTK_FILL),
1555 (GtkAttachOptions) (GTK_EXPAND|GTK_FILL), 0, 0);
1556 gtk_widget_set_usize (entry, 50, -2);
1557 g_object_set_data (G_OBJECT (dlg), "roughness", entry);
1558 g_signal_connect (G_OBJECT (entry), "focus_out_event", G_CALLBACK (doublevariable_entryfocusout), &Roughness);
1560 adj = gtk_adjustment_new (1, 1, 32767, 1, 10, 10);
1561 g_signal_connect (G_OBJECT (adj), "value_changed", G_CALLBACK (general_random), NULL);
1562 spin = gtk_spin_button_new (GTK_ADJUSTMENT (adj), 1, 0);
1563 gtk_widget_show (spin);
1564 gtk_table_attach (GTK_TABLE (table2), spin, 1, 2, 3, 4,
1565 (GtkAttachOptions) (GTK_EXPAND|GTK_FILL),
1566 (GtkAttachOptions) (GTK_EXPAND|GTK_FILL), 0, 0);
1567 gtk_widget_set_usize (spin, 60, -2);
1568 g_object_set_data (G_OBJECT (dlg), "random", spin);
1570 vbox = gtk_vbox_new (FALSE, 5);
1571 gtk_widget_show (vbox);
1572 gtk_container_set_border_width (GTK_CONTAINER (vbox), 5);
1574 label = gtk_label_new ("Extents");
1575 gtk_widget_show (label);
1576 gtk_notebook_append_page (GTK_NOTEBOOK (notebook), vbox, label);
1578 hbox2 = gtk_hbox_new (FALSE, 5);
1579 gtk_widget_show (hbox2);
1580 gtk_box_pack_start (GTK_BOX (vbox), hbox2, FALSE, TRUE, 0);
1582 frame = gtk_frame_new ("Extents");
1583 gtk_widget_show (frame);
1584 gtk_box_pack_start (GTK_BOX (hbox2), frame, TRUE, TRUE, 0);
1586 table = gtk_table_new (3, 4, FALSE);
1587 gtk_widget_show (table);
1588 gtk_container_set_border_width (GTK_CONTAINER (table), 5);
1589 gtk_container_add (GTK_CONTAINER (frame), table);
1590 gtk_table_set_row_spacings (GTK_TABLE (table), 5);
1591 gtk_table_set_col_spacings (GTK_TABLE (table), 5);
1593 label = gtk_label_new ("X:");
1594 gtk_widget_show (label);
1595 gtk_table_attach (GTK_TABLE (table), label, 0, 1, 1, 2,
1596 (GtkAttachOptions) (GTK_FILL),
1597 (GtkAttachOptions) (GTK_FILL), 0, 0);
1598 g_object_set_data (G_OBJECT (dlg), "hmin_text", label);
1600 label = gtk_label_new ("X:");
1601 gtk_widget_show (label);
1602 gtk_table_attach (GTK_TABLE (table), label, 2, 3, 1, 2,
1603 (GtkAttachOptions) (GTK_FILL),
1604 (GtkAttachOptions) (GTK_FILL), 0, 0);
1605 g_object_set_data (G_OBJECT (dlg), "hmax_text", label);
1607 label = gtk_label_new ("Y:");
1608 gtk_widget_show (label);
1609 gtk_table_attach (GTK_TABLE (table), label, 0, 1, 2, 3,
1610 (GtkAttachOptions) (GTK_FILL),
1611 (GtkAttachOptions) (GTK_FILL), 0, 0);
1612 g_object_set_data (G_OBJECT (dlg), "vmin_text", label);
1614 label = gtk_label_new ("Y:");
1615 gtk_widget_show (label);
1616 gtk_table_attach (GTK_TABLE (table), label, 2, 3, 2, 3,
1617 (GtkAttachOptions) (GTK_FILL),
1618 (GtkAttachOptions) (GTK_FILL), 0, 0);
1619 g_object_set_data (G_OBJECT (dlg), "vmax_text", label);
1621 label = gtk_label_new ("Lower-left");
1622 gtk_widget_show (label);
1623 gtk_table_attach (GTK_TABLE (table), label, 1, 2, 0, 1,
1624 (GtkAttachOptions) (GTK_FILL),
1625 (GtkAttachOptions) (GTK_FILL), 0, 0);
1627 label = gtk_label_new ("Upper-right");
1628 gtk_widget_show (label);
1629 gtk_table_attach (GTK_TABLE (table), label, 3, 4, 0, 1,
1630 (GtkAttachOptions) (GTK_FILL),
1631 (GtkAttachOptions) (GTK_FILL), 0, 0);
1633 entry = gtk_entry_new ();
1634 gtk_widget_show (entry);
1635 gtk_table_attach (GTK_TABLE (table), entry, 1, 2, 1, 2,
1636 (GtkAttachOptions) (GTK_EXPAND|GTK_FILL),
1637 (GtkAttachOptions) (GTK_EXPAND|GTK_FILL), 0, 0);
1638 gtk_widget_set_usize (entry, 50, -2);
1639 g_object_set_data (G_OBJECT (dlg), "hmin", entry);
1640 g_signal_connect (G_OBJECT (entry), "focus_out_event", G_CALLBACK (doublevariable_entryfocusout), &Hll);
1642 entry = gtk_entry_new ();
1643 gtk_widget_show (entry);
1644 gtk_table_attach (GTK_TABLE (table), entry, 3, 4, 1, 2,
1645 (GtkAttachOptions) (GTK_EXPAND|GTK_FILL),
1646 (GtkAttachOptions) (GTK_EXPAND|GTK_FILL), 0, 0);
1647 gtk_widget_set_usize (entry, 50, -2);
1648 g_object_set_data (G_OBJECT (dlg), "hmax", entry);
1649 g_signal_connect (G_OBJECT (entry), "focus_out_event", G_CALLBACK (doublevariable_entryfocusout), &Hur);
1651 entry = gtk_entry_new ();
1652 gtk_widget_show (entry);
1653 gtk_table_attach (GTK_TABLE (table), entry, 1, 2, 2, 3,
1654 (GtkAttachOptions) (GTK_EXPAND|GTK_FILL),
1655 (GtkAttachOptions) (GTK_EXPAND|GTK_FILL), 0, 0);
1656 gtk_widget_set_usize (entry, 50, -2);
1657 g_object_set_data (G_OBJECT (dlg), "vmin", entry);
1658 g_signal_connect (G_OBJECT (entry), "focus_out_event", G_CALLBACK (doublevariable_entryfocusout), &Vll);
1660 entry = gtk_entry_new ();
1661 gtk_widget_show (entry);
1662 gtk_table_attach (GTK_TABLE (table), entry, 3, 4, 2, 3,
1663 (GtkAttachOptions) (GTK_EXPAND|GTK_FILL),
1664 (GtkAttachOptions) (GTK_EXPAND|GTK_FILL), 0, 0);
1665 gtk_widget_set_usize (entry, 50, -2);
1666 g_object_set_data (G_OBJECT (dlg), "vmax", entry);
1667 g_signal_connect (G_OBJECT (entry), "focus_out_event", G_CALLBACK (doublevariable_entryfocusout), &Vur);
1669 frame = gtk_frame_new ("Divisions");
1670 gtk_widget_show (frame);
1671 gtk_box_pack_start (GTK_BOX (hbox2), frame, TRUE, TRUE, 0);
1673 table = gtk_table_new (2, 2, FALSE);
1674 gtk_widget_show (table);
1675 gtk_container_set_border_width (GTK_CONTAINER (table), 5);
1676 gtk_container_add (GTK_CONTAINER (frame), table);
1677 gtk_table_set_row_spacings (GTK_TABLE (table), 5);
1678 gtk_table_set_col_spacings (GTK_TABLE (table), 5);
1680 label = gtk_label_new ("X:");
1681 gtk_widget_show (label);
1682 gtk_table_attach (GTK_TABLE (table), label, 0, 1, 0, 1,
1683 (GtkAttachOptions) (GTK_FILL),
1684 (GtkAttachOptions) (GTK_EXPAND|GTK_FILL), 0, 0);
1685 g_object_set_data (G_OBJECT (dlg), "nh_text", label);
1687 label = gtk_label_new ("Y:");
1688 gtk_widget_show (label);
1689 gtk_table_attach (GTK_TABLE (table), label, 0, 1, 1, 2,
1690 (GtkAttachOptions) (GTK_FILL),
1691 (GtkAttachOptions) (GTK_EXPAND|GTK_FILL), 0, 0);
1692 g_object_set_data (G_OBJECT (dlg), "nv_text", label);
1694 adj = gtk_adjustment_new (8, 1, MAX_ROWS, 1, 10, 10);
1695 g_signal_connect (G_OBJECT (adj), "value_changed", G_CALLBACK (extents_nhnv_spin), &NH);
1696 spin = gtk_spin_button_new (GTK_ADJUSTMENT (adj), 1, 0);
1697 gtk_widget_show (spin);
1698 gtk_table_attach (GTK_TABLE (table), spin, 1, 2, 0, 1,
1699 (GtkAttachOptions) (GTK_EXPAND|GTK_FILL),
1700 (GtkAttachOptions) (GTK_EXPAND|GTK_FILL), 0, 0);
1701 gtk_widget_set_usize (spin, 60, -2);
1702 g_object_set_data (G_OBJECT (dlg), "nh", spin);
1704 adj = gtk_adjustment_new (8, 1, MAX_ROWS, 1, 10, 10);
1705 g_signal_connect (G_OBJECT (adj), "value_changed", G_CALLBACK (extents_nhnv_spin), &NV);
1706 spin = gtk_spin_button_new (GTK_ADJUSTMENT (adj), 1, 0);
1707 gtk_widget_show (spin);
1708 gtk_table_attach (GTK_TABLE (table), spin, 1, 2, 1, 2,
1709 (GtkAttachOptions) (GTK_EXPAND|GTK_FILL),
1710 (GtkAttachOptions) (GTK_EXPAND|GTK_FILL), 0, 0);
1711 gtk_widget_set_usize (spin, 60, -2);
1712 g_object_set_data (G_OBJECT (dlg), "nv", spin);
1714 check = gtk_check_button_new_with_label ("Use Bezier patches");
1715 gtk_widget_show (check);
1716 gtk_box_pack_start (GTK_BOX (vbox), check, FALSE, TRUE, 0);
1717 g_object_set_data (G_OBJECT (dlg), "use_patches", check);
1718 g_signal_connect (G_OBJECT (check), "toggled", G_CALLBACK (extents_use_patches), NULL);
1720 // ^Fishman - Snap to grid, replaced scroll bar with a texbox.
1721 label = gtk_label_new ("Snap to grid:");
1722 gtk_widget_show (label);
1723 gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, TRUE, 0);
1724 gtk_object_set_data (GTK_OBJECT (dlg), "snap_text", label);
1726 adj = gtk_adjustment_new (8, 0, 256, 1, 10, 10);
1727 g_signal_connect (G_OBJECT (adj), "value_changed", G_CALLBACK (extents_snaptogrid_spin), &SP);
1728 spin = gtk_spin_button_new (GTK_ADJUSTMENT (adj), 1, 0);
1729 gtk_widget_show (spin);
1730 gtk_box_pack_start (GTK_BOX (vbox), spin, FALSE, TRUE, 0);
1731 gtk_widget_set_usize (spin, 60, -2);
1732 g_object_set_data (G_OBJECT (dlg), "sp", spin);
1733 // ^Fishman - End of Snap to grid code.
1735 hbox2 = gtk_hbox_new (FALSE, 5);
1736 gtk_widget_show (hbox2);
1737 gtk_box_pack_start (GTK_BOX (vbox), hbox2, FALSE, TRUE, 10);
1739 label = gtk_label_new ("Decimate:");
1740 gtk_widget_show (label);
1741 gtk_box_pack_start (GTK_BOX (hbox2), label, FALSE, TRUE, 0);
1743 adj = gtk_adjustment_new (0, 0, 110, 1, 10, 10);
1744 g_signal_connect (G_OBJECT (adj), "value_changed", G_CALLBACK (extents_decimate), NULL);
1745 g_object_set_data (G_OBJECT (dlg), "decimate_adj", adj);
1746 scale = gtk_hscale_new (GTK_ADJUSTMENT (adj));
1747 gtk_widget_show (scale);
1748 gtk_box_pack_start (GTK_BOX (hbox2), scale, TRUE, TRUE, 0);
1749 gtk_scale_set_value_pos (GTK_SCALE (scale), GTK_POS_RIGHT);
1750 gtk_scale_set_digits (GTK_SCALE (scale), 0);
1751 g_object_set_data (G_OBJECT (dlg), "decimate", scale);
1753 frame = gtk_frame_new ("Corner values");
1754 gtk_widget_show (frame);
1755 gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, TRUE, 0);
1757 table = gtk_table_new (3, 4, FALSE);
1758 gtk_widget_show (table);
1759 gtk_container_set_border_width (GTK_CONTAINER (table), 5);
1760 gtk_container_add (GTK_CONTAINER (frame), table);
1761 gtk_table_set_row_spacings (GTK_TABLE (table), 5);
1762 gtk_table_set_col_spacings (GTK_TABLE (table), 5);
1764 label = gtk_label_new ("Upper-left:");
1765 gtk_widget_show (label);
1766 gtk_table_attach (GTK_TABLE (table), label, 0, 1, 0, 1,
1767 (GtkAttachOptions) (GTK_FILL),
1768 (GtkAttachOptions) (GTK_FILL), 0, 0);
1770 label = gtk_label_new ("Lower-left:");
1771 gtk_widget_show (label);
1772 gtk_table_attach (GTK_TABLE (table), label, 0, 1, 1, 2,
1773 (GtkAttachOptions) (GTK_FILL),
1774 (GtkAttachOptions) (GTK_FILL), 0, 0);
1776 label = gtk_label_new ("Upper-right:");
1777 gtk_widget_show (label);
1778 gtk_table_attach (GTK_TABLE (table), label, 2, 3, 0, 1,
1779 (GtkAttachOptions) (GTK_FILL),
1780 (GtkAttachOptions) (GTK_FILL), 0, 0);
1782 label = gtk_label_new ("Lower-right:");
1783 gtk_widget_show (label);
1784 gtk_table_attach (GTK_TABLE (table), label, 2, 3, 1, 2,
1785 (GtkAttachOptions) (GTK_FILL),
1786 (GtkAttachOptions) (GTK_FILL), 0, 0);
1788 entry = gtk_entry_new ();
1789 gtk_widget_show (entry);
1790 gtk_table_attach (GTK_TABLE (table), entry, 1, 2, 0, 1,
1791 (GtkAttachOptions) (GTK_EXPAND|GTK_FILL),
1792 (GtkAttachOptions) (GTK_EXPAND|GTK_FILL), 0, 0);
1793 gtk_widget_set_usize (entry, 50, -2);
1794 g_object_set_data (G_OBJECT (dlg), "z01", entry);
1795 g_signal_connect (G_OBJECT (entry), "focus_out_event", G_CALLBACK (doublevariable_entryfocusout), &Z01);
1797 entry = gtk_entry_new ();
1798 gtk_widget_show (entry);
1799 gtk_table_attach (GTK_TABLE (table), entry, 1, 2, 1, 2,
1800 (GtkAttachOptions) (GTK_EXPAND|GTK_FILL),
1801 (GtkAttachOptions) (GTK_EXPAND|GTK_FILL), 0, 0);
1802 gtk_widget_set_usize (entry, 50, -2);
1803 g_object_set_data (G_OBJECT (dlg), "z00", entry);
1804 g_signal_connect (G_OBJECT (entry), "focus_out_event", G_CALLBACK (doublevariable_entryfocusout), &Z00);
1806 entry = gtk_entry_new ();
1807 gtk_widget_show (entry);
1808 gtk_table_attach (GTK_TABLE (table), entry, 3, 4, 0, 1,
1809 (GtkAttachOptions) (GTK_EXPAND|GTK_FILL),
1810 (GtkAttachOptions) (GTK_EXPAND|GTK_FILL), 0, 0);
1811 gtk_widget_set_usize (entry, 50, -2);
1812 g_object_set_data (G_OBJECT (dlg), "z11", entry);
1813 g_signal_connect (G_OBJECT (entry), "focus_out_event", G_CALLBACK (doublevariable_entryfocusout), &Z11);
1815 entry = gtk_entry_new ();
1816 gtk_widget_show (entry);
1817 gtk_table_attach (GTK_TABLE (table), entry, 3, 4, 1, 2,
1818 (GtkAttachOptions) (GTK_EXPAND|GTK_FILL),
1819 (GtkAttachOptions) (GTK_EXPAND|GTK_FILL), 0, 0);
1820 gtk_widget_set_usize (entry, 50, -2);
1821 g_object_set_data (G_OBJECT (dlg), "z10", entry);
1822 g_signal_connect (G_OBJECT (entry), "focus_out_event", G_CALLBACK (doublevariable_entryfocusout), &Z10);
1824 check = gtk_check_button_new_with_label ("Linear borders");
1825 gtk_widget_show (check);
1826 gtk_table_attach (GTK_TABLE (table), check, 0, 4, 2, 3,
1827 (GtkAttachOptions) (GTK_EXPAND|GTK_FILL),
1828 (GtkAttachOptions) (GTK_EXPAND|GTK_FILL), 0, 0);
1829 g_object_set_data (G_OBJECT (dlg), "linearborder", check);
1830 g_signal_connect (G_OBJECT (check), "toggled", G_CALLBACK (extents_linearborder), NULL);
1832 vbox = gtk_vbox_new (FALSE, 10);
1833 gtk_widget_show (vbox);
1834 gtk_container_set_border_width (GTK_CONTAINER (vbox), 5);
1836 label = gtk_label_new ("Bitmap");
1837 gtk_widget_show (label);
1838 gtk_notebook_append_page (GTK_NOTEBOOK (notebook), vbox, label);
1840 label = gtk_label_new ("");
1841 gtk_widget_show (label);
1842 gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, TRUE, 0);
1843 g_object_set_data (G_OBJECT (dlg), "bmp_note", label);
1845 table = gtk_table_new (2, 2, FALSE);
1846 gtk_widget_show (table);
1847 gtk_container_set_border_width (GTK_CONTAINER (table), 5);
1848 gtk_box_pack_start (GTK_BOX (vbox), table, FALSE, TRUE, 0);
1849 gtk_table_set_row_spacings (GTK_TABLE (table), 5);
1850 gtk_table_set_col_spacings (GTK_TABLE (table), 5);
1852 label = gtk_label_new ("Filename:");
1853 gtk_widget_show (label);
1854 gtk_table_attach (GTK_TABLE (table), label, 0, 1, 0, 1,
1855 (GtkAttachOptions) (GTK_FILL),
1856 (GtkAttachOptions) (GTK_FILL), 0, 0);
1857 g_object_set_data (G_OBJECT (dlg), "bmp_text1", label);
1859 entry = gtk_entry_new ();
1860 gtk_widget_show (entry);
1861 gtk_table_attach (GTK_TABLE (table), entry, 1, 2, 0, 1,
1862 (GtkAttachOptions) (GTK_EXPAND|GTK_FILL),
1863 (GtkAttachOptions) (GTK_FILL), 0, 0);
1864 g_object_set_data (G_OBJECT (dlg), "bmp_file", entry);
1865 g_signal_connect (G_OBJECT (entry), "focus_out_event", G_CALLBACK (bitmap_file_entryfocusout), NULL);
1867 hbox2 = gtk_hbox_new (TRUE, 5);
1868 gtk_widget_show (hbox2);
1869 gtk_table_attach (GTK_TABLE (table), hbox2, 1, 2, 1, 2,
1870 (GtkAttachOptions) (0),
1871 (GtkAttachOptions) (GTK_EXPAND|GTK_FILL), 0, 0);
1873 button = gtk_button_new_with_label ("Browse...");
1874 gtk_widget_show (button);
1875 gtk_box_pack_start (GTK_BOX (hbox2), button, FALSE, FALSE, 0);
1876 gtk_widget_set_usize (button, 60, -2);
1877 g_object_set_data (G_OBJECT (dlg), "bmp_file_browse", button);
1878 g_signal_connect (G_OBJECT (button), "clicked", G_CALLBACK (bitmap_browse), NULL);
1880 button = gtk_button_new_with_label ("Reload");
1881 gtk_widget_show (button);
1882 gtk_box_pack_start (GTK_BOX (hbox2), button, FALSE, FALSE, 0);
1883 gtk_widget_set_usize (button, 60, -2);
1884 g_object_set_data (G_OBJECT (dlg), "bmp_reload", button);
1885 g_signal_connect (G_OBJECT (button), "clicked", G_CALLBACK (bitmap_reload), NULL);
1887 table = gtk_table_new (2, 2, TRUE);
1888 gtk_widget_show (table);
1889 gtk_container_set_border_width (GTK_CONTAINER (table), 5);
1890 gtk_box_pack_start (GTK_BOX (vbox), table, FALSE, TRUE, 0);
1891 gtk_table_set_row_spacings (GTK_TABLE (table), 5);
1892 gtk_table_set_col_spacings (GTK_TABLE (table), 5);
1894 label = gtk_label_new ("Map color 0 to:");
1895 gtk_widget_show (label);
1896 gtk_table_attach (GTK_TABLE (table), label, 0, 1, 0, 1,
1897 (GtkAttachOptions) (GTK_FILL|GTK_EXPAND),
1898 (GtkAttachOptions) (GTK_FILL), 0, 0);
1899 g_object_set_data (G_OBJECT (dlg), "bmp_text2", label);
1900 gtk_misc_set_alignment (GTK_MISC (label), 1, 0.5);
1901 gtk_label_set_justify (GTK_LABEL (label), GTK_JUSTIFY_RIGHT);
1903 label = gtk_label_new ("Map color 255 to:");
1904 gtk_widget_show (label);
1905 gtk_table_attach (GTK_TABLE (table), label, 0, 1, 1, 2,
1906 (GtkAttachOptions) (GTK_FILL|GTK_EXPAND),
1907 (GtkAttachOptions) (GTK_FILL), 0, 0);
1908 g_object_set_data (G_OBJECT (dlg), "bmp_text3", label);
1909 gtk_misc_set_alignment (GTK_MISC (label), 1, 0.5);
1910 gtk_label_set_justify (GTK_LABEL (label), GTK_JUSTIFY_RIGHT);
1912 hbox2 = gtk_hbox_new (FALSE, 5);
1913 gtk_widget_show (hbox2);
1914 gtk_table_attach (GTK_TABLE (table), hbox2, 1, 2, 0, 1,
1915 (GtkAttachOptions) (GTK_EXPAND|GTK_FILL),
1916 (GtkAttachOptions) (GTK_EXPAND|GTK_FILL), 0, 0);
1918 entry = gtk_entry_new ();
1919 gtk_widget_show (entry);
1920 gtk_box_pack_start (GTK_BOX (hbox2), entry, FALSE, FALSE, 0);
1921 gtk_widget_set_usize (entry, 50, -2);
1922 g_object_set_data (G_OBJECT (dlg), "bmp_black", entry);
1923 g_signal_connect (G_OBJECT (entry), "focus_out_event", G_CALLBACK (doublevariable_entryfocusout), &gbmp.black_value);
1925 hbox2 = gtk_hbox_new (FALSE, 5);
1926 gtk_widget_show (hbox2);
1927 gtk_table_attach (GTK_TABLE (table), hbox2, 1, 2, 1, 2,
1928 (GtkAttachOptions) (GTK_EXPAND|GTK_FILL),
1929 (GtkAttachOptions) (GTK_EXPAND|GTK_FILL), 0, 0);
1931 entry = gtk_entry_new ();
1932 gtk_widget_show (entry);
1933 gtk_box_pack_start (GTK_BOX (hbox2), entry, FALSE, FALSE, 0);
1934 gtk_widget_set_usize (entry, 50, -2);
1935 g_object_set_data (G_OBJECT (dlg), "bmp_white", entry);
1936 g_signal_connect (G_OBJECT (entry), "focus_out_event", G_CALLBACK (doublevariable_entryfocusout), &gbmp.white_value);
1938 vbox = gtk_vbox_new (FALSE, 10);
1939 gtk_widget_show (vbox);
1940 gtk_container_set_border_width (GTK_CONTAINER (vbox), 5);
1942 label = gtk_label_new ("Fix Points");
1943 gtk_widget_show (label);
1944 gtk_notebook_append_page (GTK_NOTEBOOK (notebook), vbox, label);
1946 label = gtk_label_new ("Click on a vertex in the lower half of the preview window,\n"
1947 "then use the arrow keys or text box to assign a value.\n"
1948 "Use Ctrl+Click to select multiple vertices/toggle a\n"
1949 "selection. Use Shift+Click to select a range of vertices.\n\n"
1950 "Click \"Free\" to unlock a vertex. Vertices within \"Range\n"
1951 "affected\" will be influenced by this vertex.");
1952 gtk_widget_show (label);
1953 gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, TRUE, 0);
1955 table = gtk_table_new (3, 3, FALSE);
1956 gtk_widget_show (table);
1957 gtk_container_set_border_width (GTK_CONTAINER (table), 5);
1958 gtk_box_pack_start (GTK_BOX (vbox), table, FALSE, TRUE, 0);
1959 gtk_table_set_row_spacings (GTK_TABLE (table), 5);
1960 gtk_table_set_col_spacings (GTK_TABLE (table), 5);
1962 label = gtk_label_new ("Value:");
1963 gtk_widget_show (label);
1964 gtk_table_attach (GTK_TABLE (table), label, 0, 1, 0, 1,
1965 (GtkAttachOptions) (GTK_FILL),
1966 (GtkAttachOptions) (GTK_FILL), 0, 0);
1967 gtk_misc_set_alignment (GTK_MISC (label), 1, 0.5);
1968 g_object_set_data (G_OBJECT (dlg), "fix_value_text", label);
1970 label = gtk_label_new ("Range affected:");
1971 gtk_widget_show (label);
1972 gtk_table_attach (GTK_TABLE (table), label, 0, 1, 1, 2,
1973 (GtkAttachOptions) (GTK_FILL),
1974 (GtkAttachOptions) (GTK_FILL), 0, 0);
1975 gtk_misc_set_alignment (GTK_MISC (label), 1, 0.5);
1976 g_object_set_data (G_OBJECT (dlg), "fix_range_text", label);
1978 label = gtk_label_new ("Rate of change:");
1979 gtk_widget_show (label);
1980 gtk_table_attach (GTK_TABLE (table), label, 0, 1, 2, 3,
1981 (GtkAttachOptions) (GTK_FILL),
1982 (GtkAttachOptions) (GTK_FILL), 0, 0);
1983 gtk_misc_set_alignment (GTK_MISC (label), 1, 0.5);
1984 g_object_set_data (G_OBJECT (dlg), "fix_rate_text", label);
1986 adj = gtk_adjustment_new (0, -65536, 65536, 1, 16, 16);
1987 g_signal_connect (G_OBJECT (adj), "value_changed", G_CALLBACK (fix_value_changed), NULL);
1988 spin = gtk_spin_button_new (GTK_ADJUSTMENT (adj), 1, 0);
1989 gtk_widget_show (spin);
1990 gtk_table_attach (GTK_TABLE (table), spin, 1, 2, 0, 1,
1991 (GtkAttachOptions) (GTK_EXPAND),
1992 (GtkAttachOptions) (GTK_EXPAND), 0, 0);
1993 gtk_widget_set_usize (spin, 60, -2);
1994 g_object_set_data (G_OBJECT (dlg), "fix_value", spin);
1995 g_signal_connect (G_OBJECT (spin), "focus_out_event", G_CALLBACK (fix_value_entryfocusout), NULL);
1997 entry = gtk_entry_new ();
1998 gtk_widget_show (entry);
1999 gtk_table_attach (GTK_TABLE (table), entry, 1, 2, 1, 2,
2000 (GtkAttachOptions) (GTK_EXPAND),
2001 (GtkAttachOptions) (GTK_FILL), 0, 0);
2002 gtk_widget_set_usize (entry, 60, -2);
2003 g_object_set_data (G_OBJECT (dlg), "fix_range", entry);
2004 g_signal_connect (G_OBJECT (entry), "focus_out_event", G_CALLBACK (fix_range_entryfocusout), NULL);
2006 entry = gtk_entry_new ();
2007 gtk_widget_show (entry);
2008 gtk_table_attach (GTK_TABLE (table), entry, 1, 2, 2, 3,
2009 (GtkAttachOptions) (GTK_EXPAND),
2010 (GtkAttachOptions) (GTK_FILL), 0, 0);
2011 gtk_widget_set_usize (entry, 60, -2);
2012 g_object_set_data (G_OBJECT (dlg), "fix_rate", entry);
2013 g_signal_connect (G_OBJECT (entry), "focus_out_event", G_CALLBACK (fix_rate_entryfocusout), NULL);
2015 button = gtk_button_new_with_label ("Free");
2016 gtk_widget_show (button);
2017 gtk_table_attach (GTK_TABLE (table), button, 2, 3, 0, 1,
2018 (GtkAttachOptions) (GTK_EXPAND),
2019 (GtkAttachOptions) (GTK_FILL), 0, 0);
2020 gtk_widget_set_usize (button, 60, -2);
2021 g_object_set_data (G_OBJECT (dlg), "fix_free", button);
2022 g_signal_connect (G_OBJECT (button), "clicked", G_CALLBACK (fix_free), NULL);
2024 button = gtk_button_new_with_label ("Free All");
2025 gtk_widget_show (button);
2026 gtk_table_attach (GTK_TABLE (table), button, 2, 3, 1, 2,
2027 (GtkAttachOptions) (GTK_EXPAND),
2028 (GtkAttachOptions) (GTK_FILL), 0, 0);
2029 gtk_widget_set_usize (button, 60, -2);
2030 g_object_set_data (G_OBJECT (dlg), "fix_freeall", button);
2031 g_signal_connect (G_OBJECT (button), "clicked", G_CALLBACK (fix_freeall), NULL);
2033 vbox = gtk_vbox_new (FALSE, 10);
2034 gtk_widget_show (vbox);
2035 gtk_container_set_border_width (GTK_CONTAINER (vbox), 5);
2037 label = gtk_label_new ("Texture");
2038 gtk_widget_show (label);
2039 gtk_notebook_append_page (GTK_NOTEBOOK (notebook), vbox, label);
2041 // ^Fishman - Modified to add more labels and textboxes.
2042 table = gtk_table_new (5, 2, FALSE);
2043 gtk_widget_show (table);
2044 gtk_box_pack_start (GTK_BOX (vbox), table, FALSE, TRUE, 0);
2045 gtk_table_set_row_spacings (GTK_TABLE (table), 5);
2046 gtk_table_set_col_spacings (GTK_TABLE (table), 5);
2048 label = gtk_label_new ("Surface:");
2049 gtk_widget_show (label);
2050 gtk_table_attach (GTK_TABLE (table), label, 0, 1, 0, 1,
2051 (GtkAttachOptions) (GTK_FILL),
2052 (GtkAttachOptions) (GTK_FILL), 0, 0);
2053 gtk_misc_set_alignment (GTK_MISC (label), 1, 0.5);
2055 label = gtk_label_new ("Other:");
2056 gtk_widget_show (label);
2057 gtk_table_attach (GTK_TABLE (table), label, 0, 1, 1, 2,
2058 (GtkAttachOptions) (GTK_FILL),
2059 (GtkAttachOptions) (GTK_FILL), 0, 0);
2060 gtk_misc_set_alignment (GTK_MISC (label), 1, 0.5);
2062 label = gtk_label_new ("Steep:");
2063 gtk_widget_show (label);
2064 gtk_table_attach (GTK_TABLE (table), label, 0, 1, 2, 3,
2065 (GtkAttachOptions) (GTK_FILL),
2066 (GtkAttachOptions) (GTK_FILL), 0, 0);
2067 gtk_misc_set_alignment (GTK_MISC (label), 1, 0.5);
2069 entry = gtk_entry_new ();
2070 gtk_widget_show (entry);
2071 gtk_table_attach (GTK_TABLE (table), entry, 1, 2, 0, 1,
2072 (GtkAttachOptions) (GTK_EXPAND|GTK_FILL),
2073 (GtkAttachOptions) (GTK_FILL), 0, 0);
2074 gtk_widget_set_usize (entry, 60, -2);
2075 g_object_set_data (G_OBJECT (dlg), "texture1", entry);
2076 g_signal_connect (G_OBJECT (entry), "focus_out_event", G_CALLBACK(texture_entryfocusout), GINT_TO_POINTER (0));
2078 entry = gtk_entry_new ();
2079 gtk_widget_show (entry);
2080 gtk_table_attach (GTK_TABLE (table), entry, 1, 2, 1, 2,
2081 (GtkAttachOptions) (GTK_EXPAND|GTK_FILL),
2082 (GtkAttachOptions) (GTK_FILL), 0, 0);
2083 gtk_widget_set_usize (entry, 60, -2);
2084 g_object_set_data (G_OBJECT (dlg), "texture2", entry);
2085 g_signal_connect (G_OBJECT (entry), "focus_out_event", G_CALLBACK(texture_entryfocusout), GINT_TO_POINTER (1));
2087 entry = gtk_entry_new ();
2088 gtk_widget_show (entry);
2089 gtk_table_attach (GTK_TABLE (table), entry, 1, 2, 2, 3,
2090 (GtkAttachOptions) (GTK_EXPAND|GTK_FILL),
2091 (GtkAttachOptions) (GTK_FILL), 0, 0);
2092 gtk_widget_set_usize (entry, 60, -2);
2093 g_object_set_data (G_OBJECT (dlg), "texture3", entry);
2095 hbox2 = gtk_hbox_new (FALSE, 5);
2096 gtk_widget_show (hbox2);
2097 gtk_box_pack_start (GTK_BOX (vbox), hbox2, FALSE, TRUE, 0);
2099 label = gtk_label_new ("\"Steep\" angle:");
2100 gtk_widget_show (label);
2101 gtk_box_pack_start (GTK_BOX (hbox2), label, FALSE, TRUE, 0);
2103 adj = gtk_adjustment_new (60, 0, 90, 1, 10, 10);
2104 spin = gtk_spin_button_new (GTK_ADJUSTMENT (adj), 1, 0);
2105 gtk_widget_show (spin);
2106 gtk_box_pack_start (GTK_BOX (hbox2), spin, FALSE, TRUE, 0);
2107 g_object_set_data (G_OBJECT (dlg), "tex_slant", spin);
2109 table = gtk_table_new (2, 4, TRUE);
2110 gtk_widget_show (table);
2111 gtk_box_pack_start (GTK_BOX (vbox), table, FALSE, TRUE, 0);
2112 gtk_table_set_row_spacings (GTK_TABLE (table), 5);
2113 gtk_table_set_col_spacings (GTK_TABLE (table), 5);
2115 label = gtk_label_new ("Offset <h,v>");
2116 gtk_widget_show (label);
2117 gtk_table_attach (GTK_TABLE (table), label, 0, 2, 0, 1,
2118 (GtkAttachOptions) (GTK_FILL),
2119 (GtkAttachOptions) (GTK_FILL), 0, 0);
2121 label = gtk_label_new ("Scale <h,v>");
2122 gtk_widget_show (label);
2123 gtk_table_attach (GTK_TABLE (table), label, 2, 4, 0, 1,
2124 (GtkAttachOptions) (GTK_FILL),
2125 (GtkAttachOptions) (GTK_FILL), 0, 0);
2127 entry = gtk_entry_new ();
2128 gtk_widget_show (entry);
2129 gtk_table_attach (GTK_TABLE (table), entry, 0, 1, 1, 2,
2130 (GtkAttachOptions) (GTK_EXPAND|GTK_FILL),
2131 (GtkAttachOptions) (GTK_FILL), 0, 0);
2132 gtk_widget_set_usize (entry, 60, -2);
2133 g_object_set_data (G_OBJECT (dlg), "texoffsetx", entry);
2135 entry = gtk_entry_new ();
2136 gtk_widget_show (entry);
2137 gtk_table_attach (GTK_TABLE (table), entry, 1, 2, 1, 2,
2138 (GtkAttachOptions) (GTK_EXPAND|GTK_FILL),
2139 (GtkAttachOptions) (GTK_FILL), 0, 0);
2140 gtk_widget_set_usize (entry, 60, -2);
2141 g_object_set_data (G_OBJECT (dlg), "texoffsety", entry);
2143 entry = gtk_entry_new ();
2144 gtk_widget_show (entry);
2145 gtk_table_attach (GTK_TABLE (table), entry, 2, 3, 1, 2,
2146 (GtkAttachOptions) (GTK_EXPAND|GTK_FILL),
2147 (GtkAttachOptions) (GTK_FILL), 0, 0);
2148 gtk_widget_set_usize (entry, 60, -2);
2149 g_object_set_data (G_OBJECT (dlg), "texscalex", entry);
2151 entry = gtk_entry_new ();
2152 gtk_widget_show (entry);
2153 gtk_table_attach (GTK_TABLE (table), entry, 3, 4, 1, 2,
2154 (GtkAttachOptions) (GTK_EXPAND|GTK_FILL),
2155 (GtkAttachOptions) (GTK_FILL), 0, 0);
2156 gtk_widget_set_usize (entry, 60, -2);
2157 g_object_set_data (G_OBJECT (dlg), "texscaley", entry);
2161 check = gtk_check_button_new_with_label ("Use detail brushes");
2162 gtk_widget_show (check);
2163 gtk_box_pack_start (GTK_BOX (vbox), check, FALSE, TRUE, 0);
2164 g_object_set_data (G_OBJECT (dlg), "detail", check);
2165 g_signal_connect (G_OBJECT (check), "toggled", G_CALLBACK (texture_detail), NULL);
2167 check = gtk_check_button_new_with_label ("Detail hint brushes");
2168 gtk_widget_show (check);
2169 gtk_box_pack_start (GTK_BOX (vbox), check, FALSE, TRUE, 0);
2170 g_object_set_data (G_OBJECT (dlg), "hint", check);
2171 g_signal_connect (G_OBJECT (check), "toggled", G_CALLBACK (texture_hint), NULL);
2173 // ^Fishman - Add terrain key to func_group.
2174 check = gtk_check_button_new_with_label ("Add terrain key");
2175 gtk_widget_show (check);
2176 gtk_box_pack_start (GTK_BOX (vbox), check, FALSE, TRUE, 0);
2177 g_object_set_data (G_OBJECT (dlg), "terrain_ent", check);
2178 g_signal_connect (G_OBJECT (check), "toggled", G_CALLBACK (texture_terrainent), NULL);
2180 vbox = gtk_vbox_new (FALSE, 5);
2181 gtk_widget_show (vbox);
2182 gtk_box_pack_start (GTK_BOX (hbox), vbox, FALSE, TRUE, 0);
2184 button = gtk_button_new_with_label ("OK");
2185 gtk_widget_show (button);
2186 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, TRUE, 0);
2187 gtk_widget_set_usize (button, 60, -2);
2188 g_object_set_data (G_OBJECT (dlg), "go", button);
2189 g_signal_connect (G_OBJECT (button), "clicked", G_CALLBACK (main_go), NULL);
2191 label = gtk_label_new ("Settings:");
2192 gtk_widget_show (label);
2193 gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, TRUE, 0);
2195 button = gtk_button_new_with_label ("Open...");
2196 gtk_widget_show (button);
2197 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, TRUE, 0);
2198 g_object_set_data (G_OBJECT (dlg), "open", button);
2199 g_signal_connect (G_OBJECT (button), "clicked", G_CALLBACK (main_open), NULL);
2201 button = gtk_button_new_with_label ("Save as...");
2202 gtk_widget_show (button);
2203 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, TRUE, 0);
2204 g_object_set_data (G_OBJECT (dlg), "save", button);
2205 g_signal_connect (G_OBJECT (button), "clicked", G_CALLBACK (main_save), NULL);
2207 button = gtk_button_new_with_label ("Defaults");
2208 gtk_widget_show (button);
2209 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, TRUE, 0);
2210 g_object_set_data (G_OBJECT (dlg), "defaults", button);
2211 g_signal_connect (G_OBJECT (button), "clicked", G_CALLBACK (main_defaults), NULL);
2213 button = gtk_button_new_with_label ("About...");
2214 gtk_widget_show (button);
2215 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, TRUE, 0);
2216 g_signal_connect (G_OBJECT (button), "clicked", G_CALLBACK (main_about), NULL);
2218 check = gtk_check_button_new_with_label ("Preview");
2219 gtk_widget_show (check);
2220 gtk_box_pack_start (GTK_BOX (vbox), check, FALSE, TRUE, 0);
2221 g_signal_connect (G_OBJECT (check), "toggled", G_CALLBACK (main_preview), NULL);
2222 g_object_set_data (G_OBJECT (dlg), "main_preview", check);
2224 // ^Fishman - Antializing for the preview window.
2225 check = gtk_check_button_new_with_label ("Antialised lines");
2226 gtk_widget_show (check);
2227 gtk_box_pack_start (GTK_BOX (vbox), check, FALSE, TRUE, 0);
2228 g_object_set_data (G_OBJECT (dlg), "main_antialiasing", check);
2229 g_signal_connect (G_OBJECT (check), "toggled", G_CALLBACK (main_antialiasing), NULL);
2231 for (i = 0; i < 5; i++)
2234 CreateViewWindow ();
2238 FirstPassComplete = 1;
2246 HWND hwndDisplay = (HWND)NULL;
2247 HWND ghwndTab = (HWND)NULL;
2252 char GenSurfURL[40] = {"http://tarot.telefragged.com/gensurf"};
2253 char GenSurfBoard[40]={"http://tarot.telefragged.com/board"};
2256 * AboutDlgProc - processes messages for the about dialog.
2259 qboolean CALLBACK AboutDlgProc( HWND hwnd, unsigned msg, UINT wparam, LONG lparam )
2262 DRAWITEMSTRUCT *dis;
2269 lparam = lparam; /* turn off warning */
2273 strcpy(szText,"About " );
2274 strcat(szText,gszCaption);
2275 SetWindowText(hwnd,gszCaption);
2276 SetDlgItemText(hwnd,DLG_ABOUT_APP,szText);
2277 /* Application icon: */
2278 SendDlgItemMessage( hwnd, DLG_ABOUT_ICON,
2279 STM_SETICON, (WPARAM)(HICON)LoadIcon(ghInst,"GENSURF"),
2282 hwndURL = GetDlgItem(hwnd,DLG_ABOUT_URL);
2283 hdc = GetDC(hwndURL);
2284 GetTextExtentPoint(hdc,GenSurfURL,strlen(GenSurfURL),&size);
2285 ReleaseDC(hwndURL,hdc);
2286 GetWindowRect(hwndURL,&rc);
2287 SetWindowPos(hwndURL,(HWND)NULL,0,0,size.cx,size.cy+2,
2288 SWP_NOMOVE | SWP_NOZORDER);
2290 hwndURL = GetDlgItem(hwnd,DLG_ABOUT_BOARD);
2291 hdc = GetDC(hwndURL);
2292 GetTextExtentPoint(hdc,GenSurfBoard,strlen(GenSurfBoard),&size);
2293 ReleaseDC(hwndURL,hdc);
2294 GetWindowRect(hwndURL,&rc);
2295 SetWindowPos(hwndURL,(HWND)NULL,0,0,size.cx,size.cy+2,
2296 SWP_NOMOVE | SWP_NOZORDER);
2301 switch(LOWORD(wparam))
2306 case DLG_ABOUT_BOARD:
2316 if(wparam == DLG_ABOUT_URL)
2318 dis = (LPDRAWITEMSTRUCT)lparam;
2319 SetTextColor(dis->hDC,RGB(0,0,255));
2320 TextOut(dis->hDC,0,0,GenSurfURL,strlen(GenSurfURL));
2321 GetWindowRect(dis->hwndItem,&rc);
2322 GetTextExtentPoint(dis->hDC,GenSurfURL,strlen(GenSurfURL),&size);
2323 hpen = CreatePen(PS_SOLID,0,RGB(0,0,255));
2324 SelectObject(dis->hDC,hpen);
2325 MoveToEx(dis->hDC,0,size.cy,NULL);
2326 LineTo(dis->hDC,size.cx,size.cy);
2327 SelectObject(dis->hDC,GetStockObject(BLACK_PEN));
2330 else if(wparam==DLG_ABOUT_BOARD)
2332 dis = (LPDRAWITEMSTRUCT)lparam;
2333 SetTextColor(dis->hDC,RGB(0,0,255));
2334 TextOut(dis->hDC,0,0,GenSurfBoard,strlen(GenSurfBoard));
2335 GetWindowRect(dis->hwndItem,&rc);
2336 GetTextExtentPoint(dis->hDC,GenSurfBoard,strlen(GenSurfBoard),&size);
2337 hpen = CreatePen(PS_SOLID,0,RGB(0,0,255));
2338 SelectObject(dis->hDC,hpen);
2339 MoveToEx(dis->hDC,0,size.cy,NULL);
2340 LineTo(dis->hDC,size.cx,size.cy);
2341 SelectObject(dis->hDC,GetStockObject(BLACK_PEN));
2355 } /* AboutDlgProc */
2359 if( DialogBox( ghInst,"About", ghwnd_main, (DLGPROC)AboutDlgProc ) < 0)
2362 sprintf(Text,"In About(), GetLastError()=0x%08x",GetLastError());
2363 MessageBox(ghwnd_main,Text,"GenSurf",MB_ICONEXCLAMATION);