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", eMB_OK);
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 // Hell if I know why, but in the release build the 2nd pass thru the
274 // set_sensitive loop for game_radios crashes. No need to do this more
276 if (!FirstPassComplete)
278 for (i = 0; i < NUMGAMES; i++)
279 gtk_widget_set_sensitive (game_radios[i], (i == Game ? TRUE : FALSE));
280 for (i = 0; i < 6; i++)
281 gtk_widget_set_sensitive (plane_radios[i], (i == Plane ? TRUE : FALSE));
283 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (game_radios[Game]), TRUE);
284 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (plane_radios[Plane]), TRUE);
285 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (wave_radios[WaveType]), TRUE);
286 gtk_spin_button_set_value (GTK_SPIN_BUTTON (g_object_get_data (G_OBJECT (g_pWnd), "random")),
288 sprintf (Text, RForm, WaveLength);
289 gtk_entry_set_text (GTK_ENTRY (g_object_get_data (G_OBJECT (g_pWnd), "wavelength")), Text);
290 sprintf (Text, RForm, Amplitude);
291 gtk_entry_set_text (GTK_ENTRY (g_object_get_data (G_OBJECT (g_pWnd), "amplitude")), Text);
292 sprintf (Text, RForm, Roughness);
293 gtk_entry_set_text (GTK_ENTRY (g_object_get_data (G_OBJECT (g_pWnd), "roughness")), Text);
294 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (g_object_get_data
295 (G_OBJECT (g_pWnd), "main_antialiasing")), Antialiasing);
299 sprintf (Text,RForm,Hll);
300 gtk_entry_set_text (GTK_ENTRY (g_object_get_data (G_OBJECT (g_pWnd), "hmin")), Text);
301 sprintf (Text,RForm,Vll);
302 gtk_entry_set_text (GTK_ENTRY (g_object_get_data (G_OBJECT (g_pWnd), "vmin")), Text);
303 sprintf (Text,RForm,Hur);
304 gtk_entry_set_text (GTK_ENTRY (g_object_get_data (G_OBJECT (g_pWnd), "hmax")), Text);
305 sprintf (Text,RForm,Vur);
306 gtk_entry_set_text (GTK_ENTRY (g_object_get_data (G_OBJECT (g_pWnd), "vmax")), Text);
307 sprintf (Text,RForm,Z00);
308 gtk_entry_set_text (GTK_ENTRY (g_object_get_data (G_OBJECT (g_pWnd), "z00")), Text);
309 sprintf (Text,RForm,Z01);
310 gtk_entry_set_text (GTK_ENTRY (g_object_get_data (G_OBJECT (g_pWnd), "z01")), Text);
311 sprintf (Text,RForm,Z10);
312 gtk_entry_set_text (GTK_ENTRY (g_object_get_data (G_OBJECT (g_pWnd), "z10")), Text);
313 sprintf (Text,RForm,Z11);
314 gtk_entry_set_text (GTK_ENTRY (g_object_get_data (G_OBJECT (g_pWnd), "z11")), Text);
315 gtk_spin_button_set_value (GTK_SPIN_BUTTON (g_object_get_data (G_OBJECT (g_pWnd), "nh")), NH);
316 gtk_spin_button_set_value (GTK_SPIN_BUTTON (g_object_get_data (G_OBJECT (g_pWnd), "nv")), NV);
317 gtk_spin_button_set_value (GTK_SPIN_BUTTON (g_object_get_data (G_OBJECT (g_pWnd), "sp")), SP); // ^Fishman - Snap to grid.
319 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (g_object_get_data
320 (G_OBJECT (g_pWnd), "linearborder")), FixBorders);
321 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (g_object_get_data
322 (G_OBJECT (g_pWnd), "use_patches")), UsePatches);
323 gtk_adjustment_set_value (GTK_ADJUSTMENT (g_object_get_data (G_OBJECT (g_pWnd), "decimate_adj")),
326 if (Game == QUAKE3 && UsePatches)
328 gtk_widget_set_sensitive (GTK_WIDGET (g_object_get_data (G_OBJECT (g_pWnd), "decimate")), FALSE);
333 if (NH > MAX_ROWS) NH -= 2;
334 SetDlgValues (current_tab);
340 if (NV > MAX_ROWS) NV -= 2;
341 SetDlgValues (current_tab);
345 if (NH > MAX_ROWS) NH = MAX_ROWS;
348 if (NV > MAX_ROWS) NV = MAX_ROWS;
350 gpointer spin = g_object_get_data (G_OBJECT (g_pWnd), "nh");
351 GtkAdjustment *adj = gtk_spin_button_get_adjustment (GTK_SPIN_BUTTON (spin));
353 gtk_adjustment_changed (adj);
354 spin = g_object_get_data (G_OBJECT (g_pWnd), "nv");
355 adj = gtk_spin_button_get_adjustment (GTK_SPIN_BUTTON (spin));
357 gtk_adjustment_changed (adj);
361 gtk_widget_set_sensitive (GTK_WIDGET (g_object_get_data (G_OBJECT (g_pWnd), "decimate")), TRUE);
363 gpointer spin = g_object_get_data (G_OBJECT (g_pWnd), "nh");
364 GtkAdjustment *adj = gtk_spin_button_get_adjustment (GTK_SPIN_BUTTON (spin));
366 gtk_adjustment_changed (adj);
367 spin = g_object_get_data (G_OBJECT (g_pWnd), "nv");
368 adj = gtk_spin_button_get_adjustment (GTK_SPIN_BUTTON (spin));
370 gtk_adjustment_changed (adj);
373 gtk_spin_button_set_value (GTK_SPIN_BUTTON (g_object_get_data (G_OBJECT (g_pWnd), "nh")), NH);
374 gtk_spin_button_set_value (GTK_SPIN_BUTTON (g_object_get_data (G_OBJECT (g_pWnd), "nv")), NV);
379 gtk_entry_set_text (GTK_ENTRY (g_object_get_data (G_OBJECT (g_pWnd), "bmp_file")), gbmp.name);
380 sprintf(Text,"%g",gbmp.black_value);
381 gtk_entry_set_text (GTK_ENTRY (g_object_get_data (G_OBJECT (g_pWnd), "bmp_black")), Text);
382 sprintf(Text,"%g",gbmp.white_value);
383 gtk_entry_set_text (GTK_ENTRY (g_object_get_data (G_OBJECT (g_pWnd), "bmp_white")), Text);
390 gtk_entry_set_text (GTK_ENTRY (g_object_get_data (G_OBJECT (g_pWnd), "texture1")), Texture[Game][0]);
391 gtk_entry_set_text (GTK_ENTRY (g_object_get_data (G_OBJECT (g_pWnd), "texture2")), Texture[Game][1]);
392 gtk_entry_set_text (GTK_ENTRY (g_object_get_data (G_OBJECT (g_pWnd), "texture3")), Texture[Game][2]);
393 gtk_spin_button_set_value (GTK_SPIN_BUTTON (g_object_get_data (G_OBJECT (g_pWnd), "tex_slant")),
395 sprintf(Text,RForm,TexOffset[0]);
396 gtk_entry_set_text (GTK_ENTRY (g_object_get_data (G_OBJECT (g_pWnd), "texoffsetx")), Text);
397 sprintf(Text,RForm,TexOffset[1]);
398 gtk_entry_set_text (GTK_ENTRY (g_object_get_data (G_OBJECT (g_pWnd), "texoffsety")), Text);
399 sprintf(Text,RForm,TexScale[0]);
400 gtk_entry_set_text (GTK_ENTRY (g_object_get_data (G_OBJECT (g_pWnd), "texscalex")), Text);
401 sprintf(Text,RForm,TexScale[1]);
402 gtk_entry_set_text (GTK_ENTRY (g_object_get_data (G_OBJECT (g_pWnd), "texscaley")), Text);
403 CHECK_WIDGET ("detail", UseDetail);
407 ENABLE_WIDGET ("hint", FALSE);
411 ENABLE_WIDGET ("hint", TRUE);
412 CHECK_WIDGET ("hint", AddHints);
417 // ArghRad doesn't currently support SiN
418 EnableWindow(GetDlgItem(hwndDisplay,DLG_ARGHRAD2), 0);
419 EnableWindow(GetDlgItem(hwndDisplay,DLG_ARGHRAD2_SPIN), 0);
420 ShowWindow(GetDlgItem(hwndDisplay,DLG_ARGHRAD2_TEXT), SW_HIDE);
421 ShowWindow(GetDlgItem(hwndDisplay,DLG_ARGHRAD2), SW_HIDE);
422 ShowWindow(GetDlgItem(hwndDisplay,DLG_ARGHRAD2_SPIN), SW_HIDE);
423 SetDlgItemText(hwndDisplay,DLG_TEX_USEPAK,"Use sin file");
424 SetDlgItemText(hwndDisplay,DLG_TEX_PAK_TEXT,"Sin:");
431 // ArghRad sun is inapplicable (so far)
432 EnableWindow(GetDlgItem(hwndDisplay,DLG_ARGHRAD2), 0);
433 EnableWindow(GetDlgItem(hwndDisplay,DLG_ARGHRAD2_SPIN), 0);
434 ShowWindow(GetDlgItem(hwndDisplay,DLG_ARGHRAD2_TEXT), SW_HIDE);
435 ShowWindow(GetDlgItem(hwndDisplay,DLG_ARGHRAD2), SW_HIDE);
436 ShowWindow(GetDlgItem(hwndDisplay,DLG_ARGHRAD2_SPIN), SW_HIDE);
438 EnableWindow(GetDlgItem(hwndDisplay,DLG_LADDER), 0);
439 ShowWindow(GetDlgItem(hwndDisplay,DLG_LADDER), SW_HIDE);
440 SetDlgItemText(hwndDisplay,DLG_TEX_USEPAK,"Use pk3 file");
441 SetDlgItemText(hwndDisplay,DLG_TEX_PAK_TEXT,"PK3:");
445 /*trix if(Game==HERETIC2)
447 // ArghRad doesn't currently support Heretic2
448 EnableWindow(GetDlgItem(hwndDisplay,DLG_ARGHRAD2), 0);
449 EnableWindow(GetDlgItem(hwndDisplay,DLG_ARGHRAD2_SPIN), 0);
450 ShowWindow(GetDlgItem(hwndDisplay,DLG_ARGHRAD2_TEXT), SW_HIDE);
451 ShowWindow(GetDlgItem(hwndDisplay,DLG_ARGHRAD2), SW_HIDE);
452 ShowWindow(GetDlgItem(hwndDisplay,DLG_ARGHRAD2_SPIN), SW_HIDE);
454 SetDlgItemText(hwndDisplay,DLG_TEX_USEPAK,"Use pak file");
455 SetDlgItemText(hwndDisplay,DLG_TEX_PAK_TEXT,"Pak:");
460 // A bunch of controls aren't applicable to HL
461 EnableWindow(GetDlgItem(hwndDisplay,DLG_TEXTURE_BROWSE), 0);
462 EnableWindow(GetDlgItem(hwndDisplay,DLG_TEXTURE2_BROWSE),0);
463 EnableWindow(GetDlgItem(hwndDisplay,DLG_TEXTURE3_BROWSE),0);
464 EnableWindow(GetDlgItem(hwndDisplay,DLG_DETAIL), 0);
465 EnableWindow(GetDlgItem(hwndDisplay,DLG_LADDER), 0);
466 EnableWindow(GetDlgItem(hwndDisplay,DLG_ARGHRAD2), 0);
467 EnableWindow(GetDlgItem(hwndDisplay,DLG_ARGHRAD2_SPIN), 0);
468 ShowWindow(GetDlgItem(hwndDisplay,DLG_TEXTURE_BROWSE), SW_HIDE);
469 ShowWindow(GetDlgItem(hwndDisplay,DLG_TEXTURE2_BROWSE),SW_HIDE);
470 ShowWindow(GetDlgItem(hwndDisplay,DLG_TEXTURE3_BROWSE),SW_HIDE);
471 ShowWindow(GetDlgItem(hwndDisplay,DLG_DETAIL), SW_HIDE);
472 ShowWindow(GetDlgItem(hwndDisplay,DLG_LADDER), SW_HIDE);
473 ShowWindow(GetDlgItem(hwndDisplay,DLG_ARGHRAD2_TEXT), SW_HIDE);
474 ShowWindow(GetDlgItem(hwndDisplay,DLG_ARGHRAD2), SW_HIDE);
475 ShowWindow(GetDlgItem(hwndDisplay,DLG_ARGHRAD2_SPIN), SW_HIDE);
477 SetDlgItemText(hwndDisplay,DLG_TEX_USEPAK,"Use wad file");
478 SetDlgItemText(hwndDisplay,DLG_TEX_PAK_TEXT,"Wad:");
479 SetDlgItemText(hwndDisplay,DLG_HINT,"Hint brushes");
484 // No Q2-type compilers support Genesis3D (including ArghRad)
485 EnableWindow(GetDlgItem(hwndDisplay,DLG_ARGHRAD2), 0);
486 EnableWindow(GetDlgItem(hwndDisplay,DLG_ARGHRAD2_SPIN), 0);
487 ShowWindow(GetDlgItem(hwndDisplay,DLG_ARGHRAD2_TEXT), SW_HIDE);
488 ShowWindow(GetDlgItem(hwndDisplay,DLG_ARGHRAD2), SW_HIDE);
489 ShowWindow(GetDlgItem(hwndDisplay,DLG_ARGHRAD2_SPIN), SW_HIDE);
491 SetDlgItemText(hwndDisplay,DLG_TEX_USEPAK,"Use sin file");
492 SetDlgItemText(hwndDisplay,DLG_TEX_PAK_TEXT,"Sin:");
500 static void ReadDlgValues (int tab)
509 Roughness = atof ( gtk_entry_get_text (GTK_ENTRY (g_object_get_data (G_OBJECT (g_pWnd), "roughness"))));
510 WaveLength = atof ( gtk_entry_get_text (GTK_ENTRY (g_object_get_data (G_OBJECT (g_pWnd), "wavelength"))));
511 Amplitude = atof ( gtk_entry_get_text (GTK_ENTRY (g_object_get_data (G_OBJECT (g_pWnd), "amplitude"))));
512 spin = g_object_get_data (G_OBJECT (g_pWnd), "random");
513 RandomSeed = gtk_spin_button_get_value_as_int (GTK_SPIN_BUTTON (spin));
517 SP = atoi (gtk_entry_get_text (GTK_ENTRY (g_object_get_data (G_OBJECT (g_pWnd), "sp"))));
518 NH = atoi (gtk_entry_get_text (GTK_ENTRY (g_object_get_data (G_OBJECT (g_pWnd), "nh"))));
519 NV = atoi (gtk_entry_get_text (GTK_ENTRY (g_object_get_data (G_OBJECT (g_pWnd), "nv"))));
521 if (Game == QUAKE3 && UsePatches != 0)
525 if (NH > MAX_ROWS) NH = MAX_ROWS;
528 if (NV > MAX_ROWS) NV = MAX_ROWS;
535 if (WaveType == WAVE_BITMAP)
537 GetDlgItemText(hwnd,DLG_BMP_FILE,gbmp.name,sizeof(gbmp.name));
539 GetDlgItemText(hwnd,DLG_BMP_BLACK,Text,sizeof(Text));
540 gbmp.black_value = atof(Text);
541 GetDlgItemText(hwnd,DLG_BMP_WHITE,Text,sizeof(Text));
542 gbmp.white_value = atof(Text);
548 GetDlgItemText(hwnd,DLG_FIX_VALUE,Text,sizeof(Text));
549 temp.fixed_value = atoi(Text);
550 GetDlgItemText(hwnd,DLG_FIX_RANGE,Text,sizeof(Text));
551 temp.range = atoi(Text);
552 GetDlgItemText(hwnd,DLG_FIX_RATE, Text,sizeof(Text));
553 temp.rate = atof(Text);
554 for(k=0; k<NumVerticesSelected; k++)
556 xyz[Vertex[k].i][Vertex[k].j].fixed_value = temp.fixed_value;
557 xyz[Vertex[k].i][Vertex[k].j].range = temp.range;
558 xyz[Vertex[k].i][Vertex[k].j].rate = temp.rate;
563 CheckDlgButton(ghwnd,DLG_PREVIEW,0);
564 SendMessage(ghwnd,WM_COMMAND,DLG_PREVIEW,0);
573 i = SendDlgItemMessage( hwndDisplay, DLG_TEX_LIST1, CB_GETCURSEL, 0, 0 );
575 Texture[Game][0][0] = '\0';
577 SendDlgItemMessage( hwndDisplay, DLG_TEX_LIST1, CB_GETLBTEXT, i,
578 (LPARAM)(LPCSTR)Texture[Game][0]);
580 i = SendDlgItemMessage( hwndDisplay, DLG_TEX_LIST2, CB_GETCURSEL, 0, 0 );
582 Texture[Game][1][0] = '\0';
584 SendDlgItemMessage( hwndDisplay, DLG_TEX_LIST2, CB_GETLBTEXT, i,
585 (LPARAM)(LPCSTR)Texture[Game][1]);
587 i = SendDlgItemMessage( hwndDisplay, DLG_TEX_LIST3, CB_GETCURSEL, 0, 0 );
589 Texture[Game][2][0] = '\0';
591 SendDlgItemMessage( hwndDisplay, DLG_TEX_LIST3, CB_GETLBTEXT, i,
592 (LPARAM)(LPCSTR)Texture[Game][2]);
596 GetDlgItemText(hwndDisplay,DLG_TEXTURE, Texture[Game][0],sizeof(Texture[Game][0]));
597 GetDlgItemText(hwndDisplay,DLG_TEXTURE2,Texture[Game][1],sizeof(Texture[Game][1]));
598 GetDlgItemText(hwndDisplay,DLG_TEXTURE3,Texture[Game][2],sizeof(Texture[Game][2]));
600 GetDlgItemText(hwndDisplay,DLG_TEX_SLANT,Text,sizeof(Text));
601 SlantAngle = atoi(Text);
602 SlantAngle = max(0,min(SlantAngle,90));
603 GetDlgItemText(hwndDisplay,DLG_TEXOFFSETX,Text,sizeof(Text));
604 TexOffset[0] = atof(Text);
605 GetDlgItemText(hwndDisplay,DLG_TEXOFFSETY,Text,sizeof(Text));
606 TexOffset[1] = atof(Text);
607 GetDlgItemText(hwndDisplay,DLG_TEXSCALEX,Text,sizeof(Text));
608 TexScale[0] = atof(Text);
609 if(TexScale[0] == 0.) TexScale[0] = 1.0;
610 GetDlgItemText(hwndDisplay,DLG_TEXSCALEY,Text,sizeof(Text));
611 TexScale[1] = atof(Text);
612 if(TexScale[1] == 0.) TexScale[1] = 1.0;
613 GetDlgItemText(hwndDisplay,DLG_ARGHRAD2,Text,sizeof(Text));
614 ArghRad2 = atoi(Text);
620 // =============================================================================
621 // main dialog callbacks
623 static void switch_page (GtkNotebook *notebook, GtkNotebookPage *page, guint page_num, gpointer data)
625 if (current_tab != page_num)
627 if (page_num == FIXPOINTS_TAB)
629 OldPreview = Preview;
630 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (g_object_get_data (G_OBJECT (g_pWnd),
631 "main_preview")), TRUE);
633 UpdatePreview (true);
634 NumVerticesSelected = 0;
637 if (current_tab == FIXPOINTS_TAB)
640 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (g_object_get_data (G_OBJECT (g_pWnd),
641 "main_preview")), FALSE);
643 UpdatePreview (true);
644 NumVerticesSelected = 0;
647 if (page_num == TEXTURE_TAB)
649 WasDetail = UseDetail;
653 ENABLE_WIDGET ("detail", FALSE);
657 ReadDlgValues (current_tab);
658 current_tab = page_num;
659 SetDlgValues (current_tab);
663 static gint main_close (GtkWidget *widget, gpointer data)
665 gtk_widget_hide (g_pWnd);
666 gtk_widget_hide (g_pWndPreview);
671 static void main_save (GtkWidget *widget, gpointer data)
673 ReadDlgValues (current_tab);
677 static void main_open (GtkWidget *widget, gpointer data)
679 OpenSetup (g_pWnd, 0);
680 for (int i = 0; i < 5; i++)
685 static void main_defaults (GtkWidget *widget, gpointer data)
687 OpenSetup (g_pWnd, 1);
688 for (int i = 0; i < 5; i++)
693 static void main_preview (GtkWidget *widget, gpointer data)
695 Preview = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (widget));
699 // ^Fishman - Antializing for the preview window.
700 static void main_antialiasing (GtkWidget *widget, gpointer data)
702 Antialiasing = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (widget));
703 UpdatePreview (true);
706 static void main_about (GtkWidget *widget, gpointer data)
711 static void main_go (GtkWidget *widget, gpointer data)
713 GtkWidget *notebook = GTK_WIDGET (g_object_get_data (G_OBJECT (g_pWnd), "notebook"));
716 ReadDlgValues (current_tab);
717 if (NH < 1 || NH > MAX_ROWS)
719 sprintf (Text, "The number of divisions must be > 0 and no greater than %d.", MAX_ROWS);
720 g_FuncTable.m_pfnMessageBox (g_pWnd, Text, "GenSurf", eMB_OK, eMB_ICONWARNING);
721 gtk_notebook_set_page (GTK_NOTEBOOK (notebook), EXTENTS_TAB);
725 if (NV < 1 || NV > MAX_ROWS)
727 sprintf (Text, "The number of divisions must be > 0 and no greater than %d.", MAX_ROWS);
728 g_FuncTable.m_pfnMessageBox (g_pWnd, Text, "GenSurf", eMB_OK, eMB_ICONWARNING);
729 gtk_notebook_set_page (GTK_NOTEBOOK (notebook), EXTENTS_TAB);
735 g_FuncTable.m_pfnMessageBox (g_pWnd, "The \"lower-left\" values must be less than "
736 "the corresponding \"upper-right\" values in "
737 "the \"Extent\" box.","GenSurf", eMB_OK, eMB_ICONWARNING);
738 gtk_notebook_set_page (GTK_NOTEBOOK (notebook), EXTENTS_TAB);
744 g_FuncTable.m_pfnMessageBox (g_pWnd,"The \"lower-left\" values must be less than "
745 "the corresponding \"upper-right\" values in "
746 "the \"Extent\" box.","GenSurf", eMB_OK, eMB_ICONWARNING);
747 gtk_notebook_set_page (GTK_NOTEBOOK (notebook), EXTENTS_TAB);
751 if (!strlen (Texture[Game][0]))
753 g_FuncTable.m_pfnMessageBox (g_pWnd, "You must supply a texture name.", "GenSurf", eMB_OK, eMB_ICONWARNING);
754 gtk_notebook_set_page (GTK_NOTEBOOK (notebook), EXTENTS_TAB);
758 /* if (Decimate>0 && GimpHints!=0)
760 MessageBox(hwnd,"You've elected to use a decimated grid and gimp's non-detail hint brushes. "
761 "This combination usually produces bizarre visual errors in the game, "
762 "so GenSurf has turned off the hint brush option.",
763 "GenSurf",eMB_ICONWARNING);
767 gtk_widget_hide (g_pWnd);
769 gtk_widget_hide (g_pWndPreview);
772 WriteIniFile(gszIni);
775 // =============================================================================
776 // general tab callbacks
778 static void general_game (GtkToggleButton *widget, gpointer data)
780 if (gtk_toggle_button_get_active (widget))
782 Game = GPOINTER_TO_INT (data);
783 UpdatePreview (TRUE);
787 static void general_plane (GtkToggleButton *widget, gpointer data)
789 if (gtk_toggle_button_get_active (widget))
791 Plane = GPOINTER_TO_INT (data);
793 UpdatePreview (TRUE);
797 static void general_wave (GtkToggleButton *widget, gpointer data)
799 if (gtk_toggle_button_get_active (widget))
801 WaveType = GPOINTER_TO_INT (data);
803 UpdatePreview (TRUE);
807 static void general_random (GtkAdjustment *adj, gpointer data)
809 int nPos = (int)adj->value;
811 if (RandomSeed != nPos)
814 UpdatePreview (true);
818 // =============================================================================
819 // extents tab callbacks
821 static void extents_linearborder (GtkToggleButton *check, gpointer data)
823 FixBorders = gtk_toggle_button_get_active (check);
824 UpdatePreview (true);
827 static void extents_use_patches (GtkToggleButton *check, gpointer data)
832 UsePatches = gtk_toggle_button_get_active (check);
833 SetDlgValues (current_tab);
835 UpdatePreview (true);
838 static void extents_nhnv_spin (GtkAdjustment *adj, int *data)
840 int nPos = (int)adj->value;
844 if (Game==QUAKE3 && UsePatches && (nPos % 2))
850 gtk_adjustment_set_value (adj, *data);
854 UpdatePreview (true);
858 static void extents_decimate (GtkAdjustment *adj, gpointer data)
860 int nPos = (int)adj->value;
863 UpdatePreview (true);
866 // Hydra : snap to grid begin
867 /*static void extents_snaptogrid (GtkAdjustment *adj, gpointer data)
869 int nPos = (int)adj->value;
872 UpdatePreview (true);
875 // ^Fishman - Modified version of Hydra's snap to grid code.
876 static void extents_snaptogrid_spin (GtkAdjustment *adj, int *data)
878 int nPos = (int)adj->value;
880 UpdatePreview (true);
883 // =============================================================================
884 // bitmap tab callbacks
886 static gint bitmap_file_entryfocusout(GtkWidget* widget, GdkEventFocus* event, gpointer data)
888 char filename[NAME_MAX];
890 strcpy (filename, gtk_entry_get_text (GTK_ENTRY(widget)));
891 if(strcmp (filename,gbmp.name))
898 strcpy (gbmp.name,filename);
899 if (strlen(gbmp.name) )
901 ENABLE_WIDGET ("go", (gbmp.colors != NULL ? TRUE : FALSE));
906 static void bitmap_browse (GtkWidget *widget, gpointer data)
908 const char *filename;
911 filename = g_FuncTable.m_pfnFileDialog (g_pWnd, TRUE, "Bitmap File", gbmp.defpath);
913 if (filename != NULL)
915 strcpy (gbmp.name, filename);
917 ptr = strrchr (filename, G_DIR_SEPARATOR);
921 strcpy (gbmp.defpath, filename);
925 ENABLE_WIDGET ("go", (gbmp.colors != NULL ? TRUE : FALSE));
929 static void bitmap_reload (GtkWidget *widget, gpointer data)
931 strcpy (gbmp.name, gtk_entry_get_text (GTK_ENTRY (g_object_get_data (G_OBJECT (g_pWnd), "bmp_file"))));
932 if(strlen (gbmp.name) )
935 ENABLE_WIDGET ("go", (gbmp.colors != NULL ? TRUE : FALSE));
938 ENABLE_WIDGET ("go", FALSE );
941 // =============================================================================
942 // fix points tab callbacks
944 static gint fix_value_entryfocusout (GtkWidget* widget, GdkEventFocus *event, gpointer data)
946 int i = atoi (gtk_entry_get_text (GTK_ENTRY(widget))), k;
949 if (i < -65536 || i > 65536)
952 g_FuncTable.m_pfnMessageBox (g_pWnd, "The value must be between -65536 and 65536, inclusive.",
953 "GenSurf", eMB_OK, eMB_ICONWARNING);
954 sprintf (Text, "%d", (int)xyz[Vertex[0].i][Vertex[0].j].fixed_value);
955 gtk_entry_set_text (GTK_ENTRY(widget), Text);
956 gtk_window_set_focus (GTK_WINDOW (gtk_widget_get_toplevel (widget)), widget);
958 else if (i != xyz[Vertex[0].i][Vertex[0].j].fixed_value)
960 for(k=0; k<NumVerticesSelected; k++)
961 xyz[Vertex[k].i][Vertex[k].j].fixed_value = i;
963 gtk_spin_button_set_value (GTK_SPIN_BUTTON (g_object_get_data (G_OBJECT (g_pWnd), "fix_value")),
964 (int)xyz[Vertex[0].i][Vertex[0].j].fixed_value);
965 UpdatePreview (true);
970 static void fix_value_changed (GtkAdjustment *adj, gpointer data)
972 int k, i = (int)adj->value;
974 if (xyz[Vertex[0].i][Vertex[0].j].fixed_value != i)
976 for(k=0; k<NumVerticesSelected; k++)
977 xyz[Vertex[k].i][Vertex[k].j].fixed_value = i;
982 static gint fix_range_entryfocusout (GtkWidget *widget, GdkEventFocus *event, gpointer data)
984 int i = atoi (gtk_entry_get_text (GTK_ENTRY(widget))), k;
986 if (i != xyz[Vertex[0].i][Vertex[0].j].range)
988 for (k=0; k<NumVerticesSelected; k++)
989 xyz[Vertex[k].i][Vertex[k].j].range = i;
990 UpdatePreview (true);
995 static gint fix_rate_entryfocusout (GtkWidget *widget, GdkEventFocus *event, gpointer data)
997 double r = atof (gtk_entry_get_text (GTK_ENTRY(widget)));
1000 if (r != xyz[Vertex[0].i][Vertex[0].j].rate)
1002 for(k=0; k<NumVerticesSelected; k++)
1003 xyz[Vertex[k].i][Vertex[k].j].rate = r;
1004 UpdatePreview (true);
1009 static void fix_free (GtkWidget *widget, gpointer data)
1013 for (k=0; k<NumVerticesSelected; k++)
1014 xyz[Vertex[k].i][Vertex[k].j].fixed = 0;
1015 NumVerticesSelected = 0;
1017 UpdatePreview (true);
1020 static void fix_freeall (GtkWidget *widget, gpointer data)
1024 for (i=0; i<=NH; i++)
1026 for(j=0; j<=NV; j++)
1027 xyz[i][j].fixed = 0;
1029 fix_free (NULL, data); // keep these together
1032 void vertex_selected ()
1043 for(k=0; k<NumVerticesSelected; k++)
1044 xyz[Vertex[k].i][Vertex[k].j].fixed_value = xyz[Vertex[0].i][Vertex[0].j].p[1];
1048 for(k=0; k<NumVerticesSelected; k++)
1049 xyz[Vertex[k].i][Vertex[k].j].fixed_value = xyz[Vertex[0].i][Vertex[0].j].p[0];
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[2];
1057 gtk_spin_button_set_value (GTK_SPIN_BUTTON (g_object_get_data (G_OBJECT (g_pWnd), "fix_value")),
1058 (int)xyz[Vertex[0].i][Vertex[0].j].fixed_value);
1060 sprintf(Text,"%d",(int)xyz[Vertex[0].i][Vertex[0].j].range);
1061 gtk_entry_set_text (GTK_ENTRY (g_object_get_data (G_OBJECT (g_pWnd), "fix_range")), Text);
1062 sprintf(Text,"%.5g",xyz[Vertex[0].i][Vertex[0].j].rate);
1063 gtk_entry_set_text (GTK_ENTRY (g_object_get_data (G_OBJECT (g_pWnd), "fix_rate")), Text);
1065 for (k=0; k<NumVerticesSelected; k++)
1066 xyz[Vertex[k].i][Vertex[k].j].fixed = 1;
1068 UpdatePreview (true);
1071 // =============================================================================
1072 // texture tab callbacks
1074 static void texture_detail (GtkToggleButton *check, gpointer data)
1076 UseDetail = gtk_toggle_button_get_active (check);
1077 WasDetail = UseDetail;
1080 static void texture_hint (GtkToggleButton *check, gpointer data)
1082 AddHints = gtk_toggle_button_get_active (check);
1086 ENABLE_WIDGET ("detail", FALSE);
1090 UseDetail = WasDetail;
1091 ENABLE_WIDGET ("detail", FALSE);
1093 CHECK_WIDGET ("detail", UseDetail);
1096 // ^Fishman - Add terrain key to func_group.
1097 static void texture_terrainent (GtkToggleButton *check, gpointer data)
1099 AddTerrainKey = gtk_toggle_button_get_active (check);
1102 static void texture_set(int index, const char* name)
1104 strcpy(Texture[Game][index], name);
1107 static gint texture_entryfocusout(GtkWidget* widget, GdkEventFocus* event, gpointer data)
1109 texture_set(GPOINTER_TO_INT(data), gtk_entry_get_text(GTK_ENTRY(widget)));
1113 // =============================================================================
1116 static void UpdateVariable (GtkEntry *entry, GdkEventFocus *event, double *data)
1118 double x = atof (gtk_entry_get_text (entry));
1123 UpdatePreview (true);
1127 static gint doublevariable_entryfocusout(GtkWidget* widget, GdkEventFocus* event, gpointer data)
1129 UpdateVariable(GTK_ENTRY(widget), event, reinterpret_cast<double*>(data));
1133 // =============================================================================
1136 void create_tooltips ()
1138 tooltips = gtk_tooltips_new ();
1141 gtk_tooltips_set_tip(GTK_TOOLTIPS (tooltips),
1142 GTK_WIDGET (g_object_get_data (G_OBJECT (g_pWnd), "go")),
1143 "Accept all input and generate a surface in Q3Radiant",
1145 gtk_tooltips_set_tip(GTK_TOOLTIPS (tooltips),
1146 GTK_WIDGET (g_object_get_data (G_OBJECT (g_pWnd), "open")),
1147 "Open a previously saved GenSurf settings file.",
1149 gtk_tooltips_set_tip(GTK_TOOLTIPS (tooltips),
1150 GTK_WIDGET (g_object_get_data (G_OBJECT (g_pWnd), "save")),
1151 "Save all settings to a file.",
1153 gtk_tooltips_set_tip(GTK_TOOLTIPS (tooltips),
1154 GTK_WIDGET (g_object_get_data (G_OBJECT (g_pWnd), "defaults")),
1155 "Restore default values from DEFAULTS.SRF. If this file does not exist, GenSurf "
1156 "initializes all input parameters to reasonable values. You can create your own "
1157 "default surface by setting all parameters to your liking, then saving a settings "
1158 "file as DEFAULTS.SRF with the Save As button.",
1161 gtk_tooltips_set_tip(GTK_TOOLTIPS (tooltips),
1162 GTK_WIDGET (g_object_get_data (G_OBJECT (g_pWnd), "main_preview")),
1163 "View a wire-frame representation of the surface",
1166 gtk_tooltips_set_tip(GTK_TOOLTIPS (tooltips),
1167 GTK_WIDGET (g_object_get_data (G_OBJECT (g_pWnd), "main_antialiasing")),
1168 "The lines in the preview window are antialiased for better quality",
1172 gtk_tooltips_set_tip(GTK_TOOLTIPS (tooltips),
1173 GTK_WIDGET (wave_radios[0]),
1174 "Builds a surface with alternating hills and valleys. Uses the general form Z=cos(X) "
1177 gtk_tooltips_set_tip(GTK_TOOLTIPS (tooltips),
1178 GTK_WIDGET (wave_radios[1]),
1179 "Builds a surface with ridges parallel to the vertical axis.",
1181 gtk_tooltips_set_tip(GTK_TOOLTIPS (tooltips),
1182 GTK_WIDGET (wave_radios[2]),
1183 "Builds a surface with ridges parallel to the horizontal axis.",
1185 gtk_tooltips_set_tip(GTK_TOOLTIPS (tooltips),
1186 GTK_WIDGET (wave_radios[3]),
1187 "Builds a map from a bitmap image representing a contour plot. Click the \"Bitmap\" "
1188 "tab to select the image. GenSurf only supports 256-color (8 bit) "
1189 "bitmaps. GenSurf will work with any 256-color bitmap, but gray scale bitmaps are a bit "
1192 gtk_tooltips_set_tip(GTK_TOOLTIPS (tooltips),
1193 GTK_WIDGET (wave_radios[4]),
1194 "Builds a random surface using the Plasma Cloud technique. Variance is controlled "
1195 "by the Roughness input. To build a surface with completely random values not "
1196 "dependent on neighboring vertices, use one of the other waveforms with 0 amplitude.",
1198 gtk_tooltips_set_tip(GTK_TOOLTIPS (tooltips),
1199 GTK_WIDGET (g_object_get_data (G_OBJECT (g_pWnd), "wavelength")),
1200 "Enter the wavelength (distance between crests). NOTE: Wavelengths equal to the grid "
1201 "size or 2 times the grid size will result in 0 amplitudes. For best results, the "
1202 "wavelength value should be at least 4 times the grid size (extents divided by the "
1203 "number of divisions",
1205 gtk_tooltips_set_tip(GTK_TOOLTIPS (tooltips),
1206 GTK_WIDGET (g_object_get_data (G_OBJECT (g_pWnd), "amplitude")),
1207 "Enter the height of hills/ridges.",
1209 gtk_tooltips_set_tip(GTK_TOOLTIPS (tooltips),
1210 GTK_WIDGET (g_object_get_data (G_OBJECT (g_pWnd), "roughness")),
1211 "Enter the roughness value (noise) for the surface. For fractal surfaces, this value "
1212 "is used as a variance in the fractal calculations.",
1214 gtk_tooltips_set_tip(GTK_TOOLTIPS (tooltips),
1215 GTK_WIDGET (g_object_get_data (G_OBJECT (g_pWnd), "random")),
1216 "Seed value for the pseudo-random number generator.",
1219 gtk_tooltips_set_tip(GTK_TOOLTIPS (tooltips),
1220 GTK_WIDGET (g_object_get_data (G_OBJECT (g_pWnd), "hmin")),
1221 "Minimum horizontal coordinate of the surface, i.e. X for a surface parallel to "
1222 "the XY or XZ planes, Y for a surface parallel to the YZ plane. For best results, "
1223 "the extents (maximum-minimum values) in a given direction should be evenly "
1224 "divisible by the number of divisions in that direction.",
1226 gtk_tooltips_set_tip(GTK_TOOLTIPS (tooltips),
1227 GTK_WIDGET (g_object_get_data (G_OBJECT (g_pWnd), "hmax")),
1228 "Maximum horizontal coordinate of the surface, i.e. X for a surface parallel to "
1229 "the XY or XZ planes, Y for a surface parallel to the YZ plane. For best results, "
1230 "the extents (maximum-minimum values) in a given direction should be evenly "
1231 "divisible by the number of divisions in that direction.",
1233 gtk_tooltips_set_tip(GTK_TOOLTIPS (tooltips),
1234 GTK_WIDGET (g_object_get_data (G_OBJECT (g_pWnd), "vmin")),
1235 "Minimum vertical coordinate of the surface, i.e. Y for a surface parallel to "
1236 "the XY plane, Z for a surface parallel to the XZ or YZ planes. For best results, "
1237 "the extents (maximum-minimum values) in a given direction should be evenly "
1238 "divisible by the number of divisions in that direction.",
1240 gtk_tooltips_set_tip(GTK_TOOLTIPS (tooltips),
1241 GTK_WIDGET (g_object_get_data (G_OBJECT (g_pWnd), "vmax")),
1242 "Maximum vertical coordinate of the surface, i.e. Y for a surface parallel to "
1243 "the XY plane, Z for a surface parallel to the XZ or YZ planes. For best results, "
1244 "the extents (maximum-minimum values) in a given direction should be evenly "
1245 "divisible by the number of divisions in that direction.",
1247 gtk_tooltips_set_tip(GTK_TOOLTIPS (tooltips),
1248 GTK_WIDGET (g_object_get_data (G_OBJECT (g_pWnd), "nh")),
1249 "Number of divisions in the horizontal direction. For best results, the extents "
1250 "in a given direction should be evenly divisible by the number of divisions in "
1253 gtk_tooltips_set_tip(GTK_TOOLTIPS (tooltips),
1254 GTK_WIDGET (g_object_get_data (G_OBJECT (g_pWnd), "nv")),
1255 "Number of divisions in the vertical direction. For best results, the extents "
1256 "in a given direction should be evenly divisible by the number of divisions in "
1259 gtk_tooltips_set_tip(GTK_TOOLTIPS (tooltips),
1260 GTK_WIDGET (g_object_get_data (G_OBJECT (g_pWnd), "use_patches")),
1261 "Produce one or more curved patches in the shape of your selected surface rather "
1262 "than producing solid brushes. Depending on the size of your surface (and the "
1263 "user's graphic detail settings, which you cannot control), curved surfaces will "
1264 "be represented in the game by a very large number of polygons. Read the warnings "
1265 "concerning curved surfaces on the GenSurf web page before using this feature.",
1267 gtk_tooltips_set_tip(GTK_TOOLTIPS (tooltips),
1268 GTK_WIDGET (g_object_get_data (G_OBJECT (g_pWnd), "decimate")),
1269 "Use the slider to control the number of vertices discarded by GenSurf. For many "
1270 "surfaces, you can produce roughly the same shape surface with a high decimation "
1271 "value. This will generally result in a map with lower polygon counts (and better "
1272 "in-game performance). However, this feature should NOT be used for large terrain "
1275 gtk_tooltips_set_tip(GTK_TOOLTIPS (tooltips),
1276 GTK_WIDGET (g_object_get_data (G_OBJECT (g_pWnd), "z00")),
1277 "Enter the height of the surface at the lower left corner. This value will likely "
1278 "be modified unless \"Linear Borders\" is checked.",
1280 gtk_tooltips_set_tip(GTK_TOOLTIPS (tooltips),
1281 GTK_WIDGET (g_object_get_data (G_OBJECT (g_pWnd), "z01")),
1282 "Enter the height of the surface at the upper left corner. This value will likely "
1283 "be modified unless \"Linear Borders\" is checked.",
1285 gtk_tooltips_set_tip(GTK_TOOLTIPS (tooltips),
1286 GTK_WIDGET (g_object_get_data (G_OBJECT (g_pWnd), "z10")),
1287 "Enter the height of the surface at the lower right corner. This value will likely "
1288 "be modified unless \"Linear Borders\" is checked.",
1290 gtk_tooltips_set_tip(GTK_TOOLTIPS (tooltips),
1291 GTK_WIDGET (g_object_get_data (G_OBJECT (g_pWnd), "z11")),
1292 "Enter the height of the surface at the upper right corner. This value will likely "
1293 "be modified unless \"Linear Borders\" is checked.",
1295 gtk_tooltips_set_tip(GTK_TOOLTIPS (tooltips),
1296 GTK_WIDGET (g_object_get_data (G_OBJECT (g_pWnd), "linearborder")),
1297 "Restrict the edges of the surface to a straight line. This will help match up "
1298 "brush edges if you drop this surface into another map.",
1301 gtk_tooltips_set_tip(GTK_TOOLTIPS (tooltips),
1302 GTK_WIDGET (g_object_get_data (G_OBJECT (g_pWnd), "bmp_file")),
1303 "Type the name of an 8-bit bitmap image file, or click Browse to select an image "
1304 "from a list of those available on your system.",
1306 gtk_tooltips_set_tip(GTK_TOOLTIPS (tooltips),
1307 GTK_WIDGET (g_object_get_data (G_OBJECT (g_pWnd), "bmp_file_browse")),
1308 "Select a bitmap image file 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_reload")),
1312 "Reload the selected bitmap file after making changes in an external image editor.",
1314 gtk_tooltips_set_tip(GTK_TOOLTIPS (tooltips),
1315 GTK_WIDGET (g_object_get_data (G_OBJECT (g_pWnd), "bmp_black")),
1316 "Enter the value corresponding to color index 0 in the bitmap file. For gray scale "
1317 "images, color 0 is normally black.",
1319 gtk_tooltips_set_tip(GTK_TOOLTIPS (tooltips),
1320 GTK_WIDGET (g_object_get_data (G_OBJECT (g_pWnd), "bmp_white")),
1321 "Enter the value corresponding to color index 255 in the bitmap file. For gray scale "
1322 "images, color 255 is normally white.",
1325 gtk_tooltips_set_tip(GTK_TOOLTIPS (tooltips),
1326 GTK_WIDGET (g_object_get_data (G_OBJECT (g_pWnd), "fix_value")),
1327 "Enter a value for the selected vertex. This value will not be adjusted when applying "
1328 "a waveform or roughness to the surface. Unlock this vertex (so that it will be "
1329 "adjusted normally) by clicking \"Free\". This vertex will influence vertices within "
1330 "the \"Range affected\" of this vertex.",
1332 gtk_tooltips_set_tip(GTK_TOOLTIPS (tooltips),
1333 GTK_WIDGET (g_object_get_data (G_OBJECT (g_pWnd), "fix_range")),
1334 "Enter the range away from the selected vertex that other vertices will be affected. "
1335 "Use 0 if you don't want other vertices to be influenced by the currently selected "
1336 "one. Note: this box is disabled if you've chosen the fractal generator, as it uses "
1337 "a completely different method for determining values.",
1339 gtk_tooltips_set_tip(GTK_TOOLTIPS (tooltips),
1340 GTK_WIDGET (g_object_get_data (G_OBJECT (g_pWnd), "fix_rate")),
1341 "Enter a rate of change for the surface affected by the fixed value. 0 gives a smooth "
1342 "sinusoidal curve, values less than 0 give progressively sharper spikes, and values "
1343 "greater than 0 take on a square shape. Values less than -30 or greater than 30 are "
1344 "set to -30 and 30, respectively. Note that this entry will have no effect unless "
1345 "you also specify a \"range affected\".",
1347 gtk_tooltips_set_tip(GTK_TOOLTIPS (tooltips),
1348 GTK_WIDGET (g_object_get_data (G_OBJECT (g_pWnd), "fix_free")),
1349 "Click this to free (unlock the value of) the currently selected vertex.",
1351 gtk_tooltips_set_tip(GTK_TOOLTIPS (tooltips),
1352 GTK_WIDGET (g_object_get_data (G_OBJECT (g_pWnd), "fix_freeall")),
1353 "Click this to free (unlock the values of) all vertices.",
1356 gtk_tooltips_set_tip(GTK_TOOLTIPS (tooltips),
1357 GTK_WIDGET (g_object_get_data (G_OBJECT (g_pWnd), "texture1")),
1358 "Enter the name of the texture or shader used for the surface faces.",
1360 gtk_tooltips_set_tip(GTK_TOOLTIPS (tooltips),
1361 GTK_WIDGET (g_object_get_data (G_OBJECT (g_pWnd), "texture2")),
1362 "Enter the name of the texture or shader used for faces other than the surface. Under "
1363 "normal circumstances this should be \"common/caulk\"",
1365 gtk_tooltips_set_tip(GTK_TOOLTIPS (tooltips),
1366 GTK_WIDGET (g_object_get_data (G_OBJECT (g_pWnd), "texture3")),
1367 "Enter the name of the texture or shader used for \"steep\" surface faces, where \"steep\" "
1368 "is the angle specified below. If this entry is left blank or if the \"steep\" angle is 0, "
1369 "all surface faces will use the texture specified by \"Surface\".",
1372 gtk_tooltips_set_tip(GTK_TOOLTIPS (tooltips),
1373 GTK_WIDGET (g_object_get_data (G_OBJECT (g_pWnd), "detail")),
1374 "Check this box to use the detail content property on the generated brushes. Compile "
1375 "times will be considerably shorter if the detail property is used, though the surface "
1376 "will not block visibility at all. If you use the detail property, you should make sure "
1377 "that \"common/caulk\" is used for the non-surface faces, or the polygon count will be "
1378 "much higher than necessary.",
1382 // =============================================================================
1383 // create main dialog
1385 GtkWidget* create_main_dialog ()
1387 GtkWidget *dlg, *vbox, *hbox, *hbox2, *button, *notebook, *frame, *table, *table2;
1388 GtkWidget *check, *spin, *radio, *label, *entry, *scale;
1392 char *games[] = { "Quake 2", "Half-Life", "SiN", "Heretic 2", "Kingpin", "Genesis3D", "Quake 3 Arena" };
1393 char *waveforms[] = { "Alternating hill/valley", "Cylindrical left-to-right", "Cylindrical top-to-bottom",
1394 "From bitmap", "Fractal" };
1395 char *orientations[] = { "Ground surface", "Ceiling", "Wall facing 0", "Wall facing 90",
1396 "Wall facing 180","Wall facing 270" };
1398 g_pWnd = dlg = gtk_window_new (GTK_WINDOW_TOPLEVEL);
1399 gtk_window_set_title (GTK_WINDOW (dlg), gszCaption);
1400 g_signal_connect (G_OBJECT (dlg), "delete_event", G_CALLBACK (main_close), NULL);
1401 // g_signal_connect (G_OBJECT (dlg), "destroy", G_CALLBACK (gtk_widget_destroy), NULL);
1402 gtk_window_set_transient_for (GTK_WINDOW (dlg), GTK_WINDOW (g_pRadiantWnd));
1404 hbox = gtk_hbox_new (FALSE, 5);
1405 gtk_widget_show (hbox);
1406 gtk_container_add (GTK_CONTAINER (dlg), hbox);
1407 gtk_container_set_border_width (GTK_CONTAINER (hbox), 5);
1409 notebook = gtk_notebook_new ();
1410 gtk_widget_show (notebook);
1411 gtk_box_pack_start (GTK_BOX (hbox), notebook, TRUE, TRUE, 0);
1412 g_signal_connect (G_OBJECT (notebook), "switch_page",
1413 G_CALLBACK (switch_page), NULL);
1414 gtk_notebook_set_tab_pos (GTK_NOTEBOOK (notebook), GTK_POS_TOP);
1415 g_object_set_data (G_OBJECT (dlg), "notebook", notebook);
1417 table = gtk_table_new (2, 2, FALSE);
1418 gtk_widget_show (table);
1419 gtk_container_set_border_width (GTK_CONTAINER (table), 5);
1420 gtk_table_set_row_spacings (GTK_TABLE (table), 5);
1421 gtk_table_set_col_spacings (GTK_TABLE (table), 5);
1423 label = gtk_label_new ("General");
1424 gtk_widget_show (label);
1425 gtk_notebook_append_page (GTK_NOTEBOOK (notebook), table, label);
1427 frame = gtk_frame_new ("Game");
1428 gtk_widget_show (frame);
1429 gtk_table_attach (GTK_TABLE (table), frame, 0, 1, 0, 1,
1430 (GtkAttachOptions) (GTK_EXPAND|GTK_FILL),
1431 (GtkAttachOptions) (GTK_EXPAND|GTK_FILL), 0, 0);
1433 vbox = gtk_vbox_new (TRUE, 5);
1434 gtk_widget_show (vbox);
1435 gtk_container_add (GTK_CONTAINER (frame), vbox);
1436 gtk_container_set_border_width (GTK_CONTAINER (vbox), 5);
1438 for (i = 0, group = NULL; i < NUMGAMES; i++)
1440 radio = gtk_radio_button_new_with_label (group, games[i]);
1441 gtk_widget_show (radio);
1442 gtk_box_pack_start (GTK_BOX (vbox), radio, TRUE, TRUE, 0);
1443 group = gtk_radio_button_group (GTK_RADIO_BUTTON (radio));
1444 game_radios[i] = radio;
1445 g_signal_connect (G_OBJECT (radio), "toggled", G_CALLBACK (general_game), GINT_TO_POINTER (i));
1448 frame = gtk_frame_new ("Waveform");
1449 gtk_widget_show (frame);
1450 gtk_table_attach (GTK_TABLE (table), frame, 1, 2, 0, 1,
1451 (GtkAttachOptions) (GTK_EXPAND|GTK_FILL),
1452 (GtkAttachOptions) (GTK_EXPAND|GTK_FILL), 0, 0);
1454 vbox = gtk_vbox_new (TRUE, 5);
1455 gtk_widget_show (vbox);
1456 gtk_container_add (GTK_CONTAINER (frame), vbox);
1457 gtk_container_set_border_width (GTK_CONTAINER (vbox), 5);
1459 for (i = 0, group = NULL; i < 5; i++)
1461 radio = gtk_radio_button_new_with_label (group, waveforms[i]);
1462 gtk_widget_show (radio);
1463 gtk_box_pack_start (GTK_BOX (vbox), radio, TRUE, TRUE, 0);
1464 group = gtk_radio_button_group (GTK_RADIO_BUTTON (radio));
1465 wave_radios[i] = radio;
1466 g_signal_connect (G_OBJECT (radio), "toggled", G_CALLBACK (general_wave), GINT_TO_POINTER (i));
1469 frame = gtk_frame_new ("Orientation");
1470 gtk_widget_show (frame);
1471 gtk_table_attach (GTK_TABLE (table), frame, 0, 1, 1, 2,
1472 (GtkAttachOptions) (GTK_EXPAND|GTK_FILL),
1473 (GtkAttachOptions) (GTK_EXPAND|GTK_FILL), 0, 0);
1475 vbox = gtk_vbox_new (TRUE, 5);
1476 gtk_widget_show (vbox);
1477 gtk_container_add (GTK_CONTAINER (frame), vbox);
1478 gtk_container_set_border_width (GTK_CONTAINER (vbox), 5);
1480 for (i = 0, group = NULL; i < 6; i++)
1482 radio = gtk_radio_button_new_with_label (group, orientations[i]);
1483 gtk_widget_show (radio);
1484 gtk_box_pack_start (GTK_BOX (vbox), radio, TRUE, TRUE, 0);
1485 group = gtk_radio_button_group (GTK_RADIO_BUTTON (radio));
1486 plane_radios[i] = radio;
1487 g_signal_connect (G_OBJECT (radio), "toggled", G_CALLBACK (general_plane), GINT_TO_POINTER (i));
1490 table2 = gtk_table_new (4, 2, FALSE);
1491 gtk_widget_show (table2);
1492 gtk_table_set_row_spacings (GTK_TABLE (table2), 5);
1493 gtk_table_set_col_spacings (GTK_TABLE (table2), 5);
1494 gtk_table_attach (GTK_TABLE (table), table2, 1, 2, 1, 2,
1495 (GtkAttachOptions) (GTK_EXPAND|GTK_FILL),
1496 (GtkAttachOptions) (GTK_EXPAND|GTK_FILL), 0, 0);
1498 label = gtk_label_new ("Wavelength:");
1499 gtk_widget_show (label);
1500 gtk_table_attach (GTK_TABLE (table2), label, 0, 1, 0, 1,
1501 (GtkAttachOptions) (GTK_EXPAND|GTK_FILL),
1502 (GtkAttachOptions) (GTK_EXPAND|GTK_FILL), 0, 0);
1503 gtk_misc_set_alignment (GTK_MISC (label), 1, 0.5);
1504 gtk_label_set_justify (GTK_LABEL (label), GTK_JUSTIFY_RIGHT);
1506 label = gtk_label_new ("Max. amplitude:");
1507 gtk_widget_show (label);
1508 gtk_table_attach (GTK_TABLE (table2), label, 0, 1, 1, 2,
1509 (GtkAttachOptions) (GTK_EXPAND|GTK_FILL),
1510 (GtkAttachOptions) (GTK_EXPAND|GTK_FILL), 0, 0);
1511 gtk_misc_set_alignment (GTK_MISC (label), 1, 0.5);
1512 gtk_label_set_justify (GTK_LABEL (label), GTK_JUSTIFY_RIGHT);
1514 label = gtk_label_new ("Roughness:");
1515 gtk_widget_show (label);
1516 gtk_table_attach (GTK_TABLE (table2), label, 0, 1, 2, 3,
1517 (GtkAttachOptions) (GTK_EXPAND|GTK_FILL),
1518 (GtkAttachOptions) (GTK_EXPAND|GTK_FILL), 0, 0);
1519 gtk_misc_set_alignment (GTK_MISC (label), 1, 0.5);
1520 gtk_label_set_justify (GTK_LABEL (label), GTK_JUSTIFY_RIGHT);
1522 label = gtk_label_new ("Random seed:");
1523 gtk_widget_show (label);
1524 gtk_table_attach (GTK_TABLE (table2), label, 0, 1, 3, 4,
1525 (GtkAttachOptions) (GTK_EXPAND|GTK_FILL),
1526 (GtkAttachOptions) (GTK_EXPAND|GTK_FILL), 0, 0);
1527 gtk_misc_set_alignment (GTK_MISC (label), 1, 0.5);
1528 gtk_label_set_justify (GTK_LABEL (label), GTK_JUSTIFY_RIGHT);
1530 entry = gtk_entry_new ();
1531 gtk_widget_show (entry);
1532 gtk_table_attach (GTK_TABLE (table2), entry, 1, 2, 0, 1,
1533 (GtkAttachOptions) (GTK_EXPAND|GTK_FILL),
1534 (GtkAttachOptions) (GTK_EXPAND|GTK_FILL), 0, 0);
1535 gtk_widget_set_usize (entry, 50, -2);
1536 g_object_set_data (G_OBJECT (dlg), "wavelength", entry);
1537 g_signal_connect (G_OBJECT (entry), "focus_out_event", G_CALLBACK (doublevariable_entryfocusout), &WaveLength);
1539 entry = gtk_entry_new ();
1540 gtk_widget_show (entry);
1541 gtk_table_attach (GTK_TABLE (table2), entry, 1, 2, 1, 2,
1542 (GtkAttachOptions) (GTK_EXPAND|GTK_FILL),
1543 (GtkAttachOptions) (GTK_EXPAND|GTK_FILL), 0, 0);
1544 gtk_widget_set_usize (entry, 50, -2);
1545 g_object_set_data (G_OBJECT (dlg), "amplitude", entry);
1546 g_signal_connect (G_OBJECT (entry), "focus_out_event", G_CALLBACK (doublevariable_entryfocusout), &Amplitude);
1548 entry = gtk_entry_new ();
1549 gtk_widget_show (entry);
1550 gtk_table_attach (GTK_TABLE (table2), entry, 1, 2, 2, 3,
1551 (GtkAttachOptions) (GTK_EXPAND|GTK_FILL),
1552 (GtkAttachOptions) (GTK_EXPAND|GTK_FILL), 0, 0);
1553 gtk_widget_set_usize (entry, 50, -2);
1554 g_object_set_data (G_OBJECT (dlg), "roughness", entry);
1555 g_signal_connect (G_OBJECT (entry), "focus_out_event", G_CALLBACK (doublevariable_entryfocusout), &Roughness);
1557 adj = gtk_adjustment_new (1, 1, 32767, 1, 10, 0);
1558 g_signal_connect (G_OBJECT (adj), "value_changed", G_CALLBACK (general_random), NULL);
1559 spin = gtk_spin_button_new (GTK_ADJUSTMENT (adj), 1, 0);
1560 gtk_widget_show (spin);
1561 gtk_table_attach (GTK_TABLE (table2), spin, 1, 2, 3, 4,
1562 (GtkAttachOptions) (GTK_EXPAND|GTK_FILL),
1563 (GtkAttachOptions) (GTK_EXPAND|GTK_FILL), 0, 0);
1564 gtk_widget_set_usize (spin, 60, -2);
1565 g_object_set_data (G_OBJECT (dlg), "random", spin);
1567 vbox = gtk_vbox_new (FALSE, 5);
1568 gtk_widget_show (vbox);
1569 gtk_container_set_border_width (GTK_CONTAINER (vbox), 5);
1571 label = gtk_label_new ("Extents");
1572 gtk_widget_show (label);
1573 gtk_notebook_append_page (GTK_NOTEBOOK (notebook), vbox, label);
1575 hbox2 = gtk_hbox_new (FALSE, 5);
1576 gtk_widget_show (hbox2);
1577 gtk_box_pack_start (GTK_BOX (vbox), hbox2, FALSE, TRUE, 0);
1579 frame = gtk_frame_new ("Extents");
1580 gtk_widget_show (frame);
1581 gtk_box_pack_start (GTK_BOX (hbox2), frame, TRUE, TRUE, 0);
1583 table = gtk_table_new (3, 4, FALSE);
1584 gtk_widget_show (table);
1585 gtk_container_set_border_width (GTK_CONTAINER (table), 5);
1586 gtk_container_add (GTK_CONTAINER (frame), table);
1587 gtk_table_set_row_spacings (GTK_TABLE (table), 5);
1588 gtk_table_set_col_spacings (GTK_TABLE (table), 5);
1590 label = gtk_label_new ("X:");
1591 gtk_widget_show (label);
1592 gtk_table_attach (GTK_TABLE (table), label, 0, 1, 1, 2,
1593 (GtkAttachOptions) (GTK_FILL),
1594 (GtkAttachOptions) (GTK_FILL), 0, 0);
1595 g_object_set_data (G_OBJECT (dlg), "hmin_text", label);
1597 label = gtk_label_new ("X:");
1598 gtk_widget_show (label);
1599 gtk_table_attach (GTK_TABLE (table), label, 2, 3, 1, 2,
1600 (GtkAttachOptions) (GTK_FILL),
1601 (GtkAttachOptions) (GTK_FILL), 0, 0);
1602 g_object_set_data (G_OBJECT (dlg), "hmax_text", label);
1604 label = gtk_label_new ("Y:");
1605 gtk_widget_show (label);
1606 gtk_table_attach (GTK_TABLE (table), label, 0, 1, 2, 3,
1607 (GtkAttachOptions) (GTK_FILL),
1608 (GtkAttachOptions) (GTK_FILL), 0, 0);
1609 g_object_set_data (G_OBJECT (dlg), "vmin_text", label);
1611 label = gtk_label_new ("Y:");
1612 gtk_widget_show (label);
1613 gtk_table_attach (GTK_TABLE (table), label, 2, 3, 2, 3,
1614 (GtkAttachOptions) (GTK_FILL),
1615 (GtkAttachOptions) (GTK_FILL), 0, 0);
1616 g_object_set_data (G_OBJECT (dlg), "vmax_text", label);
1618 label = gtk_label_new ("Lower-left");
1619 gtk_widget_show (label);
1620 gtk_table_attach (GTK_TABLE (table), label, 1, 2, 0, 1,
1621 (GtkAttachOptions) (GTK_FILL),
1622 (GtkAttachOptions) (GTK_FILL), 0, 0);
1624 label = gtk_label_new ("Upper-right");
1625 gtk_widget_show (label);
1626 gtk_table_attach (GTK_TABLE (table), label, 3, 4, 0, 1,
1627 (GtkAttachOptions) (GTK_FILL),
1628 (GtkAttachOptions) (GTK_FILL), 0, 0);
1630 entry = gtk_entry_new ();
1631 gtk_widget_show (entry);
1632 gtk_table_attach (GTK_TABLE (table), entry, 1, 2, 1, 2,
1633 (GtkAttachOptions) (GTK_EXPAND|GTK_FILL),
1634 (GtkAttachOptions) (GTK_EXPAND|GTK_FILL), 0, 0);
1635 gtk_widget_set_usize (entry, 50, -2);
1636 g_object_set_data (G_OBJECT (dlg), "hmin", entry);
1637 g_signal_connect (G_OBJECT (entry), "focus_out_event", G_CALLBACK (doublevariable_entryfocusout), &Hll);
1639 entry = gtk_entry_new ();
1640 gtk_widget_show (entry);
1641 gtk_table_attach (GTK_TABLE (table), entry, 3, 4, 1, 2,
1642 (GtkAttachOptions) (GTK_EXPAND|GTK_FILL),
1643 (GtkAttachOptions) (GTK_EXPAND|GTK_FILL), 0, 0);
1644 gtk_widget_set_usize (entry, 50, -2);
1645 g_object_set_data (G_OBJECT (dlg), "hmax", entry);
1646 g_signal_connect (G_OBJECT (entry), "focus_out_event", G_CALLBACK (doublevariable_entryfocusout), &Hur);
1648 entry = gtk_entry_new ();
1649 gtk_widget_show (entry);
1650 gtk_table_attach (GTK_TABLE (table), entry, 1, 2, 2, 3,
1651 (GtkAttachOptions) (GTK_EXPAND|GTK_FILL),
1652 (GtkAttachOptions) (GTK_EXPAND|GTK_FILL), 0, 0);
1653 gtk_widget_set_usize (entry, 50, -2);
1654 g_object_set_data (G_OBJECT (dlg), "vmin", entry);
1655 g_signal_connect (G_OBJECT (entry), "focus_out_event", G_CALLBACK (doublevariable_entryfocusout), &Vll);
1657 entry = gtk_entry_new ();
1658 gtk_widget_show (entry);
1659 gtk_table_attach (GTK_TABLE (table), entry, 3, 4, 2, 3,
1660 (GtkAttachOptions) (GTK_EXPAND|GTK_FILL),
1661 (GtkAttachOptions) (GTK_EXPAND|GTK_FILL), 0, 0);
1662 gtk_widget_set_usize (entry, 50, -2);
1663 g_object_set_data (G_OBJECT (dlg), "vmax", entry);
1664 g_signal_connect (G_OBJECT (entry), "focus_out_event", G_CALLBACK (doublevariable_entryfocusout), &Vur);
1666 frame = gtk_frame_new ("Divisions");
1667 gtk_widget_show (frame);
1668 gtk_box_pack_start (GTK_BOX (hbox2), frame, TRUE, TRUE, 0);
1670 table = gtk_table_new (2, 2, FALSE);
1671 gtk_widget_show (table);
1672 gtk_container_set_border_width (GTK_CONTAINER (table), 5);
1673 gtk_container_add (GTK_CONTAINER (frame), table);
1674 gtk_table_set_row_spacings (GTK_TABLE (table), 5);
1675 gtk_table_set_col_spacings (GTK_TABLE (table), 5);
1677 label = gtk_label_new ("X:");
1678 gtk_widget_show (label);
1679 gtk_table_attach (GTK_TABLE (table), label, 0, 1, 0, 1,
1680 (GtkAttachOptions) (GTK_FILL),
1681 (GtkAttachOptions) (GTK_EXPAND|GTK_FILL), 0, 0);
1682 g_object_set_data (G_OBJECT (dlg), "nh_text", label);
1684 label = gtk_label_new ("Y:");
1685 gtk_widget_show (label);
1686 gtk_table_attach (GTK_TABLE (table), label, 0, 1, 1, 2,
1687 (GtkAttachOptions) (GTK_FILL),
1688 (GtkAttachOptions) (GTK_EXPAND|GTK_FILL), 0, 0);
1689 g_object_set_data (G_OBJECT (dlg), "nv_text", label);
1691 adj = gtk_adjustment_new (8, 1, MAX_ROWS, 1, 10, 0);
1692 g_signal_connect (G_OBJECT (adj), "value_changed", G_CALLBACK (extents_nhnv_spin), &NH);
1693 spin = gtk_spin_button_new (GTK_ADJUSTMENT (adj), 1, 0);
1694 gtk_widget_show (spin);
1695 gtk_table_attach (GTK_TABLE (table), spin, 1, 2, 0, 1,
1696 (GtkAttachOptions) (GTK_EXPAND|GTK_FILL),
1697 (GtkAttachOptions) (GTK_EXPAND|GTK_FILL), 0, 0);
1698 gtk_widget_set_usize (spin, 60, -2);
1699 g_object_set_data (G_OBJECT (dlg), "nh", spin);
1701 adj = gtk_adjustment_new (8, 1, MAX_ROWS, 1, 10, 0);
1702 g_signal_connect (G_OBJECT (adj), "value_changed", G_CALLBACK (extents_nhnv_spin), &NV);
1703 spin = gtk_spin_button_new (GTK_ADJUSTMENT (adj), 1, 0);
1704 gtk_widget_show (spin);
1705 gtk_table_attach (GTK_TABLE (table), spin, 1, 2, 1, 2,
1706 (GtkAttachOptions) (GTK_EXPAND|GTK_FILL),
1707 (GtkAttachOptions) (GTK_EXPAND|GTK_FILL), 0, 0);
1708 gtk_widget_set_usize (spin, 60, -2);
1709 g_object_set_data (G_OBJECT (dlg), "nv", spin);
1711 check = gtk_check_button_new_with_label ("Use Bezier patches");
1712 gtk_widget_show (check);
1713 gtk_box_pack_start (GTK_BOX (vbox), check, FALSE, TRUE, 0);
1714 g_object_set_data (G_OBJECT (dlg), "use_patches", check);
1715 g_signal_connect (G_OBJECT (check), "toggled", G_CALLBACK (extents_use_patches), NULL);
1717 // ^Fishman - Snap to grid, replaced scroll bar with a texbox.
1718 label = gtk_label_new ("Snap to grid:");
1719 gtk_widget_show (label);
1720 gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, TRUE, 0);
1721 gtk_object_set_data (GTK_OBJECT (dlg), "snap_text", label);
1723 adj = gtk_adjustment_new (8, 0, 256, 1, 10, 0);
1724 g_signal_connect (G_OBJECT (adj), "value_changed", G_CALLBACK (extents_snaptogrid_spin), &SP);
1725 spin = gtk_spin_button_new (GTK_ADJUSTMENT (adj), 1, 0);
1726 gtk_widget_show (spin);
1727 gtk_box_pack_start (GTK_BOX (vbox), spin, FALSE, TRUE, 0);
1728 gtk_widget_set_usize (spin, 60, -2);
1729 g_object_set_data (G_OBJECT (dlg), "sp", spin);
1730 // ^Fishman - End of Snap to grid code.
1732 hbox2 = gtk_hbox_new (FALSE, 5);
1733 gtk_widget_show (hbox2);
1734 gtk_box_pack_start (GTK_BOX (vbox), hbox2, FALSE, TRUE, 10);
1736 label = gtk_label_new ("Decimate:");
1737 gtk_widget_show (label);
1738 gtk_box_pack_start (GTK_BOX (hbox2), label, FALSE, TRUE, 0);
1740 adj = gtk_adjustment_new (0, 0, 110, 1, 10, 0);
1741 g_signal_connect (G_OBJECT (adj), "value_changed", G_CALLBACK (extents_decimate), NULL);
1742 g_object_set_data (G_OBJECT (dlg), "decimate_adj", adj);
1743 scale = gtk_hscale_new (GTK_ADJUSTMENT (adj));
1744 gtk_widget_show (scale);
1745 gtk_box_pack_start (GTK_BOX (hbox2), scale, TRUE, TRUE, 0);
1746 gtk_scale_set_value_pos (GTK_SCALE (scale), GTK_POS_RIGHT);
1747 gtk_scale_set_digits (GTK_SCALE (scale), 0);
1748 g_object_set_data (G_OBJECT (dlg), "decimate", scale);
1750 frame = gtk_frame_new ("Corner values");
1751 gtk_widget_show (frame);
1752 gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, TRUE, 0);
1754 table = gtk_table_new (3, 4, FALSE);
1755 gtk_widget_show (table);
1756 gtk_container_set_border_width (GTK_CONTAINER (table), 5);
1757 gtk_container_add (GTK_CONTAINER (frame), table);
1758 gtk_table_set_row_spacings (GTK_TABLE (table), 5);
1759 gtk_table_set_col_spacings (GTK_TABLE (table), 5);
1761 label = gtk_label_new ("Upper-left:");
1762 gtk_widget_show (label);
1763 gtk_table_attach (GTK_TABLE (table), label, 0, 1, 0, 1,
1764 (GtkAttachOptions) (GTK_FILL),
1765 (GtkAttachOptions) (GTK_FILL), 0, 0);
1767 label = gtk_label_new ("Lower-left:");
1768 gtk_widget_show (label);
1769 gtk_table_attach (GTK_TABLE (table), label, 0, 1, 1, 2,
1770 (GtkAttachOptions) (GTK_FILL),
1771 (GtkAttachOptions) (GTK_FILL), 0, 0);
1773 label = gtk_label_new ("Upper-right:");
1774 gtk_widget_show (label);
1775 gtk_table_attach (GTK_TABLE (table), label, 2, 3, 0, 1,
1776 (GtkAttachOptions) (GTK_FILL),
1777 (GtkAttachOptions) (GTK_FILL), 0, 0);
1779 label = gtk_label_new ("Lower-right:");
1780 gtk_widget_show (label);
1781 gtk_table_attach (GTK_TABLE (table), label, 2, 3, 1, 2,
1782 (GtkAttachOptions) (GTK_FILL),
1783 (GtkAttachOptions) (GTK_FILL), 0, 0);
1785 entry = gtk_entry_new ();
1786 gtk_widget_show (entry);
1787 gtk_table_attach (GTK_TABLE (table), entry, 1, 2, 0, 1,
1788 (GtkAttachOptions) (GTK_EXPAND|GTK_FILL),
1789 (GtkAttachOptions) (GTK_EXPAND|GTK_FILL), 0, 0);
1790 gtk_widget_set_usize (entry, 50, -2);
1791 g_object_set_data (G_OBJECT (dlg), "z01", entry);
1792 g_signal_connect (G_OBJECT (entry), "focus_out_event", G_CALLBACK (doublevariable_entryfocusout), &Z01);
1794 entry = gtk_entry_new ();
1795 gtk_widget_show (entry);
1796 gtk_table_attach (GTK_TABLE (table), entry, 1, 2, 1, 2,
1797 (GtkAttachOptions) (GTK_EXPAND|GTK_FILL),
1798 (GtkAttachOptions) (GTK_EXPAND|GTK_FILL), 0, 0);
1799 gtk_widget_set_usize (entry, 50, -2);
1800 g_object_set_data (G_OBJECT (dlg), "z00", entry);
1801 g_signal_connect (G_OBJECT (entry), "focus_out_event", G_CALLBACK (doublevariable_entryfocusout), &Z00);
1803 entry = gtk_entry_new ();
1804 gtk_widget_show (entry);
1805 gtk_table_attach (GTK_TABLE (table), entry, 3, 4, 0, 1,
1806 (GtkAttachOptions) (GTK_EXPAND|GTK_FILL),
1807 (GtkAttachOptions) (GTK_EXPAND|GTK_FILL), 0, 0);
1808 gtk_widget_set_usize (entry, 50, -2);
1809 g_object_set_data (G_OBJECT (dlg), "z11", entry);
1810 g_signal_connect (G_OBJECT (entry), "focus_out_event", G_CALLBACK (doublevariable_entryfocusout), &Z11);
1812 entry = gtk_entry_new ();
1813 gtk_widget_show (entry);
1814 gtk_table_attach (GTK_TABLE (table), entry, 3, 4, 1, 2,
1815 (GtkAttachOptions) (GTK_EXPAND|GTK_FILL),
1816 (GtkAttachOptions) (GTK_EXPAND|GTK_FILL), 0, 0);
1817 gtk_widget_set_usize (entry, 50, -2);
1818 g_object_set_data (G_OBJECT (dlg), "z10", entry);
1819 g_signal_connect (G_OBJECT (entry), "focus_out_event", G_CALLBACK (doublevariable_entryfocusout), &Z10);
1821 check = gtk_check_button_new_with_label ("Linear borders");
1822 gtk_widget_show (check);
1823 gtk_table_attach (GTK_TABLE (table), check, 0, 4, 2, 3,
1824 (GtkAttachOptions) (GTK_EXPAND|GTK_FILL),
1825 (GtkAttachOptions) (GTK_EXPAND|GTK_FILL), 0, 0);
1826 g_object_set_data (G_OBJECT (dlg), "linearborder", check);
1827 g_signal_connect (G_OBJECT (check), "toggled", G_CALLBACK (extents_linearborder), NULL);
1829 vbox = gtk_vbox_new (FALSE, 10);
1830 gtk_widget_show (vbox);
1831 gtk_container_set_border_width (GTK_CONTAINER (vbox), 5);
1833 label = gtk_label_new ("Bitmap");
1834 gtk_widget_show (label);
1835 gtk_notebook_append_page (GTK_NOTEBOOK (notebook), vbox, label);
1837 label = gtk_label_new ("");
1838 gtk_widget_show (label);
1839 gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, TRUE, 0);
1840 g_object_set_data (G_OBJECT (dlg), "bmp_note", label);
1842 table = gtk_table_new (2, 2, FALSE);
1843 gtk_widget_show (table);
1844 gtk_container_set_border_width (GTK_CONTAINER (table), 5);
1845 gtk_box_pack_start (GTK_BOX (vbox), table, FALSE, TRUE, 0);
1846 gtk_table_set_row_spacings (GTK_TABLE (table), 5);
1847 gtk_table_set_col_spacings (GTK_TABLE (table), 5);
1849 label = gtk_label_new ("Filename:");
1850 gtk_widget_show (label);
1851 gtk_table_attach (GTK_TABLE (table), label, 0, 1, 0, 1,
1852 (GtkAttachOptions) (GTK_FILL),
1853 (GtkAttachOptions) (GTK_FILL), 0, 0);
1854 g_object_set_data (G_OBJECT (dlg), "bmp_text1", label);
1856 entry = gtk_entry_new ();
1857 gtk_widget_show (entry);
1858 gtk_table_attach (GTK_TABLE (table), entry, 1, 2, 0, 1,
1859 (GtkAttachOptions) (GTK_EXPAND|GTK_FILL),
1860 (GtkAttachOptions) (GTK_FILL), 0, 0);
1861 g_object_set_data (G_OBJECT (dlg), "bmp_file", entry);
1862 g_signal_connect (G_OBJECT (entry), "focus_out_event", G_CALLBACK (bitmap_file_entryfocusout), NULL);
1864 hbox2 = gtk_hbox_new (TRUE, 5);
1865 gtk_widget_show (hbox2);
1866 gtk_table_attach (GTK_TABLE (table), hbox2, 1, 2, 1, 2,
1867 (GtkAttachOptions) (0),
1868 (GtkAttachOptions) (GTK_EXPAND|GTK_FILL), 0, 0);
1870 button = gtk_button_new_with_label ("Browse...");
1871 gtk_widget_show (button);
1872 gtk_box_pack_start (GTK_BOX (hbox2), button, FALSE, FALSE, 0);
1873 gtk_widget_set_usize (button, 60, -2);
1874 g_object_set_data (G_OBJECT (dlg), "bmp_file_browse", button);
1875 g_signal_connect (G_OBJECT (button), "clicked", G_CALLBACK (bitmap_browse), NULL);
1877 button = gtk_button_new_with_label ("Reload");
1878 gtk_widget_show (button);
1879 gtk_box_pack_start (GTK_BOX (hbox2), button, FALSE, FALSE, 0);
1880 gtk_widget_set_usize (button, 60, -2);
1881 g_object_set_data (G_OBJECT (dlg), "bmp_reload", button);
1882 g_signal_connect (G_OBJECT (button), "clicked", G_CALLBACK (bitmap_reload), NULL);
1884 table = gtk_table_new (2, 2, TRUE);
1885 gtk_widget_show (table);
1886 gtk_container_set_border_width (GTK_CONTAINER (table), 5);
1887 gtk_box_pack_start (GTK_BOX (vbox), table, FALSE, TRUE, 0);
1888 gtk_table_set_row_spacings (GTK_TABLE (table), 5);
1889 gtk_table_set_col_spacings (GTK_TABLE (table), 5);
1891 label = gtk_label_new ("Map color 0 to:");
1892 gtk_widget_show (label);
1893 gtk_table_attach (GTK_TABLE (table), label, 0, 1, 0, 1,
1894 (GtkAttachOptions) (GTK_FILL|GTK_EXPAND),
1895 (GtkAttachOptions) (GTK_FILL), 0, 0);
1896 g_object_set_data (G_OBJECT (dlg), "bmp_text2", label);
1897 gtk_misc_set_alignment (GTK_MISC (label), 1, 0.5);
1898 gtk_label_set_justify (GTK_LABEL (label), GTK_JUSTIFY_RIGHT);
1900 label = gtk_label_new ("Map color 255 to:");
1901 gtk_widget_show (label);
1902 gtk_table_attach (GTK_TABLE (table), label, 0, 1, 1, 2,
1903 (GtkAttachOptions) (GTK_FILL|GTK_EXPAND),
1904 (GtkAttachOptions) (GTK_FILL), 0, 0);
1905 g_object_set_data (G_OBJECT (dlg), "bmp_text3", label);
1906 gtk_misc_set_alignment (GTK_MISC (label), 1, 0.5);
1907 gtk_label_set_justify (GTK_LABEL (label), GTK_JUSTIFY_RIGHT);
1909 hbox2 = gtk_hbox_new (FALSE, 5);
1910 gtk_widget_show (hbox2);
1911 gtk_table_attach (GTK_TABLE (table), hbox2, 1, 2, 0, 1,
1912 (GtkAttachOptions) (GTK_EXPAND|GTK_FILL),
1913 (GtkAttachOptions) (GTK_EXPAND|GTK_FILL), 0, 0);
1915 entry = gtk_entry_new ();
1916 gtk_widget_show (entry);
1917 gtk_box_pack_start (GTK_BOX (hbox2), entry, FALSE, FALSE, 0);
1918 gtk_widget_set_usize (entry, 50, -2);
1919 g_object_set_data (G_OBJECT (dlg), "bmp_black", entry);
1920 g_signal_connect (G_OBJECT (entry), "focus_out_event", G_CALLBACK (doublevariable_entryfocusout), &gbmp.black_value);
1922 hbox2 = gtk_hbox_new (FALSE, 5);
1923 gtk_widget_show (hbox2);
1924 gtk_table_attach (GTK_TABLE (table), hbox2, 1, 2, 1, 2,
1925 (GtkAttachOptions) (GTK_EXPAND|GTK_FILL),
1926 (GtkAttachOptions) (GTK_EXPAND|GTK_FILL), 0, 0);
1928 entry = gtk_entry_new ();
1929 gtk_widget_show (entry);
1930 gtk_box_pack_start (GTK_BOX (hbox2), entry, FALSE, FALSE, 0);
1931 gtk_widget_set_usize (entry, 50, -2);
1932 g_object_set_data (G_OBJECT (dlg), "bmp_white", entry);
1933 g_signal_connect (G_OBJECT (entry), "focus_out_event", G_CALLBACK (doublevariable_entryfocusout), &gbmp.white_value);
1935 vbox = gtk_vbox_new (FALSE, 10);
1936 gtk_widget_show (vbox);
1937 gtk_container_set_border_width (GTK_CONTAINER (vbox), 5);
1939 label = gtk_label_new ("Fix Points");
1940 gtk_widget_show (label);
1941 gtk_notebook_append_page (GTK_NOTEBOOK (notebook), vbox, label);
1943 label = gtk_label_new ("Click on a vertex in the lower half of the preview window,\n"
1944 "then use the arrow keys or text box to assign a value.\n"
1945 "Use Ctrl+Click to select multiple vertices/toggle a\n"
1946 "selection. Use Shift+Click to select a range of vertices.\n\n"
1947 "Click \"Free\" to unlock a vertex. Vertices within \"Range\n"
1948 "affected\" will be influenced by this vertex.");
1949 gtk_widget_show (label);
1950 gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, TRUE, 0);
1952 table = gtk_table_new (3, 3, FALSE);
1953 gtk_widget_show (table);
1954 gtk_container_set_border_width (GTK_CONTAINER (table), 5);
1955 gtk_box_pack_start (GTK_BOX (vbox), table, FALSE, TRUE, 0);
1956 gtk_table_set_row_spacings (GTK_TABLE (table), 5);
1957 gtk_table_set_col_spacings (GTK_TABLE (table), 5);
1959 label = gtk_label_new ("Value:");
1960 gtk_widget_show (label);
1961 gtk_table_attach (GTK_TABLE (table), label, 0, 1, 0, 1,
1962 (GtkAttachOptions) (GTK_FILL),
1963 (GtkAttachOptions) (GTK_FILL), 0, 0);
1964 gtk_misc_set_alignment (GTK_MISC (label), 1, 0.5);
1965 g_object_set_data (G_OBJECT (dlg), "fix_value_text", label);
1967 label = gtk_label_new ("Range affected:");
1968 gtk_widget_show (label);
1969 gtk_table_attach (GTK_TABLE (table), label, 0, 1, 1, 2,
1970 (GtkAttachOptions) (GTK_FILL),
1971 (GtkAttachOptions) (GTK_FILL), 0, 0);
1972 gtk_misc_set_alignment (GTK_MISC (label), 1, 0.5);
1973 g_object_set_data (G_OBJECT (dlg), "fix_range_text", label);
1975 label = gtk_label_new ("Rate of change:");
1976 gtk_widget_show (label);
1977 gtk_table_attach (GTK_TABLE (table), label, 0, 1, 2, 3,
1978 (GtkAttachOptions) (GTK_FILL),
1979 (GtkAttachOptions) (GTK_FILL), 0, 0);
1980 gtk_misc_set_alignment (GTK_MISC (label), 1, 0.5);
1981 g_object_set_data (G_OBJECT (dlg), "fix_rate_text", label);
1983 adj = gtk_adjustment_new (0, -65536, 65536, 1, 16, 0);
1984 g_signal_connect (G_OBJECT (adj), "value_changed", G_CALLBACK (fix_value_changed), NULL);
1985 spin = gtk_spin_button_new (GTK_ADJUSTMENT (adj), 1, 0);
1986 gtk_widget_show (spin);
1987 gtk_table_attach (GTK_TABLE (table), spin, 1, 2, 0, 1,
1988 (GtkAttachOptions) (GTK_EXPAND),
1989 (GtkAttachOptions) (GTK_EXPAND), 0, 0);
1990 gtk_widget_set_usize (spin, 60, -2);
1991 g_object_set_data (G_OBJECT (dlg), "fix_value", spin);
1992 g_signal_connect (G_OBJECT (spin), "focus_out_event", G_CALLBACK (fix_value_entryfocusout), NULL);
1994 entry = gtk_entry_new ();
1995 gtk_widget_show (entry);
1996 gtk_table_attach (GTK_TABLE (table), entry, 1, 2, 1, 2,
1997 (GtkAttachOptions) (GTK_EXPAND),
1998 (GtkAttachOptions) (GTK_FILL), 0, 0);
1999 gtk_widget_set_usize (entry, 60, -2);
2000 g_object_set_data (G_OBJECT (dlg), "fix_range", entry);
2001 g_signal_connect (G_OBJECT (entry), "focus_out_event", G_CALLBACK (fix_range_entryfocusout), NULL);
2003 entry = gtk_entry_new ();
2004 gtk_widget_show (entry);
2005 gtk_table_attach (GTK_TABLE (table), entry, 1, 2, 2, 3,
2006 (GtkAttachOptions) (GTK_EXPAND),
2007 (GtkAttachOptions) (GTK_FILL), 0, 0);
2008 gtk_widget_set_usize (entry, 60, -2);
2009 g_object_set_data (G_OBJECT (dlg), "fix_rate", entry);
2010 g_signal_connect (G_OBJECT (entry), "focus_out_event", G_CALLBACK (fix_rate_entryfocusout), NULL);
2012 button = gtk_button_new_with_label ("Free");
2013 gtk_widget_show (button);
2014 gtk_table_attach (GTK_TABLE (table), button, 2, 3, 0, 1,
2015 (GtkAttachOptions) (GTK_EXPAND),
2016 (GtkAttachOptions) (GTK_FILL), 0, 0);
2017 gtk_widget_set_usize (button, 60, -2);
2018 g_object_set_data (G_OBJECT (dlg), "fix_free", button);
2019 g_signal_connect (G_OBJECT (button), "clicked", G_CALLBACK (fix_free), NULL);
2021 button = gtk_button_new_with_label ("Free All");
2022 gtk_widget_show (button);
2023 gtk_table_attach (GTK_TABLE (table), button, 2, 3, 1, 2,
2024 (GtkAttachOptions) (GTK_EXPAND),
2025 (GtkAttachOptions) (GTK_FILL), 0, 0);
2026 gtk_widget_set_usize (button, 60, -2);
2027 g_object_set_data (G_OBJECT (dlg), "fix_freeall", button);
2028 g_signal_connect (G_OBJECT (button), "clicked", G_CALLBACK (fix_freeall), NULL);
2030 vbox = gtk_vbox_new (FALSE, 10);
2031 gtk_widget_show (vbox);
2032 gtk_container_set_border_width (GTK_CONTAINER (vbox), 5);
2034 label = gtk_label_new ("Texture");
2035 gtk_widget_show (label);
2036 gtk_notebook_append_page (GTK_NOTEBOOK (notebook), vbox, label);
2038 // ^Fishman - Modified to add more labels and textboxes.
2039 table = gtk_table_new (5, 2, FALSE);
2040 gtk_widget_show (table);
2041 gtk_box_pack_start (GTK_BOX (vbox), table, FALSE, TRUE, 0);
2042 gtk_table_set_row_spacings (GTK_TABLE (table), 5);
2043 gtk_table_set_col_spacings (GTK_TABLE (table), 5);
2045 label = gtk_label_new ("Surface:");
2046 gtk_widget_show (label);
2047 gtk_table_attach (GTK_TABLE (table), label, 0, 1, 0, 1,
2048 (GtkAttachOptions) (GTK_FILL),
2049 (GtkAttachOptions) (GTK_FILL), 0, 0);
2050 gtk_misc_set_alignment (GTK_MISC (label), 1, 0.5);
2052 label = gtk_label_new ("Other:");
2053 gtk_widget_show (label);
2054 gtk_table_attach (GTK_TABLE (table), label, 0, 1, 1, 2,
2055 (GtkAttachOptions) (GTK_FILL),
2056 (GtkAttachOptions) (GTK_FILL), 0, 0);
2057 gtk_misc_set_alignment (GTK_MISC (label), 1, 0.5);
2059 label = gtk_label_new ("Steep:");
2060 gtk_widget_show (label);
2061 gtk_table_attach (GTK_TABLE (table), label, 0, 1, 2, 3,
2062 (GtkAttachOptions) (GTK_FILL),
2063 (GtkAttachOptions) (GTK_FILL), 0, 0);
2064 gtk_misc_set_alignment (GTK_MISC (label), 1, 0.5);
2066 entry = gtk_entry_new ();
2067 gtk_widget_show (entry);
2068 gtk_table_attach (GTK_TABLE (table), entry, 1, 2, 0, 1,
2069 (GtkAttachOptions) (GTK_EXPAND|GTK_FILL),
2070 (GtkAttachOptions) (GTK_FILL), 0, 0);
2071 gtk_widget_set_usize (entry, 60, -2);
2072 g_object_set_data (G_OBJECT (dlg), "texture1", entry);
2073 g_signal_connect (G_OBJECT (entry), "focus_out_event", G_CALLBACK(texture_entryfocusout), GINT_TO_POINTER (0));
2075 entry = gtk_entry_new ();
2076 gtk_widget_show (entry);
2077 gtk_table_attach (GTK_TABLE (table), entry, 1, 2, 1, 2,
2078 (GtkAttachOptions) (GTK_EXPAND|GTK_FILL),
2079 (GtkAttachOptions) (GTK_FILL), 0, 0);
2080 gtk_widget_set_usize (entry, 60, -2);
2081 g_object_set_data (G_OBJECT (dlg), "texture2", entry);
2082 g_signal_connect (G_OBJECT (entry), "focus_out_event", G_CALLBACK(texture_entryfocusout), GINT_TO_POINTER (1));
2084 entry = gtk_entry_new ();
2085 gtk_widget_show (entry);
2086 gtk_table_attach (GTK_TABLE (table), entry, 1, 2, 2, 3,
2087 (GtkAttachOptions) (GTK_EXPAND|GTK_FILL),
2088 (GtkAttachOptions) (GTK_FILL), 0, 0);
2089 gtk_widget_set_usize (entry, 60, -2);
2090 g_object_set_data (G_OBJECT (dlg), "texture3", entry);
2092 hbox2 = gtk_hbox_new (FALSE, 5);
2093 gtk_widget_show (hbox2);
2094 gtk_box_pack_start (GTK_BOX (vbox), hbox2, FALSE, TRUE, 0);
2096 label = gtk_label_new ("\"Steep\" angle:");
2097 gtk_widget_show (label);
2098 gtk_box_pack_start (GTK_BOX (hbox2), label, FALSE, TRUE, 0);
2100 adj = gtk_adjustment_new (60, 0, 90, 1, 10, 0);
2101 spin = gtk_spin_button_new (GTK_ADJUSTMENT (adj), 1, 0);
2102 gtk_widget_show (spin);
2103 gtk_box_pack_start (GTK_BOX (hbox2), spin, FALSE, TRUE, 0);
2104 g_object_set_data (G_OBJECT (dlg), "tex_slant", spin);
2106 table = gtk_table_new (2, 4, TRUE);
2107 gtk_widget_show (table);
2108 gtk_box_pack_start (GTK_BOX (vbox), table, FALSE, TRUE, 0);
2109 gtk_table_set_row_spacings (GTK_TABLE (table), 5);
2110 gtk_table_set_col_spacings (GTK_TABLE (table), 5);
2112 label = gtk_label_new ("Offset <h,v>");
2113 gtk_widget_show (label);
2114 gtk_table_attach (GTK_TABLE (table), label, 0, 2, 0, 1,
2115 (GtkAttachOptions) (GTK_FILL),
2116 (GtkAttachOptions) (GTK_FILL), 0, 0);
2118 label = gtk_label_new ("Scale <h,v>");
2119 gtk_widget_show (label);
2120 gtk_table_attach (GTK_TABLE (table), label, 2, 4, 0, 1,
2121 (GtkAttachOptions) (GTK_FILL),
2122 (GtkAttachOptions) (GTK_FILL), 0, 0);
2124 entry = gtk_entry_new ();
2125 gtk_widget_show (entry);
2126 gtk_table_attach (GTK_TABLE (table), entry, 0, 1, 1, 2,
2127 (GtkAttachOptions) (GTK_EXPAND|GTK_FILL),
2128 (GtkAttachOptions) (GTK_FILL), 0, 0);
2129 gtk_widget_set_usize (entry, 60, -2);
2130 g_object_set_data (G_OBJECT (dlg), "texoffsetx", entry);
2132 entry = gtk_entry_new ();
2133 gtk_widget_show (entry);
2134 gtk_table_attach (GTK_TABLE (table), entry, 1, 2, 1, 2,
2135 (GtkAttachOptions) (GTK_EXPAND|GTK_FILL),
2136 (GtkAttachOptions) (GTK_FILL), 0, 0);
2137 gtk_widget_set_usize (entry, 60, -2);
2138 g_object_set_data (G_OBJECT (dlg), "texoffsety", entry);
2140 entry = gtk_entry_new ();
2141 gtk_widget_show (entry);
2142 gtk_table_attach (GTK_TABLE (table), entry, 2, 3, 1, 2,
2143 (GtkAttachOptions) (GTK_EXPAND|GTK_FILL),
2144 (GtkAttachOptions) (GTK_FILL), 0, 0);
2145 gtk_widget_set_usize (entry, 60, -2);
2146 g_object_set_data (G_OBJECT (dlg), "texscalex", entry);
2148 entry = gtk_entry_new ();
2149 gtk_widget_show (entry);
2150 gtk_table_attach (GTK_TABLE (table), entry, 3, 4, 1, 2,
2151 (GtkAttachOptions) (GTK_EXPAND|GTK_FILL),
2152 (GtkAttachOptions) (GTK_FILL), 0, 0);
2153 gtk_widget_set_usize (entry, 60, -2);
2154 g_object_set_data (G_OBJECT (dlg), "texscaley", entry);
2158 check = gtk_check_button_new_with_label ("Use detail brushes");
2159 gtk_widget_show (check);
2160 gtk_box_pack_start (GTK_BOX (vbox), check, FALSE, TRUE, 0);
2161 g_object_set_data (G_OBJECT (dlg), "detail", check);
2162 g_signal_connect (G_OBJECT (check), "toggled", G_CALLBACK (texture_detail), NULL);
2164 check = gtk_check_button_new_with_label ("Detail hint brushes");
2165 gtk_widget_show (check);
2166 gtk_box_pack_start (GTK_BOX (vbox), check, FALSE, TRUE, 0);
2167 g_object_set_data (G_OBJECT (dlg), "hint", check);
2168 g_signal_connect (G_OBJECT (check), "toggled", G_CALLBACK (texture_hint), NULL);
2170 // ^Fishman - Add terrain key to func_group.
2171 check = gtk_check_button_new_with_label ("Add terrain key");
2172 gtk_widget_show (check);
2173 gtk_box_pack_start (GTK_BOX (vbox), check, FALSE, TRUE, 0);
2174 g_object_set_data (G_OBJECT (dlg), "terrain_ent", check);
2175 g_signal_connect (G_OBJECT (check), "toggled", G_CALLBACK (texture_terrainent), NULL);
2177 vbox = gtk_vbox_new (FALSE, 5);
2178 gtk_widget_show (vbox);
2179 gtk_box_pack_start (GTK_BOX (hbox), vbox, FALSE, TRUE, 0);
2181 button = gtk_button_new_with_label ("OK");
2182 gtk_widget_show (button);
2183 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, TRUE, 0);
2184 gtk_widget_set_usize (button, 60, -2);
2185 g_object_set_data (G_OBJECT (dlg), "go", button);
2186 g_signal_connect (G_OBJECT (button), "clicked", G_CALLBACK (main_go), NULL);
2188 label = gtk_label_new ("Settings:");
2189 gtk_widget_show (label);
2190 gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, TRUE, 0);
2192 button = gtk_button_new_with_label ("Open...");
2193 gtk_widget_show (button);
2194 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, TRUE, 0);
2195 g_object_set_data (G_OBJECT (dlg), "open", button);
2196 g_signal_connect (G_OBJECT (button), "clicked", G_CALLBACK (main_open), NULL);
2198 button = gtk_button_new_with_label ("Save as...");
2199 gtk_widget_show (button);
2200 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, TRUE, 0);
2201 g_object_set_data (G_OBJECT (dlg), "save", button);
2202 g_signal_connect (G_OBJECT (button), "clicked", G_CALLBACK (main_save), NULL);
2204 button = gtk_button_new_with_label ("Defaults");
2205 gtk_widget_show (button);
2206 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, TRUE, 0);
2207 g_object_set_data (G_OBJECT (dlg), "defaults", button);
2208 g_signal_connect (G_OBJECT (button), "clicked", G_CALLBACK (main_defaults), NULL);
2210 button = gtk_button_new_with_label ("About...");
2211 gtk_widget_show (button);
2212 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, TRUE, 0);
2213 g_signal_connect (G_OBJECT (button), "clicked", G_CALLBACK (main_about), NULL);
2215 check = gtk_check_button_new_with_label ("Preview");
2216 gtk_widget_show (check);
2217 gtk_box_pack_start (GTK_BOX (vbox), check, FALSE, TRUE, 0);
2218 g_signal_connect (G_OBJECT (check), "toggled", G_CALLBACK (main_preview), NULL);
2219 g_object_set_data (G_OBJECT (dlg), "main_preview", check);
2221 // ^Fishman - Antializing for the preview window.
2222 check = gtk_check_button_new_with_label ("Antialised lines");
2223 gtk_widget_show (check);
2224 gtk_box_pack_start (GTK_BOX (vbox), check, FALSE, TRUE, 0);
2225 g_object_set_data (G_OBJECT (dlg), "main_antialiasing", check);
2226 g_signal_connect (G_OBJECT (check), "toggled", G_CALLBACK (main_antialiasing), NULL);
2228 for (i = 0; i < 5; i++)
2231 CreateViewWindow ();
2235 FirstPassComplete = 1;
2243 HWND hwndDisplay = (HWND)NULL;
2244 HWND ghwndTab = (HWND)NULL;
2249 char GenSurfURL[40] = {"http://tarot.telefragged.com/gensurf"};
2250 char GenSurfBoard[40]={"http://tarot.telefragged.com/board"};
2253 * AboutDlgProc - processes messages for the about dialog.
2256 qboolean CALLBACK AboutDlgProc( HWND hwnd, unsigned msg, UINT wparam, LONG lparam )
2259 DRAWITEMSTRUCT *dis;
2266 lparam = lparam; /* turn off warning */
2270 strcpy(szText,"About " );
2271 strcat(szText,gszCaption);
2272 SetWindowText(hwnd,gszCaption);
2273 SetDlgItemText(hwnd,DLG_ABOUT_APP,szText);
2274 /* Application icon: */
2275 SendDlgItemMessage( hwnd, DLG_ABOUT_ICON,
2276 STM_SETICON, (WPARAM)(HICON)LoadIcon(ghInst,"GENSURF"),
2279 hwndURL = GetDlgItem(hwnd,DLG_ABOUT_URL);
2280 hdc = GetDC(hwndURL);
2281 GetTextExtentPoint(hdc,GenSurfURL,strlen(GenSurfURL),&size);
2282 ReleaseDC(hwndURL,hdc);
2283 GetWindowRect(hwndURL,&rc);
2284 SetWindowPos(hwndURL,(HWND)NULL,0,0,size.cx,size.cy+2,
2285 SWP_NOMOVE | SWP_NOZORDER);
2287 hwndURL = GetDlgItem(hwnd,DLG_ABOUT_BOARD);
2288 hdc = GetDC(hwndURL);
2289 GetTextExtentPoint(hdc,GenSurfBoard,strlen(GenSurfBoard),&size);
2290 ReleaseDC(hwndURL,hdc);
2291 GetWindowRect(hwndURL,&rc);
2292 SetWindowPos(hwndURL,(HWND)NULL,0,0,size.cx,size.cy+2,
2293 SWP_NOMOVE | SWP_NOZORDER);
2298 switch(LOWORD(wparam))
2303 case DLG_ABOUT_BOARD:
2313 if(wparam == DLG_ABOUT_URL)
2315 dis = (LPDRAWITEMSTRUCT)lparam;
2316 SetTextColor(dis->hDC,RGB(0,0,255));
2317 TextOut(dis->hDC,0,0,GenSurfURL,strlen(GenSurfURL));
2318 GetWindowRect(dis->hwndItem,&rc);
2319 GetTextExtentPoint(dis->hDC,GenSurfURL,strlen(GenSurfURL),&size);
2320 hpen = CreatePen(PS_SOLID,0,RGB(0,0,255));
2321 SelectObject(dis->hDC,hpen);
2322 MoveToEx(dis->hDC,0,size.cy,NULL);
2323 LineTo(dis->hDC,size.cx,size.cy);
2324 SelectObject(dis->hDC,GetStockObject(BLACK_PEN));
2327 else if(wparam==DLG_ABOUT_BOARD)
2329 dis = (LPDRAWITEMSTRUCT)lparam;
2330 SetTextColor(dis->hDC,RGB(0,0,255));
2331 TextOut(dis->hDC,0,0,GenSurfBoard,strlen(GenSurfBoard));
2332 GetWindowRect(dis->hwndItem,&rc);
2333 GetTextExtentPoint(dis->hDC,GenSurfBoard,strlen(GenSurfBoard),&size);
2334 hpen = CreatePen(PS_SOLID,0,RGB(0,0,255));
2335 SelectObject(dis->hDC,hpen);
2336 MoveToEx(dis->hDC,0,size.cy,NULL);
2337 LineTo(dis->hDC,size.cx,size.cy);
2338 SelectObject(dis->hDC,GetStockObject(BLACK_PEN));
2352 } /* AboutDlgProc */
2356 if( DialogBox( ghInst,"About", ghwnd_main, (DLGPROC)AboutDlgProc ) < 0)
2359 sprintf(Text,"In About(), GetLastError()=0x%08x",GetLastError());
2360 MessageBox(ghwnd_main,Text,"GenSurf",eMB_ICONWARNING);