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
26 #include <glib/gi18n.h>
31 #define FIXPOINTS_TAB 3
33 //#define BUFF_SIZE 32768
35 #define ENABLE_WIDGET(name,enable) \
36 gtk_widget_set_sensitive (GTK_WIDGET (g_object_get_data (G_OBJECT (g_pWnd), (name))), (enable))
37 #define CHECK_WIDGET(name,check) \
38 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (g_object_get_data (G_OBJECT (g_pWnd), name)), check)
40 static GtkWidget *game_radios[NUMGAMES];
41 static GtkWidget *wave_radios[5];
42 static GtkWidget *plane_radios[6];
43 static guint current_tab;
44 static int OldPreview;
46 static GtkTooltips *tooltips;
47 static int FirstPassComplete = 0;
49 void About (GtkWidget *parent)
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 "................................",
89 "................................"
92 // leo: I'm too lazy to create a nice about box
93 // ^Fishman - I am lazy too :P.
94 g_FuncTable.m_pfnMessageBox (parent, "GtkGenSurf 1.05\n\n"
96 "David Hyde (rascal@vicksburg.com)\n\n"
98 "Leonardo Zide (leo@lokigames.com)\n\n"
100 "Pablo Zurita (pablo@qeradiant.com)\n"
101 "Hydra (hydra@hydras-world.com)",
102 "About GtkGenSurf", MB_OK, NULL);
105 // =============================================================================
108 static void SetupControls ()
118 gtk_widget_hide (GTK_WIDGET (g_object_get_data (G_OBJECT (g_pWnd), "use_patches")));
119 ENABLE_WIDGET ("use_patches", FALSE);
123 gtk_widget_show (GTK_WIDGET (g_object_get_data (G_OBJECT (g_pWnd), "use_patches")));
124 ENABLE_WIDGET ("use_patches", TRUE);
127 if (Game == QUAKE3 && UsePatches != 0)
129 ENABLE_WIDGET ("decimate", FALSE);
131 gtk_label_set_text (GTK_LABEL (g_object_get_data (G_OBJECT (g_pWnd), "snap_text")), "Snap to grid:"); // ^Fishman - Snap to grid.
135 if (WaveType != WAVE_BITMAP)
137 ENABLE_WIDGET ("bmp_file", FALSE);
138 ENABLE_WIDGET ("bmp_file_browse", FALSE);
139 ENABLE_WIDGET ("bmp_black", FALSE);
140 ENABLE_WIDGET ("bmp_white", FALSE);
141 ENABLE_WIDGET ("bmp_text1", FALSE);
142 ENABLE_WIDGET ("bmp_text2", FALSE);
143 ENABLE_WIDGET ("bmp_text3", FALSE);
144 ENABLE_WIDGET ("bmp_reload", FALSE);
145 gtk_label_set_text (GTK_LABEL (g_object_get_data (G_OBJECT (g_pWnd), "bmp_note")),
146 "These options are disabled unless \"From Bitmap\"\n"
147 "is selected as the Waveform on the General tab.");
151 ENABLE_WIDGET ("bmp_file", TRUE);
152 ENABLE_WIDGET ("bmp_file_browse", TRUE);
153 ENABLE_WIDGET ("bmp_black", TRUE);
154 ENABLE_WIDGET ("bmp_white", TRUE);
155 ENABLE_WIDGET ("bmp_text1", TRUE);
156 ENABLE_WIDGET ("bmp_text2", TRUE);
157 ENABLE_WIDGET ("bmp_text3", TRUE);
158 ENABLE_WIDGET ("bmp_reload", strlen(gbmp.name) != 0);
159 gtk_label_set_text (GTK_LABEL (g_object_get_data (G_OBJECT (g_pWnd), "bmp_note")),
160 "GenSurf works only with 8-bit bitmaps. Color indices are\n"
161 "mapped to values for each vertex. Generally, gray scale\n"
162 "images are stored with black as color 0, white as color 255.");
167 ENABLE_WIDGET ("fix_value", (NumVerticesSelected != 0));
168 ENABLE_WIDGET ("fix_value_text", (NumVerticesSelected != 0));
169 ENABLE_WIDGET ("fix_free", (NumVerticesSelected != 0));
170 ENABLE_WIDGET ("fix_range", ((NumVerticesSelected != 0) && (WaveType != WAVE_ROUGH_ONLY)));
171 ENABLE_WIDGET ("fix_range_text", ((NumVerticesSelected != 0) && (WaveType != WAVE_ROUGH_ONLY)));
172 ENABLE_WIDGET ("fix_rate", ((NumVerticesSelected != 0) && (WaveType != WAVE_ROUGH_ONLY)));
173 ENABLE_WIDGET ("fix_rate_text", ((NumVerticesSelected != 0) && (WaveType != WAVE_ROUGH_ONLY)));
177 ENABLE_WIDGET ("texture2", (UsePatches == 0));
178 ENABLE_WIDGET ("texture3", (UsePatches == 0));
179 ENABLE_WIDGET ("tex_slant", (UsePatches == 0));
180 ENABLE_WIDGET ("detail", (UsePatches == 0));
183 ENABLE_WIDGET ("terrain_ent", FALSE); // ^Fishman - Adds terrain key to func_group.
184 ENABLE_WIDGET ("hint", (UsePatches == 0));
193 ENABLE_WIDGET ("amplitude", TRUE);
194 ENABLE_WIDGET ("wavelength", TRUE);
195 ENABLE_WIDGET ("z00", TRUE);
196 ENABLE_WIDGET ("z01", TRUE);
197 ENABLE_WIDGET ("z10", TRUE);
198 ENABLE_WIDGET ("z11", TRUE);
199 ENABLE_WIDGET ("linearborder", TRUE);
200 ENABLE_WIDGET ("go", TRUE);
203 ENABLE_WIDGET ("amplitude", FALSE);
204 ENABLE_WIDGET ("wavelength", FALSE);
205 ENABLE_WIDGET ("z00", FALSE);
206 ENABLE_WIDGET ("z01", FALSE);
207 ENABLE_WIDGET ("z10", FALSE);
208 ENABLE_WIDGET ("z11", FALSE);
209 ENABLE_WIDGET ("linearborder", FALSE);
210 ENABLE_WIDGET ("go", (gbmp.colors != NULL ? TRUE : FALSE));
212 case WAVE_ROUGH_ONLY:
213 ENABLE_WIDGET ("amplitude", FALSE);
214 ENABLE_WIDGET ("wavelength", FALSE);
215 ENABLE_WIDGET ("z00", TRUE);
216 ENABLE_WIDGET ("z01", TRUE);
217 ENABLE_WIDGET ("z10", TRUE);
218 ENABLE_WIDGET ("z11", TRUE);
219 ENABLE_WIDGET ("linearborder", TRUE);
220 ENABLE_WIDGET ("go", TRUE);
223 ENABLE_WIDGET ("amplitude", TRUE);
224 ENABLE_WIDGET ("wavelength", TRUE);
225 ENABLE_WIDGET ("z00", TRUE);
226 ENABLE_WIDGET ("z01", TRUE);
227 ENABLE_WIDGET ("z10", TRUE);
228 ENABLE_WIDGET ("z11", TRUE);
229 ENABLE_WIDGET ("linearborder", TRUE);
230 ENABLE_WIDGET ("go", TRUE);
237 gtk_label_set_text (GTK_LABEL (g_object_get_data (G_OBJECT (g_pWnd), "hmin_text")), "X:");
238 gtk_label_set_text (GTK_LABEL (g_object_get_data (G_OBJECT (g_pWnd), "hmax_text")), "X:");
239 gtk_label_set_text (GTK_LABEL (g_object_get_data (G_OBJECT (g_pWnd), "vmin_text")), "Z:");
240 gtk_label_set_text (GTK_LABEL (g_object_get_data (G_OBJECT (g_pWnd), "vmax_text")), "Z:");
241 gtk_label_set_text (GTK_LABEL (g_object_get_data (G_OBJECT (g_pWnd), "nh_text")), "X:");
242 gtk_label_set_text (GTK_LABEL (g_object_get_data (G_OBJECT (g_pWnd), "nv_text")), "Z:");
246 gtk_label_set_text (GTK_LABEL (g_object_get_data (G_OBJECT (g_pWnd), "hmin_text")), "Y:");
247 gtk_label_set_text (GTK_LABEL (g_object_get_data (G_OBJECT (g_pWnd), "hmax_text")), "Y:");
248 gtk_label_set_text (GTK_LABEL (g_object_get_data (G_OBJECT (g_pWnd), "vmin_text")), "Z:");
249 gtk_label_set_text (GTK_LABEL (g_object_get_data (G_OBJECT (g_pWnd), "vmax_text")), "Z:");
250 gtk_label_set_text (GTK_LABEL (g_object_get_data (G_OBJECT (g_pWnd), "nh_text")), "Y:");
251 gtk_label_set_text (GTK_LABEL (g_object_get_data (G_OBJECT (g_pWnd), "nv_text")), "Z:");
254 gtk_label_set_text (GTK_LABEL (g_object_get_data (G_OBJECT (g_pWnd), "hmin_text")), "X:");
255 gtk_label_set_text (GTK_LABEL (g_object_get_data (G_OBJECT (g_pWnd), "hmax_text")), "X:");
256 gtk_label_set_text (GTK_LABEL (g_object_get_data (G_OBJECT (g_pWnd), "vmin_text")), "Y:");
257 gtk_label_set_text (GTK_LABEL (g_object_get_data (G_OBJECT (g_pWnd), "vmax_text")), "Y:");
258 gtk_label_set_text (GTK_LABEL (g_object_get_data (G_OBJECT (g_pWnd), "nh_text")), "X:");
259 gtk_label_set_text (GTK_LABEL (g_object_get_data (G_OBJECT (g_pWnd), "nv_text")), "Y:");
264 // SetDlgValues fills in text boxes and initializes other input controls
265 static void SetDlgValues (int tab)
268 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)
281 for (i = 0; i < NUMGAMES; i++)
282 gtk_widget_set_sensitive (game_radios[i], (i == Game ? TRUE : FALSE));
283 for (i = 0; i < 6; i++)
284 gtk_widget_set_sensitive (plane_radios[i], (i == Plane ? TRUE : FALSE));
287 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (game_radios[Game]), TRUE);
288 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (plane_radios[Plane]), TRUE);
289 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (wave_radios[WaveType]), TRUE);
290 gtk_spin_button_set_value (GTK_SPIN_BUTTON (g_object_get_data (G_OBJECT (g_pWnd), "random")),
292 sprintf (Text, RForm, WaveLength);
293 gtk_entry_set_text (GTK_ENTRY (g_object_get_data (G_OBJECT (g_pWnd), "wavelength")), Text);
294 sprintf (Text, RForm, Amplitude);
295 gtk_entry_set_text (GTK_ENTRY (g_object_get_data (G_OBJECT (g_pWnd), "amplitude")), Text);
296 sprintf (Text, RForm, Roughness);
297 gtk_entry_set_text (GTK_ENTRY (g_object_get_data (G_OBJECT (g_pWnd), "roughness")), Text);
298 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (g_object_get_data
299 (G_OBJECT (g_pWnd), "main_antialiasing")), Antialiasing);
303 sprintf (Text,RForm,Hll);
304 gtk_entry_set_text (GTK_ENTRY (g_object_get_data (G_OBJECT (g_pWnd), "hmin")), Text);
305 sprintf (Text,RForm,Vll);
306 gtk_entry_set_text (GTK_ENTRY (g_object_get_data (G_OBJECT (g_pWnd), "vmin")), Text);
307 sprintf (Text,RForm,Hur);
308 gtk_entry_set_text (GTK_ENTRY (g_object_get_data (G_OBJECT (g_pWnd), "hmax")), Text);
309 sprintf (Text,RForm,Vur);
310 gtk_entry_set_text (GTK_ENTRY (g_object_get_data (G_OBJECT (g_pWnd), "vmax")), Text);
311 sprintf (Text,RForm,Z00);
312 gtk_entry_set_text (GTK_ENTRY (g_object_get_data (G_OBJECT (g_pWnd), "z00")), Text);
313 sprintf (Text,RForm,Z01);
314 gtk_entry_set_text (GTK_ENTRY (g_object_get_data (G_OBJECT (g_pWnd), "z01")), Text);
315 sprintf (Text,RForm,Z10);
316 gtk_entry_set_text (GTK_ENTRY (g_object_get_data (G_OBJECT (g_pWnd), "z10")), Text);
317 sprintf (Text,RForm,Z11);
318 gtk_entry_set_text (GTK_ENTRY (g_object_get_data (G_OBJECT (g_pWnd), "z11")), Text);
319 gtk_spin_button_set_value (GTK_SPIN_BUTTON (g_object_get_data (G_OBJECT (g_pWnd), "nh")), NH);
320 gtk_spin_button_set_value (GTK_SPIN_BUTTON (g_object_get_data (G_OBJECT (g_pWnd), "nv")), NV);
321 gtk_spin_button_set_value (GTK_SPIN_BUTTON (g_object_get_data (G_OBJECT (g_pWnd), "sp")), SP); // ^Fishman - Snap to grid.
323 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (g_object_get_data
324 (G_OBJECT (g_pWnd), "linearborder")), FixBorders);
325 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (g_object_get_data
326 (G_OBJECT (g_pWnd), "use_patches")), UsePatches);
327 gtk_adjustment_set_value (GTK_ADJUSTMENT (g_object_get_data (G_OBJECT (g_pWnd), "decimate_adj")),
330 if (Game == QUAKE3 && UsePatches)
332 gtk_widget_set_sensitive (GTK_WIDGET (g_object_get_data (G_OBJECT (g_pWnd), "decimate")), FALSE);
337 if (NH > MAX_ROWS) NH -= 2;
338 SetDlgValues (current_tab);
344 if (NV > MAX_ROWS) NV -= 2;
345 SetDlgValues (current_tab);
349 if (NH > MAX_ROWS) NH = MAX_ROWS;
352 if (NV > MAX_ROWS) NV = MAX_ROWS;
354 gpointer spin = g_object_get_data (G_OBJECT (g_pWnd), "nh");
355 GtkAdjustment *adj = gtk_spin_button_get_adjustment (GTK_SPIN_BUTTON (spin));
357 gtk_adjustment_changed (adj);
358 spin = g_object_get_data (G_OBJECT (g_pWnd), "nv");
359 adj = gtk_spin_button_get_adjustment (GTK_SPIN_BUTTON (spin));
361 gtk_adjustment_changed (adj);
365 gtk_widget_set_sensitive (GTK_WIDGET (g_object_get_data (G_OBJECT (g_pWnd), "decimate")), TRUE);
367 gpointer spin = g_object_get_data (G_OBJECT (g_pWnd), "nh");
368 GtkAdjustment *adj = gtk_spin_button_get_adjustment (GTK_SPIN_BUTTON (spin));
370 gtk_adjustment_changed (adj);
371 spin = g_object_get_data (G_OBJECT (g_pWnd), "nv");
372 adj = gtk_spin_button_get_adjustment (GTK_SPIN_BUTTON (spin));
374 gtk_adjustment_changed (adj);
377 gtk_spin_button_set_value (GTK_SPIN_BUTTON (g_object_get_data (G_OBJECT (g_pWnd), "nh")), NH);
378 gtk_spin_button_set_value (GTK_SPIN_BUTTON (g_object_get_data (G_OBJECT (g_pWnd), "nv")), NV);
383 gtk_entry_set_text (GTK_ENTRY (g_object_get_data (G_OBJECT (g_pWnd), "bmp_file")), gbmp.name);
384 sprintf(Text,"%g",gbmp.black_value);
385 gtk_entry_set_text (GTK_ENTRY (g_object_get_data (G_OBJECT (g_pWnd), "bmp_black")), Text);
386 sprintf(Text,"%g",gbmp.white_value);
387 gtk_entry_set_text (GTK_ENTRY (g_object_get_data (G_OBJECT (g_pWnd), "bmp_white")), Text);
394 gtk_entry_set_text (GTK_ENTRY (g_object_get_data (G_OBJECT (g_pWnd), "texture1")), Texture[Game][0]);
395 gtk_entry_set_text (GTK_ENTRY (g_object_get_data (G_OBJECT (g_pWnd), "texture2")), Texture[Game][1]);
396 gtk_entry_set_text (GTK_ENTRY (g_object_get_data (G_OBJECT (g_pWnd), "texture3")), Texture[Game][2]);
397 gtk_spin_button_set_value (GTK_SPIN_BUTTON (g_object_get_data (G_OBJECT (g_pWnd), "tex_slant")),
399 sprintf(Text,RForm,TexOffset[0]);
400 gtk_entry_set_text (GTK_ENTRY (g_object_get_data (G_OBJECT (g_pWnd), "texoffsetx")), Text);
401 sprintf(Text,RForm,TexOffset[1]);
402 gtk_entry_set_text (GTK_ENTRY (g_object_get_data (G_OBJECT (g_pWnd), "texoffsety")), Text);
403 sprintf(Text,RForm,TexScale[0]);
404 gtk_entry_set_text (GTK_ENTRY (g_object_get_data (G_OBJECT (g_pWnd), "texscalex")), Text);
405 sprintf(Text,RForm,TexScale[1]);
406 gtk_entry_set_text (GTK_ENTRY (g_object_get_data (G_OBJECT (g_pWnd), "texscaley")), Text);
407 CHECK_WIDGET ("detail", UseDetail);
411 ENABLE_WIDGET ("hint", FALSE);
415 ENABLE_WIDGET ("hint", TRUE);
416 CHECK_WIDGET ("hint", AddHints);
421 // ArghRad doesn't currently support SiN
422 EnableWindow(GetDlgItem(hwndDisplay,DLG_ARGHRAD2), 0);
423 EnableWindow(GetDlgItem(hwndDisplay,DLG_ARGHRAD2_SPIN), 0);
424 ShowWindow(GetDlgItem(hwndDisplay,DLG_ARGHRAD2_TEXT), SW_HIDE);
425 ShowWindow(GetDlgItem(hwndDisplay,DLG_ARGHRAD2), SW_HIDE);
426 ShowWindow(GetDlgItem(hwndDisplay,DLG_ARGHRAD2_SPIN), SW_HIDE);
427 SetDlgItemText(hwndDisplay,DLG_TEX_USEPAK,"Use sin file");
428 SetDlgItemText(hwndDisplay,DLG_TEX_PAK_TEXT,"Sin:");
435 // ArghRad sun is inapplicable (so far)
436 EnableWindow(GetDlgItem(hwndDisplay,DLG_ARGHRAD2), 0);
437 EnableWindow(GetDlgItem(hwndDisplay,DLG_ARGHRAD2_SPIN), 0);
438 ShowWindow(GetDlgItem(hwndDisplay,DLG_ARGHRAD2_TEXT), SW_HIDE);
439 ShowWindow(GetDlgItem(hwndDisplay,DLG_ARGHRAD2), SW_HIDE);
440 ShowWindow(GetDlgItem(hwndDisplay,DLG_ARGHRAD2_SPIN), SW_HIDE);
442 EnableWindow(GetDlgItem(hwndDisplay,DLG_LADDER), 0);
443 ShowWindow(GetDlgItem(hwndDisplay,DLG_LADDER), SW_HIDE);
444 SetDlgItemText(hwndDisplay,DLG_TEX_USEPAK,"Use pk3 file");
445 SetDlgItemText(hwndDisplay,DLG_TEX_PAK_TEXT,"PK3:");
449 /*trix if(Game==HERETIC2)
451 // ArghRad doesn't currently support Heretic2
452 EnableWindow(GetDlgItem(hwndDisplay,DLG_ARGHRAD2), 0);
453 EnableWindow(GetDlgItem(hwndDisplay,DLG_ARGHRAD2_SPIN), 0);
454 ShowWindow(GetDlgItem(hwndDisplay,DLG_ARGHRAD2_TEXT), SW_HIDE);
455 ShowWindow(GetDlgItem(hwndDisplay,DLG_ARGHRAD2), SW_HIDE);
456 ShowWindow(GetDlgItem(hwndDisplay,DLG_ARGHRAD2_SPIN), SW_HIDE);
458 SetDlgItemText(hwndDisplay,DLG_TEX_USEPAK,"Use pak file");
459 SetDlgItemText(hwndDisplay,DLG_TEX_PAK_TEXT,"Pak:");
464 // A bunch of controls aren't applicable to HL
465 EnableWindow(GetDlgItem(hwndDisplay,DLG_TEXTURE_BROWSE), 0);
466 EnableWindow(GetDlgItem(hwndDisplay,DLG_TEXTURE2_BROWSE),0);
467 EnableWindow(GetDlgItem(hwndDisplay,DLG_TEXTURE3_BROWSE),0);
468 EnableWindow(GetDlgItem(hwndDisplay,DLG_DETAIL), 0);
469 EnableWindow(GetDlgItem(hwndDisplay,DLG_LADDER), 0);
470 EnableWindow(GetDlgItem(hwndDisplay,DLG_ARGHRAD2), 0);
471 EnableWindow(GetDlgItem(hwndDisplay,DLG_ARGHRAD2_SPIN), 0);
472 ShowWindow(GetDlgItem(hwndDisplay,DLG_TEXTURE_BROWSE), SW_HIDE);
473 ShowWindow(GetDlgItem(hwndDisplay,DLG_TEXTURE2_BROWSE),SW_HIDE);
474 ShowWindow(GetDlgItem(hwndDisplay,DLG_TEXTURE3_BROWSE),SW_HIDE);
475 ShowWindow(GetDlgItem(hwndDisplay,DLG_DETAIL), SW_HIDE);
476 ShowWindow(GetDlgItem(hwndDisplay,DLG_LADDER), SW_HIDE);
477 ShowWindow(GetDlgItem(hwndDisplay,DLG_ARGHRAD2_TEXT), SW_HIDE);
478 ShowWindow(GetDlgItem(hwndDisplay,DLG_ARGHRAD2), SW_HIDE);
479 ShowWindow(GetDlgItem(hwndDisplay,DLG_ARGHRAD2_SPIN), SW_HIDE);
481 SetDlgItemText(hwndDisplay,DLG_TEX_USEPAK,"Use wad file");
482 SetDlgItemText(hwndDisplay,DLG_TEX_PAK_TEXT,"Wad:");
483 SetDlgItemText(hwndDisplay,DLG_HINT,"Hint brushes");
488 // No Q2-type compilers support Genesis3D (including ArghRad)
489 EnableWindow(GetDlgItem(hwndDisplay,DLG_ARGHRAD2), 0);
490 EnableWindow(GetDlgItem(hwndDisplay,DLG_ARGHRAD2_SPIN), 0);
491 ShowWindow(GetDlgItem(hwndDisplay,DLG_ARGHRAD2_TEXT), SW_HIDE);
492 ShowWindow(GetDlgItem(hwndDisplay,DLG_ARGHRAD2), SW_HIDE);
493 ShowWindow(GetDlgItem(hwndDisplay,DLG_ARGHRAD2_SPIN), SW_HIDE);
495 SetDlgItemText(hwndDisplay,DLG_TEX_USEPAK,"Use sin file");
496 SetDlgItemText(hwndDisplay,DLG_TEX_PAK_TEXT,"Sin:");
504 static void ReadDlgValues (int tab)
513 Roughness = atof ( gtk_entry_get_text (GTK_ENTRY (g_object_get_data (G_OBJECT (g_pWnd), "roughness"))));
514 WaveLength = atof ( gtk_entry_get_text (GTK_ENTRY (g_object_get_data (G_OBJECT (g_pWnd), "wavelength"))));
515 Amplitude = atof ( gtk_entry_get_text (GTK_ENTRY (g_object_get_data (G_OBJECT (g_pWnd), "amplitude"))));
516 spin = g_object_get_data (G_OBJECT (g_pWnd), "random");
517 RandomSeed = gtk_spin_button_get_value_as_int (GTK_SPIN_BUTTON (spin));
521 SP = atoi (gtk_entry_get_text (GTK_ENTRY (g_object_get_data (G_OBJECT (g_pWnd), "sp"))));
522 NH = atoi (gtk_entry_get_text (GTK_ENTRY (g_object_get_data (G_OBJECT (g_pWnd), "nh"))));
523 NV = atoi (gtk_entry_get_text (GTK_ENTRY (g_object_get_data (G_OBJECT (g_pWnd), "nv"))));
525 if (Game == QUAKE3 && UsePatches != 0)
529 if (NH > MAX_ROWS) NH = MAX_ROWS;
532 if (NV > MAX_ROWS) NV = MAX_ROWS;
539 if (WaveType == WAVE_BITMAP)
541 GetDlgItemText(hwnd,DLG_BMP_FILE,gbmp.name,sizeof(gbmp.name));
543 GetDlgItemText(hwnd,DLG_BMP_BLACK,Text,sizeof(Text));
544 gbmp.black_value = atof(Text);
545 GetDlgItemText(hwnd,DLG_BMP_WHITE,Text,sizeof(Text));
546 gbmp.white_value = atof(Text);
552 GetDlgItemText(hwnd,DLG_FIX_VALUE,Text,sizeof(Text));
553 temp.fixed_value = atoi(Text);
554 GetDlgItemText(hwnd,DLG_FIX_RANGE,Text,sizeof(Text));
555 temp.range = atoi(Text);
556 GetDlgItemText(hwnd,DLG_FIX_RATE, Text,sizeof(Text));
557 temp.rate = atof(Text);
558 for(k=0; k<NumVerticesSelected; k++)
560 xyz[Vertex[k].i][Vertex[k].j].fixed_value = temp.fixed_value;
561 xyz[Vertex[k].i][Vertex[k].j].range = temp.range;
562 xyz[Vertex[k].i][Vertex[k].j].rate = temp.rate;
567 CheckDlgButton(ghwnd,DLG_PREVIEW,0);
568 SendMessage(ghwnd,WM_COMMAND,DLG_PREVIEW,0);
577 i = SendDlgItemMessage( hwndDisplay, DLG_TEX_LIST1, CB_GETCURSEL, 0, 0 );
579 Texture[Game][0][0] = '\0';
581 SendDlgItemMessage( hwndDisplay, DLG_TEX_LIST1, CB_GETLBTEXT, i,
582 (LPARAM)(LPCSTR)Texture[Game][0]);
584 i = SendDlgItemMessage( hwndDisplay, DLG_TEX_LIST2, CB_GETCURSEL, 0, 0 );
586 Texture[Game][1][0] = '\0';
588 SendDlgItemMessage( hwndDisplay, DLG_TEX_LIST2, CB_GETLBTEXT, i,
589 (LPARAM)(LPCSTR)Texture[Game][1]);
591 i = SendDlgItemMessage( hwndDisplay, DLG_TEX_LIST3, CB_GETCURSEL, 0, 0 );
593 Texture[Game][2][0] = '\0';
595 SendDlgItemMessage( hwndDisplay, DLG_TEX_LIST3, CB_GETLBTEXT, i,
596 (LPARAM)(LPCSTR)Texture[Game][2]);
600 GetDlgItemText(hwndDisplay,DLG_TEXTURE, Texture[Game][0],sizeof(Texture[Game][0]));
601 GetDlgItemText(hwndDisplay,DLG_TEXTURE2,Texture[Game][1],sizeof(Texture[Game][1]));
602 GetDlgItemText(hwndDisplay,DLG_TEXTURE3,Texture[Game][2],sizeof(Texture[Game][2]));
604 GetDlgItemText(hwndDisplay,DLG_TEX_SLANT,Text,sizeof(Text));
605 SlantAngle = atoi(Text);
606 SlantAngle = max(0,min(SlantAngle,90));
607 GetDlgItemText(hwndDisplay,DLG_TEXOFFSETX,Text,sizeof(Text));
608 TexOffset[0] = atof(Text);
609 GetDlgItemText(hwndDisplay,DLG_TEXOFFSETY,Text,sizeof(Text));
610 TexOffset[1] = atof(Text);
611 GetDlgItemText(hwndDisplay,DLG_TEXSCALEX,Text,sizeof(Text));
612 TexScale[0] = atof(Text);
613 if(TexScale[0] == 0.) TexScale[0] = 1.0;
614 GetDlgItemText(hwndDisplay,DLG_TEXSCALEY,Text,sizeof(Text));
615 TexScale[1] = atof(Text);
616 if(TexScale[1] == 0.) TexScale[1] = 1.0;
617 GetDlgItemText(hwndDisplay,DLG_ARGHRAD2,Text,sizeof(Text));
618 ArghRad2 = atoi(Text);
624 // =============================================================================
625 // main dialog callbacks
627 static void switch_page (GtkNotebook *notebook, GtkNotebookPage *page, guint page_num, gpointer data)
629 if (current_tab != page_num)
631 if (page_num == FIXPOINTS_TAB)
633 OldPreview = Preview;
634 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (g_object_get_data (G_OBJECT (g_pWnd),
635 "main_preview")), TRUE);
637 UpdatePreview (true);
638 NumVerticesSelected = 0;
641 if (current_tab == FIXPOINTS_TAB)
644 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (g_object_get_data (G_OBJECT (g_pWnd),
645 "main_preview")), FALSE);
647 UpdatePreview (true);
648 NumVerticesSelected = 0;
651 if (page_num == TEXTURE_TAB)
653 WasDetail = UseDetail;
657 ENABLE_WIDGET ("detail", FALSE);
661 ReadDlgValues (current_tab);
662 current_tab = page_num;
663 SetDlgValues (current_tab);
667 static gint main_close (GtkWidget *widget, gpointer data)
669 gtk_widget_hide (g_pWnd);
670 gtk_widget_hide (g_pWndPreview);
675 static void main_save (GtkWidget *widget, gpointer data)
677 ReadDlgValues (current_tab);
681 static void main_open (GtkWidget *widget, gpointer data)
683 OpenSetup (g_pWnd, 0);
684 for (int i = 0; i < 5; i++)
689 static void main_defaults (GtkWidget *widget, gpointer data)
691 OpenSetup (g_pWnd, 1);
692 for (int i = 0; i < 5; i++)
697 static void main_preview (GtkWidget *widget, gpointer data)
699 Preview = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (widget));
703 // ^Fishman - Antializing for the preview window.
704 static void main_antialiasing (GtkWidget *widget, gpointer data)
706 Antialiasing = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (widget));
707 UpdatePreview (true);
710 static void main_about (GtkWidget *widget, gpointer data)
715 static void main_go (GtkWidget *widget, gpointer data)
717 GtkWidget *notebook = GTK_WIDGET (g_object_get_data (G_OBJECT (g_pWnd), "notebook"));
720 ReadDlgValues (current_tab);
721 if (NH < 1 || NH > MAX_ROWS)
723 sprintf (Text, "The number of divisions must be > 0 and no greater than %d.", MAX_ROWS);
724 g_FuncTable.m_pfnMessageBox (g_pWnd, Text, "GenSurf", MB_ICONEXCLAMATION, NULL);
725 gtk_notebook_set_page (GTK_NOTEBOOK (notebook), EXTENTS_TAB);
729 if (NV < 1 || NV > MAX_ROWS)
731 sprintf (Text, "The number of divisions must be > 0 and no greater than %d.", MAX_ROWS);
732 g_FuncTable.m_pfnMessageBox (g_pWnd, Text, "GenSurf", MB_ICONEXCLAMATION, NULL);
733 gtk_notebook_set_page (GTK_NOTEBOOK (notebook), EXTENTS_TAB);
739 g_FuncTable.m_pfnMessageBox (g_pWnd, "The \"lower-left\" values must be less than "
740 "the corresponding \"upper-right\" values in "
741 "the \"Extent\" box.","GenSurf", MB_OK | MB_ICONEXCLAMATION, NULL);
742 gtk_notebook_set_page (GTK_NOTEBOOK (notebook), EXTENTS_TAB);
748 g_FuncTable.m_pfnMessageBox (g_pWnd,"The \"lower-left\" values must be less than "
749 "the corresponding \"upper-right\" values in "
750 "the \"Extent\" box.","GenSurf", MB_OK | MB_ICONEXCLAMATION, NULL);
751 gtk_notebook_set_page (GTK_NOTEBOOK (notebook), EXTENTS_TAB);
755 if (!strlen (Texture[Game][0]))
757 g_FuncTable.m_pfnMessageBox (g_pWnd, "You must supply a texture name.", "GenSurf", MB_ICONEXCLAMATION, NULL);
758 gtk_notebook_set_page (GTK_NOTEBOOK (notebook), EXTENTS_TAB);
762 /* if (Decimate>0 && GimpHints!=0)
764 MessageBox(hwnd,"You've elected to use a decimated grid and gimp's non-detail hint brushes. "
765 "This combination usually produces bizarre visual errors in the game, "
766 "so GenSurf has turned off the hint brush option.",
767 "GenSurf",MB_ICONEXCLAMATION);
771 gtk_widget_hide (g_pWnd);
773 gtk_widget_hide (g_pWndPreview);
776 WriteIniFile(gszIni);
779 // =============================================================================
780 // general tab callbacks
782 static void general_game (GtkToggleButton *widget, gpointer data)
784 if (gtk_toggle_button_get_active (widget))
786 Game = GPOINTER_TO_INT (data);
787 UpdatePreview (TRUE);
791 static void general_plane (GtkToggleButton *widget, gpointer data)
793 if (gtk_toggle_button_get_active (widget))
795 Plane = GPOINTER_TO_INT (data);
797 UpdatePreview (TRUE);
801 static void general_wave (GtkToggleButton *widget, gpointer data)
803 if (gtk_toggle_button_get_active (widget))
805 WaveType = GPOINTER_TO_INT (data);
807 UpdatePreview (TRUE);
811 static void general_random (GtkAdjustment *adj, gpointer data)
813 int nPos = (int)adj->value;
815 if (RandomSeed != nPos)
818 UpdatePreview (true);
822 // =============================================================================
823 // extents tab callbacks
825 static void extents_linearborder (GtkToggleButton *check, gpointer data)
827 FixBorders = gtk_toggle_button_get_active (check);
828 UpdatePreview (true);
831 static void extents_use_patches (GtkToggleButton *check, gpointer data)
836 UsePatches = gtk_toggle_button_get_active (check);
837 SetDlgValues (current_tab);
839 UpdatePreview (true);
842 static void extents_nhnv_spin (GtkAdjustment *adj, int *data)
844 int nPos = (int)adj->value;
848 if (Game==QUAKE3 && UsePatches && (nPos % 2))
854 gtk_adjustment_set_value (adj, *data);
858 UpdatePreview (true);
862 static void extents_decimate (GtkAdjustment *adj, gpointer data)
864 int nPos = (int)adj->value;
867 UpdatePreview (true);
870 // Hydra : snap to grid begin
871 /*static void extents_snaptogrid (GtkAdjustment *adj, gpointer data)
873 int nPos = (int)adj->value;
876 UpdatePreview (true);
879 // ^Fishman - Modified version of Hydra's snap to grid code.
880 static void extents_snaptogrid_spin (GtkAdjustment *adj, int *data)
882 int nPos = (int)adj->value;
884 UpdatePreview (true);
887 // =============================================================================
888 // bitmap tab callbacks
890 static gint bitmap_file_entryfocusout(GtkWidget* widget, GdkEventFocus* event, gpointer data)
892 char filename[NAME_MAX];
894 strcpy (filename, gtk_entry_get_text (GTK_ENTRY(widget)));
895 if(strcmp (filename,gbmp.name))
902 strcpy (gbmp.name,filename);
903 if (strlen(gbmp.name) )
905 ENABLE_WIDGET ("go", (gbmp.colors != NULL ? TRUE : FALSE));
910 static void bitmap_browse (GtkWidget *widget, gpointer data)
912 const char *filename;
915 filename = g_FuncTable.m_pfnFileDialog (g_pWnd, TRUE, "Bitmap File", gbmp.defpath, "gtkgensurf");
917 if (filename != NULL)
919 strcpy (gbmp.name, filename);
921 ptr = strrchr (filename, G_DIR_SEPARATOR);
925 strcpy (gbmp.defpath, filename);
929 ENABLE_WIDGET ("go", (gbmp.colors != NULL ? TRUE : FALSE));
933 static void bitmap_reload (GtkWidget *widget, gpointer data)
935 strcpy (gbmp.name, gtk_entry_get_text (GTK_ENTRY (g_object_get_data (G_OBJECT (g_pWnd), "bmp_file"))));
936 if(strlen (gbmp.name) )
939 ENABLE_WIDGET ("go", (gbmp.colors != NULL ? TRUE : FALSE));
942 ENABLE_WIDGET ("go", FALSE );
945 // =============================================================================
946 // fix points tab callbacks
948 static gint fix_value_entryfocusout (GtkWidget* widget, GdkEventFocus *event, gpointer data)
950 int i = atoi (gtk_entry_get_text (GTK_ENTRY(widget))), k;
953 if (i < -65536 || i > 65536)
956 g_FuncTable.m_pfnMessageBox (g_pWnd, "The value must be between -65536 and 65536, inclusive.",
957 "GenSurf", MB_OK | MB_ICONEXCLAMATION, NULL);
958 sprintf (Text, "%d", (int)xyz[Vertex[0].i][Vertex[0].j].fixed_value);
959 gtk_entry_set_text (GTK_ENTRY(widget), Text);
960 gtk_window_set_focus (GTK_WINDOW (gtk_widget_get_toplevel (widget)), widget);
962 else if (i != xyz[Vertex[0].i][Vertex[0].j].fixed_value)
964 for(k=0; k<NumVerticesSelected; k++)
965 xyz[Vertex[k].i][Vertex[k].j].fixed_value = i;
967 gtk_spin_button_set_value (GTK_SPIN_BUTTON (g_object_get_data (G_OBJECT (g_pWnd), "fix_value")),
968 (int)xyz[Vertex[0].i][Vertex[0].j].fixed_value);
969 UpdatePreview (true);
974 static void fix_value_changed (GtkAdjustment *adj, gpointer data)
976 int k, i = (int)adj->value;
978 if (xyz[Vertex[0].i][Vertex[0].j].fixed_value != i)
980 for(k=0; k<NumVerticesSelected; k++)
981 xyz[Vertex[k].i][Vertex[k].j].fixed_value = i;
986 static gint fix_range_entryfocusout (GtkWidget *widget, GdkEventFocus *event, gpointer data)
988 int i = atoi (gtk_entry_get_text (GTK_ENTRY(widget))), k;
990 if (i != xyz[Vertex[0].i][Vertex[0].j].range)
992 for (k=0; k<NumVerticesSelected; k++)
993 xyz[Vertex[k].i][Vertex[k].j].range = i;
994 UpdatePreview (true);
999 static gint fix_rate_entryfocusout (GtkWidget *widget, GdkEventFocus *event, gpointer data)
1001 double r = atof (gtk_entry_get_text (GTK_ENTRY(widget)));
1004 if (r != xyz[Vertex[0].i][Vertex[0].j].rate)
1006 for(k=0; k<NumVerticesSelected; k++)
1007 xyz[Vertex[k].i][Vertex[k].j].rate = r;
1008 UpdatePreview (true);
1013 static void fix_free (GtkWidget *widget, gpointer data)
1017 for (k=0; k<NumVerticesSelected; k++)
1018 xyz[Vertex[k].i][Vertex[k].j].fixed = 0;
1019 NumVerticesSelected = 0;
1021 UpdatePreview (true);
1024 static void fix_freeall (GtkWidget *widget, gpointer data)
1028 for (i=0; i<=NH; i++)
1030 for(j=0; j<=NV; j++)
1031 xyz[i][j].fixed = 0;
1033 fix_free (NULL, data); // keep these together
1036 void vertex_selected ()
1047 for(k=0; k<NumVerticesSelected; k++)
1048 xyz[Vertex[k].i][Vertex[k].j].fixed_value = xyz[Vertex[0].i][Vertex[0].j].p[1];
1052 for(k=0; k<NumVerticesSelected; k++)
1053 xyz[Vertex[k].i][Vertex[k].j].fixed_value = xyz[Vertex[0].i][Vertex[0].j].p[0];
1056 for(k=0; k<NumVerticesSelected; k++)
1057 xyz[Vertex[k].i][Vertex[k].j].fixed_value = xyz[Vertex[0].i][Vertex[0].j].p[2];
1061 gtk_spin_button_set_value (GTK_SPIN_BUTTON (g_object_get_data (G_OBJECT (g_pWnd), "fix_value")),
1062 (int)xyz[Vertex[0].i][Vertex[0].j].fixed_value);
1064 sprintf(Text,"%d",(int)xyz[Vertex[0].i][Vertex[0].j].range);
1065 gtk_entry_set_text (GTK_ENTRY (g_object_get_data (G_OBJECT (g_pWnd), "fix_range")), Text);
1066 sprintf(Text,"%.5g",xyz[Vertex[0].i][Vertex[0].j].rate);
1067 gtk_entry_set_text (GTK_ENTRY (g_object_get_data (G_OBJECT (g_pWnd), "fix_rate")), Text);
1069 for (k=0; k<NumVerticesSelected; k++)
1070 xyz[Vertex[k].i][Vertex[k].j].fixed = 1;
1072 UpdatePreview (true);
1075 // =============================================================================
1076 // texture tab callbacks
1078 static void texture_detail (GtkToggleButton *check, gpointer data)
1080 UseDetail = gtk_toggle_button_get_active (check);
1081 WasDetail = UseDetail;
1084 static void texture_hint (GtkToggleButton *check, gpointer data)
1086 AddHints = gtk_toggle_button_get_active (check);
1090 ENABLE_WIDGET ("detail", FALSE);
1094 UseDetail = WasDetail;
1095 ENABLE_WIDGET ("detail", FALSE);
1097 CHECK_WIDGET ("detail", UseDetail);
1100 // ^Fishman - Add terrain key to func_group.
1101 static void texture_terrainent (GtkToggleButton *check, gpointer data)
1103 AddTerrainKey = gtk_toggle_button_get_active (check);
1106 static void texture_set(int index, const char* name)
1108 strcpy(Texture[Game][index], name);
1111 static gint texture_entryfocusout(GtkWidget* widget, GdkEventFocus* event, gpointer data)
1113 texture_set(GPOINTER_TO_INT(data), gtk_entry_get_text(GTK_ENTRY(widget)));
1117 // =============================================================================
1120 static void UpdateVariable (GtkEntry *entry, GdkEventFocus *event, double *data)
1122 double x = atof (gtk_entry_get_text (entry));
1127 UpdatePreview (true);
1131 static gint doublevariable_entryfocusout(GtkWidget* widget, GdkEventFocus* event, gpointer data)
1133 UpdateVariable(GTK_ENTRY(widget), event, reinterpret_cast<double*>(data));
1137 // =============================================================================
1140 void create_tooltips ()
1142 tooltips = gtk_tooltips_new ();
1145 gtk_tooltips_set_tip(GTK_TOOLTIPS (tooltips),
1146 GTK_WIDGET (g_object_get_data (G_OBJECT (g_pWnd), "go")),
1147 "Accept all input and generate a surface in Q3Radiant",
1149 gtk_tooltips_set_tip(GTK_TOOLTIPS (tooltips),
1150 GTK_WIDGET (g_object_get_data (G_OBJECT (g_pWnd), "open")),
1151 "Open a previously saved GenSurf settings file.",
1153 gtk_tooltips_set_tip(GTK_TOOLTIPS (tooltips),
1154 GTK_WIDGET (g_object_get_data (G_OBJECT (g_pWnd), "save")),
1155 "Save all settings to a file.",
1157 gtk_tooltips_set_tip(GTK_TOOLTIPS (tooltips),
1158 GTK_WIDGET (g_object_get_data (G_OBJECT (g_pWnd), "defaults")),
1159 "Restore default values from DEFAULTS.SRF. If this file does not exist, GenSurf "
1160 "initializes all input parameters to reasonable values. You can create your own "
1161 "default surface by setting all parameters to your liking, then saving a settings "
1162 "file as DEFAULTS.SRF with the Save As button.",
1165 gtk_tooltips_set_tip(GTK_TOOLTIPS (tooltips),
1166 GTK_WIDGET (g_object_get_data (G_OBJECT (g_pWnd), "main_preview")),
1167 "View a wire-frame representation of the surface",
1170 gtk_tooltips_set_tip(GTK_TOOLTIPS (tooltips),
1171 GTK_WIDGET (g_object_get_data (G_OBJECT (g_pWnd), "main_antialiasing")),
1172 "The lines in the preview window are antialiased for better quality",
1176 gtk_tooltips_set_tip(GTK_TOOLTIPS (tooltips),
1177 GTK_WIDGET (wave_radios[0]),
1178 "Builds a surface with alternating hills and valleys. Uses the general form Z=cos(X) "
1181 gtk_tooltips_set_tip(GTK_TOOLTIPS (tooltips),
1182 GTK_WIDGET (wave_radios[1]),
1183 "Builds a surface with ridges parallel to the vertical axis.",
1185 gtk_tooltips_set_tip(GTK_TOOLTIPS (tooltips),
1186 GTK_WIDGET (wave_radios[2]),
1187 "Builds a surface with ridges parallel to the horizontal axis.",
1189 gtk_tooltips_set_tip(GTK_TOOLTIPS (tooltips),
1190 GTK_WIDGET (wave_radios[3]),
1191 "Builds a map from a bitmap image representing a contour plot. Click the \"Bitmap\" "
1192 "tab to select the image. GenSurf only supports 256-color (8 bit) "
1193 "bitmaps. GenSurf will work with any 256-color bitmap, but gray scale bitmaps are a bit "
1196 gtk_tooltips_set_tip(GTK_TOOLTIPS (tooltips),
1197 GTK_WIDGET (wave_radios[4]),
1198 "Builds a random surface using the Plasma Cloud technique. Variance is controlled "
1199 "by the Roughness input. To build a surface with completely random values not "
1200 "dependent on neighboring vertices, use one of the other waveforms with 0 amplitude.",
1202 gtk_tooltips_set_tip(GTK_TOOLTIPS (tooltips),
1203 GTK_WIDGET (g_object_get_data (G_OBJECT (g_pWnd), "wavelength")),
1204 "Enter the wavelength (distance between crests). NOTE: Wavelengths equal to the grid "
1205 "size or 2 times the grid size will result in 0 amplitudes. For best results, the "
1206 "wavelength value should be at least 4 times the grid size (extents divided by the "
1207 "number of divisions",
1209 gtk_tooltips_set_tip(GTK_TOOLTIPS (tooltips),
1210 GTK_WIDGET (g_object_get_data (G_OBJECT (g_pWnd), "amplitude")),
1211 "Enter the height of hills/ridges.",
1213 gtk_tooltips_set_tip(GTK_TOOLTIPS (tooltips),
1214 GTK_WIDGET (g_object_get_data (G_OBJECT (g_pWnd), "roughness")),
1215 "Enter the roughness value (noise) for the surface. For fractal surfaces, this value "
1216 "is used as a variance in the fractal calculations.",
1218 gtk_tooltips_set_tip(GTK_TOOLTIPS (tooltips),
1219 GTK_WIDGET (g_object_get_data (G_OBJECT (g_pWnd), "random")),
1220 "Seed value for the pseudo-random number generator.",
1223 gtk_tooltips_set_tip(GTK_TOOLTIPS (tooltips),
1224 GTK_WIDGET (g_object_get_data (G_OBJECT (g_pWnd), "hmin")),
1225 "Minimum horizontal coordinate of the surface, i.e. X for a surface parallel to "
1226 "the XY or XZ planes, Y for a surface parallel to the YZ plane. For best results, "
1227 "the extents (maximum-minimum values) in a given direction should be evenly "
1228 "divisible by the number of divisions in that direction.",
1230 gtk_tooltips_set_tip(GTK_TOOLTIPS (tooltips),
1231 GTK_WIDGET (g_object_get_data (G_OBJECT (g_pWnd), "hmax")),
1232 "Maximum horizontal coordinate of the surface, i.e. X for a surface parallel to "
1233 "the XY or XZ planes, Y for a surface parallel to the YZ plane. For best results, "
1234 "the extents (maximum-minimum values) in a given direction should be evenly "
1235 "divisible by the number of divisions in that direction.",
1237 gtk_tooltips_set_tip(GTK_TOOLTIPS (tooltips),
1238 GTK_WIDGET (g_object_get_data (G_OBJECT (g_pWnd), "vmin")),
1239 "Minimum vertical coordinate of the surface, i.e. Y for a surface parallel to "
1240 "the XY plane, Z for a surface parallel to the XZ or YZ planes. For best results, "
1241 "the extents (maximum-minimum values) in a given direction should be evenly "
1242 "divisible by the number of divisions in that direction.",
1244 gtk_tooltips_set_tip(GTK_TOOLTIPS (tooltips),
1245 GTK_WIDGET (g_object_get_data (G_OBJECT (g_pWnd), "vmax")),
1246 "Maximum vertical coordinate of the surface, i.e. Y for a surface parallel to "
1247 "the XY plane, Z for a surface parallel to the XZ or YZ planes. For best results, "
1248 "the extents (maximum-minimum values) in a given direction should be evenly "
1249 "divisible by the number of divisions in that direction.",
1251 gtk_tooltips_set_tip(GTK_TOOLTIPS (tooltips),
1252 GTK_WIDGET (g_object_get_data (G_OBJECT (g_pWnd), "nh")),
1253 "Number of divisions in the horizontal direction. For best results, the extents "
1254 "in a given direction should be evenly divisible by the number of divisions in "
1257 gtk_tooltips_set_tip(GTK_TOOLTIPS (tooltips),
1258 GTK_WIDGET (g_object_get_data (G_OBJECT (g_pWnd), "nv")),
1259 "Number of divisions in the vertical direction. For best results, the extents "
1260 "in a given direction should be evenly divisible by the number of divisions in "
1263 gtk_tooltips_set_tip(GTK_TOOLTIPS (tooltips),
1264 GTK_WIDGET (g_object_get_data (G_OBJECT (g_pWnd), "use_patches")),
1265 "Produce one or more curved patches in the shape of your selected surface rather "
1266 "than producing solid brushes. Depending on the size of your surface (and the "
1267 "user's graphic detail settings, which you cannot control), curved surfaces will "
1268 "be represented in the game by a very large number of polygons. Read the warnings "
1269 "concerning curved surfaces on the GenSurf web page before using this feature.",
1271 gtk_tooltips_set_tip(GTK_TOOLTIPS (tooltips),
1272 GTK_WIDGET (g_object_get_data (G_OBJECT (g_pWnd), "decimate")),
1273 "Use the slider to control the number of vertices discarded by GenSurf. For many "
1274 "surfaces, you can produce roughly the same shape surface with a high decimation "
1275 "value. This will generally result in a map with lower polygon counts (and better "
1276 "in-game performance). However, this feature should NOT be used for large terrain "
1279 gtk_tooltips_set_tip(GTK_TOOLTIPS (tooltips),
1280 GTK_WIDGET (g_object_get_data (G_OBJECT (g_pWnd), "z00")),
1281 "Enter the height of the surface at the lower left corner. This value will likely "
1282 "be modified unless \"Linear Borders\" is checked.",
1284 gtk_tooltips_set_tip(GTK_TOOLTIPS (tooltips),
1285 GTK_WIDGET (g_object_get_data (G_OBJECT (g_pWnd), "z01")),
1286 "Enter the height of the surface at the upper left corner. This value will likely "
1287 "be modified unless \"Linear Borders\" is checked.",
1289 gtk_tooltips_set_tip(GTK_TOOLTIPS (tooltips),
1290 GTK_WIDGET (g_object_get_data (G_OBJECT (g_pWnd), "z10")),
1291 "Enter the height of the surface at the lower right corner. This value will likely "
1292 "be modified unless \"Linear Borders\" is checked.",
1294 gtk_tooltips_set_tip(GTK_TOOLTIPS (tooltips),
1295 GTK_WIDGET (g_object_get_data (G_OBJECT (g_pWnd), "z11")),
1296 "Enter the height of the surface at the upper right corner. This value will likely "
1297 "be modified unless \"Linear Borders\" is checked.",
1299 gtk_tooltips_set_tip(GTK_TOOLTIPS (tooltips),
1300 GTK_WIDGET (g_object_get_data (G_OBJECT (g_pWnd), "linearborder")),
1301 "Restrict the edges of the surface to a straight line. This will help match up "
1302 "brush edges if you drop this surface into another map.",
1305 gtk_tooltips_set_tip(GTK_TOOLTIPS (tooltips),
1306 GTK_WIDGET (g_object_get_data (G_OBJECT (g_pWnd), "bmp_file")),
1307 "Type the name of an 8-bit bitmap image file, or click Browse to select an image "
1308 "from a list of those available on your system.",
1310 gtk_tooltips_set_tip(GTK_TOOLTIPS (tooltips),
1311 GTK_WIDGET (g_object_get_data (G_OBJECT (g_pWnd), "bmp_file_browse")),
1312 "Select a bitmap image file from a list of those available on your system.",
1314 gtk_tooltips_set_tip(GTK_TOOLTIPS (tooltips),
1315 GTK_WIDGET (g_object_get_data (G_OBJECT (g_pWnd), "bmp_reload")),
1316 "Reload the selected bitmap file after making changes in an external image editor.",
1318 gtk_tooltips_set_tip(GTK_TOOLTIPS (tooltips),
1319 GTK_WIDGET (g_object_get_data (G_OBJECT (g_pWnd), "bmp_black")),
1320 "Enter the value corresponding to color index 0 in the bitmap file. For gray scale "
1321 "images, color 0 is normally black.",
1323 gtk_tooltips_set_tip(GTK_TOOLTIPS (tooltips),
1324 GTK_WIDGET (g_object_get_data (G_OBJECT (g_pWnd), "bmp_white")),
1325 "Enter the value corresponding to color index 255 in the bitmap file. For gray scale "
1326 "images, color 255 is normally white.",
1329 gtk_tooltips_set_tip(GTK_TOOLTIPS (tooltips),
1330 GTK_WIDGET (g_object_get_data (G_OBJECT (g_pWnd), "fix_value")),
1331 "Enter a value for the selected vertex. This value will not be adjusted when applying "
1332 "a waveform or roughness to the surface. Unlock this vertex (so that it will be "
1333 "adjusted normally) by clicking \"Free\". This vertex will influence vertices within "
1334 "the \"Range affected\" of this vertex.",
1336 gtk_tooltips_set_tip(GTK_TOOLTIPS (tooltips),
1337 GTK_WIDGET (g_object_get_data (G_OBJECT (g_pWnd), "fix_range")),
1338 "Enter the range away from the selected vertex that other vertices will be affected. "
1339 "Use 0 if you don't want other vertices to be influenced by the currently selected "
1340 "one. Note: this box is disabled if you've chosen the fractal generator, as it uses "
1341 "a completely different method for determining values.",
1343 gtk_tooltips_set_tip(GTK_TOOLTIPS (tooltips),
1344 GTK_WIDGET (g_object_get_data (G_OBJECT (g_pWnd), "fix_rate")),
1345 "Enter a rate of change for the surface affected by the fixed value. 0 gives a smooth "
1346 "sinusoidal curve, values less than 0 give progressively sharper spikes, and values "
1347 "greater than 0 take on a square shape. Values less than -30 or greater than 30 are "
1348 "set to -30 and 30, respectively. Note that this entry will have no effect unless "
1349 "you also specify a \"range affected\".",
1351 gtk_tooltips_set_tip(GTK_TOOLTIPS (tooltips),
1352 GTK_WIDGET (g_object_get_data (G_OBJECT (g_pWnd), "fix_free")),
1353 "Click this to free (unlock the value of) the currently selected vertex.",
1355 gtk_tooltips_set_tip(GTK_TOOLTIPS (tooltips),
1356 GTK_WIDGET (g_object_get_data (G_OBJECT (g_pWnd), "fix_freeall")),
1357 "Click this to free (unlock the values of) all vertices.",
1360 gtk_tooltips_set_tip(GTK_TOOLTIPS (tooltips),
1361 GTK_WIDGET (g_object_get_data (G_OBJECT (g_pWnd), "texture1")),
1362 "Enter the name of the texture or shader used for the surface faces.",
1364 gtk_tooltips_set_tip(GTK_TOOLTIPS (tooltips),
1365 GTK_WIDGET (g_object_get_data (G_OBJECT (g_pWnd), "texture2")),
1366 "Enter the name of the texture or shader used for faces other than the surface. Under "
1367 "normal circumstances this should be \"common/caulk\"",
1369 gtk_tooltips_set_tip(GTK_TOOLTIPS (tooltips),
1370 GTK_WIDGET (g_object_get_data (G_OBJECT (g_pWnd), "texture3")),
1371 "Enter the name of the texture or shader used for \"steep\" surface faces, where \"steep\" "
1372 "is the angle specified below. If this entry is left blank or if the \"steep\" angle is 0, "
1373 "all surface faces will use the texture specified by \"Surface\".",
1376 gtk_tooltips_set_tip(GTK_TOOLTIPS (tooltips),
1377 GTK_WIDGET (g_object_get_data (G_OBJECT (g_pWnd), "detail")),
1378 "Check this box to use the detail content property on the generated brushes. Compile "
1379 "times will be considerably shorter if the detail property is used, though the surface "
1380 "will not block visibility at all. If you use the detail property, you should make sure "
1381 "that \"common/caulk\" is used for the non-surface faces, or the polygon count will be "
1382 "much higher than necessary.",
1386 // =============================================================================
1387 // create main dialog
1389 GtkWidget* create_main_dialog ()
1391 GtkWidget *dlg, *vbox, *hbox, *hbox2, *button, *notebook, *frame, *table, *table2;
1392 GtkWidget *check, *spin, *radio, *label, *entry, *scale;
1396 char *games[] = { "Quake 2", "Half-Life", "SiN", "Heretic 2", "Kingpin", "Genesis3D", "Quake 3 Arena" };
1397 char *waveforms[] = { "Alternating hill/valley", "Cylindrical left-to-right", "Cylindrical top-to-bottom",
1398 "From bitmap", "Fractal" };
1399 char *orientations[] = { "Ground surface", "Ceiling", "Wall facing 0", "Wall facing 90",
1400 "Wall facing 180","Wall facing 270" };
1402 g_pWnd = dlg = gtk_window_new (GTK_WINDOW_TOPLEVEL);
1403 gtk_window_set_title (GTK_WINDOW (dlg), gszCaption);
1404 g_signal_connect (G_OBJECT (dlg), "delete_event", G_CALLBACK (main_close), NULL);
1405 // g_signal_connect (G_OBJECT (dlg), "destroy", G_CALLBACK (gtk_widget_destroy), NULL);
1406 gtk_window_set_transient_for (GTK_WINDOW (dlg), GTK_WINDOW (g_pRadiantWnd));
1408 hbox = gtk_hbox_new (FALSE, 5);
1409 gtk_widget_show (hbox);
1410 gtk_container_add (GTK_CONTAINER (dlg), hbox);
1411 gtk_container_set_border_width (GTK_CONTAINER (hbox), 5);
1413 notebook = gtk_notebook_new ();
1414 gtk_widget_show (notebook);
1415 gtk_box_pack_start (GTK_BOX (hbox), notebook, TRUE, TRUE, 0);
1416 g_signal_connect (G_OBJECT (notebook), "switch_page",
1417 G_CALLBACK (switch_page), NULL);
1418 gtk_notebook_set_tab_pos (GTK_NOTEBOOK (notebook), GTK_POS_TOP);
1419 g_object_set_data (G_OBJECT (dlg), "notebook", notebook);
1421 table = gtk_table_new (2, 2, FALSE);
1422 gtk_widget_show (table);
1423 gtk_container_set_border_width (GTK_CONTAINER (table), 5);
1424 gtk_table_set_row_spacings (GTK_TABLE (table), 5);
1425 gtk_table_set_col_spacings (GTK_TABLE (table), 5);
1427 label = gtk_label_new (_("General"));
1428 gtk_widget_show (label);
1429 gtk_notebook_append_page (GTK_NOTEBOOK (notebook), table, label);
1431 frame = gtk_frame_new (_("Game"));
1432 gtk_widget_show (frame);
1433 gtk_table_attach (GTK_TABLE (table), frame, 0, 1, 0, 1,
1434 (GtkAttachOptions) (GTK_EXPAND|GTK_FILL),
1435 (GtkAttachOptions) (GTK_EXPAND|GTK_FILL), 0, 0);
1437 vbox = gtk_vbox_new (TRUE, 5);
1438 gtk_widget_show (vbox);
1439 gtk_container_add (GTK_CONTAINER (frame), vbox);
1440 gtk_container_set_border_width (GTK_CONTAINER (vbox), 5);
1442 for (i = 0, group = NULL; i < NUMGAMES; i++)
1444 radio = gtk_radio_button_new_with_label (group, games[i]);
1445 gtk_widget_show (radio);
1446 gtk_box_pack_start (GTK_BOX (vbox), radio, TRUE, TRUE, 0);
1447 group = gtk_radio_button_group (GTK_RADIO_BUTTON (radio));
1448 game_radios[i] = radio;
1449 g_signal_connect (G_OBJECT (radio), "toggled", G_CALLBACK (general_game), GINT_TO_POINTER (i));
1452 frame = gtk_frame_new (_("Waveform"));
1453 gtk_widget_show (frame);
1454 gtk_table_attach (GTK_TABLE (table), frame, 1, 2, 0, 1,
1455 (GtkAttachOptions) (GTK_EXPAND|GTK_FILL),
1456 (GtkAttachOptions) (GTK_EXPAND|GTK_FILL), 0, 0);
1458 vbox = gtk_vbox_new (TRUE, 5);
1459 gtk_widget_show (vbox);
1460 gtk_container_add (GTK_CONTAINER (frame), vbox);
1461 gtk_container_set_border_width (GTK_CONTAINER (vbox), 5);
1463 for (i = 0, group = NULL; i < 5; i++)
1465 radio = gtk_radio_button_new_with_label (group, waveforms[i]);
1466 gtk_widget_show (radio);
1467 gtk_box_pack_start (GTK_BOX (vbox), radio, TRUE, TRUE, 0);
1468 group = gtk_radio_button_group (GTK_RADIO_BUTTON (radio));
1469 wave_radios[i] = radio;
1470 g_signal_connect (G_OBJECT (radio), "toggled", G_CALLBACK (general_wave), GINT_TO_POINTER (i));
1473 frame = gtk_frame_new (_("Orientation"));
1474 gtk_widget_show (frame);
1475 gtk_table_attach (GTK_TABLE (table), frame, 0, 1, 1, 2,
1476 (GtkAttachOptions) (GTK_EXPAND|GTK_FILL),
1477 (GtkAttachOptions) (GTK_EXPAND|GTK_FILL), 0, 0);
1479 vbox = gtk_vbox_new (TRUE, 5);
1480 gtk_widget_show (vbox);
1481 gtk_container_add (GTK_CONTAINER (frame), vbox);
1482 gtk_container_set_border_width (GTK_CONTAINER (vbox), 5);
1484 for (i = 0, group = NULL; i < 6; i++)
1486 radio = gtk_radio_button_new_with_label (group, orientations[i]);
1487 gtk_widget_show (radio);
1488 gtk_box_pack_start (GTK_BOX (vbox), radio, TRUE, TRUE, 0);
1489 group = gtk_radio_button_group (GTK_RADIO_BUTTON (radio));
1490 plane_radios[i] = radio;
1491 g_signal_connect (G_OBJECT (radio), "toggled", G_CALLBACK (general_plane), GINT_TO_POINTER (i));
1494 table2 = gtk_table_new (4, 2, FALSE);
1495 gtk_widget_show (table2);
1496 gtk_table_set_row_spacings (GTK_TABLE (table2), 5);
1497 gtk_table_set_col_spacings (GTK_TABLE (table2), 5);
1498 gtk_table_attach (GTK_TABLE (table), table2, 1, 2, 1, 2,
1499 (GtkAttachOptions) (GTK_EXPAND|GTK_FILL),
1500 (GtkAttachOptions) (GTK_EXPAND|GTK_FILL), 0, 0);
1502 label = gtk_label_new (_("Wavelength:"));
1503 gtk_widget_show (label);
1504 gtk_table_attach (GTK_TABLE (table2), label, 0, 1, 0, 1,
1505 (GtkAttachOptions) (GTK_EXPAND|GTK_FILL),
1506 (GtkAttachOptions) (GTK_EXPAND|GTK_FILL), 0, 0);
1507 gtk_misc_set_alignment (GTK_MISC (label), 1, 0.5);
1508 gtk_label_set_justify (GTK_LABEL (label), GTK_JUSTIFY_RIGHT);
1510 label = gtk_label_new (_("Max. amplitude:"));
1511 gtk_widget_show (label);
1512 gtk_table_attach (GTK_TABLE (table2), label, 0, 1, 1, 2,
1513 (GtkAttachOptions) (GTK_EXPAND|GTK_FILL),
1514 (GtkAttachOptions) (GTK_EXPAND|GTK_FILL), 0, 0);
1515 gtk_misc_set_alignment (GTK_MISC (label), 1, 0.5);
1516 gtk_label_set_justify (GTK_LABEL (label), GTK_JUSTIFY_RIGHT);
1518 label = gtk_label_new (_("Roughness:"));
1519 gtk_widget_show (label);
1520 gtk_table_attach (GTK_TABLE (table2), label, 0, 1, 2, 3,
1521 (GtkAttachOptions) (GTK_EXPAND|GTK_FILL),
1522 (GtkAttachOptions) (GTK_EXPAND|GTK_FILL), 0, 0);
1523 gtk_misc_set_alignment (GTK_MISC (label), 1, 0.5);
1524 gtk_label_set_justify (GTK_LABEL (label), GTK_JUSTIFY_RIGHT);
1526 label = gtk_label_new (_("Random seed:"));
1527 gtk_widget_show (label);
1528 gtk_table_attach (GTK_TABLE (table2), label, 0, 1, 3, 4,
1529 (GtkAttachOptions) (GTK_EXPAND|GTK_FILL),
1530 (GtkAttachOptions) (GTK_EXPAND|GTK_FILL), 0, 0);
1531 gtk_misc_set_alignment (GTK_MISC (label), 1, 0.5);
1532 gtk_label_set_justify (GTK_LABEL (label), GTK_JUSTIFY_RIGHT);
1534 entry = gtk_entry_new ();
1535 gtk_widget_show (entry);
1536 gtk_table_attach (GTK_TABLE (table2), entry, 1, 2, 0, 1,
1537 (GtkAttachOptions) (GTK_EXPAND|GTK_FILL),
1538 (GtkAttachOptions) (GTK_EXPAND|GTK_FILL), 0, 0);
1539 gtk_widget_set_usize (entry, 50, -2);
1540 g_object_set_data (G_OBJECT (dlg), "wavelength", entry);
1541 g_signal_connect (G_OBJECT (entry), "focus_out_event", G_CALLBACK (doublevariable_entryfocusout), &WaveLength);
1543 entry = gtk_entry_new ();
1544 gtk_widget_show (entry);
1545 gtk_table_attach (GTK_TABLE (table2), entry, 1, 2, 1, 2,
1546 (GtkAttachOptions) (GTK_EXPAND|GTK_FILL),
1547 (GtkAttachOptions) (GTK_EXPAND|GTK_FILL), 0, 0);
1548 gtk_widget_set_usize (entry, 50, -2);
1549 g_object_set_data (G_OBJECT (dlg), "amplitude", entry);
1550 g_signal_connect (G_OBJECT (entry), "focus_out_event", G_CALLBACK (doublevariable_entryfocusout), &Amplitude);
1552 entry = gtk_entry_new ();
1553 gtk_widget_show (entry);
1554 gtk_table_attach (GTK_TABLE (table2), entry, 1, 2, 2, 3,
1555 (GtkAttachOptions) (GTK_EXPAND|GTK_FILL),
1556 (GtkAttachOptions) (GTK_EXPAND|GTK_FILL), 0, 0);
1557 gtk_widget_set_usize (entry, 50, -2);
1558 g_object_set_data (G_OBJECT (dlg), "roughness", entry);
1559 g_signal_connect (G_OBJECT (entry), "focus_out_event", G_CALLBACK (doublevariable_entryfocusout), &Roughness);
1561 adj = gtk_adjustment_new (1, 1, 32767, 1, 10, 10);
1562 g_signal_connect (G_OBJECT (adj), "value_changed", G_CALLBACK (general_random), NULL);
1563 spin = gtk_spin_button_new (GTK_ADJUSTMENT (adj), 1, 0);
1564 gtk_widget_show (spin);
1565 gtk_table_attach (GTK_TABLE (table2), spin, 1, 2, 3, 4,
1566 (GtkAttachOptions) (GTK_EXPAND|GTK_FILL),
1567 (GtkAttachOptions) (GTK_EXPAND|GTK_FILL), 0, 0);
1568 gtk_widget_set_usize (spin, 60, -2);
1569 g_object_set_data (G_OBJECT (dlg), "random", spin);
1571 vbox = gtk_vbox_new (FALSE, 5);
1572 gtk_widget_show (vbox);
1573 gtk_container_set_border_width (GTK_CONTAINER (vbox), 5);
1575 label = gtk_label_new (_("Extents"));
1576 gtk_widget_show (label);
1577 gtk_notebook_append_page (GTK_NOTEBOOK (notebook), vbox, label);
1579 hbox2 = gtk_hbox_new (FALSE, 5);
1580 gtk_widget_show (hbox2);
1581 gtk_box_pack_start (GTK_BOX (vbox), hbox2, FALSE, TRUE, 0);
1583 frame = gtk_frame_new (_("Extents"));
1584 gtk_widget_show (frame);
1585 gtk_box_pack_start (GTK_BOX (hbox2), frame, TRUE, TRUE, 0);
1587 table = gtk_table_new (3, 4, FALSE);
1588 gtk_widget_show (table);
1589 gtk_container_set_border_width (GTK_CONTAINER (table), 5);
1590 gtk_container_add (GTK_CONTAINER (frame), table);
1591 gtk_table_set_row_spacings (GTK_TABLE (table), 5);
1592 gtk_table_set_col_spacings (GTK_TABLE (table), 5);
1594 label = gtk_label_new (_("X:"));
1595 gtk_widget_show (label);
1596 gtk_table_attach (GTK_TABLE (table), label, 0, 1, 1, 2,
1597 (GtkAttachOptions) (GTK_FILL),
1598 (GtkAttachOptions) (GTK_FILL), 0, 0);
1599 g_object_set_data (G_OBJECT (dlg), "hmin_text", label);
1601 label = gtk_label_new (_("X:"));
1602 gtk_widget_show (label);
1603 gtk_table_attach (GTK_TABLE (table), label, 2, 3, 1, 2,
1604 (GtkAttachOptions) (GTK_FILL),
1605 (GtkAttachOptions) (GTK_FILL), 0, 0);
1606 g_object_set_data (G_OBJECT (dlg), "hmax_text", label);
1608 label = gtk_label_new (_("Y:"));
1609 gtk_widget_show (label);
1610 gtk_table_attach (GTK_TABLE (table), label, 0, 1, 2, 3,
1611 (GtkAttachOptions) (GTK_FILL),
1612 (GtkAttachOptions) (GTK_FILL), 0, 0);
1613 g_object_set_data (G_OBJECT (dlg), "vmin_text", label);
1615 label = gtk_label_new (_("Y:"));
1616 gtk_widget_show (label);
1617 gtk_table_attach (GTK_TABLE (table), label, 2, 3, 2, 3,
1618 (GtkAttachOptions) (GTK_FILL),
1619 (GtkAttachOptions) (GTK_FILL), 0, 0);
1620 g_object_set_data (G_OBJECT (dlg), "vmax_text", label);
1622 label = gtk_label_new (_("Lower-left"));
1623 gtk_widget_show (label);
1624 gtk_table_attach (GTK_TABLE (table), label, 1, 2, 0, 1,
1625 (GtkAttachOptions) (GTK_FILL),
1626 (GtkAttachOptions) (GTK_FILL), 0, 0);
1628 label = gtk_label_new (_("Upper-right"));
1629 gtk_widget_show (label);
1630 gtk_table_attach (GTK_TABLE (table), label, 3, 4, 0, 1,
1631 (GtkAttachOptions) (GTK_FILL),
1632 (GtkAttachOptions) (GTK_FILL), 0, 0);
1634 entry = gtk_entry_new ();
1635 gtk_widget_show (entry);
1636 gtk_table_attach (GTK_TABLE (table), entry, 1, 2, 1, 2,
1637 (GtkAttachOptions) (GTK_EXPAND|GTK_FILL),
1638 (GtkAttachOptions) (GTK_EXPAND|GTK_FILL), 0, 0);
1639 gtk_widget_set_usize (entry, 50, -2);
1640 g_object_set_data (G_OBJECT (dlg), "hmin", entry);
1641 g_signal_connect (G_OBJECT (entry), "focus_out_event", G_CALLBACK (doublevariable_entryfocusout), &Hll);
1643 entry = gtk_entry_new ();
1644 gtk_widget_show (entry);
1645 gtk_table_attach (GTK_TABLE (table), entry, 3, 4, 1, 2,
1646 (GtkAttachOptions) (GTK_EXPAND|GTK_FILL),
1647 (GtkAttachOptions) (GTK_EXPAND|GTK_FILL), 0, 0);
1648 gtk_widget_set_usize (entry, 50, -2);
1649 g_object_set_data (G_OBJECT (dlg), "hmax", entry);
1650 g_signal_connect (G_OBJECT (entry), "focus_out_event", G_CALLBACK (doublevariable_entryfocusout), &Hur);
1652 entry = gtk_entry_new ();
1653 gtk_widget_show (entry);
1654 gtk_table_attach (GTK_TABLE (table), entry, 1, 2, 2, 3,
1655 (GtkAttachOptions) (GTK_EXPAND|GTK_FILL),
1656 (GtkAttachOptions) (GTK_EXPAND|GTK_FILL), 0, 0);
1657 gtk_widget_set_usize (entry, 50, -2);
1658 g_object_set_data (G_OBJECT (dlg), "vmin", entry);
1659 g_signal_connect (G_OBJECT (entry), "focus_out_event", G_CALLBACK (doublevariable_entryfocusout), &Vll);
1661 entry = gtk_entry_new ();
1662 gtk_widget_show (entry);
1663 gtk_table_attach (GTK_TABLE (table), entry, 3, 4, 2, 3,
1664 (GtkAttachOptions) (GTK_EXPAND|GTK_FILL),
1665 (GtkAttachOptions) (GTK_EXPAND|GTK_FILL), 0, 0);
1666 gtk_widget_set_usize (entry, 50, -2);
1667 g_object_set_data (G_OBJECT (dlg), "vmax", entry);
1668 g_signal_connect (G_OBJECT (entry), "focus_out_event", G_CALLBACK (doublevariable_entryfocusout), &Vur);
1670 frame = gtk_frame_new (_("Divisions"));
1671 gtk_widget_show (frame);
1672 gtk_box_pack_start (GTK_BOX (hbox2), frame, TRUE, TRUE, 0);
1674 table = gtk_table_new (2, 2, FALSE);
1675 gtk_widget_show (table);
1676 gtk_container_set_border_width (GTK_CONTAINER (table), 5);
1677 gtk_container_add (GTK_CONTAINER (frame), table);
1678 gtk_table_set_row_spacings (GTK_TABLE (table), 5);
1679 gtk_table_set_col_spacings (GTK_TABLE (table), 5);
1681 label = gtk_label_new (_("X:"));
1682 gtk_widget_show (label);
1683 gtk_table_attach (GTK_TABLE (table), label, 0, 1, 0, 1,
1684 (GtkAttachOptions) (GTK_FILL),
1685 (GtkAttachOptions) (GTK_EXPAND|GTK_FILL), 0, 0);
1686 g_object_set_data (G_OBJECT (dlg), "nh_text", label);
1688 label = gtk_label_new (_("Y:"));
1689 gtk_widget_show (label);
1690 gtk_table_attach (GTK_TABLE (table), label, 0, 1, 1, 2,
1691 (GtkAttachOptions) (GTK_FILL),
1692 (GtkAttachOptions) (GTK_EXPAND|GTK_FILL), 0, 0);
1693 g_object_set_data (G_OBJECT (dlg), "nv_text", label);
1695 adj = gtk_adjustment_new (8, 1, MAX_ROWS, 1, 10, 10);
1696 g_signal_connect (G_OBJECT (adj), "value_changed", G_CALLBACK (extents_nhnv_spin), &NH);
1697 spin = gtk_spin_button_new (GTK_ADJUSTMENT (adj), 1, 0);
1698 gtk_widget_show (spin);
1699 gtk_table_attach (GTK_TABLE (table), spin, 1, 2, 0, 1,
1700 (GtkAttachOptions) (GTK_EXPAND|GTK_FILL),
1701 (GtkAttachOptions) (GTK_EXPAND|GTK_FILL), 0, 0);
1702 gtk_widget_set_usize (spin, 60, -2);
1703 g_object_set_data (G_OBJECT (dlg), "nh", spin);
1705 adj = gtk_adjustment_new (8, 1, MAX_ROWS, 1, 10, 10);
1706 g_signal_connect (G_OBJECT (adj), "value_changed", G_CALLBACK (extents_nhnv_spin), &NV);
1707 spin = gtk_spin_button_new (GTK_ADJUSTMENT (adj), 1, 0);
1708 gtk_widget_show (spin);
1709 gtk_table_attach (GTK_TABLE (table), spin, 1, 2, 1, 2,
1710 (GtkAttachOptions) (GTK_EXPAND|GTK_FILL),
1711 (GtkAttachOptions) (GTK_EXPAND|GTK_FILL), 0, 0);
1712 gtk_widget_set_usize (spin, 60, -2);
1713 g_object_set_data (G_OBJECT (dlg), "nv", spin);
1715 check = gtk_check_button_new_with_label ("Use Bezier patches");
1716 gtk_widget_show (check);
1717 gtk_box_pack_start (GTK_BOX (vbox), check, FALSE, TRUE, 0);
1718 g_object_set_data (G_OBJECT (dlg), "use_patches", check);
1719 g_signal_connect (G_OBJECT (check), "toggled", G_CALLBACK (extents_use_patches), NULL);
1721 // ^Fishman - Snap to grid, replaced scroll bar with a texbox.
1722 label = gtk_label_new (_("Snap to grid:"));
1723 gtk_widget_show (label);
1724 gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, TRUE, 0);
1725 gtk_object_set_data (GTK_OBJECT (dlg), "snap_text", label);
1727 adj = gtk_adjustment_new (8, 0, 256, 1, 10, 10);
1728 g_signal_connect (G_OBJECT (adj), "value_changed", G_CALLBACK (extents_snaptogrid_spin), &SP);
1729 spin = gtk_spin_button_new (GTK_ADJUSTMENT (adj), 1, 0);
1730 gtk_widget_show (spin);
1731 gtk_box_pack_start (GTK_BOX (vbox), spin, FALSE, TRUE, 0);
1732 gtk_widget_set_usize (spin, 60, -2);
1733 g_object_set_data (G_OBJECT (dlg), "sp", spin);
1734 // ^Fishman - End of Snap to grid code.
1736 hbox2 = gtk_hbox_new (FALSE, 5);
1737 gtk_widget_show (hbox2);
1738 gtk_box_pack_start (GTK_BOX (vbox), hbox2, FALSE, TRUE, 10);
1740 label = gtk_label_new (_("Decimate:"));
1741 gtk_widget_show (label);
1742 gtk_box_pack_start (GTK_BOX (hbox2), label, FALSE, TRUE, 0);
1744 adj = gtk_adjustment_new (0, 0, 110, 1, 10, 10);
1745 g_signal_connect (G_OBJECT (adj), "value_changed", G_CALLBACK (extents_decimate), NULL);
1746 g_object_set_data (G_OBJECT (dlg), "decimate_adj", adj);
1747 scale = gtk_hscale_new (GTK_ADJUSTMENT (adj));
1748 gtk_widget_show (scale);
1749 gtk_box_pack_start (GTK_BOX (hbox2), scale, TRUE, TRUE, 0);
1750 gtk_scale_set_value_pos (GTK_SCALE (scale), GTK_POS_RIGHT);
1751 gtk_scale_set_digits (GTK_SCALE (scale), 0);
1752 g_object_set_data (G_OBJECT (dlg), "decimate", scale);
1754 frame = gtk_frame_new (_("Corner values"));
1755 gtk_widget_show (frame);
1756 gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, TRUE, 0);
1758 table = gtk_table_new (3, 4, FALSE);
1759 gtk_widget_show (table);
1760 gtk_container_set_border_width (GTK_CONTAINER (table), 5);
1761 gtk_container_add (GTK_CONTAINER (frame), table);
1762 gtk_table_set_row_spacings (GTK_TABLE (table), 5);
1763 gtk_table_set_col_spacings (GTK_TABLE (table), 5);
1765 label = gtk_label_new (_("Upper-left:"));
1766 gtk_widget_show (label);
1767 gtk_table_attach (GTK_TABLE (table), label, 0, 1, 0, 1,
1768 (GtkAttachOptions) (GTK_FILL),
1769 (GtkAttachOptions) (GTK_FILL), 0, 0);
1771 label = gtk_label_new (_("Lower-left:"));
1772 gtk_widget_show (label);
1773 gtk_table_attach (GTK_TABLE (table), label, 0, 1, 1, 2,
1774 (GtkAttachOptions) (GTK_FILL),
1775 (GtkAttachOptions) (GTK_FILL), 0, 0);
1777 label = gtk_label_new (_("Upper-right:"));
1778 gtk_widget_show (label);
1779 gtk_table_attach (GTK_TABLE (table), label, 2, 3, 0, 1,
1780 (GtkAttachOptions) (GTK_FILL),
1781 (GtkAttachOptions) (GTK_FILL), 0, 0);
1783 label = gtk_label_new (_("Lower-right:"));
1784 gtk_widget_show (label);
1785 gtk_table_attach (GTK_TABLE (table), label, 2, 3, 1, 2,
1786 (GtkAttachOptions) (GTK_FILL),
1787 (GtkAttachOptions) (GTK_FILL), 0, 0);
1789 entry = gtk_entry_new ();
1790 gtk_widget_show (entry);
1791 gtk_table_attach (GTK_TABLE (table), entry, 1, 2, 0, 1,
1792 (GtkAttachOptions) (GTK_EXPAND|GTK_FILL),
1793 (GtkAttachOptions) (GTK_EXPAND|GTK_FILL), 0, 0);
1794 gtk_widget_set_usize (entry, 50, -2);
1795 g_object_set_data (G_OBJECT (dlg), "z01", entry);
1796 g_signal_connect (G_OBJECT (entry), "focus_out_event", G_CALLBACK (doublevariable_entryfocusout), &Z01);
1798 entry = gtk_entry_new ();
1799 gtk_widget_show (entry);
1800 gtk_table_attach (GTK_TABLE (table), entry, 1, 2, 1, 2,
1801 (GtkAttachOptions) (GTK_EXPAND|GTK_FILL),
1802 (GtkAttachOptions) (GTK_EXPAND|GTK_FILL), 0, 0);
1803 gtk_widget_set_usize (entry, 50, -2);
1804 g_object_set_data (G_OBJECT (dlg), "z00", entry);
1805 g_signal_connect (G_OBJECT (entry), "focus_out_event", G_CALLBACK (doublevariable_entryfocusout), &Z00);
1807 entry = gtk_entry_new ();
1808 gtk_widget_show (entry);
1809 gtk_table_attach (GTK_TABLE (table), entry, 3, 4, 0, 1,
1810 (GtkAttachOptions) (GTK_EXPAND|GTK_FILL),
1811 (GtkAttachOptions) (GTK_EXPAND|GTK_FILL), 0, 0);
1812 gtk_widget_set_usize (entry, 50, -2);
1813 g_object_set_data (G_OBJECT (dlg), "z11", entry);
1814 g_signal_connect (G_OBJECT (entry), "focus_out_event", G_CALLBACK (doublevariable_entryfocusout), &Z11);
1816 entry = gtk_entry_new ();
1817 gtk_widget_show (entry);
1818 gtk_table_attach (GTK_TABLE (table), entry, 3, 4, 1, 2,
1819 (GtkAttachOptions) (GTK_EXPAND|GTK_FILL),
1820 (GtkAttachOptions) (GTK_EXPAND|GTK_FILL), 0, 0);
1821 gtk_widget_set_usize (entry, 50, -2);
1822 g_object_set_data (G_OBJECT (dlg), "z10", entry);
1823 g_signal_connect (G_OBJECT (entry), "focus_out_event", G_CALLBACK (doublevariable_entryfocusout), &Z10);
1825 check = gtk_check_button_new_with_label ("Linear borders");
1826 gtk_widget_show (check);
1827 gtk_table_attach (GTK_TABLE (table), check, 0, 4, 2, 3,
1828 (GtkAttachOptions) (GTK_EXPAND|GTK_FILL),
1829 (GtkAttachOptions) (GTK_EXPAND|GTK_FILL), 0, 0);
1830 g_object_set_data (G_OBJECT (dlg), "linearborder", check);
1831 g_signal_connect (G_OBJECT (check), "toggled", G_CALLBACK (extents_linearborder), NULL);
1833 vbox = gtk_vbox_new (FALSE, 10);
1834 gtk_widget_show (vbox);
1835 gtk_container_set_border_width (GTK_CONTAINER (vbox), 5);
1837 label = gtk_label_new (_("Bitmap"));
1838 gtk_widget_show (label);
1839 gtk_notebook_append_page (GTK_NOTEBOOK (notebook), vbox, label);
1841 label = gtk_label_new ("");
1842 gtk_widget_show (label);
1843 gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, TRUE, 0);
1844 g_object_set_data (G_OBJECT (dlg), "bmp_note", label);
1846 table = gtk_table_new (2, 2, FALSE);
1847 gtk_widget_show (table);
1848 gtk_container_set_border_width (GTK_CONTAINER (table), 5);
1849 gtk_box_pack_start (GTK_BOX (vbox), table, FALSE, TRUE, 0);
1850 gtk_table_set_row_spacings (GTK_TABLE (table), 5);
1851 gtk_table_set_col_spacings (GTK_TABLE (table), 5);
1853 label = gtk_label_new (_("Filename:"));
1854 gtk_widget_show (label);
1855 gtk_table_attach (GTK_TABLE (table), label, 0, 1, 0, 1,
1856 (GtkAttachOptions) (GTK_FILL),
1857 (GtkAttachOptions) (GTK_FILL), 0, 0);
1858 g_object_set_data (G_OBJECT (dlg), "bmp_text1", label);
1860 entry = gtk_entry_new ();
1861 gtk_widget_show (entry);
1862 gtk_table_attach (GTK_TABLE (table), entry, 1, 2, 0, 1,
1863 (GtkAttachOptions) (GTK_EXPAND|GTK_FILL),
1864 (GtkAttachOptions) (GTK_FILL), 0, 0);
1865 g_object_set_data (G_OBJECT (dlg), "bmp_file", entry);
1866 g_signal_connect (G_OBJECT (entry), "focus_out_event", G_CALLBACK (bitmap_file_entryfocusout), NULL);
1868 hbox2 = gtk_hbox_new (TRUE, 5);
1869 gtk_widget_show (hbox2);
1870 gtk_table_attach (GTK_TABLE (table), hbox2, 1, 2, 1, 2,
1871 (GtkAttachOptions) (0),
1872 (GtkAttachOptions) (GTK_EXPAND|GTK_FILL), 0, 0);
1874 button = gtk_button_new_with_label (_("Browse..."));
1875 gtk_widget_show (button);
1876 gtk_box_pack_start (GTK_BOX (hbox2), button, FALSE, FALSE, 0);
1877 gtk_widget_set_usize (button, 60, -2);
1878 g_object_set_data (G_OBJECT (dlg), "bmp_file_browse", button);
1879 g_signal_connect (G_OBJECT (button), "clicked", G_CALLBACK (bitmap_browse), NULL);
1881 button = gtk_button_new_with_label (_("Reload"));
1882 gtk_widget_show (button);
1883 gtk_box_pack_start (GTK_BOX (hbox2), button, FALSE, FALSE, 0);
1884 gtk_widget_set_usize (button, 60, -2);
1885 g_object_set_data (G_OBJECT (dlg), "bmp_reload", button);
1886 g_signal_connect (G_OBJECT (button), "clicked", G_CALLBACK (bitmap_reload), NULL);
1888 table = gtk_table_new (2, 2, TRUE);
1889 gtk_widget_show (table);
1890 gtk_container_set_border_width (GTK_CONTAINER (table), 5);
1891 gtk_box_pack_start (GTK_BOX (vbox), table, FALSE, TRUE, 0);
1892 gtk_table_set_row_spacings (GTK_TABLE (table), 5);
1893 gtk_table_set_col_spacings (GTK_TABLE (table), 5);
1895 label = gtk_label_new (_("Map color 0 to:"));
1896 gtk_widget_show (label);
1897 gtk_table_attach (GTK_TABLE (table), label, 0, 1, 0, 1,
1898 (GtkAttachOptions) (GTK_FILL|GTK_EXPAND),
1899 (GtkAttachOptions) (GTK_FILL), 0, 0);
1900 g_object_set_data (G_OBJECT (dlg), "bmp_text2", label);
1901 gtk_misc_set_alignment (GTK_MISC (label), 1, 0.5);
1902 gtk_label_set_justify (GTK_LABEL (label), GTK_JUSTIFY_RIGHT);
1904 label = gtk_label_new (_("Map color 255 to:"));
1905 gtk_widget_show (label);
1906 gtk_table_attach (GTK_TABLE (table), label, 0, 1, 1, 2,
1907 (GtkAttachOptions) (GTK_FILL|GTK_EXPAND),
1908 (GtkAttachOptions) (GTK_FILL), 0, 0);
1909 g_object_set_data (G_OBJECT (dlg), "bmp_text3", label);
1910 gtk_misc_set_alignment (GTK_MISC (label), 1, 0.5);
1911 gtk_label_set_justify (GTK_LABEL (label), GTK_JUSTIFY_RIGHT);
1913 hbox2 = gtk_hbox_new (FALSE, 5);
1914 gtk_widget_show (hbox2);
1915 gtk_table_attach (GTK_TABLE (table), hbox2, 1, 2, 0, 1,
1916 (GtkAttachOptions) (GTK_EXPAND|GTK_FILL),
1917 (GtkAttachOptions) (GTK_EXPAND|GTK_FILL), 0, 0);
1919 entry = gtk_entry_new ();
1920 gtk_widget_show (entry);
1921 gtk_box_pack_start (GTK_BOX (hbox2), entry, FALSE, FALSE, 0);
1922 gtk_widget_set_usize (entry, 50, -2);
1923 g_object_set_data (G_OBJECT (dlg), "bmp_black", entry);
1924 g_signal_connect (G_OBJECT (entry), "focus_out_event", G_CALLBACK (doublevariable_entryfocusout), &gbmp.black_value);
1926 hbox2 = gtk_hbox_new (FALSE, 5);
1927 gtk_widget_show (hbox2);
1928 gtk_table_attach (GTK_TABLE (table), hbox2, 1, 2, 1, 2,
1929 (GtkAttachOptions) (GTK_EXPAND|GTK_FILL),
1930 (GtkAttachOptions) (GTK_EXPAND|GTK_FILL), 0, 0);
1932 entry = gtk_entry_new ();
1933 gtk_widget_show (entry);
1934 gtk_box_pack_start (GTK_BOX (hbox2), entry, FALSE, FALSE, 0);
1935 gtk_widget_set_usize (entry, 50, -2);
1936 g_object_set_data (G_OBJECT (dlg), "bmp_white", entry);
1937 g_signal_connect (G_OBJECT (entry), "focus_out_event", G_CALLBACK (doublevariable_entryfocusout), &gbmp.white_value);
1939 vbox = gtk_vbox_new (FALSE, 10);
1940 gtk_widget_show (vbox);
1941 gtk_container_set_border_width (GTK_CONTAINER (vbox), 5);
1943 label = gtk_label_new (_("Fix Points"));
1944 gtk_widget_show (label);
1945 gtk_notebook_append_page (GTK_NOTEBOOK (notebook), vbox, label);
1947 label = gtk_label_new (_("Click on a vertex in the lower half of the preview window,\n"
1948 "then use the arrow keys or text box to assign a value.\n"
1949 "Use Ctrl+Click to select multiple vertices/toggle a\n"
1950 "selection. Use Shift+Click to select a range of vertices.\n\n"
1951 "Click \"Free\" to unlock a vertex. Vertices within \"Range\n"
1952 "affected\" will be influenced by this vertex."));
1953 gtk_widget_show (label);
1954 gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, TRUE, 0);
1956 table = gtk_table_new (3, 3, FALSE);
1957 gtk_widget_show (table);
1958 gtk_container_set_border_width (GTK_CONTAINER (table), 5);
1959 gtk_box_pack_start (GTK_BOX (vbox), table, FALSE, TRUE, 0);
1960 gtk_table_set_row_spacings (GTK_TABLE (table), 5);
1961 gtk_table_set_col_spacings (GTK_TABLE (table), 5);
1963 label = gtk_label_new (_("Value:"));
1964 gtk_widget_show (label);
1965 gtk_table_attach (GTK_TABLE (table), label, 0, 1, 0, 1,
1966 (GtkAttachOptions) (GTK_FILL),
1967 (GtkAttachOptions) (GTK_FILL), 0, 0);
1968 gtk_misc_set_alignment (GTK_MISC (label), 1, 0.5);
1969 g_object_set_data (G_OBJECT (dlg), "fix_value_text", label);
1971 label = gtk_label_new (_("Range affected:"));
1972 gtk_widget_show (label);
1973 gtk_table_attach (GTK_TABLE (table), label, 0, 1, 1, 2,
1974 (GtkAttachOptions) (GTK_FILL),
1975 (GtkAttachOptions) (GTK_FILL), 0, 0);
1976 gtk_misc_set_alignment (GTK_MISC (label), 1, 0.5);
1977 g_object_set_data (G_OBJECT (dlg), "fix_range_text", label);
1979 label = gtk_label_new (_("Rate of change:"));
1980 gtk_widget_show (label);
1981 gtk_table_attach (GTK_TABLE (table), label, 0, 1, 2, 3,
1982 (GtkAttachOptions) (GTK_FILL),
1983 (GtkAttachOptions) (GTK_FILL), 0, 0);
1984 gtk_misc_set_alignment (GTK_MISC (label), 1, 0.5);
1985 g_object_set_data (G_OBJECT (dlg), "fix_rate_text", label);
1987 adj = gtk_adjustment_new (0, -65536, 65536, 1, 16, 16);
1988 g_signal_connect (G_OBJECT (adj), "value_changed", G_CALLBACK (fix_value_changed), NULL);
1989 spin = gtk_spin_button_new (GTK_ADJUSTMENT (adj), 1, 0);
1990 gtk_widget_show (spin);
1991 gtk_table_attach (GTK_TABLE (table), spin, 1, 2, 0, 1,
1992 (GtkAttachOptions) (GTK_EXPAND),
1993 (GtkAttachOptions) (GTK_EXPAND), 0, 0);
1994 gtk_widget_set_usize (spin, 60, -2);
1995 g_object_set_data (G_OBJECT (dlg), "fix_value", spin);
1996 g_signal_connect (G_OBJECT (spin), "focus_out_event", G_CALLBACK (fix_value_entryfocusout), NULL);
1998 entry = gtk_entry_new ();
1999 gtk_widget_show (entry);
2000 gtk_table_attach (GTK_TABLE (table), entry, 1, 2, 1, 2,
2001 (GtkAttachOptions) (GTK_EXPAND),
2002 (GtkAttachOptions) (GTK_FILL), 0, 0);
2003 gtk_widget_set_usize (entry, 60, -2);
2004 g_object_set_data (G_OBJECT (dlg), "fix_range", entry);
2005 g_signal_connect (G_OBJECT (entry), "focus_out_event", G_CALLBACK (fix_range_entryfocusout), NULL);
2007 entry = gtk_entry_new ();
2008 gtk_widget_show (entry);
2009 gtk_table_attach (GTK_TABLE (table), entry, 1, 2, 2, 3,
2010 (GtkAttachOptions) (GTK_EXPAND),
2011 (GtkAttachOptions) (GTK_FILL), 0, 0);
2012 gtk_widget_set_usize (entry, 60, -2);
2013 g_object_set_data (G_OBJECT (dlg), "fix_rate", entry);
2014 g_signal_connect (G_OBJECT (entry), "focus_out_event", G_CALLBACK (fix_rate_entryfocusout), NULL);
2016 button = gtk_button_new_with_label (_("Free"));
2017 gtk_widget_show (button);
2018 gtk_table_attach (GTK_TABLE (table), button, 2, 3, 0, 1,
2019 (GtkAttachOptions) (GTK_EXPAND),
2020 (GtkAttachOptions) (GTK_FILL), 0, 0);
2021 gtk_widget_set_usize (button, 60, -2);
2022 g_object_set_data (G_OBJECT (dlg), "fix_free", button);
2023 g_signal_connect (G_OBJECT (button), "clicked", G_CALLBACK (fix_free), NULL);
2025 button = gtk_button_new_with_label (_("Free All"));
2026 gtk_widget_show (button);
2027 gtk_table_attach (GTK_TABLE (table), button, 2, 3, 1, 2,
2028 (GtkAttachOptions) (GTK_EXPAND),
2029 (GtkAttachOptions) (GTK_FILL), 0, 0);
2030 gtk_widget_set_usize (button, 60, -2);
2031 g_object_set_data (G_OBJECT (dlg), "fix_freeall", button);
2032 g_signal_connect (G_OBJECT (button), "clicked", G_CALLBACK (fix_freeall), NULL);
2034 vbox = gtk_vbox_new (FALSE, 10);
2035 gtk_widget_show (vbox);
2036 gtk_container_set_border_width (GTK_CONTAINER (vbox), 5);
2038 label = gtk_label_new (_("Texture"));
2039 gtk_widget_show (label);
2040 gtk_notebook_append_page (GTK_NOTEBOOK (notebook), vbox, label);
2042 // ^Fishman - Modified to add more labels and textboxes.
2043 table = gtk_table_new (5, 2, FALSE);
2044 gtk_widget_show (table);
2045 gtk_box_pack_start (GTK_BOX (vbox), table, FALSE, TRUE, 0);
2046 gtk_table_set_row_spacings (GTK_TABLE (table), 5);
2047 gtk_table_set_col_spacings (GTK_TABLE (table), 5);
2049 label = gtk_label_new (_("Surface:"));
2050 gtk_widget_show (label);
2051 gtk_table_attach (GTK_TABLE (table), label, 0, 1, 0, 1,
2052 (GtkAttachOptions) (GTK_FILL),
2053 (GtkAttachOptions) (GTK_FILL), 0, 0);
2054 gtk_misc_set_alignment (GTK_MISC (label), 1, 0.5);
2056 label = gtk_label_new (_("Other:"));
2057 gtk_widget_show (label);
2058 gtk_table_attach (GTK_TABLE (table), label, 0, 1, 1, 2,
2059 (GtkAttachOptions) (GTK_FILL),
2060 (GtkAttachOptions) (GTK_FILL), 0, 0);
2061 gtk_misc_set_alignment (GTK_MISC (label), 1, 0.5);
2063 label = gtk_label_new (_("Steep:"));
2064 gtk_widget_show (label);
2065 gtk_table_attach (GTK_TABLE (table), label, 0, 1, 2, 3,
2066 (GtkAttachOptions) (GTK_FILL),
2067 (GtkAttachOptions) (GTK_FILL), 0, 0);
2068 gtk_misc_set_alignment (GTK_MISC (label), 1, 0.5);
2070 entry = gtk_entry_new ();
2071 gtk_widget_show (entry);
2072 gtk_table_attach (GTK_TABLE (table), entry, 1, 2, 0, 1,
2073 (GtkAttachOptions) (GTK_EXPAND|GTK_FILL),
2074 (GtkAttachOptions) (GTK_FILL), 0, 0);
2075 gtk_widget_set_usize (entry, 60, -2);
2076 g_object_set_data (G_OBJECT (dlg), "texture1", entry);
2077 g_signal_connect (G_OBJECT (entry), "focus_out_event", G_CALLBACK(texture_entryfocusout), GINT_TO_POINTER (0));
2079 entry = gtk_entry_new ();
2080 gtk_widget_show (entry);
2081 gtk_table_attach (GTK_TABLE (table), entry, 1, 2, 1, 2,
2082 (GtkAttachOptions) (GTK_EXPAND|GTK_FILL),
2083 (GtkAttachOptions) (GTK_FILL), 0, 0);
2084 gtk_widget_set_usize (entry, 60, -2);
2085 g_object_set_data (G_OBJECT (dlg), "texture2", entry);
2086 g_signal_connect (G_OBJECT (entry), "focus_out_event", G_CALLBACK(texture_entryfocusout), GINT_TO_POINTER (1));
2088 entry = gtk_entry_new ();
2089 gtk_widget_show (entry);
2090 gtk_table_attach (GTK_TABLE (table), entry, 1, 2, 2, 3,
2091 (GtkAttachOptions) (GTK_EXPAND|GTK_FILL),
2092 (GtkAttachOptions) (GTK_FILL), 0, 0);
2093 gtk_widget_set_usize (entry, 60, -2);
2094 g_object_set_data (G_OBJECT (dlg), "texture3", entry);
2096 hbox2 = gtk_hbox_new (FALSE, 5);
2097 gtk_widget_show (hbox2);
2098 gtk_box_pack_start (GTK_BOX (vbox), hbox2, FALSE, TRUE, 0);
2100 label = gtk_label_new (_("\"Steep\" angle:"));
2101 gtk_widget_show (label);
2102 gtk_box_pack_start (GTK_BOX (hbox2), label, FALSE, TRUE, 0);
2104 adj = gtk_adjustment_new (60, 0, 90, 1, 10, 10);
2105 spin = gtk_spin_button_new (GTK_ADJUSTMENT (adj), 1, 0);
2106 gtk_widget_show (spin);
2107 gtk_box_pack_start (GTK_BOX (hbox2), spin, FALSE, TRUE, 0);
2108 g_object_set_data (G_OBJECT (dlg), "tex_slant", spin);
2110 table = gtk_table_new (2, 4, TRUE);
2111 gtk_widget_show (table);
2112 gtk_box_pack_start (GTK_BOX (vbox), table, FALSE, TRUE, 0);
2113 gtk_table_set_row_spacings (GTK_TABLE (table), 5);
2114 gtk_table_set_col_spacings (GTK_TABLE (table), 5);
2116 label = gtk_label_new (_("Offset <h,v>"));
2117 gtk_widget_show (label);
2118 gtk_table_attach (GTK_TABLE (table), label, 0, 2, 0, 1,
2119 (GtkAttachOptions) (GTK_FILL),
2120 (GtkAttachOptions) (GTK_FILL), 0, 0);
2122 label = gtk_label_new (_("Scale <h,v>"));
2123 gtk_widget_show (label);
2124 gtk_table_attach (GTK_TABLE (table), label, 2, 4, 0, 1,
2125 (GtkAttachOptions) (GTK_FILL),
2126 (GtkAttachOptions) (GTK_FILL), 0, 0);
2128 entry = gtk_entry_new ();
2129 gtk_widget_show (entry);
2130 gtk_table_attach (GTK_TABLE (table), entry, 0, 1, 1, 2,
2131 (GtkAttachOptions) (GTK_EXPAND|GTK_FILL),
2132 (GtkAttachOptions) (GTK_FILL), 0, 0);
2133 gtk_widget_set_usize (entry, 60, -2);
2134 g_object_set_data (G_OBJECT (dlg), "texoffsetx", entry);
2136 entry = gtk_entry_new ();
2137 gtk_widget_show (entry);
2138 gtk_table_attach (GTK_TABLE (table), entry, 1, 2, 1, 2,
2139 (GtkAttachOptions) (GTK_EXPAND|GTK_FILL),
2140 (GtkAttachOptions) (GTK_FILL), 0, 0);
2141 gtk_widget_set_usize (entry, 60, -2);
2142 g_object_set_data (G_OBJECT (dlg), "texoffsety", entry);
2144 entry = gtk_entry_new ();
2145 gtk_widget_show (entry);
2146 gtk_table_attach (GTK_TABLE (table), entry, 2, 3, 1, 2,
2147 (GtkAttachOptions) (GTK_EXPAND|GTK_FILL),
2148 (GtkAttachOptions) (GTK_FILL), 0, 0);
2149 gtk_widget_set_usize (entry, 60, -2);
2150 g_object_set_data (G_OBJECT (dlg), "texscalex", entry);
2152 entry = gtk_entry_new ();
2153 gtk_widget_show (entry);
2154 gtk_table_attach (GTK_TABLE (table), entry, 3, 4, 1, 2,
2155 (GtkAttachOptions) (GTK_EXPAND|GTK_FILL),
2156 (GtkAttachOptions) (GTK_FILL), 0, 0);
2157 gtk_widget_set_usize (entry, 60, -2);
2158 g_object_set_data (G_OBJECT (dlg), "texscaley", entry);
2162 check = gtk_check_button_new_with_label (_("Use detail brushes"));
2163 gtk_widget_show (check);
2164 gtk_box_pack_start (GTK_BOX (vbox), check, FALSE, TRUE, 0);
2165 g_object_set_data (G_OBJECT (dlg), "detail", check);
2166 g_signal_connect (G_OBJECT (check), "toggled", G_CALLBACK (texture_detail), NULL);
2168 check = gtk_check_button_new_with_label (_("Detail hint brushes"));
2169 gtk_widget_show (check);
2170 gtk_box_pack_start (GTK_BOX (vbox), check, FALSE, TRUE, 0);
2171 g_object_set_data (G_OBJECT (dlg), "hint", check);
2172 g_signal_connect (G_OBJECT (check), "toggled", G_CALLBACK (texture_hint), NULL);
2174 // ^Fishman - Add terrain key to func_group.
2175 check = gtk_check_button_new_with_label (_("Add terrain key"));
2176 gtk_widget_show (check);
2177 gtk_box_pack_start (GTK_BOX (vbox), check, FALSE, TRUE, 0);
2178 g_object_set_data (G_OBJECT (dlg), "terrain_ent", check);
2179 g_signal_connect (G_OBJECT (check), "toggled", G_CALLBACK (texture_terrainent), NULL);
2181 vbox = gtk_vbox_new (FALSE, 5);
2182 gtk_widget_show (vbox);
2183 gtk_box_pack_start (GTK_BOX (hbox), vbox, FALSE, TRUE, 0);
2185 button = gtk_button_new_with_label (_("OK"));
2186 gtk_widget_show (button);
2187 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, TRUE, 0);
2188 gtk_widget_set_usize (button, 60, -2);
2189 g_object_set_data (G_OBJECT (dlg), "go", button);
2190 g_signal_connect (G_OBJECT (button), "clicked", G_CALLBACK (main_go), NULL);
2192 label = gtk_label_new (_("Settings:"));
2193 gtk_widget_show (label);
2194 gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, TRUE, 0);
2196 button = gtk_button_new_with_label ("Open...");
2197 gtk_widget_show (button);
2198 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, TRUE, 0);
2199 g_object_set_data (G_OBJECT (dlg), "open", button);
2200 g_signal_connect (G_OBJECT (button), "clicked", G_CALLBACK (main_open), NULL);
2202 button = gtk_button_new_with_label (_("Save as..."));
2203 gtk_widget_show (button);
2204 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, TRUE, 0);
2205 g_object_set_data (G_OBJECT (dlg), "save", button);
2206 g_signal_connect (G_OBJECT (button), "clicked", G_CALLBACK (main_save), NULL);
2208 button = gtk_button_new_with_label (_("Defaults"));
2209 gtk_widget_show (button);
2210 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, TRUE, 0);
2211 g_object_set_data (G_OBJECT (dlg), "defaults", button);
2212 g_signal_connect (G_OBJECT (button), "clicked", G_CALLBACK (main_defaults), NULL);
2214 button = gtk_button_new_with_label (_("About..."));
2215 gtk_widget_show (button);
2216 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, TRUE, 0);
2217 g_signal_connect (G_OBJECT (button), "clicked", G_CALLBACK (main_about), NULL);
2219 check = gtk_check_button_new_with_label (_("Preview"));
2220 gtk_widget_show (check);
2221 gtk_box_pack_start (GTK_BOX (vbox), check, FALSE, TRUE, 0);
2222 g_signal_connect (G_OBJECT (check), "toggled", G_CALLBACK (main_preview), NULL);
2223 g_object_set_data (G_OBJECT (dlg), "main_preview", check);
2225 // ^Fishman - Antializing for the preview window.
2226 check = gtk_check_button_new_with_label (_("Antialised lines"));
2227 gtk_widget_show (check);
2228 gtk_box_pack_start (GTK_BOX (vbox), check, FALSE, TRUE, 0);
2229 g_object_set_data (G_OBJECT (dlg), "main_antialiasing", check);
2230 g_signal_connect (G_OBJECT (check), "toggled", G_CALLBACK (main_antialiasing), NULL);
2232 for (i = 0; i < 5; i++)
2235 CreateViewWindow ();
2239 FirstPassComplete = 1;
2247 HWND hwndDisplay = (HWND)NULL;
2248 HWND ghwndTab = (HWND)NULL;
2253 char GenSurfURL[40] = {"http://tarot.telefragged.com/gensurf"};
2254 char GenSurfBoard[40]={"http://tarot.telefragged.com/board"};
2257 * AboutDlgProc - processes messages for the about dialog.
2260 qboolean CALLBACK AboutDlgProc( HWND hwnd, unsigned msg, UINT wparam, LONG lparam )
2263 DRAWITEMSTRUCT *dis;
2270 lparam = lparam; /* turn off warning */
2274 strcpy(szText,"About " );
2275 strcat(szText,gszCaption);
2276 SetWindowText(hwnd,gszCaption);
2277 SetDlgItemText(hwnd,DLG_ABOUT_APP,szText);
2278 /* Application icon: */
2279 SendDlgItemMessage( hwnd, DLG_ABOUT_ICON,
2280 STM_SETICON, (WPARAM)(HICON)LoadIcon(ghInst,"GENSURF"),
2283 hwndURL = GetDlgItem(hwnd,DLG_ABOUT_URL);
2284 hdc = GetDC(hwndURL);
2285 GetTextExtentPoint(hdc,GenSurfURL,strlen(GenSurfURL),&size);
2286 ReleaseDC(hwndURL,hdc);
2287 GetWindowRect(hwndURL,&rc);
2288 SetWindowPos(hwndURL,(HWND)NULL,0,0,size.cx,size.cy+2,
2289 SWP_NOMOVE | SWP_NOZORDER);
2291 hwndURL = GetDlgItem(hwnd,DLG_ABOUT_BOARD);
2292 hdc = GetDC(hwndURL);
2293 GetTextExtentPoint(hdc,GenSurfBoard,strlen(GenSurfBoard),&size);
2294 ReleaseDC(hwndURL,hdc);
2295 GetWindowRect(hwndURL,&rc);
2296 SetWindowPos(hwndURL,(HWND)NULL,0,0,size.cx,size.cy+2,
2297 SWP_NOMOVE | SWP_NOZORDER);
2302 switch(LOWORD(wparam))
2307 case DLG_ABOUT_BOARD:
2317 if(wparam == DLG_ABOUT_URL)
2319 dis = (LPDRAWITEMSTRUCT)lparam;
2320 SetTextColor(dis->hDC,RGB(0,0,255));
2321 TextOut(dis->hDC,0,0,GenSurfURL,strlen(GenSurfURL));
2322 GetWindowRect(dis->hwndItem,&rc);
2323 GetTextExtentPoint(dis->hDC,GenSurfURL,strlen(GenSurfURL),&size);
2324 hpen = CreatePen(PS_SOLID,0,RGB(0,0,255));
2325 SelectObject(dis->hDC,hpen);
2326 MoveToEx(dis->hDC,0,size.cy,NULL);
2327 LineTo(dis->hDC,size.cx,size.cy);
2328 SelectObject(dis->hDC,GetStockObject(BLACK_PEN));
2331 else if(wparam==DLG_ABOUT_BOARD)
2333 dis = (LPDRAWITEMSTRUCT)lparam;
2334 SetTextColor(dis->hDC,RGB(0,0,255));
2335 TextOut(dis->hDC,0,0,GenSurfBoard,strlen(GenSurfBoard));
2336 GetWindowRect(dis->hwndItem,&rc);
2337 GetTextExtentPoint(dis->hDC,GenSurfBoard,strlen(GenSurfBoard),&size);
2338 hpen = CreatePen(PS_SOLID,0,RGB(0,0,255));
2339 SelectObject(dis->hDC,hpen);
2340 MoveToEx(dis->hDC,0,size.cy,NULL);
2341 LineTo(dis->hDC,size.cx,size.cy);
2342 SelectObject(dis->hDC,GetStockObject(BLACK_PEN));
2356 } /* AboutDlgProc */
2360 if( DialogBox( ghInst,"About", ghwnd_main, (DLGPROC)AboutDlgProc ) < 0)
2363 sprintf(Text,"In About(), GetLastError()=0x%08x",GetLastError());
2364 MessageBox(ghwnd_main,Text,"GenSurf",MB_ICONEXCLAMATION);