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 ){
56 "................................",
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 "................................"
90 // leo: I'm too lazy to create a nice about box
91 // ^Fishman - I am lazy too :P.
92 g_FuncTable.m_pfnMessageBox( parent, "GtkGenSurf 1.05\n\n"
94 "David Hyde (rascal@vicksburg.com)\n\n"
96 "Leonardo Zide (leo@lokigames.com)\n\n"
98 "Pablo Zurita (pablo@qeradiant.com)\n"
99 "Hydra (hydra@hydras-world.com)",
100 "About GtkGenSurf", eMB_OK );
103 // =============================================================================
106 static void SetupControls(){
107 switch ( current_tab )
113 if ( Game != QUAKE3 ) {
114 gtk_widget_hide( GTK_WIDGET( g_object_get_data( G_OBJECT( g_pWnd ), "use_patches" ) ) );
115 ENABLE_WIDGET( "use_patches", FALSE );
119 gtk_widget_show( GTK_WIDGET( g_object_get_data( G_OBJECT( g_pWnd ), "use_patches" ) ) );
120 ENABLE_WIDGET( "use_patches", TRUE );
123 if ( Game == QUAKE3 && UsePatches != 0 ) {
124 ENABLE_WIDGET( "decimate", FALSE );
126 gtk_label_set_text( GTK_LABEL( g_object_get_data( G_OBJECT( g_pWnd ), "snap_text" ) ), "Snap to grid:" ); // ^Fishman - Snap to grid.
130 if ( WaveType != WAVE_BITMAP ) {
131 ENABLE_WIDGET( "bmp_file", FALSE );
132 ENABLE_WIDGET( "bmp_file_browse", FALSE );
133 ENABLE_WIDGET( "bmp_black", FALSE );
134 ENABLE_WIDGET( "bmp_white", FALSE );
135 ENABLE_WIDGET( "bmp_text1", FALSE );
136 ENABLE_WIDGET( "bmp_text2", FALSE );
137 ENABLE_WIDGET( "bmp_text3", FALSE );
138 ENABLE_WIDGET( "bmp_reload", FALSE );
139 gtk_label_set_text( GTK_LABEL( g_object_get_data( G_OBJECT( g_pWnd ), "bmp_note" ) ),
140 "These options are disabled unless \"From Bitmap\"\n"
141 "is selected as the Waveform on the General tab." );
145 ENABLE_WIDGET( "bmp_file", TRUE );
146 ENABLE_WIDGET( "bmp_file_browse", TRUE );
147 ENABLE_WIDGET( "bmp_black", TRUE );
148 ENABLE_WIDGET( "bmp_white", TRUE );
149 ENABLE_WIDGET( "bmp_text1", TRUE );
150 ENABLE_WIDGET( "bmp_text2", TRUE );
151 ENABLE_WIDGET( "bmp_text3", TRUE );
152 ENABLE_WIDGET( "bmp_reload", strlen( gbmp.name ) != 0 );
153 gtk_label_set_text( GTK_LABEL( g_object_get_data( G_OBJECT( g_pWnd ), "bmp_note" ) ),
154 "GenSurf works only with 8-bit bitmaps. Color indices are\n"
155 "mapped to values for each vertex. Generally, gray scale\n"
156 "images are stored with black as color 0, white as color 255." );
161 ENABLE_WIDGET( "fix_value", ( NumVerticesSelected != 0 ) );
162 ENABLE_WIDGET( "fix_value_text", ( NumVerticesSelected != 0 ) );
163 ENABLE_WIDGET( "fix_free", ( NumVerticesSelected != 0 ) );
164 ENABLE_WIDGET( "fix_range", ( ( NumVerticesSelected != 0 ) && ( WaveType != WAVE_ROUGH_ONLY ) ) );
165 ENABLE_WIDGET( "fix_range_text", ( ( NumVerticesSelected != 0 ) && ( WaveType != WAVE_ROUGH_ONLY ) ) );
166 ENABLE_WIDGET( "fix_rate", ( ( NumVerticesSelected != 0 ) && ( WaveType != WAVE_ROUGH_ONLY ) ) );
167 ENABLE_WIDGET( "fix_rate_text", ( ( NumVerticesSelected != 0 ) && ( WaveType != WAVE_ROUGH_ONLY ) ) );
171 ENABLE_WIDGET( "texture2", ( UsePatches == 0 ) );
172 ENABLE_WIDGET( "texture3", ( UsePatches == 0 ) );
173 ENABLE_WIDGET( "tex_slant", ( UsePatches == 0 ) );
174 ENABLE_WIDGET( "detail", ( UsePatches == 0 ) );
175 if ( Game != QUAKE3 ) {
176 ENABLE_WIDGET( "terrain_ent", FALSE ); // ^Fishman - Adds terrain key to func_group.
177 ENABLE_WIDGET( "hint", ( UsePatches == 0 ) );
186 ENABLE_WIDGET( "amplitude", TRUE );
187 ENABLE_WIDGET( "wavelength", TRUE );
188 ENABLE_WIDGET( "z00", TRUE );
189 ENABLE_WIDGET( "z01", TRUE );
190 ENABLE_WIDGET( "z10", TRUE );
191 ENABLE_WIDGET( "z11", TRUE );
192 ENABLE_WIDGET( "linearborder", TRUE );
193 ENABLE_WIDGET( "go", TRUE );
196 ENABLE_WIDGET( "amplitude", FALSE );
197 ENABLE_WIDGET( "wavelength", FALSE );
198 ENABLE_WIDGET( "z00", FALSE );
199 ENABLE_WIDGET( "z01", FALSE );
200 ENABLE_WIDGET( "z10", FALSE );
201 ENABLE_WIDGET( "z11", FALSE );
202 ENABLE_WIDGET( "linearborder", FALSE );
203 ENABLE_WIDGET( "go", ( gbmp.colors != NULL ? TRUE : FALSE ) );
205 case WAVE_ROUGH_ONLY:
206 ENABLE_WIDGET( "amplitude", FALSE );
207 ENABLE_WIDGET( "wavelength", FALSE );
208 ENABLE_WIDGET( "z00", TRUE );
209 ENABLE_WIDGET( "z01", TRUE );
210 ENABLE_WIDGET( "z10", TRUE );
211 ENABLE_WIDGET( "z11", TRUE );
212 ENABLE_WIDGET( "linearborder", TRUE );
213 ENABLE_WIDGET( "go", TRUE );
216 ENABLE_WIDGET( "amplitude", TRUE );
217 ENABLE_WIDGET( "wavelength", TRUE );
218 ENABLE_WIDGET( "z00", TRUE );
219 ENABLE_WIDGET( "z01", TRUE );
220 ENABLE_WIDGET( "z10", TRUE );
221 ENABLE_WIDGET( "z11", TRUE );
222 ENABLE_WIDGET( "linearborder", TRUE );
223 ENABLE_WIDGET( "go", TRUE );
230 gtk_label_set_text( GTK_LABEL( g_object_get_data( G_OBJECT( g_pWnd ), "hmin_text" ) ), "X:" );
231 gtk_label_set_text( GTK_LABEL( g_object_get_data( G_OBJECT( g_pWnd ), "hmax_text" ) ), "X:" );
232 gtk_label_set_text( GTK_LABEL( g_object_get_data( G_OBJECT( g_pWnd ), "vmin_text" ) ), "Z:" );
233 gtk_label_set_text( GTK_LABEL( g_object_get_data( G_OBJECT( g_pWnd ), "vmax_text" ) ), "Z:" );
234 gtk_label_set_text( GTK_LABEL( g_object_get_data( G_OBJECT( g_pWnd ), "nh_text" ) ), "X:" );
235 gtk_label_set_text( GTK_LABEL( g_object_get_data( G_OBJECT( g_pWnd ), "nv_text" ) ), "Z:" );
239 gtk_label_set_text( GTK_LABEL( g_object_get_data( G_OBJECT( g_pWnd ), "hmin_text" ) ), "Y:" );
240 gtk_label_set_text( GTK_LABEL( g_object_get_data( G_OBJECT( g_pWnd ), "hmax_text" ) ), "Y:" );
241 gtk_label_set_text( GTK_LABEL( g_object_get_data( G_OBJECT( g_pWnd ), "vmin_text" ) ), "Z:" );
242 gtk_label_set_text( GTK_LABEL( g_object_get_data( G_OBJECT( g_pWnd ), "vmax_text" ) ), "Z:" );
243 gtk_label_set_text( GTK_LABEL( g_object_get_data( G_OBJECT( g_pWnd ), "nh_text" ) ), "Y:" );
244 gtk_label_set_text( GTK_LABEL( g_object_get_data( G_OBJECT( g_pWnd ), "nv_text" ) ), "Z:" );
247 gtk_label_set_text( GTK_LABEL( g_object_get_data( G_OBJECT( g_pWnd ), "hmin_text" ) ), "X:" );
248 gtk_label_set_text( GTK_LABEL( g_object_get_data( G_OBJECT( g_pWnd ), "hmax_text" ) ), "X:" );
249 gtk_label_set_text( GTK_LABEL( g_object_get_data( G_OBJECT( g_pWnd ), "vmin_text" ) ), "Y:" );
250 gtk_label_set_text( GTK_LABEL( g_object_get_data( G_OBJECT( g_pWnd ), "vmax_text" ) ), "Y:" );
251 gtk_label_set_text( GTK_LABEL( g_object_get_data( G_OBJECT( g_pWnd ), "nh_text" ) ), "X:" );
252 gtk_label_set_text( GTK_LABEL( g_object_get_data( G_OBJECT( g_pWnd ), "nv_text" ) ), "Y:" );
257 // SetDlgValues fills in text boxes and initializes other input controls
258 static void SetDlgValues( int tab ){
260 char RForm[16] = "%.5g";
266 // Hell if I know why, but in the release build the 2nd pass thru the
267 // set_sensitive loop for game_radios crashes. No need to do this more
269 if ( !FirstPassComplete ) {
270 for ( i = 0; i < NUMGAMES; i++ )
271 gtk_widget_set_sensitive( game_radios[i], ( i == Game ? TRUE : FALSE ) );
272 for ( i = 0; i < 6; i++ )
273 gtk_widget_set_sensitive( plane_radios[i], ( i == Plane ? TRUE : FALSE ) );
275 gtk_toggle_button_set_active( GTK_TOGGLE_BUTTON( game_radios[Game] ), TRUE );
276 gtk_toggle_button_set_active( GTK_TOGGLE_BUTTON( plane_radios[Plane] ), TRUE );
277 gtk_toggle_button_set_active( GTK_TOGGLE_BUTTON( wave_radios[WaveType] ), TRUE );
278 gtk_spin_button_set_value( GTK_SPIN_BUTTON( g_object_get_data( G_OBJECT( g_pWnd ), "random" ) ),
280 sprintf( Text, RForm, WaveLength );
281 gtk_entry_set_text( GTK_ENTRY( g_object_get_data( G_OBJECT( g_pWnd ), "wavelength" ) ), Text );
282 sprintf( Text, RForm, Amplitude );
283 gtk_entry_set_text( GTK_ENTRY( g_object_get_data( G_OBJECT( g_pWnd ), "amplitude" ) ), Text );
284 sprintf( Text, RForm, Roughness );
285 gtk_entry_set_text( GTK_ENTRY( g_object_get_data( G_OBJECT( g_pWnd ), "roughness" ) ), Text );
286 gtk_toggle_button_set_active( GTK_TOGGLE_BUTTON( g_object_get_data
287 ( G_OBJECT( g_pWnd ), "main_antialiasing" ) ), Antialiasing );
291 sprintf( Text,RForm,Hll );
292 gtk_entry_set_text( GTK_ENTRY( g_object_get_data( G_OBJECT( g_pWnd ), "hmin" ) ), Text );
293 sprintf( Text,RForm,Vll );
294 gtk_entry_set_text( GTK_ENTRY( g_object_get_data( G_OBJECT( g_pWnd ), "vmin" ) ), Text );
295 sprintf( Text,RForm,Hur );
296 gtk_entry_set_text( GTK_ENTRY( g_object_get_data( G_OBJECT( g_pWnd ), "hmax" ) ), Text );
297 sprintf( Text,RForm,Vur );
298 gtk_entry_set_text( GTK_ENTRY( g_object_get_data( G_OBJECT( g_pWnd ), "vmax" ) ), Text );
299 sprintf( Text,RForm,Z00 );
300 gtk_entry_set_text( GTK_ENTRY( g_object_get_data( G_OBJECT( g_pWnd ), "z00" ) ), Text );
301 sprintf( Text,RForm,Z01 );
302 gtk_entry_set_text( GTK_ENTRY( g_object_get_data( G_OBJECT( g_pWnd ), "z01" ) ), Text );
303 sprintf( Text,RForm,Z10 );
304 gtk_entry_set_text( GTK_ENTRY( g_object_get_data( G_OBJECT( g_pWnd ), "z10" ) ), Text );
305 sprintf( Text,RForm,Z11 );
306 gtk_entry_set_text( GTK_ENTRY( g_object_get_data( G_OBJECT( g_pWnd ), "z11" ) ), Text );
307 gtk_spin_button_set_value( GTK_SPIN_BUTTON( g_object_get_data( G_OBJECT( g_pWnd ), "nh" ) ), NH );
308 gtk_spin_button_set_value( GTK_SPIN_BUTTON( g_object_get_data( G_OBJECT( g_pWnd ), "nv" ) ), NV );
309 gtk_spin_button_set_value( GTK_SPIN_BUTTON( g_object_get_data( G_OBJECT( g_pWnd ), "sp" ) ), SP ); // ^Fishman - Snap to grid.
311 gtk_toggle_button_set_active( GTK_TOGGLE_BUTTON( g_object_get_data
312 ( G_OBJECT( g_pWnd ), "linearborder" ) ), FixBorders );
313 gtk_toggle_button_set_active( GTK_TOGGLE_BUTTON( g_object_get_data
314 ( G_OBJECT( g_pWnd ), "use_patches" ) ), UsePatches );
315 gtk_adjustment_set_value( GTK_ADJUSTMENT( g_object_get_data( G_OBJECT( g_pWnd ), "decimate_adj" ) ),
318 if ( Game == QUAKE3 && UsePatches ) {
319 gtk_widget_set_sensitive( GTK_WIDGET( g_object_get_data( G_OBJECT( g_pWnd ), "decimate" ) ), FALSE );
323 if ( NH > MAX_ROWS ) {
326 SetDlgValues( current_tab );
331 if ( NV > MAX_ROWS ) {
334 SetDlgValues( current_tab );
342 if ( NH > MAX_ROWS ) {
351 if ( NV > MAX_ROWS ) {
355 gpointer spin = g_object_get_data( G_OBJECT( g_pWnd ), "nh" );
356 GtkAdjustment *adj = gtk_spin_button_get_adjustment( GTK_SPIN_BUTTON( spin ) );
358 gtk_adjustment_changed( adj );
359 spin = g_object_get_data( G_OBJECT( g_pWnd ), "nv" );
360 adj = gtk_spin_button_get_adjustment( GTK_SPIN_BUTTON( spin ) );
362 gtk_adjustment_changed( adj );
366 gtk_widget_set_sensitive( GTK_WIDGET( g_object_get_data( G_OBJECT( g_pWnd ), "decimate" ) ), TRUE );
368 gpointer spin = g_object_get_data( G_OBJECT( g_pWnd ), "nh" );
369 GtkAdjustment *adj = gtk_spin_button_get_adjustment( GTK_SPIN_BUTTON( spin ) );
371 gtk_adjustment_changed( adj );
372 spin = g_object_get_data( G_OBJECT( g_pWnd ), "nv" );
373 adj = gtk_spin_button_get_adjustment( GTK_SPIN_BUTTON( spin ) );
375 gtk_adjustment_changed( adj );
378 gtk_spin_button_set_value( GTK_SPIN_BUTTON( g_object_get_data( G_OBJECT( g_pWnd ), "nh" ) ), NH );
379 gtk_spin_button_set_value( GTK_SPIN_BUTTON( g_object_get_data( G_OBJECT( g_pWnd ), "nv" ) ), NV );
384 gtk_entry_set_text( GTK_ENTRY( g_object_get_data( G_OBJECT( g_pWnd ), "bmp_file" ) ), gbmp.name );
385 sprintf( Text,"%g",gbmp.black_value );
386 gtk_entry_set_text( GTK_ENTRY( g_object_get_data( G_OBJECT( g_pWnd ), "bmp_black" ) ), Text );
387 sprintf( Text,"%g",gbmp.white_value );
388 gtk_entry_set_text( GTK_ENTRY( g_object_get_data( G_OBJECT( g_pWnd ), "bmp_white" ) ), Text );
395 gtk_entry_set_text( GTK_ENTRY( g_object_get_data( G_OBJECT( g_pWnd ), "texture1" ) ), Texture[Game][0] );
396 gtk_entry_set_text( GTK_ENTRY( g_object_get_data( G_OBJECT( g_pWnd ), "texture2" ) ), Texture[Game][1] );
397 gtk_entry_set_text( GTK_ENTRY( g_object_get_data( G_OBJECT( g_pWnd ), "texture3" ) ), Texture[Game][2] );
398 gtk_spin_button_set_value( GTK_SPIN_BUTTON( g_object_get_data( G_OBJECT( g_pWnd ), "tex_slant" ) ),
400 sprintf( Text,RForm,TexOffset[0] );
401 gtk_entry_set_text( GTK_ENTRY( g_object_get_data( G_OBJECT( g_pWnd ), "texoffsetx" ) ), Text );
402 sprintf( Text,RForm,TexOffset[1] );
403 gtk_entry_set_text( GTK_ENTRY( g_object_get_data( G_OBJECT( g_pWnd ), "texoffsety" ) ), Text );
404 sprintf( Text,RForm,TexScale[0] );
405 gtk_entry_set_text( GTK_ENTRY( g_object_get_data( G_OBJECT( g_pWnd ), "texscalex" ) ), Text );
406 sprintf( Text,RForm,TexScale[1] );
407 gtk_entry_set_text( GTK_ENTRY( g_object_get_data( G_OBJECT( g_pWnd ), "texscaley" ) ), Text );
408 CHECK_WIDGET( "detail", UseDetail );
410 if ( Game == QUAKE3 ) {
411 ENABLE_WIDGET( "hint", FALSE );
415 ENABLE_WIDGET( "hint", TRUE );
417 CHECK_WIDGET( "hint", AddHints );
422 // ArghRad doesn't currently support SiN
423 EnableWindow(GetDlgItem(hwndDisplay,DLG_ARGHRAD2), 0);
424 EnableWindow(GetDlgItem(hwndDisplay,DLG_ARGHRAD2_SPIN), 0);
425 ShowWindow(GetDlgItem(hwndDisplay,DLG_ARGHRAD2_TEXT), SW_HIDE);
426 ShowWindow(GetDlgItem(hwndDisplay,DLG_ARGHRAD2), SW_HIDE);
427 ShowWindow(GetDlgItem(hwndDisplay,DLG_ARGHRAD2_SPIN), SW_HIDE);
428 SetDlgItemText(hwndDisplay,DLG_TEX_USEPAK,"Use sin file");
429 SetDlgItemText(hwndDisplay,DLG_TEX_PAK_TEXT,"Sin:");
433 if ( Game == QUAKE3 ) {
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 ){
512 Roughness = atof( gtk_entry_get_text( GTK_ENTRY( g_object_get_data( G_OBJECT( g_pWnd ), "roughness" ) ) ) );
513 WaveLength = atof( gtk_entry_get_text( GTK_ENTRY( g_object_get_data( G_OBJECT( g_pWnd ), "wavelength" ) ) ) );
514 Amplitude = atof( gtk_entry_get_text( GTK_ENTRY( g_object_get_data( G_OBJECT( g_pWnd ), "amplitude" ) ) ) );
515 spin = g_object_get_data( G_OBJECT( g_pWnd ), "random" );
516 RandomSeed = gtk_spin_button_get_value_as_int( GTK_SPIN_BUTTON( spin ) );
520 SP = atoi( gtk_entry_get_text( GTK_ENTRY( g_object_get_data( G_OBJECT( g_pWnd ), "sp" ) ) ) );
521 NH = atoi( gtk_entry_get_text( GTK_ENTRY( g_object_get_data( G_OBJECT( g_pWnd ), "nh" ) ) ) );
522 NV = atoi( gtk_entry_get_text( GTK_ENTRY( g_object_get_data( G_OBJECT( g_pWnd ), "nv" ) ) ) );
524 if ( Game == QUAKE3 && UsePatches != 0 ) {
531 if ( NH > MAX_ROWS ) {
540 if ( NV > MAX_ROWS ) {
548 // =============================================================================
549 // main dialog callbacks
551 static void switch_page( GtkNotebook *notebook, GtkNotebookPage *page, guint page_num, gpointer data ){
552 if ( current_tab != page_num ) {
553 if ( page_num == FIXPOINTS_TAB ) {
554 OldPreview = Preview;
555 gtk_toggle_button_set_active( GTK_TOGGLE_BUTTON( g_object_get_data( G_OBJECT( g_pWnd ),
556 "main_preview" ) ), TRUE );
558 UpdatePreview( true );
559 NumVerticesSelected = 0;
562 if ( current_tab == FIXPOINTS_TAB ) {
564 gtk_toggle_button_set_active( GTK_TOGGLE_BUTTON( g_object_get_data( G_OBJECT( g_pWnd ),
565 "main_preview" ) ), FALSE );
568 UpdatePreview( true );
569 NumVerticesSelected = 0;
572 if ( page_num == TEXTURE_TAB ) {
573 WasDetail = UseDetail;
576 ENABLE_WIDGET( "detail", FALSE );
580 ReadDlgValues( current_tab );
581 current_tab = page_num;
582 SetDlgValues( current_tab );
586 static gint main_close( GtkWidget *widget, gpointer data ){
587 gtk_widget_hide( g_pWnd );
588 gtk_widget_hide( g_pWndPreview );
593 static void main_save( GtkWidget *widget, gpointer data ){
594 ReadDlgValues( current_tab );
598 static void main_open( GtkWidget *widget, gpointer data ){
599 OpenSetup( g_pWnd, 0 );
600 for ( int i = 0; i < 5; i++ )
605 static void main_defaults( GtkWidget *widget, gpointer data ){
606 OpenSetup( g_pWnd, 1 );
607 for ( int i = 0; i < 5; i++ )
612 static void main_preview( GtkWidget *widget, gpointer data ){
613 Preview = gtk_toggle_button_get_active( GTK_TOGGLE_BUTTON( widget ) );
617 // ^Fishman - Antializing for the preview window.
618 static void main_antialiasing( GtkWidget *widget, gpointer data ){
619 Antialiasing = gtk_toggle_button_get_active( GTK_TOGGLE_BUTTON( widget ) );
620 UpdatePreview( true );
623 static void main_about( GtkWidget *widget, gpointer data ){
627 static void main_go( GtkWidget *widget, gpointer data ){
628 GtkWidget *notebook = GTK_WIDGET( g_object_get_data( G_OBJECT( g_pWnd ), "notebook" ) );
631 ReadDlgValues( current_tab );
632 if ( NH < 1 || NH > MAX_ROWS ) {
633 sprintf( Text, "The number of divisions must be > 0 and no greater than %d.", MAX_ROWS );
634 g_FuncTable.m_pfnMessageBox( g_pWnd, Text, "GenSurf", eMB_OK, eMB_ICONWARNING );
635 gtk_notebook_set_page( GTK_NOTEBOOK( notebook ), EXTENTS_TAB );
639 if ( NV < 1 || NV > MAX_ROWS ) {
640 sprintf( Text, "The number of divisions must be > 0 and no greater than %d.", MAX_ROWS );
641 g_FuncTable.m_pfnMessageBox( g_pWnd, Text, "GenSurf", eMB_OK, eMB_ICONWARNING );
642 gtk_notebook_set_page( GTK_NOTEBOOK( notebook ), EXTENTS_TAB );
647 g_FuncTable.m_pfnMessageBox( g_pWnd, "The \"lower-left\" values must be less than "
648 "the corresponding \"upper-right\" values in "
649 "the \"Extent\" box.","GenSurf", eMB_OK, eMB_ICONWARNING );
650 gtk_notebook_set_page( GTK_NOTEBOOK( notebook ), EXTENTS_TAB );
655 g_FuncTable.m_pfnMessageBox( g_pWnd,"The \"lower-left\" values must be less than "
656 "the corresponding \"upper-right\" values in "
657 "the \"Extent\" box.","GenSurf", eMB_OK, eMB_ICONWARNING );
658 gtk_notebook_set_page( GTK_NOTEBOOK( notebook ), EXTENTS_TAB );
662 if ( !strlen( Texture[Game][0] ) ) {
663 g_FuncTable.m_pfnMessageBox( g_pWnd, "You must supply a texture name.", "GenSurf", eMB_OK, eMB_ICONWARNING );
664 gtk_notebook_set_page( GTK_NOTEBOOK( notebook ), EXTENTS_TAB );
668 /* if (Decimate>0 && GimpHints!=0)
670 MessageBox(hwnd,"You've elected to use a decimated grid and gimp's non-detail hint brushes. "
671 "This combination usually produces bizarre visual errors in the game, "
672 "so GenSurf has turned off the hint brush option.",
673 "GenSurf",eMB_ICONWARNING);
677 gtk_widget_hide( g_pWnd );
678 if ( g_pWndPreview ) {
679 gtk_widget_hide( g_pWndPreview );
683 WriteIniFile( gszIni );
686 // =============================================================================
687 // general tab callbacks
689 static void general_game( GtkToggleButton *widget, gpointer data ){
690 if ( gtk_toggle_button_get_active( widget ) ) {
691 Game = GPOINTER_TO_INT( data );
692 UpdatePreview( TRUE );
696 static void general_plane( GtkToggleButton *widget, gpointer data ){
697 if ( gtk_toggle_button_get_active( widget ) ) {
698 Plane = GPOINTER_TO_INT( data );
700 UpdatePreview( TRUE );
704 static void general_wave( GtkToggleButton *widget, gpointer data ){
705 if ( gtk_toggle_button_get_active( widget ) ) {
706 WaveType = GPOINTER_TO_INT( data );
708 UpdatePreview( TRUE );
712 static void general_random( GtkAdjustment *adj, gpointer data ){
713 int nPos = (int)adj->value;
715 if ( RandomSeed != nPos ) {
717 UpdatePreview( true );
721 // =============================================================================
722 // extents tab callbacks
724 static void extents_linearborder( GtkToggleButton *check, gpointer data ){
725 FixBorders = gtk_toggle_button_get_active( check );
726 UpdatePreview( true );
729 static void extents_use_patches( GtkToggleButton *check, gpointer data ){
730 if ( Game != QUAKE3 ) {
734 UsePatches = gtk_toggle_button_get_active( check );
735 SetDlgValues( current_tab );
737 UpdatePreview( true );
740 static void extents_nhnv_spin( GtkAdjustment *adj, int *data ){
741 int nPos = (int)adj->value;
743 if ( *data != nPos ) {
744 if ( Game == QUAKE3 && UsePatches && ( nPos % 2 ) ) {
745 if ( *data < nPos ) {
751 gtk_adjustment_set_value( adj, *data );
756 UpdatePreview( true );
760 static void extents_decimate( GtkAdjustment *adj, gpointer data ){
761 int nPos = (int)adj->value;
764 UpdatePreview( true );
767 // Hydra : snap to grid begin
768 /*static void extents_snaptogrid (GtkAdjustment *adj, gpointer data)
770 int nPos = (int)adj->value;
773 UpdatePreview (true);
776 // ^Fishman - Modified version of Hydra's snap to grid code.
777 static void extents_snaptogrid_spin( GtkAdjustment *adj, int *data ){
778 int nPos = (int)adj->value;
780 UpdatePreview( true );
783 // =============================================================================
784 // bitmap tab callbacks
786 static gint bitmap_file_entryfocusout( GtkWidget* widget, GdkEventFocus* event, gpointer data ){
787 char filename[NAME_MAX];
789 strcpy( filename, gtk_entry_get_text( GTK_ENTRY( widget ) ) );
790 if ( strcmp( filename,gbmp.name ) ) {
791 strcpy( gbmp.name,filename );
792 if ( strlen( gbmp.name ) ) {
795 ENABLE_WIDGET( "go", ( gbmp.colors != NULL ? TRUE : FALSE ) );
800 static void bitmap_browse( GtkWidget *widget, gpointer data ){
801 const char *filename;
804 filename = g_FuncTable.m_pfnFileDialog( g_pWnd, TRUE, "Bitmap File", gbmp.defpath );
806 if ( filename != NULL ) {
807 strcpy( gbmp.name, filename );
809 ptr = strrchr( filename, G_DIR_SEPARATOR );
812 strcpy( gbmp.defpath, filename );
816 ENABLE_WIDGET( "go", ( gbmp.colors != NULL ? TRUE : FALSE ) );
820 static void bitmap_reload( GtkWidget *widget, gpointer data ){
821 strcpy( gbmp.name, gtk_entry_get_text( GTK_ENTRY( g_object_get_data( G_OBJECT( g_pWnd ), "bmp_file" ) ) ) );
822 if ( strlen( gbmp.name ) ) {
824 ENABLE_WIDGET( "go", ( gbmp.colors != NULL ? TRUE : FALSE ) );
827 ENABLE_WIDGET( "go", FALSE );
831 // =============================================================================
832 // fix points tab callbacks
834 static gint fix_value_entryfocusout( GtkWidget* widget, GdkEventFocus *event, gpointer data ){
835 int i = atoi( gtk_entry_get_text( GTK_ENTRY( widget ) ) ), k;
838 if ( i < -65536 || i > 65536 ) {
840 g_FuncTable.m_pfnMessageBox( g_pWnd, "The value must be between -65536 and 65536, inclusive.",
841 "GenSurf", eMB_OK, eMB_ICONWARNING );
842 sprintf( Text, "%d", (int)xyz[Vertex[0].i][Vertex[0].j].fixed_value );
843 gtk_entry_set_text( GTK_ENTRY( widget ), Text );
844 gtk_window_set_focus( GTK_WINDOW( gtk_widget_get_toplevel( widget ) ), widget );
846 else if ( i != xyz[Vertex[0].i][Vertex[0].j].fixed_value ) {
847 for ( k = 0; k < NumVerticesSelected; k++ )
848 xyz[Vertex[k].i][Vertex[k].j].fixed_value = i;
850 gtk_spin_button_set_value( GTK_SPIN_BUTTON( g_object_get_data( G_OBJECT( g_pWnd ), "fix_value" ) ),
851 (int)xyz[Vertex[0].i][Vertex[0].j].fixed_value );
852 UpdatePreview( true );
857 static void fix_value_changed( GtkAdjustment *adj, gpointer data ){
858 int k, i = (int)adj->value;
860 if ( xyz[Vertex[0].i][Vertex[0].j].fixed_value != i ) {
861 for ( k = 0; k < NumVerticesSelected; k++ )
862 xyz[Vertex[k].i][Vertex[k].j].fixed_value = i;
863 UpdatePreview( true );
867 static gint fix_range_entryfocusout( GtkWidget *widget, GdkEventFocus *event, gpointer data ){
868 int i = atoi( gtk_entry_get_text( GTK_ENTRY( widget ) ) ), k;
870 if ( i != xyz[Vertex[0].i][Vertex[0].j].range ) {
871 for ( k = 0; k < NumVerticesSelected; k++ )
872 xyz[Vertex[k].i][Vertex[k].j].range = i;
873 UpdatePreview( true );
878 static gint fix_rate_entryfocusout( GtkWidget *widget, GdkEventFocus *event, gpointer data ){
879 double r = atof( gtk_entry_get_text( GTK_ENTRY( widget ) ) );
882 if ( r != xyz[Vertex[0].i][Vertex[0].j].rate ) {
883 for ( k = 0; k < NumVerticesSelected; k++ )
884 xyz[Vertex[k].i][Vertex[k].j].rate = r;
885 UpdatePreview( true );
890 static void fix_free( GtkWidget *widget, gpointer data ){
893 for ( k = 0; k < NumVerticesSelected; k++ )
894 xyz[Vertex[k].i][Vertex[k].j].fixed = 0;
895 NumVerticesSelected = 0;
897 UpdatePreview( true );
900 static void fix_freeall( GtkWidget *widget, gpointer data ){
903 for ( i = 0; i <= NH; i++ )
905 for ( j = 0; j <= NV; j++ )
908 fix_free( NULL, data ); // keep these together
911 void vertex_selected(){
921 for ( k = 0; k < NumVerticesSelected; k++ )
922 xyz[Vertex[k].i][Vertex[k].j].fixed_value = xyz[Vertex[0].i][Vertex[0].j].p[1];
926 for ( k = 0; k < NumVerticesSelected; k++ )
927 xyz[Vertex[k].i][Vertex[k].j].fixed_value = xyz[Vertex[0].i][Vertex[0].j].p[0];
930 for ( k = 0; k < NumVerticesSelected; k++ )
931 xyz[Vertex[k].i][Vertex[k].j].fixed_value = xyz[Vertex[0].i][Vertex[0].j].p[2];
935 gtk_spin_button_set_value( GTK_SPIN_BUTTON( g_object_get_data( G_OBJECT( g_pWnd ), "fix_value" ) ),
936 (int)xyz[Vertex[0].i][Vertex[0].j].fixed_value );
938 sprintf( Text,"%d",(int)xyz[Vertex[0].i][Vertex[0].j].range );
939 gtk_entry_set_text( GTK_ENTRY( g_object_get_data( G_OBJECT( g_pWnd ), "fix_range" ) ), Text );
940 sprintf( Text,"%.5g",xyz[Vertex[0].i][Vertex[0].j].rate );
941 gtk_entry_set_text( GTK_ENTRY( g_object_get_data( G_OBJECT( g_pWnd ), "fix_rate" ) ), Text );
943 for ( k = 0; k < NumVerticesSelected; k++ )
944 xyz[Vertex[k].i][Vertex[k].j].fixed = 1;
946 UpdatePreview( true );
949 // =============================================================================
950 // texture tab callbacks
952 static void texture_detail( GtkToggleButton *check, gpointer data ){
953 UseDetail = gtk_toggle_button_get_active( check );
954 WasDetail = UseDetail;
957 static void texture_hint( GtkToggleButton *check, gpointer data ){
958 AddHints = gtk_toggle_button_get_active( check );
959 if ( AddHints == 1 ) {
961 ENABLE_WIDGET( "detail", FALSE );
965 UseDetail = WasDetail;
966 ENABLE_WIDGET( "detail", FALSE );
968 CHECK_WIDGET( "detail", UseDetail );
971 // ^Fishman - Add terrain key to func_group.
972 static void texture_terrainent( GtkToggleButton *check, gpointer data ){
973 AddTerrainKey = gtk_toggle_button_get_active( check );
976 static void texture_set( int index, const char* name ){
977 strcpy( Texture[Game][index], name );
980 static gint texture_entryfocusout( GtkWidget* widget, GdkEventFocus* event, gpointer data ){
981 texture_set( GPOINTER_TO_INT( data ), gtk_entry_get_text( GTK_ENTRY( widget ) ) );
985 // =============================================================================
988 static void UpdateVariable( GtkEntry *entry, GdkEventFocus *event, double *data ){
989 double x = atof( gtk_entry_get_text( entry ) );
993 UpdatePreview( true );
997 static gint doublevariable_entryfocusout( GtkWidget* widget, GdkEventFocus* event, gpointer data ){
998 UpdateVariable( GTK_ENTRY( widget ), event, reinterpret_cast<double*>( data ) );
1002 // =============================================================================
1005 void create_tooltips(){
1006 tooltips = gtk_tooltips_new();
1009 gtk_tooltips_set_tip( GTK_TOOLTIPS( tooltips ),
1010 GTK_WIDGET( g_object_get_data( G_OBJECT( g_pWnd ), "go" ) ),
1011 "Accept all input and generate a surface in Q3Radiant",
1013 gtk_tooltips_set_tip( GTK_TOOLTIPS( tooltips ),
1014 GTK_WIDGET( g_object_get_data( G_OBJECT( g_pWnd ), "open" ) ),
1015 "Open a previously saved GenSurf settings file.",
1017 gtk_tooltips_set_tip( GTK_TOOLTIPS( tooltips ),
1018 GTK_WIDGET( g_object_get_data( G_OBJECT( g_pWnd ), "save" ) ),
1019 "Save all settings to a file.",
1021 gtk_tooltips_set_tip( GTK_TOOLTIPS( tooltips ),
1022 GTK_WIDGET( g_object_get_data( G_OBJECT( g_pWnd ), "defaults" ) ),
1023 "Restore default values from DEFAULTS.SRF. If this file does not exist, GenSurf "
1024 "initializes all input parameters to reasonable values. You can create your own "
1025 "default surface by setting all parameters to your liking, then saving a settings "
1026 "file as DEFAULTS.SRF with the Save As button.",
1029 gtk_tooltips_set_tip( GTK_TOOLTIPS( tooltips ),
1030 GTK_WIDGET( g_object_get_data( G_OBJECT( g_pWnd ), "main_preview" ) ),
1031 "View a wire-frame representation of the surface",
1034 gtk_tooltips_set_tip( GTK_TOOLTIPS( tooltips ),
1035 GTK_WIDGET( g_object_get_data( G_OBJECT( g_pWnd ), "main_antialiasing" ) ),
1036 "The lines in the preview window are antialiased for better quality",
1040 gtk_tooltips_set_tip( GTK_TOOLTIPS( tooltips ),
1041 GTK_WIDGET( wave_radios[0] ),
1042 "Builds a surface with alternating hills and valleys. Uses the general form Z=cos(X) "
1045 gtk_tooltips_set_tip( GTK_TOOLTIPS( tooltips ),
1046 GTK_WIDGET( wave_radios[1] ),
1047 "Builds a surface with ridges parallel to the vertical axis.",
1049 gtk_tooltips_set_tip( GTK_TOOLTIPS( tooltips ),
1050 GTK_WIDGET( wave_radios[2] ),
1051 "Builds a surface with ridges parallel to the horizontal axis.",
1053 gtk_tooltips_set_tip( GTK_TOOLTIPS( tooltips ),
1054 GTK_WIDGET( wave_radios[3] ),
1055 "Builds a map from a bitmap image representing a contour plot. Click the \"Bitmap\" "
1056 "tab to select the image. GenSurf only supports 256-color (8 bit) "
1057 "bitmaps. GenSurf will work with any 256-color bitmap, but gray scale bitmaps are a bit "
1060 gtk_tooltips_set_tip( GTK_TOOLTIPS( tooltips ),
1061 GTK_WIDGET( wave_radios[4] ),
1062 "Builds a random surface using the Plasma Cloud technique. Variance is controlled "
1063 "by the Roughness input. To build a surface with completely random values not "
1064 "dependent on neighboring vertices, use one of the other waveforms with 0 amplitude.",
1066 gtk_tooltips_set_tip( GTK_TOOLTIPS( tooltips ),
1067 GTK_WIDGET( g_object_get_data( G_OBJECT( g_pWnd ), "wavelength" ) ),
1068 "Enter the wavelength (distance between crests). NOTE: Wavelengths equal to the grid "
1069 "size or 2 times the grid size will result in 0 amplitudes. For best results, the "
1070 "wavelength value should be at least 4 times the grid size (extents divided by the "
1071 "number of divisions",
1073 gtk_tooltips_set_tip( GTK_TOOLTIPS( tooltips ),
1074 GTK_WIDGET( g_object_get_data( G_OBJECT( g_pWnd ), "amplitude" ) ),
1075 "Enter the height of hills/ridges.",
1077 gtk_tooltips_set_tip( GTK_TOOLTIPS( tooltips ),
1078 GTK_WIDGET( g_object_get_data( G_OBJECT( g_pWnd ), "roughness" ) ),
1079 "Enter the roughness value (noise) for the surface. For fractal surfaces, this value "
1080 "is used as a variance in the fractal calculations.",
1082 gtk_tooltips_set_tip( GTK_TOOLTIPS( tooltips ),
1083 GTK_WIDGET( g_object_get_data( G_OBJECT( g_pWnd ), "random" ) ),
1084 "Seed value for the pseudo-random number generator.",
1087 gtk_tooltips_set_tip( GTK_TOOLTIPS( tooltips ),
1088 GTK_WIDGET( g_object_get_data( G_OBJECT( g_pWnd ), "hmin" ) ),
1089 "Minimum horizontal coordinate of the surface, i.e. X for a surface parallel to "
1090 "the XY or XZ planes, Y for a surface parallel to the YZ plane. For best results, "
1091 "the extents (maximum-minimum values) in a given direction should be evenly "
1092 "divisible by the number of divisions in that direction.",
1094 gtk_tooltips_set_tip( GTK_TOOLTIPS( tooltips ),
1095 GTK_WIDGET( g_object_get_data( G_OBJECT( g_pWnd ), "hmax" ) ),
1096 "Maximum horizontal coordinate of the surface, i.e. X for a surface parallel to "
1097 "the XY or XZ planes, Y for a surface parallel to the YZ plane. For best results, "
1098 "the extents (maximum-minimum values) in a given direction should be evenly "
1099 "divisible by the number of divisions in that direction.",
1101 gtk_tooltips_set_tip( GTK_TOOLTIPS( tooltips ),
1102 GTK_WIDGET( g_object_get_data( G_OBJECT( g_pWnd ), "vmin" ) ),
1103 "Minimum vertical coordinate of the surface, i.e. Y for a surface parallel to "
1104 "the XY plane, Z for a surface parallel to the XZ or YZ planes. For best results, "
1105 "the extents (maximum-minimum values) in a given direction should be evenly "
1106 "divisible by the number of divisions in that direction.",
1108 gtk_tooltips_set_tip( GTK_TOOLTIPS( tooltips ),
1109 GTK_WIDGET( g_object_get_data( G_OBJECT( g_pWnd ), "vmax" ) ),
1110 "Maximum vertical coordinate of the surface, i.e. Y for a surface parallel to "
1111 "the XY plane, Z for a surface parallel to the XZ or YZ planes. For best results, "
1112 "the extents (maximum-minimum values) in a given direction should be evenly "
1113 "divisible by the number of divisions in that direction.",
1115 gtk_tooltips_set_tip( GTK_TOOLTIPS( tooltips ),
1116 GTK_WIDGET( g_object_get_data( G_OBJECT( g_pWnd ), "nh" ) ),
1117 "Number of divisions in the horizontal direction. For best results, the extents "
1118 "in a given direction should be evenly divisible by the number of divisions in "
1121 gtk_tooltips_set_tip( GTK_TOOLTIPS( tooltips ),
1122 GTK_WIDGET( g_object_get_data( G_OBJECT( g_pWnd ), "nv" ) ),
1123 "Number of divisions in the vertical direction. For best results, the extents "
1124 "in a given direction should be evenly divisible by the number of divisions in "
1127 gtk_tooltips_set_tip( GTK_TOOLTIPS( tooltips ),
1128 GTK_WIDGET( g_object_get_data( G_OBJECT( g_pWnd ), "use_patches" ) ),
1129 "Produce one or more curved patches in the shape of your selected surface rather "
1130 "than producing solid brushes. Depending on the size of your surface (and the "
1131 "user's graphic detail settings, which you cannot control), curved surfaces will "
1132 "be represented in the game by a very large number of polygons. Read the warnings "
1133 "concerning curved surfaces on the GenSurf web page before using this feature.",
1135 gtk_tooltips_set_tip( GTK_TOOLTIPS( tooltips ),
1136 GTK_WIDGET( g_object_get_data( G_OBJECT( g_pWnd ), "decimate" ) ),
1137 "Use the slider to control the number of vertices discarded by GenSurf. For many "
1138 "surfaces, you can produce roughly the same shape surface with a high decimation "
1139 "value. This will generally result in a map with lower polygon counts (and better "
1140 "in-game performance). However, this feature should NOT be used for large terrain "
1143 gtk_tooltips_set_tip( GTK_TOOLTIPS( tooltips ),
1144 GTK_WIDGET( g_object_get_data( G_OBJECT( g_pWnd ), "z00" ) ),
1145 "Enter the height of the surface at the lower left corner. This value will likely "
1146 "be modified unless \"Linear Borders\" is checked.",
1148 gtk_tooltips_set_tip( GTK_TOOLTIPS( tooltips ),
1149 GTK_WIDGET( g_object_get_data( G_OBJECT( g_pWnd ), "z01" ) ),
1150 "Enter the height of the surface at the upper left corner. This value will likely "
1151 "be modified unless \"Linear Borders\" is checked.",
1153 gtk_tooltips_set_tip( GTK_TOOLTIPS( tooltips ),
1154 GTK_WIDGET( g_object_get_data( G_OBJECT( g_pWnd ), "z10" ) ),
1155 "Enter the height of the surface at the lower right corner. This value will likely "
1156 "be modified unless \"Linear Borders\" is checked.",
1158 gtk_tooltips_set_tip( GTK_TOOLTIPS( tooltips ),
1159 GTK_WIDGET( g_object_get_data( G_OBJECT( g_pWnd ), "z11" ) ),
1160 "Enter the height of the surface at the upper right corner. This value will likely "
1161 "be modified unless \"Linear Borders\" is checked.",
1163 gtk_tooltips_set_tip( GTK_TOOLTIPS( tooltips ),
1164 GTK_WIDGET( g_object_get_data( G_OBJECT( g_pWnd ), "linearborder" ) ),
1165 "Restrict the edges of the surface to a straight line. This will help match up "
1166 "brush edges if you drop this surface into another map.",
1169 gtk_tooltips_set_tip( GTK_TOOLTIPS( tooltips ),
1170 GTK_WIDGET( g_object_get_data( G_OBJECT( g_pWnd ), "bmp_file" ) ),
1171 "Type the name of an 8-bit bitmap image file, or click Browse to select an image "
1172 "from a list of those available on your system.",
1174 gtk_tooltips_set_tip( GTK_TOOLTIPS( tooltips ),
1175 GTK_WIDGET( g_object_get_data( G_OBJECT( g_pWnd ), "bmp_file_browse" ) ),
1176 "Select a bitmap image file from a list of those available on your system.",
1178 gtk_tooltips_set_tip( GTK_TOOLTIPS( tooltips ),
1179 GTK_WIDGET( g_object_get_data( G_OBJECT( g_pWnd ), "bmp_reload" ) ),
1180 "Reload the selected bitmap file after making changes in an external image editor.",
1182 gtk_tooltips_set_tip( GTK_TOOLTIPS( tooltips ),
1183 GTK_WIDGET( g_object_get_data( G_OBJECT( g_pWnd ), "bmp_black" ) ),
1184 "Enter the value corresponding to color index 0 in the bitmap file. For gray scale "
1185 "images, color 0 is normally black.",
1187 gtk_tooltips_set_tip( GTK_TOOLTIPS( tooltips ),
1188 GTK_WIDGET( g_object_get_data( G_OBJECT( g_pWnd ), "bmp_white" ) ),
1189 "Enter the value corresponding to color index 255 in the bitmap file. For gray scale "
1190 "images, color 255 is normally white.",
1193 gtk_tooltips_set_tip( GTK_TOOLTIPS( tooltips ),
1194 GTK_WIDGET( g_object_get_data( G_OBJECT( g_pWnd ), "fix_value" ) ),
1195 "Enter a value for the selected vertex. This value will not be adjusted when applying "
1196 "a waveform or roughness to the surface. Unlock this vertex (so that it will be "
1197 "adjusted normally) by clicking \"Free\". This vertex will influence vertices within "
1198 "the \"Range affected\" of this vertex.",
1200 gtk_tooltips_set_tip( GTK_TOOLTIPS( tooltips ),
1201 GTK_WIDGET( g_object_get_data( G_OBJECT( g_pWnd ), "fix_range" ) ),
1202 "Enter the range away from the selected vertex that other vertices will be affected. "
1203 "Use 0 if you don't want other vertices to be influenced by the currently selected "
1204 "one. Note: this box is disabled if you've chosen the fractal generator, as it uses "
1205 "a completely different method for determining values.",
1207 gtk_tooltips_set_tip( GTK_TOOLTIPS( tooltips ),
1208 GTK_WIDGET( g_object_get_data( G_OBJECT( g_pWnd ), "fix_rate" ) ),
1209 "Enter a rate of change for the surface affected by the fixed value. 0 gives a smooth "
1210 "sinusoidal curve, values less than 0 give progressively sharper spikes, and values "
1211 "greater than 0 take on a square shape. Values less than -30 or greater than 30 are "
1212 "set to -30 and 30, respectively. Note that this entry will have no effect unless "
1213 "you also specify a \"range affected\".",
1215 gtk_tooltips_set_tip( GTK_TOOLTIPS( tooltips ),
1216 GTK_WIDGET( g_object_get_data( G_OBJECT( g_pWnd ), "fix_free" ) ),
1217 "Click this to free (unlock the value of) the currently selected vertex.",
1219 gtk_tooltips_set_tip( GTK_TOOLTIPS( tooltips ),
1220 GTK_WIDGET( g_object_get_data( G_OBJECT( g_pWnd ), "fix_freeall" ) ),
1221 "Click this to free (unlock the values of) all vertices.",
1224 gtk_tooltips_set_tip( GTK_TOOLTIPS( tooltips ),
1225 GTK_WIDGET( g_object_get_data( G_OBJECT( g_pWnd ), "texture1" ) ),
1226 "Enter the name of the texture or shader used for the surface faces.",
1228 gtk_tooltips_set_tip( GTK_TOOLTIPS( tooltips ),
1229 GTK_WIDGET( g_object_get_data( G_OBJECT( g_pWnd ), "texture2" ) ),
1230 "Enter the name of the texture or shader used for faces other than the surface. Under "
1231 "normal circumstances this should be \"common/caulk\"",
1233 gtk_tooltips_set_tip( GTK_TOOLTIPS( tooltips ),
1234 GTK_WIDGET( g_object_get_data( G_OBJECT( g_pWnd ), "texture3" ) ),
1235 "Enter the name of the texture or shader used for \"steep\" surface faces, where \"steep\" "
1236 "is the angle specified below. If this entry is left blank or if the \"steep\" angle is 0, "
1237 "all surface faces will use the texture specified by \"Surface\".",
1240 gtk_tooltips_set_tip( GTK_TOOLTIPS( tooltips ),
1241 GTK_WIDGET( g_object_get_data( G_OBJECT( g_pWnd ), "detail" ) ),
1242 "Check this box to use the detail content property on the generated brushes. Compile "
1243 "times will be considerably shorter if the detail property is used, though the surface "
1244 "will not block visibility at all. If you use the detail property, you should make sure "
1245 "that \"common/caulk\" is used for the non-surface faces, or the polygon count will be "
1246 "much higher than necessary.",
1250 // =============================================================================
1251 // create main dialog
1253 GtkWidget* create_main_dialog(){
1254 GtkWidget *dlg, *vbox, *hbox, *hbox2, *button, *notebook, *frame, *table, *table2;
1255 GtkWidget *check, *spin, *radio, *label, *entry, *scale;
1259 const char *games[] = { "Quake 2", "Half-Life", "SiN", "Heretic 2", "Kingpin", "Genesis3D", "Quake 3 Arena" };
1260 const char *waveforms[] = { "Alternating hill/valley", "Cylindrical left-to-right", "Cylindrical top-to-bottom",
1261 "From bitmap", "Fractal" };
1262 const char *orientations[] = { "Ground surface", "Ceiling", "Wall facing 0", "Wall facing 90",
1263 "Wall facing 180","Wall facing 270" };
1265 g_pWnd = dlg = gtk_window_new( GTK_WINDOW_TOPLEVEL );
1266 gtk_window_set_title( GTK_WINDOW( dlg ), gszCaption );
1267 g_signal_connect( G_OBJECT( dlg ), "delete_event", G_CALLBACK( main_close ), NULL );
1268 // g_signal_connect (G_OBJECT (dlg), "destroy", G_CALLBACK (gtk_widget_destroy), NULL);
1269 gtk_window_set_transient_for( GTK_WINDOW( dlg ), GTK_WINDOW( g_pRadiantWnd ) );
1271 hbox = gtk_hbox_new( FALSE, 5 );
1272 gtk_widget_show( hbox );
1273 gtk_container_add( GTK_CONTAINER( dlg ), hbox );
1274 gtk_container_set_border_width( GTK_CONTAINER( hbox ), 5 );
1276 notebook = gtk_notebook_new();
1277 gtk_widget_show( notebook );
1278 gtk_box_pack_start( GTK_BOX( hbox ), notebook, TRUE, TRUE, 0 );
1279 g_signal_connect( G_OBJECT( notebook ), "switch_page",
1280 G_CALLBACK( switch_page ), NULL );
1281 gtk_notebook_set_tab_pos( GTK_NOTEBOOK( notebook ), GTK_POS_TOP );
1282 g_object_set_data( G_OBJECT( dlg ), "notebook", notebook );
1284 table = gtk_table_new( 2, 2, FALSE );
1285 gtk_widget_show( table );
1286 gtk_container_set_border_width( GTK_CONTAINER( table ), 5 );
1287 gtk_table_set_row_spacings( GTK_TABLE( table ), 5 );
1288 gtk_table_set_col_spacings( GTK_TABLE( table ), 5 );
1290 label = gtk_label_new( "General" );
1291 gtk_widget_show( label );
1292 gtk_notebook_append_page( GTK_NOTEBOOK( notebook ), table, label );
1294 frame = gtk_frame_new( "Game" );
1295 gtk_widget_show( frame );
1296 gtk_table_attach( GTK_TABLE( table ), frame, 0, 1, 0, 1,
1297 (GtkAttachOptions) ( GTK_EXPAND | GTK_FILL ),
1298 (GtkAttachOptions) ( GTK_EXPAND | GTK_FILL ), 0, 0 );
1300 vbox = gtk_vbox_new( TRUE, 5 );
1301 gtk_widget_show( vbox );
1302 gtk_container_add( GTK_CONTAINER( frame ), vbox );
1303 gtk_container_set_border_width( GTK_CONTAINER( vbox ), 5 );
1305 for ( i = 0, group = NULL; i < NUMGAMES; i++ )
1307 radio = gtk_radio_button_new_with_label( group, games[i] );
1308 gtk_widget_show( radio );
1309 gtk_box_pack_start( GTK_BOX( vbox ), radio, TRUE, TRUE, 0 );
1310 group = gtk_radio_button_group( GTK_RADIO_BUTTON( radio ) );
1311 game_radios[i] = radio;
1312 g_signal_connect( G_OBJECT( radio ), "toggled", G_CALLBACK( general_game ), GINT_TO_POINTER( i ) );
1315 frame = gtk_frame_new( "Waveform" );
1316 gtk_widget_show( frame );
1317 gtk_table_attach( GTK_TABLE( table ), frame, 1, 2, 0, 1,
1318 (GtkAttachOptions) ( GTK_EXPAND | GTK_FILL ),
1319 (GtkAttachOptions) ( GTK_EXPAND | GTK_FILL ), 0, 0 );
1321 vbox = gtk_vbox_new( TRUE, 5 );
1322 gtk_widget_show( vbox );
1323 gtk_container_add( GTK_CONTAINER( frame ), vbox );
1324 gtk_container_set_border_width( GTK_CONTAINER( vbox ), 5 );
1326 for ( i = 0, group = NULL; i < 5; i++ )
1328 radio = gtk_radio_button_new_with_label( group, waveforms[i] );
1329 gtk_widget_show( radio );
1330 gtk_box_pack_start( GTK_BOX( vbox ), radio, TRUE, TRUE, 0 );
1331 group = gtk_radio_button_group( GTK_RADIO_BUTTON( radio ) );
1332 wave_radios[i] = radio;
1333 g_signal_connect( G_OBJECT( radio ), "toggled", G_CALLBACK( general_wave ), GINT_TO_POINTER( i ) );
1336 frame = gtk_frame_new( "Orientation" );
1337 gtk_widget_show( frame );
1338 gtk_table_attach( GTK_TABLE( table ), frame, 0, 1, 1, 2,
1339 (GtkAttachOptions) ( GTK_EXPAND | GTK_FILL ),
1340 (GtkAttachOptions) ( GTK_EXPAND | GTK_FILL ), 0, 0 );
1342 vbox = gtk_vbox_new( TRUE, 5 );
1343 gtk_widget_show( vbox );
1344 gtk_container_add( GTK_CONTAINER( frame ), vbox );
1345 gtk_container_set_border_width( GTK_CONTAINER( vbox ), 5 );
1347 for ( i = 0, group = NULL; i < 6; i++ )
1349 radio = gtk_radio_button_new_with_label( group, orientations[i] );
1350 gtk_widget_show( radio );
1351 gtk_box_pack_start( GTK_BOX( vbox ), radio, TRUE, TRUE, 0 );
1352 group = gtk_radio_button_group( GTK_RADIO_BUTTON( radio ) );
1353 plane_radios[i] = radio;
1354 g_signal_connect( G_OBJECT( radio ), "toggled", G_CALLBACK( general_plane ), GINT_TO_POINTER( i ) );
1357 table2 = gtk_table_new( 4, 2, FALSE );
1358 gtk_widget_show( table2 );
1359 gtk_table_set_row_spacings( GTK_TABLE( table2 ), 5 );
1360 gtk_table_set_col_spacings( GTK_TABLE( table2 ), 5 );
1361 gtk_table_attach( GTK_TABLE( table ), table2, 1, 2, 1, 2,
1362 (GtkAttachOptions) ( GTK_EXPAND | GTK_FILL ),
1363 (GtkAttachOptions) ( GTK_EXPAND | GTK_FILL ), 0, 0 );
1365 label = gtk_label_new( "Wavelength:" );
1366 gtk_widget_show( label );
1367 gtk_table_attach( GTK_TABLE( table2 ), label, 0, 1, 0, 1,
1368 (GtkAttachOptions) ( GTK_EXPAND | GTK_FILL ),
1369 (GtkAttachOptions) ( GTK_EXPAND | GTK_FILL ), 0, 0 );
1370 gtk_misc_set_alignment( GTK_MISC( label ), 1, 0.5 );
1371 gtk_label_set_justify( GTK_LABEL( label ), GTK_JUSTIFY_RIGHT );
1373 label = gtk_label_new( "Max. amplitude:" );
1374 gtk_widget_show( label );
1375 gtk_table_attach( GTK_TABLE( table2 ), label, 0, 1, 1, 2,
1376 (GtkAttachOptions) ( GTK_EXPAND | GTK_FILL ),
1377 (GtkAttachOptions) ( GTK_EXPAND | GTK_FILL ), 0, 0 );
1378 gtk_misc_set_alignment( GTK_MISC( label ), 1, 0.5 );
1379 gtk_label_set_justify( GTK_LABEL( label ), GTK_JUSTIFY_RIGHT );
1381 label = gtk_label_new( "Roughness:" );
1382 gtk_widget_show( label );
1383 gtk_table_attach( GTK_TABLE( table2 ), label, 0, 1, 2, 3,
1384 (GtkAttachOptions) ( GTK_EXPAND | GTK_FILL ),
1385 (GtkAttachOptions) ( GTK_EXPAND | GTK_FILL ), 0, 0 );
1386 gtk_misc_set_alignment( GTK_MISC( label ), 1, 0.5 );
1387 gtk_label_set_justify( GTK_LABEL( label ), GTK_JUSTIFY_RIGHT );
1389 label = gtk_label_new( "Random seed:" );
1390 gtk_widget_show( label );
1391 gtk_table_attach( GTK_TABLE( table2 ), label, 0, 1, 3, 4,
1392 (GtkAttachOptions) ( GTK_EXPAND | GTK_FILL ),
1393 (GtkAttachOptions) ( GTK_EXPAND | GTK_FILL ), 0, 0 );
1394 gtk_misc_set_alignment( GTK_MISC( label ), 1, 0.5 );
1395 gtk_label_set_justify( GTK_LABEL( label ), GTK_JUSTIFY_RIGHT );
1397 entry = gtk_entry_new();
1398 gtk_widget_show( entry );
1399 gtk_table_attach( GTK_TABLE( table2 ), entry, 1, 2, 0, 1,
1400 (GtkAttachOptions) ( GTK_EXPAND | GTK_FILL ),
1401 (GtkAttachOptions) ( GTK_EXPAND | GTK_FILL ), 0, 0 );
1402 gtk_widget_set_usize( entry, 50, -2 );
1403 g_object_set_data( G_OBJECT( dlg ), "wavelength", entry );
1404 g_signal_connect( G_OBJECT( entry ), "focus_out_event", G_CALLBACK( doublevariable_entryfocusout ), &WaveLength );
1406 entry = gtk_entry_new();
1407 gtk_widget_show( entry );
1408 gtk_table_attach( GTK_TABLE( table2 ), entry, 1, 2, 1, 2,
1409 (GtkAttachOptions) ( GTK_EXPAND | GTK_FILL ),
1410 (GtkAttachOptions) ( GTK_EXPAND | GTK_FILL ), 0, 0 );
1411 gtk_widget_set_usize( entry, 50, -2 );
1412 g_object_set_data( G_OBJECT( dlg ), "amplitude", entry );
1413 g_signal_connect( G_OBJECT( entry ), "focus_out_event", G_CALLBACK( doublevariable_entryfocusout ), &Amplitude );
1415 entry = gtk_entry_new();
1416 gtk_widget_show( entry );
1417 gtk_table_attach( GTK_TABLE( table2 ), entry, 1, 2, 2, 3,
1418 (GtkAttachOptions) ( GTK_EXPAND | GTK_FILL ),
1419 (GtkAttachOptions) ( GTK_EXPAND | GTK_FILL ), 0, 0 );
1420 gtk_widget_set_usize( entry, 50, -2 );
1421 g_object_set_data( G_OBJECT( dlg ), "roughness", entry );
1422 g_signal_connect( G_OBJECT( entry ), "focus_out_event", G_CALLBACK( doublevariable_entryfocusout ), &Roughness );
1424 adj = gtk_adjustment_new( 1, 1, 32767, 1, 10, 0 );
1425 g_signal_connect( G_OBJECT( adj ), "value_changed", G_CALLBACK( general_random ), NULL );
1426 spin = gtk_spin_button_new( GTK_ADJUSTMENT( adj ), 1, 0 );
1427 gtk_widget_show( spin );
1428 gtk_table_attach( GTK_TABLE( table2 ), spin, 1, 2, 3, 4,
1429 (GtkAttachOptions) ( GTK_EXPAND | GTK_FILL ),
1430 (GtkAttachOptions) ( GTK_EXPAND | GTK_FILL ), 0, 0 );
1431 gtk_widget_set_usize( spin, 60, -2 );
1432 g_object_set_data( G_OBJECT( dlg ), "random", spin );
1434 vbox = gtk_vbox_new( FALSE, 5 );
1435 gtk_widget_show( vbox );
1436 gtk_container_set_border_width( GTK_CONTAINER( vbox ), 5 );
1438 label = gtk_label_new( "Extents" );
1439 gtk_widget_show( label );
1440 gtk_notebook_append_page( GTK_NOTEBOOK( notebook ), vbox, label );
1442 hbox2 = gtk_hbox_new( FALSE, 5 );
1443 gtk_widget_show( hbox2 );
1444 gtk_box_pack_start( GTK_BOX( vbox ), hbox2, FALSE, TRUE, 0 );
1446 frame = gtk_frame_new( "Extents" );
1447 gtk_widget_show( frame );
1448 gtk_box_pack_start( GTK_BOX( hbox2 ), frame, TRUE, TRUE, 0 );
1450 table = gtk_table_new( 3, 4, FALSE );
1451 gtk_widget_show( table );
1452 gtk_container_set_border_width( GTK_CONTAINER( table ), 5 );
1453 gtk_container_add( GTK_CONTAINER( frame ), table );
1454 gtk_table_set_row_spacings( GTK_TABLE( table ), 5 );
1455 gtk_table_set_col_spacings( GTK_TABLE( table ), 5 );
1457 label = gtk_label_new( "X:" );
1458 gtk_widget_show( label );
1459 gtk_table_attach( GTK_TABLE( table ), label, 0, 1, 1, 2,
1460 (GtkAttachOptions) ( GTK_FILL ),
1461 (GtkAttachOptions) ( GTK_FILL ), 0, 0 );
1462 g_object_set_data( G_OBJECT( dlg ), "hmin_text", label );
1464 label = gtk_label_new( "X:" );
1465 gtk_widget_show( label );
1466 gtk_table_attach( GTK_TABLE( table ), label, 2, 3, 1, 2,
1467 (GtkAttachOptions) ( GTK_FILL ),
1468 (GtkAttachOptions) ( GTK_FILL ), 0, 0 );
1469 g_object_set_data( G_OBJECT( dlg ), "hmax_text", label );
1471 label = gtk_label_new( "Y:" );
1472 gtk_widget_show( label );
1473 gtk_table_attach( GTK_TABLE( table ), label, 0, 1, 2, 3,
1474 (GtkAttachOptions) ( GTK_FILL ),
1475 (GtkAttachOptions) ( GTK_FILL ), 0, 0 );
1476 g_object_set_data( G_OBJECT( dlg ), "vmin_text", label );
1478 label = gtk_label_new( "Y:" );
1479 gtk_widget_show( label );
1480 gtk_table_attach( GTK_TABLE( table ), label, 2, 3, 2, 3,
1481 (GtkAttachOptions) ( GTK_FILL ),
1482 (GtkAttachOptions) ( GTK_FILL ), 0, 0 );
1483 g_object_set_data( G_OBJECT( dlg ), "vmax_text", label );
1485 label = gtk_label_new( "Lower-left" );
1486 gtk_widget_show( label );
1487 gtk_table_attach( GTK_TABLE( table ), label, 1, 2, 0, 1,
1488 (GtkAttachOptions) ( GTK_FILL ),
1489 (GtkAttachOptions) ( GTK_FILL ), 0, 0 );
1491 label = gtk_label_new( "Upper-right" );
1492 gtk_widget_show( label );
1493 gtk_table_attach( GTK_TABLE( table ), label, 3, 4, 0, 1,
1494 (GtkAttachOptions) ( GTK_FILL ),
1495 (GtkAttachOptions) ( GTK_FILL ), 0, 0 );
1497 entry = gtk_entry_new();
1498 gtk_widget_show( entry );
1499 gtk_table_attach( GTK_TABLE( table ), entry, 1, 2, 1, 2,
1500 (GtkAttachOptions) ( GTK_EXPAND | GTK_FILL ),
1501 (GtkAttachOptions) ( GTK_EXPAND | GTK_FILL ), 0, 0 );
1502 gtk_widget_set_usize( entry, 50, -2 );
1503 g_object_set_data( G_OBJECT( dlg ), "hmin", entry );
1504 g_signal_connect( G_OBJECT( entry ), "focus_out_event", G_CALLBACK( doublevariable_entryfocusout ), &Hll );
1506 entry = gtk_entry_new();
1507 gtk_widget_show( entry );
1508 gtk_table_attach( GTK_TABLE( table ), entry, 3, 4, 1, 2,
1509 (GtkAttachOptions) ( GTK_EXPAND | GTK_FILL ),
1510 (GtkAttachOptions) ( GTK_EXPAND | GTK_FILL ), 0, 0 );
1511 gtk_widget_set_usize( entry, 50, -2 );
1512 g_object_set_data( G_OBJECT( dlg ), "hmax", entry );
1513 g_signal_connect( G_OBJECT( entry ), "focus_out_event", G_CALLBACK( doublevariable_entryfocusout ), &Hur );
1515 entry = gtk_entry_new();
1516 gtk_widget_show( entry );
1517 gtk_table_attach( GTK_TABLE( table ), entry, 1, 2, 2, 3,
1518 (GtkAttachOptions) ( GTK_EXPAND | GTK_FILL ),
1519 (GtkAttachOptions) ( GTK_EXPAND | GTK_FILL ), 0, 0 );
1520 gtk_widget_set_usize( entry, 50, -2 );
1521 g_object_set_data( G_OBJECT( dlg ), "vmin", entry );
1522 g_signal_connect( G_OBJECT( entry ), "focus_out_event", G_CALLBACK( doublevariable_entryfocusout ), &Vll );
1524 entry = gtk_entry_new();
1525 gtk_widget_show( entry );
1526 gtk_table_attach( GTK_TABLE( table ), entry, 3, 4, 2, 3,
1527 (GtkAttachOptions) ( GTK_EXPAND | GTK_FILL ),
1528 (GtkAttachOptions) ( GTK_EXPAND | GTK_FILL ), 0, 0 );
1529 gtk_widget_set_usize( entry, 50, -2 );
1530 g_object_set_data( G_OBJECT( dlg ), "vmax", entry );
1531 g_signal_connect( G_OBJECT( entry ), "focus_out_event", G_CALLBACK( doublevariable_entryfocusout ), &Vur );
1533 frame = gtk_frame_new( "Divisions" );
1534 gtk_widget_show( frame );
1535 gtk_box_pack_start( GTK_BOX( hbox2 ), frame, TRUE, TRUE, 0 );
1537 table = gtk_table_new( 2, 2, FALSE );
1538 gtk_widget_show( table );
1539 gtk_container_set_border_width( GTK_CONTAINER( table ), 5 );
1540 gtk_container_add( GTK_CONTAINER( frame ), table );
1541 gtk_table_set_row_spacings( GTK_TABLE( table ), 5 );
1542 gtk_table_set_col_spacings( GTK_TABLE( table ), 5 );
1544 label = gtk_label_new( "X:" );
1545 gtk_widget_show( label );
1546 gtk_table_attach( GTK_TABLE( table ), label, 0, 1, 0, 1,
1547 (GtkAttachOptions) ( GTK_FILL ),
1548 (GtkAttachOptions) ( GTK_EXPAND | GTK_FILL ), 0, 0 );
1549 g_object_set_data( G_OBJECT( dlg ), "nh_text", label );
1551 label = gtk_label_new( "Y:" );
1552 gtk_widget_show( label );
1553 gtk_table_attach( GTK_TABLE( table ), label, 0, 1, 1, 2,
1554 (GtkAttachOptions) ( GTK_FILL ),
1555 (GtkAttachOptions) ( GTK_EXPAND | GTK_FILL ), 0, 0 );
1556 g_object_set_data( G_OBJECT( dlg ), "nv_text", label );
1558 adj = gtk_adjustment_new( 8, 1, MAX_ROWS, 1, 10, 0 );
1559 g_signal_connect( G_OBJECT( adj ), "value_changed", G_CALLBACK( extents_nhnv_spin ), &NH );
1560 spin = gtk_spin_button_new( GTK_ADJUSTMENT( adj ), 1, 0 );
1561 gtk_widget_show( spin );
1562 gtk_table_attach( GTK_TABLE( table ), spin, 1, 2, 0, 1,
1563 (GtkAttachOptions) ( GTK_EXPAND | GTK_FILL ),
1564 (GtkAttachOptions) ( GTK_EXPAND | GTK_FILL ), 0, 0 );
1565 gtk_widget_set_usize( spin, 60, -2 );
1566 g_object_set_data( G_OBJECT( dlg ), "nh", spin );
1568 adj = gtk_adjustment_new( 8, 1, MAX_ROWS, 1, 10, 0 );
1569 g_signal_connect( G_OBJECT( adj ), "value_changed", G_CALLBACK( extents_nhnv_spin ), &NV );
1570 spin = gtk_spin_button_new( GTK_ADJUSTMENT( adj ), 1, 0 );
1571 gtk_widget_show( spin );
1572 gtk_table_attach( GTK_TABLE( table ), spin, 1, 2, 1, 2,
1573 (GtkAttachOptions) ( GTK_EXPAND | GTK_FILL ),
1574 (GtkAttachOptions) ( GTK_EXPAND | GTK_FILL ), 0, 0 );
1575 gtk_widget_set_usize( spin, 60, -2 );
1576 g_object_set_data( G_OBJECT( dlg ), "nv", spin );
1578 check = gtk_check_button_new_with_label( "Use Bezier patches" );
1579 gtk_widget_show( check );
1580 gtk_box_pack_start( GTK_BOX( vbox ), check, FALSE, TRUE, 0 );
1581 g_object_set_data( G_OBJECT( dlg ), "use_patches", check );
1582 g_signal_connect( G_OBJECT( check ), "toggled", G_CALLBACK( extents_use_patches ), NULL );
1584 // ^Fishman - Snap to grid, replaced scroll bar with a texbox.
1585 label = gtk_label_new( "Snap to grid:" );
1586 gtk_widget_show( label );
1587 gtk_box_pack_start( GTK_BOX( vbox ), label, FALSE, TRUE, 0 );
1588 gtk_object_set_data( GTK_OBJECT( dlg ), "snap_text", label );
1590 adj = gtk_adjustment_new( 8, 0, 256, 1, 10, 0 );
1591 g_signal_connect( G_OBJECT( adj ), "value_changed", G_CALLBACK( extents_snaptogrid_spin ), &SP );
1592 spin = gtk_spin_button_new( GTK_ADJUSTMENT( adj ), 1, 0 );
1593 gtk_widget_show( spin );
1594 gtk_box_pack_start( GTK_BOX( vbox ), spin, FALSE, TRUE, 0 );
1595 gtk_widget_set_usize( spin, 60, -2 );
1596 g_object_set_data( G_OBJECT( dlg ), "sp", spin );
1597 // ^Fishman - End of Snap to grid code.
1599 hbox2 = gtk_hbox_new( FALSE, 5 );
1600 gtk_widget_show( hbox2 );
1601 gtk_box_pack_start( GTK_BOX( vbox ), hbox2, FALSE, TRUE, 10 );
1603 label = gtk_label_new( "Decimate:" );
1604 gtk_widget_show( label );
1605 gtk_box_pack_start( GTK_BOX( hbox2 ), label, FALSE, TRUE, 0 );
1607 adj = gtk_adjustment_new( 0, 0, 110, 1, 10, 0 );
1608 g_signal_connect( G_OBJECT( adj ), "value_changed", G_CALLBACK( extents_decimate ), NULL );
1609 g_object_set_data( G_OBJECT( dlg ), "decimate_adj", adj );
1610 scale = gtk_hscale_new( GTK_ADJUSTMENT( adj ) );
1611 gtk_widget_show( scale );
1612 gtk_box_pack_start( GTK_BOX( hbox2 ), scale, TRUE, TRUE, 0 );
1613 gtk_scale_set_value_pos( GTK_SCALE( scale ), GTK_POS_RIGHT );
1614 gtk_scale_set_digits( GTK_SCALE( scale ), 0 );
1615 g_object_set_data( G_OBJECT( dlg ), "decimate", scale );
1617 frame = gtk_frame_new( "Corner values" );
1618 gtk_widget_show( frame );
1619 gtk_box_pack_start( GTK_BOX( vbox ), frame, FALSE, TRUE, 0 );
1621 table = gtk_table_new( 3, 4, FALSE );
1622 gtk_widget_show( table );
1623 gtk_container_set_border_width( GTK_CONTAINER( table ), 5 );
1624 gtk_container_add( GTK_CONTAINER( frame ), table );
1625 gtk_table_set_row_spacings( GTK_TABLE( table ), 5 );
1626 gtk_table_set_col_spacings( GTK_TABLE( table ), 5 );
1628 label = gtk_label_new( "Upper-left:" );
1629 gtk_widget_show( label );
1630 gtk_table_attach( GTK_TABLE( table ), label, 0, 1, 0, 1,
1631 (GtkAttachOptions) ( GTK_FILL ),
1632 (GtkAttachOptions) ( GTK_FILL ), 0, 0 );
1634 label = gtk_label_new( "Lower-left:" );
1635 gtk_widget_show( label );
1636 gtk_table_attach( GTK_TABLE( table ), label, 0, 1, 1, 2,
1637 (GtkAttachOptions) ( GTK_FILL ),
1638 (GtkAttachOptions) ( GTK_FILL ), 0, 0 );
1640 label = gtk_label_new( "Upper-right:" );
1641 gtk_widget_show( label );
1642 gtk_table_attach( GTK_TABLE( table ), label, 2, 3, 0, 1,
1643 (GtkAttachOptions) ( GTK_FILL ),
1644 (GtkAttachOptions) ( GTK_FILL ), 0, 0 );
1646 label = gtk_label_new( "Lower-right:" );
1647 gtk_widget_show( label );
1648 gtk_table_attach( GTK_TABLE( table ), label, 2, 3, 1, 2,
1649 (GtkAttachOptions) ( GTK_FILL ),
1650 (GtkAttachOptions) ( GTK_FILL ), 0, 0 );
1652 entry = gtk_entry_new();
1653 gtk_widget_show( entry );
1654 gtk_table_attach( GTK_TABLE( table ), entry, 1, 2, 0, 1,
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 ), "z01", entry );
1659 g_signal_connect( G_OBJECT( entry ), "focus_out_event", G_CALLBACK( doublevariable_entryfocusout ), &Z01 );
1661 entry = gtk_entry_new();
1662 gtk_widget_show( entry );
1663 gtk_table_attach( GTK_TABLE( table ), entry, 1, 2, 1, 2,
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 ), "z00", entry );
1668 g_signal_connect( G_OBJECT( entry ), "focus_out_event", G_CALLBACK( doublevariable_entryfocusout ), &Z00 );
1670 entry = gtk_entry_new();
1671 gtk_widget_show( entry );
1672 gtk_table_attach( GTK_TABLE( table ), entry, 3, 4, 0, 1,
1673 (GtkAttachOptions) ( GTK_EXPAND | GTK_FILL ),
1674 (GtkAttachOptions) ( GTK_EXPAND | GTK_FILL ), 0, 0 );
1675 gtk_widget_set_usize( entry, 50, -2 );
1676 g_object_set_data( G_OBJECT( dlg ), "z11", entry );
1677 g_signal_connect( G_OBJECT( entry ), "focus_out_event", G_CALLBACK( doublevariable_entryfocusout ), &Z11 );
1679 entry = gtk_entry_new();
1680 gtk_widget_show( entry );
1681 gtk_table_attach( GTK_TABLE( table ), entry, 3, 4, 1, 2,
1682 (GtkAttachOptions) ( GTK_EXPAND | GTK_FILL ),
1683 (GtkAttachOptions) ( GTK_EXPAND | GTK_FILL ), 0, 0 );
1684 gtk_widget_set_usize( entry, 50, -2 );
1685 g_object_set_data( G_OBJECT( dlg ), "z10", entry );
1686 g_signal_connect( G_OBJECT( entry ), "focus_out_event", G_CALLBACK( doublevariable_entryfocusout ), &Z10 );
1688 check = gtk_check_button_new_with_label( "Linear borders" );
1689 gtk_widget_show( check );
1690 gtk_table_attach( GTK_TABLE( table ), check, 0, 4, 2, 3,
1691 (GtkAttachOptions) ( GTK_EXPAND | GTK_FILL ),
1692 (GtkAttachOptions) ( GTK_EXPAND | GTK_FILL ), 0, 0 );
1693 g_object_set_data( G_OBJECT( dlg ), "linearborder", check );
1694 g_signal_connect( G_OBJECT( check ), "toggled", G_CALLBACK( extents_linearborder ), NULL );
1696 vbox = gtk_vbox_new( FALSE, 10 );
1697 gtk_widget_show( vbox );
1698 gtk_container_set_border_width( GTK_CONTAINER( vbox ), 5 );
1700 label = gtk_label_new( "Bitmap" );
1701 gtk_widget_show( label );
1702 gtk_notebook_append_page( GTK_NOTEBOOK( notebook ), vbox, label );
1704 label = gtk_label_new( "" );
1705 gtk_widget_show( label );
1706 gtk_box_pack_start( GTK_BOX( vbox ), label, FALSE, TRUE, 0 );
1707 g_object_set_data( G_OBJECT( dlg ), "bmp_note", label );
1709 table = gtk_table_new( 2, 2, FALSE );
1710 gtk_widget_show( table );
1711 gtk_container_set_border_width( GTK_CONTAINER( table ), 5 );
1712 gtk_box_pack_start( GTK_BOX( vbox ), table, FALSE, TRUE, 0 );
1713 gtk_table_set_row_spacings( GTK_TABLE( table ), 5 );
1714 gtk_table_set_col_spacings( GTK_TABLE( table ), 5 );
1716 label = gtk_label_new( "Filename:" );
1717 gtk_widget_show( label );
1718 gtk_table_attach( GTK_TABLE( table ), label, 0, 1, 0, 1,
1719 (GtkAttachOptions) ( GTK_FILL ),
1720 (GtkAttachOptions) ( GTK_FILL ), 0, 0 );
1721 g_object_set_data( G_OBJECT( dlg ), "bmp_text1", label );
1723 entry = gtk_entry_new();
1724 gtk_widget_show( entry );
1725 gtk_table_attach( GTK_TABLE( table ), entry, 1, 2, 0, 1,
1726 (GtkAttachOptions) ( GTK_EXPAND | GTK_FILL ),
1727 (GtkAttachOptions) ( GTK_FILL ), 0, 0 );
1728 g_object_set_data( G_OBJECT( dlg ), "bmp_file", entry );
1729 g_signal_connect( G_OBJECT( entry ), "focus_out_event", G_CALLBACK( bitmap_file_entryfocusout ), NULL );
1731 hbox2 = gtk_hbox_new( TRUE, 5 );
1732 gtk_widget_show( hbox2 );
1733 gtk_table_attach( GTK_TABLE( table ), hbox2, 1, 2, 1, 2,
1734 (GtkAttachOptions) ( 0 ),
1735 (GtkAttachOptions) ( GTK_EXPAND | GTK_FILL ), 0, 0 );
1737 button = gtk_button_new_with_label( "Browse..." );
1738 gtk_widget_show( button );
1739 gtk_box_pack_start( GTK_BOX( hbox2 ), button, FALSE, FALSE, 0 );
1740 gtk_widget_set_usize( button, 60, -2 );
1741 g_object_set_data( G_OBJECT( dlg ), "bmp_file_browse", button );
1742 g_signal_connect( G_OBJECT( button ), "clicked", G_CALLBACK( bitmap_browse ), NULL );
1744 button = gtk_button_new_with_label( "Reload" );
1745 gtk_widget_show( button );
1746 gtk_box_pack_start( GTK_BOX( hbox2 ), button, FALSE, FALSE, 0 );
1747 gtk_widget_set_usize( button, 60, -2 );
1748 g_object_set_data( G_OBJECT( dlg ), "bmp_reload", button );
1749 g_signal_connect( G_OBJECT( button ), "clicked", G_CALLBACK( bitmap_reload ), NULL );
1751 table = gtk_table_new( 2, 2, TRUE );
1752 gtk_widget_show( table );
1753 gtk_container_set_border_width( GTK_CONTAINER( table ), 5 );
1754 gtk_box_pack_start( GTK_BOX( vbox ), table, FALSE, TRUE, 0 );
1755 gtk_table_set_row_spacings( GTK_TABLE( table ), 5 );
1756 gtk_table_set_col_spacings( GTK_TABLE( table ), 5 );
1758 label = gtk_label_new( "Map color 0 to:" );
1759 gtk_widget_show( label );
1760 gtk_table_attach( GTK_TABLE( table ), label, 0, 1, 0, 1,
1761 (GtkAttachOptions) ( GTK_FILL | GTK_EXPAND ),
1762 (GtkAttachOptions) ( GTK_FILL ), 0, 0 );
1763 g_object_set_data( G_OBJECT( dlg ), "bmp_text2", label );
1764 gtk_misc_set_alignment( GTK_MISC( label ), 1, 0.5 );
1765 gtk_label_set_justify( GTK_LABEL( label ), GTK_JUSTIFY_RIGHT );
1767 label = gtk_label_new( "Map color 255 to:" );
1768 gtk_widget_show( label );
1769 gtk_table_attach( GTK_TABLE( table ), label, 0, 1, 1, 2,
1770 (GtkAttachOptions) ( GTK_FILL | GTK_EXPAND ),
1771 (GtkAttachOptions) ( GTK_FILL ), 0, 0 );
1772 g_object_set_data( G_OBJECT( dlg ), "bmp_text3", label );
1773 gtk_misc_set_alignment( GTK_MISC( label ), 1, 0.5 );
1774 gtk_label_set_justify( GTK_LABEL( label ), GTK_JUSTIFY_RIGHT );
1776 hbox2 = gtk_hbox_new( FALSE, 5 );
1777 gtk_widget_show( hbox2 );
1778 gtk_table_attach( GTK_TABLE( table ), hbox2, 1, 2, 0, 1,
1779 (GtkAttachOptions) ( GTK_EXPAND | GTK_FILL ),
1780 (GtkAttachOptions) ( GTK_EXPAND | GTK_FILL ), 0, 0 );
1782 entry = gtk_entry_new();
1783 gtk_widget_show( entry );
1784 gtk_box_pack_start( GTK_BOX( hbox2 ), entry, FALSE, FALSE, 0 );
1785 gtk_widget_set_usize( entry, 50, -2 );
1786 g_object_set_data( G_OBJECT( dlg ), "bmp_black", entry );
1787 g_signal_connect( G_OBJECT( entry ), "focus_out_event", G_CALLBACK( doublevariable_entryfocusout ), &gbmp.black_value );
1789 hbox2 = gtk_hbox_new( FALSE, 5 );
1790 gtk_widget_show( hbox2 );
1791 gtk_table_attach( GTK_TABLE( table ), hbox2, 1, 2, 1, 2,
1792 (GtkAttachOptions) ( GTK_EXPAND | GTK_FILL ),
1793 (GtkAttachOptions) ( GTK_EXPAND | GTK_FILL ), 0, 0 );
1795 entry = gtk_entry_new();
1796 gtk_widget_show( entry );
1797 gtk_box_pack_start( GTK_BOX( hbox2 ), entry, FALSE, FALSE, 0 );
1798 gtk_widget_set_usize( entry, 50, -2 );
1799 g_object_set_data( G_OBJECT( dlg ), "bmp_white", entry );
1800 g_signal_connect( G_OBJECT( entry ), "focus_out_event", G_CALLBACK( doublevariable_entryfocusout ), &gbmp.white_value );
1802 vbox = gtk_vbox_new( FALSE, 10 );
1803 gtk_widget_show( vbox );
1804 gtk_container_set_border_width( GTK_CONTAINER( vbox ), 5 );
1806 label = gtk_label_new( "Fix Points" );
1807 gtk_widget_show( label );
1808 gtk_notebook_append_page( GTK_NOTEBOOK( notebook ), vbox, label );
1810 label = gtk_label_new( "Click on a vertex in the lower half of the preview window,\n"
1811 "then use the arrow keys or text box to assign a value.\n"
1812 "Use Ctrl+Click to select multiple vertices/toggle a\n"
1813 "selection. Use Shift+Click to select a range of vertices.\n\n"
1814 "Click \"Free\" to unlock a vertex. Vertices within \"Range\n"
1815 "affected\" will be influenced by this vertex." );
1816 gtk_widget_show( label );
1817 gtk_box_pack_start( GTK_BOX( vbox ), label, FALSE, TRUE, 0 );
1819 table = gtk_table_new( 3, 3, FALSE );
1820 gtk_widget_show( table );
1821 gtk_container_set_border_width( GTK_CONTAINER( table ), 5 );
1822 gtk_box_pack_start( GTK_BOX( vbox ), table, FALSE, TRUE, 0 );
1823 gtk_table_set_row_spacings( GTK_TABLE( table ), 5 );
1824 gtk_table_set_col_spacings( GTK_TABLE( table ), 5 );
1826 label = gtk_label_new( "Value:" );
1827 gtk_widget_show( label );
1828 gtk_table_attach( GTK_TABLE( table ), label, 0, 1, 0, 1,
1829 (GtkAttachOptions) ( GTK_FILL ),
1830 (GtkAttachOptions) ( GTK_FILL ), 0, 0 );
1831 gtk_misc_set_alignment( GTK_MISC( label ), 1, 0.5 );
1832 g_object_set_data( G_OBJECT( dlg ), "fix_value_text", label );
1834 label = gtk_label_new( "Range affected:" );
1835 gtk_widget_show( label );
1836 gtk_table_attach( GTK_TABLE( table ), label, 0, 1, 1, 2,
1837 (GtkAttachOptions) ( GTK_FILL ),
1838 (GtkAttachOptions) ( GTK_FILL ), 0, 0 );
1839 gtk_misc_set_alignment( GTK_MISC( label ), 1, 0.5 );
1840 g_object_set_data( G_OBJECT( dlg ), "fix_range_text", label );
1842 label = gtk_label_new( "Rate of change:" );
1843 gtk_widget_show( label );
1844 gtk_table_attach( GTK_TABLE( table ), label, 0, 1, 2, 3,
1845 (GtkAttachOptions) ( GTK_FILL ),
1846 (GtkAttachOptions) ( GTK_FILL ), 0, 0 );
1847 gtk_misc_set_alignment( GTK_MISC( label ), 1, 0.5 );
1848 g_object_set_data( G_OBJECT( dlg ), "fix_rate_text", label );
1850 adj = gtk_adjustment_new( 0, -65536, 65536, 1, 16, 0 );
1851 g_signal_connect( G_OBJECT( adj ), "value_changed", G_CALLBACK( fix_value_changed ), NULL );
1852 spin = gtk_spin_button_new( GTK_ADJUSTMENT( adj ), 1, 0 );
1853 gtk_widget_show( spin );
1854 gtk_table_attach( GTK_TABLE( table ), spin, 1, 2, 0, 1,
1855 (GtkAttachOptions) ( GTK_EXPAND ),
1856 (GtkAttachOptions) ( GTK_EXPAND ), 0, 0 );
1857 gtk_widget_set_usize( spin, 60, -2 );
1858 g_object_set_data( G_OBJECT( dlg ), "fix_value", spin );
1859 g_signal_connect( G_OBJECT( spin ), "focus_out_event", G_CALLBACK( fix_value_entryfocusout ), NULL );
1861 entry = gtk_entry_new();
1862 gtk_widget_show( entry );
1863 gtk_table_attach( GTK_TABLE( table ), entry, 1, 2, 1, 2,
1864 (GtkAttachOptions) ( GTK_EXPAND ),
1865 (GtkAttachOptions) ( GTK_FILL ), 0, 0 );
1866 gtk_widget_set_usize( entry, 60, -2 );
1867 g_object_set_data( G_OBJECT( dlg ), "fix_range", entry );
1868 g_signal_connect( G_OBJECT( entry ), "focus_out_event", G_CALLBACK( fix_range_entryfocusout ), NULL );
1870 entry = gtk_entry_new();
1871 gtk_widget_show( entry );
1872 gtk_table_attach( GTK_TABLE( table ), entry, 1, 2, 2, 3,
1873 (GtkAttachOptions) ( GTK_EXPAND ),
1874 (GtkAttachOptions) ( GTK_FILL ), 0, 0 );
1875 gtk_widget_set_usize( entry, 60, -2 );
1876 g_object_set_data( G_OBJECT( dlg ), "fix_rate", entry );
1877 g_signal_connect( G_OBJECT( entry ), "focus_out_event", G_CALLBACK( fix_rate_entryfocusout ), NULL );
1879 button = gtk_button_new_with_label( "Free" );
1880 gtk_widget_show( button );
1881 gtk_table_attach( GTK_TABLE( table ), button, 2, 3, 0, 1,
1882 (GtkAttachOptions) ( GTK_EXPAND ),
1883 (GtkAttachOptions) ( GTK_FILL ), 0, 0 );
1884 gtk_widget_set_usize( button, 60, -2 );
1885 g_object_set_data( G_OBJECT( dlg ), "fix_free", button );
1886 g_signal_connect( G_OBJECT( button ), "clicked", G_CALLBACK( fix_free ), NULL );
1888 button = gtk_button_new_with_label( "Free All" );
1889 gtk_widget_show( button );
1890 gtk_table_attach( GTK_TABLE( table ), button, 2, 3, 1, 2,
1891 (GtkAttachOptions) ( GTK_EXPAND ),
1892 (GtkAttachOptions) ( GTK_FILL ), 0, 0 );
1893 gtk_widget_set_usize( button, 60, -2 );
1894 g_object_set_data( G_OBJECT( dlg ), "fix_freeall", button );
1895 g_signal_connect( G_OBJECT( button ), "clicked", G_CALLBACK( fix_freeall ), NULL );
1897 vbox = gtk_vbox_new( FALSE, 10 );
1898 gtk_widget_show( vbox );
1899 gtk_container_set_border_width( GTK_CONTAINER( vbox ), 5 );
1901 label = gtk_label_new( "Texture" );
1902 gtk_widget_show( label );
1903 gtk_notebook_append_page( GTK_NOTEBOOK( notebook ), vbox, label );
1905 // ^Fishman - Modified to add more labels and textboxes.
1906 table = gtk_table_new( 5, 2, FALSE );
1907 gtk_widget_show( table );
1908 gtk_box_pack_start( GTK_BOX( vbox ), table, FALSE, TRUE, 0 );
1909 gtk_table_set_row_spacings( GTK_TABLE( table ), 5 );
1910 gtk_table_set_col_spacings( GTK_TABLE( table ), 5 );
1912 label = gtk_label_new( "Surface:" );
1913 gtk_widget_show( label );
1914 gtk_table_attach( GTK_TABLE( table ), label, 0, 1, 0, 1,
1915 (GtkAttachOptions) ( GTK_FILL ),
1916 (GtkAttachOptions) ( GTK_FILL ), 0, 0 );
1917 gtk_misc_set_alignment( GTK_MISC( label ), 1, 0.5 );
1919 label = gtk_label_new( "Other:" );
1920 gtk_widget_show( label );
1921 gtk_table_attach( GTK_TABLE( table ), label, 0, 1, 1, 2,
1922 (GtkAttachOptions) ( GTK_FILL ),
1923 (GtkAttachOptions) ( GTK_FILL ), 0, 0 );
1924 gtk_misc_set_alignment( GTK_MISC( label ), 1, 0.5 );
1926 label = gtk_label_new( "Steep:" );
1927 gtk_widget_show( label );
1928 gtk_table_attach( GTK_TABLE( table ), label, 0, 1, 2, 3,
1929 (GtkAttachOptions) ( GTK_FILL ),
1930 (GtkAttachOptions) ( GTK_FILL ), 0, 0 );
1931 gtk_misc_set_alignment( GTK_MISC( label ), 1, 0.5 );
1933 entry = gtk_entry_new();
1934 gtk_widget_show( entry );
1935 gtk_table_attach( GTK_TABLE( table ), entry, 1, 2, 0, 1,
1936 (GtkAttachOptions) ( GTK_EXPAND | GTK_FILL ),
1937 (GtkAttachOptions) ( GTK_FILL ), 0, 0 );
1938 gtk_widget_set_usize( entry, 60, -2 );
1939 g_object_set_data( G_OBJECT( dlg ), "texture1", entry );
1940 g_signal_connect( G_OBJECT( entry ), "focus_out_event", G_CALLBACK( texture_entryfocusout ), GINT_TO_POINTER( 0 ) );
1942 entry = gtk_entry_new();
1943 gtk_widget_show( entry );
1944 gtk_table_attach( GTK_TABLE( table ), entry, 1, 2, 1, 2,
1945 (GtkAttachOptions) ( GTK_EXPAND | GTK_FILL ),
1946 (GtkAttachOptions) ( GTK_FILL ), 0, 0 );
1947 gtk_widget_set_usize( entry, 60, -2 );
1948 g_object_set_data( G_OBJECT( dlg ), "texture2", entry );
1949 g_signal_connect( G_OBJECT( entry ), "focus_out_event", G_CALLBACK( texture_entryfocusout ), GINT_TO_POINTER( 1 ) );
1951 entry = gtk_entry_new();
1952 gtk_widget_show( entry );
1953 gtk_table_attach( GTK_TABLE( table ), entry, 1, 2, 2, 3,
1954 (GtkAttachOptions) ( GTK_EXPAND | GTK_FILL ),
1955 (GtkAttachOptions) ( GTK_FILL ), 0, 0 );
1956 gtk_widget_set_usize( entry, 60, -2 );
1957 g_object_set_data( G_OBJECT( dlg ), "texture3", entry );
1959 hbox2 = gtk_hbox_new( FALSE, 5 );
1960 gtk_widget_show( hbox2 );
1961 gtk_box_pack_start( GTK_BOX( vbox ), hbox2, FALSE, TRUE, 0 );
1963 label = gtk_label_new( "\"Steep\" angle:" );
1964 gtk_widget_show( label );
1965 gtk_box_pack_start( GTK_BOX( hbox2 ), label, FALSE, TRUE, 0 );
1967 adj = gtk_adjustment_new( 60, 0, 90, 1, 10, 0 );
1968 spin = gtk_spin_button_new( GTK_ADJUSTMENT( adj ), 1, 0 );
1969 gtk_widget_show( spin );
1970 gtk_box_pack_start( GTK_BOX( hbox2 ), spin, FALSE, TRUE, 0 );
1971 g_object_set_data( G_OBJECT( dlg ), "tex_slant", spin );
1973 table = gtk_table_new( 2, 4, TRUE );
1974 gtk_widget_show( table );
1975 gtk_box_pack_start( GTK_BOX( vbox ), table, FALSE, TRUE, 0 );
1976 gtk_table_set_row_spacings( GTK_TABLE( table ), 5 );
1977 gtk_table_set_col_spacings( GTK_TABLE( table ), 5 );
1979 label = gtk_label_new( "Offset <h,v>" );
1980 gtk_widget_show( label );
1981 gtk_table_attach( GTK_TABLE( table ), label, 0, 2, 0, 1,
1982 (GtkAttachOptions) ( GTK_FILL ),
1983 (GtkAttachOptions) ( GTK_FILL ), 0, 0 );
1985 label = gtk_label_new( "Scale <h,v>" );
1986 gtk_widget_show( label );
1987 gtk_table_attach( GTK_TABLE( table ), label, 2, 4, 0, 1,
1988 (GtkAttachOptions) ( GTK_FILL ),
1989 (GtkAttachOptions) ( GTK_FILL ), 0, 0 );
1991 entry = gtk_entry_new();
1992 gtk_widget_show( entry );
1993 gtk_table_attach( GTK_TABLE( table ), entry, 0, 1, 1, 2,
1994 (GtkAttachOptions) ( GTK_EXPAND | GTK_FILL ),
1995 (GtkAttachOptions) ( GTK_FILL ), 0, 0 );
1996 gtk_widget_set_usize( entry, 60, -2 );
1997 g_object_set_data( G_OBJECT( dlg ), "texoffsetx", entry );
1999 entry = gtk_entry_new();
2000 gtk_widget_show( entry );
2001 gtk_table_attach( GTK_TABLE( table ), entry, 1, 2, 1, 2,
2002 (GtkAttachOptions) ( GTK_EXPAND | GTK_FILL ),
2003 (GtkAttachOptions) ( GTK_FILL ), 0, 0 );
2004 gtk_widget_set_usize( entry, 60, -2 );
2005 g_object_set_data( G_OBJECT( dlg ), "texoffsety", entry );
2007 entry = gtk_entry_new();
2008 gtk_widget_show( entry );
2009 gtk_table_attach( GTK_TABLE( table ), entry, 2, 3, 1, 2,
2010 (GtkAttachOptions) ( GTK_EXPAND | GTK_FILL ),
2011 (GtkAttachOptions) ( GTK_FILL ), 0, 0 );
2012 gtk_widget_set_usize( entry, 60, -2 );
2013 g_object_set_data( G_OBJECT( dlg ), "texscalex", entry );
2015 entry = gtk_entry_new();
2016 gtk_widget_show( entry );
2017 gtk_table_attach( GTK_TABLE( table ), entry, 3, 4, 1, 2,
2018 (GtkAttachOptions) ( GTK_EXPAND | GTK_FILL ),
2019 (GtkAttachOptions) ( GTK_FILL ), 0, 0 );
2020 gtk_widget_set_usize( entry, 60, -2 );
2021 g_object_set_data( G_OBJECT( dlg ), "texscaley", entry );
2025 check = gtk_check_button_new_with_label( "Use detail brushes" );
2026 gtk_widget_show( check );
2027 gtk_box_pack_start( GTK_BOX( vbox ), check, FALSE, TRUE, 0 );
2028 g_object_set_data( G_OBJECT( dlg ), "detail", check );
2029 g_signal_connect( G_OBJECT( check ), "toggled", G_CALLBACK( texture_detail ), NULL );
2031 check = gtk_check_button_new_with_label( "Detail hint brushes" );
2032 gtk_widget_show( check );
2033 gtk_box_pack_start( GTK_BOX( vbox ), check, FALSE, TRUE, 0 );
2034 g_object_set_data( G_OBJECT( dlg ), "hint", check );
2035 g_signal_connect( G_OBJECT( check ), "toggled", G_CALLBACK( texture_hint ), NULL );
2037 // ^Fishman - Add terrain key to func_group.
2038 check = gtk_check_button_new_with_label( "Add terrain key" );
2039 gtk_widget_show( check );
2040 gtk_box_pack_start( GTK_BOX( vbox ), check, FALSE, TRUE, 0 );
2041 g_object_set_data( G_OBJECT( dlg ), "terrain_ent", check );
2042 g_signal_connect( G_OBJECT( check ), "toggled", G_CALLBACK( texture_terrainent ), NULL );
2044 vbox = gtk_vbox_new( FALSE, 5 );
2045 gtk_widget_show( vbox );
2046 gtk_box_pack_start( GTK_BOX( hbox ), vbox, FALSE, TRUE, 0 );
2048 button = gtk_button_new_with_label( "OK" );
2049 gtk_widget_show( button );
2050 gtk_box_pack_start( GTK_BOX( vbox ), button, FALSE, TRUE, 0 );
2051 gtk_widget_set_usize( button, 60, -2 );
2052 g_object_set_data( G_OBJECT( dlg ), "go", button );
2053 g_signal_connect( G_OBJECT( button ), "clicked", G_CALLBACK( main_go ), NULL );
2055 label = gtk_label_new( "Settings:" );
2056 gtk_widget_show( label );
2057 gtk_box_pack_start( GTK_BOX( vbox ), label, FALSE, TRUE, 0 );
2059 button = gtk_button_new_with_label( "Open..." );
2060 gtk_widget_show( button );
2061 gtk_box_pack_start( GTK_BOX( vbox ), button, FALSE, TRUE, 0 );
2062 g_object_set_data( G_OBJECT( dlg ), "open", button );
2063 g_signal_connect( G_OBJECT( button ), "clicked", G_CALLBACK( main_open ), NULL );
2065 button = gtk_button_new_with_label( "Save as..." );
2066 gtk_widget_show( button );
2067 gtk_box_pack_start( GTK_BOX( vbox ), button, FALSE, TRUE, 0 );
2068 g_object_set_data( G_OBJECT( dlg ), "save", button );
2069 g_signal_connect( G_OBJECT( button ), "clicked", G_CALLBACK( main_save ), NULL );
2071 button = gtk_button_new_with_label( "Defaults" );
2072 gtk_widget_show( button );
2073 gtk_box_pack_start( GTK_BOX( vbox ), button, FALSE, TRUE, 0 );
2074 g_object_set_data( G_OBJECT( dlg ), "defaults", button );
2075 g_signal_connect( G_OBJECT( button ), "clicked", G_CALLBACK( main_defaults ), NULL );
2077 button = gtk_button_new_with_label( "About..." );
2078 gtk_widget_show( button );
2079 gtk_box_pack_start( GTK_BOX( vbox ), button, FALSE, TRUE, 0 );
2080 g_signal_connect( G_OBJECT( button ), "clicked", G_CALLBACK( main_about ), NULL );
2082 check = gtk_check_button_new_with_label( "Preview" );
2083 gtk_widget_show( check );
2084 gtk_box_pack_start( GTK_BOX( vbox ), check, FALSE, TRUE, 0 );
2085 g_signal_connect( G_OBJECT( check ), "toggled", G_CALLBACK( main_preview ), NULL );
2086 g_object_set_data( G_OBJECT( dlg ), "main_preview", check );
2088 // ^Fishman - Antializing for the preview window.
2089 check = gtk_check_button_new_with_label( "Antialised lines" );
2090 gtk_widget_show( check );
2091 gtk_box_pack_start( GTK_BOX( vbox ), check, FALSE, TRUE, 0 );
2092 g_object_set_data( G_OBJECT( dlg ), "main_antialiasing", check );
2093 g_signal_connect( G_OBJECT( check ), "toggled", G_CALLBACK( main_antialiasing ), NULL );
2095 for ( i = 0; i < 5; i++ )
2102 FirstPassComplete = 1;