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 ) {
549 if ( WaveType == WAVE_BITMAP ) {
550 GetDlgItemText( hwnd,DLG_BMP_FILE,gbmp.name,sizeof( gbmp.name ) );
551 CheckValidDIB( hwnd );
552 GetDlgItemText( hwnd,DLG_BMP_BLACK,Text,sizeof( Text ) );
553 gbmp.black_value = atof( Text );
554 GetDlgItemText( hwnd,DLG_BMP_WHITE,Text,sizeof( Text ) );
555 gbmp.white_value = atof( Text );
556 UpdatePreview( TRUE );
561 GetDlgItemText( hwnd,DLG_FIX_VALUE,Text,sizeof( Text ) );
562 temp.fixed_value = atoi( Text );
563 GetDlgItemText( hwnd,DLG_FIX_RANGE,Text,sizeof( Text ) );
564 temp.range = atoi( Text );
565 GetDlgItemText( hwnd,DLG_FIX_RATE, Text,sizeof( Text ) );
566 temp.rate = atof( Text );
567 for ( k = 0; k < NumVerticesSelected; k++ )
569 xyz[Vertex[k].i][Vertex[k].j].fixed_value = temp.fixed_value;
570 xyz[Vertex[k].i][Vertex[k].j].range = temp.range;
571 xyz[Vertex[k].i][Vertex[k].j].rate = temp.rate;
575 CheckDlgButton( ghwnd,DLG_PREVIEW,0 );
576 SendMessage( ghwnd,WM_COMMAND,DLG_PREVIEW,0 );
579 UpdatePreview( TRUE );
583 if ( UsePak[Game] ) {
584 i = SendDlgItemMessage( hwndDisplay, DLG_TEX_LIST1, CB_GETCURSEL, 0, 0 );
586 Texture[Game][0][0] = '\0';
589 SendDlgItemMessage( hwndDisplay, DLG_TEX_LIST1, CB_GETLBTEXT, i,
590 (LPARAM)(LPCSTR)Texture[Game][0] );
593 i = SendDlgItemMessage( hwndDisplay, DLG_TEX_LIST2, CB_GETCURSEL, 0, 0 );
595 Texture[Game][1][0] = '\0';
598 SendDlgItemMessage( hwndDisplay, DLG_TEX_LIST2, CB_GETLBTEXT, i,
599 (LPARAM)(LPCSTR)Texture[Game][1] );
602 i = SendDlgItemMessage( hwndDisplay, DLG_TEX_LIST3, CB_GETCURSEL, 0, 0 );
604 Texture[Game][2][0] = '\0';
607 SendDlgItemMessage( hwndDisplay, DLG_TEX_LIST3, CB_GETLBTEXT, i,
608 (LPARAM)(LPCSTR)Texture[Game][2] );
613 GetDlgItemText( hwndDisplay,DLG_TEXTURE, Texture[Game][0],sizeof( Texture[Game][0] ) );
614 GetDlgItemText( hwndDisplay,DLG_TEXTURE2,Texture[Game][1],sizeof( Texture[Game][1] ) );
615 GetDlgItemText( hwndDisplay,DLG_TEXTURE3,Texture[Game][2],sizeof( Texture[Game][2] ) );
617 GetDlgItemText( hwndDisplay,DLG_TEX_SLANT,Text,sizeof( Text ) );
618 SlantAngle = atoi( Text );
619 SlantAngle = max( 0,min( SlantAngle,90 ) );
620 GetDlgItemText( hwndDisplay,DLG_TEXOFFSETX,Text,sizeof( Text ) );
621 TexOffset[0] = atof( Text );
622 GetDlgItemText( hwndDisplay,DLG_TEXOFFSETY,Text,sizeof( Text ) );
623 TexOffset[1] = atof( Text );
624 GetDlgItemText( hwndDisplay,DLG_TEXSCALEX,Text,sizeof( Text ) );
625 TexScale[0] = atof( Text );
626 if ( TexScale[0] == 0. ) {
629 GetDlgItemText( hwndDisplay,DLG_TEXSCALEY,Text,sizeof( Text ) );
630 TexScale[1] = atof( Text );
631 if ( TexScale[1] == 0. ) {
634 GetDlgItemText( hwndDisplay,DLG_ARGHRAD2,Text,sizeof( Text ) );
635 ArghRad2 = atoi( Text );
641 // =============================================================================
642 // main dialog callbacks
644 static void switch_page( GtkNotebook *notebook, GtkNotebookPage *page, guint page_num, gpointer data ){
645 if ( current_tab != page_num ) {
646 if ( page_num == FIXPOINTS_TAB ) {
647 OldPreview = Preview;
648 gtk_toggle_button_set_active( GTK_TOGGLE_BUTTON( g_object_get_data( G_OBJECT( g_pWnd ),
649 "main_preview" ) ), TRUE );
651 UpdatePreview( true );
652 NumVerticesSelected = 0;
655 if ( current_tab == FIXPOINTS_TAB ) {
657 gtk_toggle_button_set_active( GTK_TOGGLE_BUTTON( g_object_get_data( G_OBJECT( g_pWnd ),
658 "main_preview" ) ), FALSE );
661 UpdatePreview( true );
662 NumVerticesSelected = 0;
665 if ( page_num == TEXTURE_TAB ) {
666 WasDetail = UseDetail;
669 ENABLE_WIDGET( "detail", FALSE );
673 ReadDlgValues( current_tab );
674 current_tab = page_num;
675 SetDlgValues( current_tab );
679 static gint main_close( GtkWidget *widget, gpointer data ){
680 gtk_widget_hide( g_pWnd );
681 gtk_widget_hide( g_pWndPreview );
686 static void main_save( GtkWidget *widget, gpointer data ){
687 ReadDlgValues( current_tab );
691 static void main_open( GtkWidget *widget, gpointer data ){
692 OpenSetup( g_pWnd, 0 );
693 for ( int i = 0; i < 5; i++ )
698 static void main_defaults( GtkWidget *widget, gpointer data ){
699 OpenSetup( g_pWnd, 1 );
700 for ( int i = 0; i < 5; i++ )
705 static void main_preview( GtkWidget *widget, gpointer data ){
706 Preview = gtk_toggle_button_get_active( GTK_TOGGLE_BUTTON( widget ) );
710 // ^Fishman - Antializing for the preview window.
711 static void main_antialiasing( GtkWidget *widget, gpointer data ){
712 Antialiasing = gtk_toggle_button_get_active( GTK_TOGGLE_BUTTON( widget ) );
713 UpdatePreview( true );
716 static void main_about( GtkWidget *widget, gpointer data ){
720 static void main_go( GtkWidget *widget, gpointer data ){
721 GtkWidget *notebook = GTK_WIDGET( g_object_get_data( G_OBJECT( g_pWnd ), "notebook" ) );
724 ReadDlgValues( current_tab );
725 if ( NH < 1 || NH > MAX_ROWS ) {
726 sprintf( Text, "The number of divisions must be > 0 and no greater than %d.", MAX_ROWS );
727 g_FuncTable.m_pfnMessageBox( g_pWnd, Text, "GenSurf", eMB_OK, eMB_ICONWARNING );
728 gtk_notebook_set_page( GTK_NOTEBOOK( notebook ), EXTENTS_TAB );
732 if ( NV < 1 || NV > MAX_ROWS ) {
733 sprintf( Text, "The number of divisions must be > 0 and no greater than %d.", MAX_ROWS );
734 g_FuncTable.m_pfnMessageBox( g_pWnd, Text, "GenSurf", eMB_OK, eMB_ICONWARNING );
735 gtk_notebook_set_page( GTK_NOTEBOOK( notebook ), EXTENTS_TAB );
740 g_FuncTable.m_pfnMessageBox( g_pWnd, "The \"lower-left\" values must be less than "
741 "the corresponding \"upper-right\" values in "
742 "the \"Extent\" box.","GenSurf", eMB_OK, eMB_ICONWARNING );
743 gtk_notebook_set_page( GTK_NOTEBOOK( notebook ), EXTENTS_TAB );
748 g_FuncTable.m_pfnMessageBox( g_pWnd,"The \"lower-left\" values must be less than "
749 "the corresponding \"upper-right\" values in "
750 "the \"Extent\" box.","GenSurf", eMB_OK, eMB_ICONWARNING );
751 gtk_notebook_set_page( GTK_NOTEBOOK( notebook ), EXTENTS_TAB );
755 if ( !strlen( Texture[Game][0] ) ) {
756 g_FuncTable.m_pfnMessageBox( g_pWnd, "You must supply a texture name.", "GenSurf", eMB_OK, eMB_ICONWARNING );
757 gtk_notebook_set_page( GTK_NOTEBOOK( notebook ), EXTENTS_TAB );
761 /* if (Decimate>0 && GimpHints!=0)
763 MessageBox(hwnd,"You've elected to use a decimated grid and gimp's non-detail hint brushes. "
764 "This combination usually produces bizarre visual errors in the game, "
765 "so GenSurf has turned off the hint brush option.",
766 "GenSurf",eMB_ICONWARNING);
770 gtk_widget_hide( g_pWnd );
771 if ( g_pWndPreview ) {
772 gtk_widget_hide( g_pWndPreview );
776 WriteIniFile( gszIni );
779 // =============================================================================
780 // general tab callbacks
782 static void general_game( GtkToggleButton *widget, gpointer data ){
783 if ( gtk_toggle_button_get_active( widget ) ) {
784 Game = GPOINTER_TO_INT( data );
785 UpdatePreview( TRUE );
789 static void general_plane( GtkToggleButton *widget, gpointer data ){
790 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 ){
798 if ( gtk_toggle_button_get_active( widget ) ) {
799 WaveType = GPOINTER_TO_INT( data );
801 UpdatePreview( TRUE );
805 static void general_random( GtkAdjustment *adj, gpointer data ){
806 int nPos = (int)adj->value;
808 if ( RandomSeed != nPos ) {
810 UpdatePreview( true );
814 // =============================================================================
815 // extents tab callbacks
817 static void extents_linearborder( GtkToggleButton *check, gpointer data ){
818 FixBorders = gtk_toggle_button_get_active( check );
819 UpdatePreview( true );
822 static void extents_use_patches( GtkToggleButton *check, gpointer data ){
823 if ( Game != QUAKE3 ) {
827 UsePatches = gtk_toggle_button_get_active( check );
828 SetDlgValues( current_tab );
830 UpdatePreview( true );
833 static void extents_nhnv_spin( GtkAdjustment *adj, int *data ){
834 int nPos = (int)adj->value;
836 if ( *data != nPos ) {
837 if ( Game == QUAKE3 && UsePatches && ( nPos % 2 ) ) {
838 if ( *data < nPos ) {
844 gtk_adjustment_set_value( adj, *data );
849 UpdatePreview( true );
853 static void extents_decimate( GtkAdjustment *adj, gpointer data ){
854 int nPos = (int)adj->value;
857 UpdatePreview( true );
860 // Hydra : snap to grid begin
861 /*static void extents_snaptogrid (GtkAdjustment *adj, gpointer data)
863 int nPos = (int)adj->value;
866 UpdatePreview (true);
869 // ^Fishman - Modified version of Hydra's snap to grid code.
870 static void extents_snaptogrid_spin( GtkAdjustment *adj, int *data ){
871 int nPos = (int)adj->value;
873 UpdatePreview( true );
876 // =============================================================================
877 // bitmap tab callbacks
879 static gint bitmap_file_entryfocusout( GtkWidget* widget, GdkEventFocus* event, gpointer data ){
880 char filename[NAME_MAX];
882 strcpy( filename, gtk_entry_get_text( GTK_ENTRY( widget ) ) );
883 if ( strcmp( filename,gbmp.name ) ) {
884 strcpy( gbmp.name,filename );
885 if ( strlen( gbmp.name ) ) {
888 ENABLE_WIDGET( "go", ( gbmp.colors != NULL ? TRUE : FALSE ) );
893 static void bitmap_browse( GtkWidget *widget, gpointer data ){
894 const char *filename;
897 filename = g_FuncTable.m_pfnFileDialog( g_pWnd, TRUE, "Bitmap File", gbmp.defpath );
899 if ( filename != NULL ) {
900 strcpy( gbmp.name, filename );
902 ptr = strrchr( filename, G_DIR_SEPARATOR );
905 strcpy( gbmp.defpath, filename );
909 ENABLE_WIDGET( "go", ( gbmp.colors != NULL ? TRUE : FALSE ) );
913 static void bitmap_reload( GtkWidget *widget, gpointer data ){
914 strcpy( gbmp.name, gtk_entry_get_text( GTK_ENTRY( g_object_get_data( G_OBJECT( g_pWnd ), "bmp_file" ) ) ) );
915 if ( strlen( gbmp.name ) ) {
917 ENABLE_WIDGET( "go", ( gbmp.colors != NULL ? TRUE : FALSE ) );
920 ENABLE_WIDGET( "go", FALSE );
924 // =============================================================================
925 // fix points tab callbacks
927 static gint fix_value_entryfocusout( GtkWidget* widget, GdkEventFocus *event, gpointer data ){
928 int i = atoi( gtk_entry_get_text( GTK_ENTRY( widget ) ) ), k;
931 if ( i < -65536 || i > 65536 ) {
933 g_FuncTable.m_pfnMessageBox( g_pWnd, "The value must be between -65536 and 65536, inclusive.",
934 "GenSurf", eMB_OK, eMB_ICONWARNING );
935 sprintf( Text, "%d", (int)xyz[Vertex[0].i][Vertex[0].j].fixed_value );
936 gtk_entry_set_text( GTK_ENTRY( widget ), Text );
937 gtk_window_set_focus( GTK_WINDOW( gtk_widget_get_toplevel( widget ) ), widget );
939 else if ( i != xyz[Vertex[0].i][Vertex[0].j].fixed_value ) {
940 for ( k = 0; k < NumVerticesSelected; k++ )
941 xyz[Vertex[k].i][Vertex[k].j].fixed_value = i;
943 gtk_spin_button_set_value( GTK_SPIN_BUTTON( g_object_get_data( G_OBJECT( g_pWnd ), "fix_value" ) ),
944 (int)xyz[Vertex[0].i][Vertex[0].j].fixed_value );
945 UpdatePreview( true );
950 static void fix_value_changed( GtkAdjustment *adj, gpointer data ){
951 int k, i = (int)adj->value;
953 if ( xyz[Vertex[0].i][Vertex[0].j].fixed_value != i ) {
954 for ( k = 0; k < NumVerticesSelected; k++ )
955 xyz[Vertex[k].i][Vertex[k].j].fixed_value = i;
956 UpdatePreview( true );
960 static gint fix_range_entryfocusout( GtkWidget *widget, GdkEventFocus *event, gpointer data ){
961 int i = atoi( gtk_entry_get_text( GTK_ENTRY( widget ) ) ), k;
963 if ( i != xyz[Vertex[0].i][Vertex[0].j].range ) {
964 for ( k = 0; k < NumVerticesSelected; k++ )
965 xyz[Vertex[k].i][Vertex[k].j].range = i;
966 UpdatePreview( true );
971 static gint fix_rate_entryfocusout( GtkWidget *widget, GdkEventFocus *event, gpointer data ){
972 double r = atof( gtk_entry_get_text( GTK_ENTRY( widget ) ) );
975 if ( r != xyz[Vertex[0].i][Vertex[0].j].rate ) {
976 for ( k = 0; k < NumVerticesSelected; k++ )
977 xyz[Vertex[k].i][Vertex[k].j].rate = r;
978 UpdatePreview( true );
983 static void fix_free( GtkWidget *widget, gpointer data ){
986 for ( k = 0; k < NumVerticesSelected; k++ )
987 xyz[Vertex[k].i][Vertex[k].j].fixed = 0;
988 NumVerticesSelected = 0;
990 UpdatePreview( true );
993 static void fix_freeall( GtkWidget *widget, gpointer data ){
996 for ( i = 0; i <= NH; i++ )
998 for ( j = 0; j <= NV; j++ )
1001 fix_free( NULL, data ); // keep these together
1004 void vertex_selected(){
1014 for ( k = 0; k < NumVerticesSelected; k++ )
1015 xyz[Vertex[k].i][Vertex[k].j].fixed_value = xyz[Vertex[0].i][Vertex[0].j].p[1];
1019 for ( k = 0; k < NumVerticesSelected; k++ )
1020 xyz[Vertex[k].i][Vertex[k].j].fixed_value = xyz[Vertex[0].i][Vertex[0].j].p[0];
1023 for ( k = 0; k < NumVerticesSelected; k++ )
1024 xyz[Vertex[k].i][Vertex[k].j].fixed_value = xyz[Vertex[0].i][Vertex[0].j].p[2];
1028 gtk_spin_button_set_value( GTK_SPIN_BUTTON( g_object_get_data( G_OBJECT( g_pWnd ), "fix_value" ) ),
1029 (int)xyz[Vertex[0].i][Vertex[0].j].fixed_value );
1031 sprintf( Text,"%d",(int)xyz[Vertex[0].i][Vertex[0].j].range );
1032 gtk_entry_set_text( GTK_ENTRY( g_object_get_data( G_OBJECT( g_pWnd ), "fix_range" ) ), Text );
1033 sprintf( Text,"%.5g",xyz[Vertex[0].i][Vertex[0].j].rate );
1034 gtk_entry_set_text( GTK_ENTRY( g_object_get_data( G_OBJECT( g_pWnd ), "fix_rate" ) ), Text );
1036 for ( k = 0; k < NumVerticesSelected; k++ )
1037 xyz[Vertex[k].i][Vertex[k].j].fixed = 1;
1039 UpdatePreview( true );
1042 // =============================================================================
1043 // texture tab callbacks
1045 static void texture_detail( GtkToggleButton *check, gpointer data ){
1046 UseDetail = gtk_toggle_button_get_active( check );
1047 WasDetail = UseDetail;
1050 static void texture_hint( GtkToggleButton *check, gpointer data ){
1051 AddHints = gtk_toggle_button_get_active( check );
1052 if ( AddHints == 1 ) {
1054 ENABLE_WIDGET( "detail", FALSE );
1058 UseDetail = WasDetail;
1059 ENABLE_WIDGET( "detail", FALSE );
1061 CHECK_WIDGET( "detail", UseDetail );
1064 // ^Fishman - Add terrain key to func_group.
1065 static void texture_terrainent( GtkToggleButton *check, gpointer data ){
1066 AddTerrainKey = gtk_toggle_button_get_active( check );
1069 static void texture_set( int index, const char* name ){
1070 strcpy( Texture[Game][index], name );
1073 static gint texture_entryfocusout( GtkWidget* widget, GdkEventFocus* event, gpointer data ){
1074 texture_set( GPOINTER_TO_INT( data ), gtk_entry_get_text( GTK_ENTRY( widget ) ) );
1078 // =============================================================================
1081 static void UpdateVariable( GtkEntry *entry, GdkEventFocus *event, double *data ){
1082 double x = atof( gtk_entry_get_text( entry ) );
1086 UpdatePreview( true );
1090 static gint doublevariable_entryfocusout( GtkWidget* widget, GdkEventFocus* event, gpointer data ){
1091 UpdateVariable( GTK_ENTRY( widget ), event, reinterpret_cast<double*>( data ) );
1095 // =============================================================================
1098 void create_tooltips(){
1099 tooltips = gtk_tooltips_new();
1102 gtk_tooltips_set_tip( GTK_TOOLTIPS( tooltips ),
1103 GTK_WIDGET( g_object_get_data( G_OBJECT( g_pWnd ), "go" ) ),
1104 "Accept all input and generate a surface in Q3Radiant",
1106 gtk_tooltips_set_tip( GTK_TOOLTIPS( tooltips ),
1107 GTK_WIDGET( g_object_get_data( G_OBJECT( g_pWnd ), "open" ) ),
1108 "Open a previously saved GenSurf settings file.",
1110 gtk_tooltips_set_tip( GTK_TOOLTIPS( tooltips ),
1111 GTK_WIDGET( g_object_get_data( G_OBJECT( g_pWnd ), "save" ) ),
1112 "Save all settings to a file.",
1114 gtk_tooltips_set_tip( GTK_TOOLTIPS( tooltips ),
1115 GTK_WIDGET( g_object_get_data( G_OBJECT( g_pWnd ), "defaults" ) ),
1116 "Restore default values from DEFAULTS.SRF. If this file does not exist, GenSurf "
1117 "initializes all input parameters to reasonable values. You can create your own "
1118 "default surface by setting all parameters to your liking, then saving a settings "
1119 "file as DEFAULTS.SRF with the Save As button.",
1122 gtk_tooltips_set_tip( GTK_TOOLTIPS( tooltips ),
1123 GTK_WIDGET( g_object_get_data( G_OBJECT( g_pWnd ), "main_preview" ) ),
1124 "View a wire-frame representation of the surface",
1127 gtk_tooltips_set_tip( GTK_TOOLTIPS( tooltips ),
1128 GTK_WIDGET( g_object_get_data( G_OBJECT( g_pWnd ), "main_antialiasing" ) ),
1129 "The lines in the preview window are antialiased for better quality",
1133 gtk_tooltips_set_tip( GTK_TOOLTIPS( tooltips ),
1134 GTK_WIDGET( wave_radios[0] ),
1135 "Builds a surface with alternating hills and valleys. Uses the general form Z=cos(X) "
1138 gtk_tooltips_set_tip( GTK_TOOLTIPS( tooltips ),
1139 GTK_WIDGET( wave_radios[1] ),
1140 "Builds a surface with ridges parallel to the vertical axis.",
1142 gtk_tooltips_set_tip( GTK_TOOLTIPS( tooltips ),
1143 GTK_WIDGET( wave_radios[2] ),
1144 "Builds a surface with ridges parallel to the horizontal axis.",
1146 gtk_tooltips_set_tip( GTK_TOOLTIPS( tooltips ),
1147 GTK_WIDGET( wave_radios[3] ),
1148 "Builds a map from a bitmap image representing a contour plot. Click the \"Bitmap\" "
1149 "tab to select the image. GenSurf only supports 256-color (8 bit) "
1150 "bitmaps. GenSurf will work with any 256-color bitmap, but gray scale bitmaps are a bit "
1153 gtk_tooltips_set_tip( GTK_TOOLTIPS( tooltips ),
1154 GTK_WIDGET( wave_radios[4] ),
1155 "Builds a random surface using the Plasma Cloud technique. Variance is controlled "
1156 "by the Roughness input. To build a surface with completely random values not "
1157 "dependent on neighboring vertices, use one of the other waveforms with 0 amplitude.",
1159 gtk_tooltips_set_tip( GTK_TOOLTIPS( tooltips ),
1160 GTK_WIDGET( g_object_get_data( G_OBJECT( g_pWnd ), "wavelength" ) ),
1161 "Enter the wavelength (distance between crests). NOTE: Wavelengths equal to the grid "
1162 "size or 2 times the grid size will result in 0 amplitudes. For best results, the "
1163 "wavelength value should be at least 4 times the grid size (extents divided by the "
1164 "number of divisions",
1166 gtk_tooltips_set_tip( GTK_TOOLTIPS( tooltips ),
1167 GTK_WIDGET( g_object_get_data( G_OBJECT( g_pWnd ), "amplitude" ) ),
1168 "Enter the height of hills/ridges.",
1170 gtk_tooltips_set_tip( GTK_TOOLTIPS( tooltips ),
1171 GTK_WIDGET( g_object_get_data( G_OBJECT( g_pWnd ), "roughness" ) ),
1172 "Enter the roughness value (noise) for the surface. For fractal surfaces, this value "
1173 "is used as a variance in the fractal calculations.",
1175 gtk_tooltips_set_tip( GTK_TOOLTIPS( tooltips ),
1176 GTK_WIDGET( g_object_get_data( G_OBJECT( g_pWnd ), "random" ) ),
1177 "Seed value for the pseudo-random number generator.",
1180 gtk_tooltips_set_tip( GTK_TOOLTIPS( tooltips ),
1181 GTK_WIDGET( g_object_get_data( G_OBJECT( g_pWnd ), "hmin" ) ),
1182 "Minimum horizontal coordinate of the surface, i.e. X for a surface parallel to "
1183 "the XY or XZ planes, Y for a surface parallel to the YZ plane. For best results, "
1184 "the extents (maximum-minimum values) in a given direction should be evenly "
1185 "divisible by the number of divisions in that direction.",
1187 gtk_tooltips_set_tip( GTK_TOOLTIPS( tooltips ),
1188 GTK_WIDGET( g_object_get_data( G_OBJECT( g_pWnd ), "hmax" ) ),
1189 "Maximum horizontal coordinate of the surface, i.e. X for a surface parallel to "
1190 "the XY or XZ planes, Y for a surface parallel to the YZ plane. For best results, "
1191 "the extents (maximum-minimum values) in a given direction should be evenly "
1192 "divisible by the number of divisions in that direction.",
1194 gtk_tooltips_set_tip( GTK_TOOLTIPS( tooltips ),
1195 GTK_WIDGET( g_object_get_data( G_OBJECT( g_pWnd ), "vmin" ) ),
1196 "Minimum vertical coordinate of the surface, i.e. Y for a surface parallel to "
1197 "the XY plane, Z for a surface parallel to the XZ or YZ planes. For best results, "
1198 "the extents (maximum-minimum values) in a given direction should be evenly "
1199 "divisible by the number of divisions in that direction.",
1201 gtk_tooltips_set_tip( GTK_TOOLTIPS( tooltips ),
1202 GTK_WIDGET( g_object_get_data( G_OBJECT( g_pWnd ), "vmax" ) ),
1203 "Maximum vertical coordinate of the surface, i.e. Y for a surface parallel to "
1204 "the XY plane, Z for a surface parallel to the XZ or YZ planes. For best results, "
1205 "the extents (maximum-minimum values) in a given direction should be evenly "
1206 "divisible by the number of divisions in that direction.",
1208 gtk_tooltips_set_tip( GTK_TOOLTIPS( tooltips ),
1209 GTK_WIDGET( g_object_get_data( G_OBJECT( g_pWnd ), "nh" ) ),
1210 "Number of divisions in the horizontal direction. For best results, the extents "
1211 "in a given direction should be evenly divisible by the number of divisions in "
1214 gtk_tooltips_set_tip( GTK_TOOLTIPS( tooltips ),
1215 GTK_WIDGET( g_object_get_data( G_OBJECT( g_pWnd ), "nv" ) ),
1216 "Number of divisions in the vertical direction. For best results, the extents "
1217 "in a given direction should be evenly divisible by the number of divisions in "
1220 gtk_tooltips_set_tip( GTK_TOOLTIPS( tooltips ),
1221 GTK_WIDGET( g_object_get_data( G_OBJECT( g_pWnd ), "use_patches" ) ),
1222 "Produce one or more curved patches in the shape of your selected surface rather "
1223 "than producing solid brushes. Depending on the size of your surface (and the "
1224 "user's graphic detail settings, which you cannot control), curved surfaces will "
1225 "be represented in the game by a very large number of polygons. Read the warnings "
1226 "concerning curved surfaces on the GenSurf web page before using this feature.",
1228 gtk_tooltips_set_tip( GTK_TOOLTIPS( tooltips ),
1229 GTK_WIDGET( g_object_get_data( G_OBJECT( g_pWnd ), "decimate" ) ),
1230 "Use the slider to control the number of vertices discarded by GenSurf. For many "
1231 "surfaces, you can produce roughly the same shape surface with a high decimation "
1232 "value. This will generally result in a map with lower polygon counts (and better "
1233 "in-game performance). However, this feature should NOT be used for large terrain "
1236 gtk_tooltips_set_tip( GTK_TOOLTIPS( tooltips ),
1237 GTK_WIDGET( g_object_get_data( G_OBJECT( g_pWnd ), "z00" ) ),
1238 "Enter the height of the surface at the lower left corner. This value will likely "
1239 "be modified unless \"Linear Borders\" is checked.",
1241 gtk_tooltips_set_tip( GTK_TOOLTIPS( tooltips ),
1242 GTK_WIDGET( g_object_get_data( G_OBJECT( g_pWnd ), "z01" ) ),
1243 "Enter the height of the surface at the upper left corner. This value will likely "
1244 "be modified unless \"Linear Borders\" is checked.",
1246 gtk_tooltips_set_tip( GTK_TOOLTIPS( tooltips ),
1247 GTK_WIDGET( g_object_get_data( G_OBJECT( g_pWnd ), "z10" ) ),
1248 "Enter the height of the surface at the lower right corner. This value will likely "
1249 "be modified unless \"Linear Borders\" is checked.",
1251 gtk_tooltips_set_tip( GTK_TOOLTIPS( tooltips ),
1252 GTK_WIDGET( g_object_get_data( G_OBJECT( g_pWnd ), "z11" ) ),
1253 "Enter the height of the surface at the upper right corner. This value will likely "
1254 "be modified unless \"Linear Borders\" is checked.",
1256 gtk_tooltips_set_tip( GTK_TOOLTIPS( tooltips ),
1257 GTK_WIDGET( g_object_get_data( G_OBJECT( g_pWnd ), "linearborder" ) ),
1258 "Restrict the edges of the surface to a straight line. This will help match up "
1259 "brush edges if you drop this surface into another map.",
1262 gtk_tooltips_set_tip( GTK_TOOLTIPS( tooltips ),
1263 GTK_WIDGET( g_object_get_data( G_OBJECT( g_pWnd ), "bmp_file" ) ),
1264 "Type the name of an 8-bit bitmap image file, or click Browse to select an image "
1265 "from a list of those available on your system.",
1267 gtk_tooltips_set_tip( GTK_TOOLTIPS( tooltips ),
1268 GTK_WIDGET( g_object_get_data( G_OBJECT( g_pWnd ), "bmp_file_browse" ) ),
1269 "Select a bitmap image file from a list of those available on your system.",
1271 gtk_tooltips_set_tip( GTK_TOOLTIPS( tooltips ),
1272 GTK_WIDGET( g_object_get_data( G_OBJECT( g_pWnd ), "bmp_reload" ) ),
1273 "Reload the selected bitmap file after making changes in an external image editor.",
1275 gtk_tooltips_set_tip( GTK_TOOLTIPS( tooltips ),
1276 GTK_WIDGET( g_object_get_data( G_OBJECT( g_pWnd ), "bmp_black" ) ),
1277 "Enter the value corresponding to color index 0 in the bitmap file. For gray scale "
1278 "images, color 0 is normally black.",
1280 gtk_tooltips_set_tip( GTK_TOOLTIPS( tooltips ),
1281 GTK_WIDGET( g_object_get_data( G_OBJECT( g_pWnd ), "bmp_white" ) ),
1282 "Enter the value corresponding to color index 255 in the bitmap file. For gray scale "
1283 "images, color 255 is normally white.",
1286 gtk_tooltips_set_tip( GTK_TOOLTIPS( tooltips ),
1287 GTK_WIDGET( g_object_get_data( G_OBJECT( g_pWnd ), "fix_value" ) ),
1288 "Enter a value for the selected vertex. This value will not be adjusted when applying "
1289 "a waveform or roughness to the surface. Unlock this vertex (so that it will be "
1290 "adjusted normally) by clicking \"Free\". This vertex will influence vertices within "
1291 "the \"Range affected\" of this vertex.",
1293 gtk_tooltips_set_tip( GTK_TOOLTIPS( tooltips ),
1294 GTK_WIDGET( g_object_get_data( G_OBJECT( g_pWnd ), "fix_range" ) ),
1295 "Enter the range away from the selected vertex that other vertices will be affected. "
1296 "Use 0 if you don't want other vertices to be influenced by the currently selected "
1297 "one. Note: this box is disabled if you've chosen the fractal generator, as it uses "
1298 "a completely different method for determining values.",
1300 gtk_tooltips_set_tip( GTK_TOOLTIPS( tooltips ),
1301 GTK_WIDGET( g_object_get_data( G_OBJECT( g_pWnd ), "fix_rate" ) ),
1302 "Enter a rate of change for the surface affected by the fixed value. 0 gives a smooth "
1303 "sinusoidal curve, values less than 0 give progressively sharper spikes, and values "
1304 "greater than 0 take on a square shape. Values less than -30 or greater than 30 are "
1305 "set to -30 and 30, respectively. Note that this entry will have no effect unless "
1306 "you also specify a \"range affected\".",
1308 gtk_tooltips_set_tip( GTK_TOOLTIPS( tooltips ),
1309 GTK_WIDGET( g_object_get_data( G_OBJECT( g_pWnd ), "fix_free" ) ),
1310 "Click this to free (unlock the value of) the currently selected vertex.",
1312 gtk_tooltips_set_tip( GTK_TOOLTIPS( tooltips ),
1313 GTK_WIDGET( g_object_get_data( G_OBJECT( g_pWnd ), "fix_freeall" ) ),
1314 "Click this to free (unlock the values of) all vertices.",
1317 gtk_tooltips_set_tip( GTK_TOOLTIPS( tooltips ),
1318 GTK_WIDGET( g_object_get_data( G_OBJECT( g_pWnd ), "texture1" ) ),
1319 "Enter the name of the texture or shader used for the surface faces.",
1321 gtk_tooltips_set_tip( GTK_TOOLTIPS( tooltips ),
1322 GTK_WIDGET( g_object_get_data( G_OBJECT( g_pWnd ), "texture2" ) ),
1323 "Enter the name of the texture or shader used for faces other than the surface. Under "
1324 "normal circumstances this should be \"common/caulk\"",
1326 gtk_tooltips_set_tip( GTK_TOOLTIPS( tooltips ),
1327 GTK_WIDGET( g_object_get_data( G_OBJECT( g_pWnd ), "texture3" ) ),
1328 "Enter the name of the texture or shader used for \"steep\" surface faces, where \"steep\" "
1329 "is the angle specified below. If this entry is left blank or if the \"steep\" angle is 0, "
1330 "all surface faces will use the texture specified by \"Surface\".",
1333 gtk_tooltips_set_tip( GTK_TOOLTIPS( tooltips ),
1334 GTK_WIDGET( g_object_get_data( G_OBJECT( g_pWnd ), "detail" ) ),
1335 "Check this box to use the detail content property on the generated brushes. Compile "
1336 "times will be considerably shorter if the detail property is used, though the surface "
1337 "will not block visibility at all. If you use the detail property, you should make sure "
1338 "that \"common/caulk\" is used for the non-surface faces, or the polygon count will be "
1339 "much higher than necessary.",
1343 // =============================================================================
1344 // create main dialog
1346 GtkWidget* create_main_dialog(){
1347 GtkWidget *hbox2, *button, *notebook, *table2;
1348 GtkWidget *check, *spin, *radio, *label, *entry, *scale;
1352 const char *games[] = { "Quake 2", "Half-Life", "SiN", "Heretic 2", "Kingpin", "Genesis3D", "Quake 3 Arena" };
1353 const char *waveforms[] = { "Alternating hill/valley", "Cylindrical left-to-right", "Cylindrical top-to-bottom",
1354 "From bitmap", "Fractal" };
1355 const char *orientations[] = { "Ground surface", "Ceiling", "Wall facing 0", "Wall facing 90",
1356 "Wall facing 180","Wall facing 270" };
1358 auto dlg = g_pWnd = ui::Window( ui::window_type::TOP );
1359 gtk_window_set_title( GTK_WINDOW( dlg ), gszCaption );
1360 g_signal_connect( G_OBJECT( dlg ), "delete_event", G_CALLBACK( main_close ), NULL );
1361 // g_signal_connect (G_OBJECT (dlg), "destroy", G_CALLBACK (gtk_widget_destroy), NULL);
1362 gtk_window_set_transient_for( GTK_WINDOW( dlg ), GTK_WINDOW( g_pRadiantWnd ) );
1364 auto hbox = ui::HBox( FALSE, 5 );
1367 gtk_container_set_border_width( GTK_CONTAINER( hbox ), 5 );
1369 notebook = gtk_notebook_new();
1370 gtk_widget_show( notebook );
1371 gtk_box_pack_start( GTK_BOX( hbox ), notebook, TRUE, TRUE, 0 );
1372 g_signal_connect( G_OBJECT( notebook ), "switch_page",
1373 G_CALLBACK( switch_page ), NULL );
1374 gtk_notebook_set_tab_pos( GTK_NOTEBOOK( notebook ), GTK_POS_TOP );
1375 g_object_set_data( G_OBJECT( dlg ), "notebook", notebook );
1377 table = ui::Table( 2, 2, FALSE );
1378 gtk_widget_show( table );
1379 gtk_container_set_border_width( GTK_CONTAINER( table ), 5 );
1380 gtk_table_set_row_spacings( GTK_TABLE( table ), 5 );
1381 gtk_table_set_col_spacings( GTK_TABLE( table ), 5 );
1383 label = ui::Label( "General" );
1384 gtk_widget_show( label );
1385 gtk_notebook_append_page( GTK_NOTEBOOK( notebook ), table, label );
1387 auto frame = ui::Frame( "Game" );
1388 gtk_widget_show( frame );
1389 gtk_table_attach( GTK_TABLE( table ), frame, 0, 1, 0, 1,
1390 (GtkAttachOptions) ( GTK_EXPAND | GTK_FILL ),
1391 (GtkAttachOptions) ( GTK_EXPAND | GTK_FILL ), 0, 0 );
1393 auto vbox = ui::VBox( TRUE, 5 );
1396 gtk_container_set_border_width( GTK_CONTAINER( vbox ), 5 );
1398 for ( i = 0, group = NULL; i < NUMGAMES; i++ )
1400 radio = gtk_radio_button_new_with_label( group, games[i] );
1401 gtk_widget_show( radio );
1402 gtk_box_pack_start( GTK_BOX( vbox ), radio, TRUE, TRUE, 0 );
1403 group = gtk_radio_button_get_group( GTK_RADIO_BUTTON( radio ) );
1404 game_radios[i] = radio;
1405 g_signal_connect( G_OBJECT( radio ), "toggled", G_CALLBACK( general_game ), GINT_TO_POINTER( i ) );
1408 frame = ui::Frame( "Waveform" );
1409 gtk_widget_show( frame );
1410 gtk_table_attach( GTK_TABLE( table ), frame, 1, 2, 0, 1,
1411 (GtkAttachOptions) ( GTK_EXPAND | GTK_FILL ),
1412 (GtkAttachOptions) ( GTK_EXPAND | GTK_FILL ), 0, 0 );
1414 vbox = ui::VBox( TRUE, 5 );
1417 gtk_container_set_border_width( GTK_CONTAINER( vbox ), 5 );
1419 for ( i = 0, group = NULL; i < 5; i++ )
1421 radio = gtk_radio_button_new_with_label( group, waveforms[i] );
1422 gtk_widget_show( radio );
1423 gtk_box_pack_start( GTK_BOX( vbox ), radio, TRUE, TRUE, 0 );
1424 group = gtk_radio_button_get_group( GTK_RADIO_BUTTON( radio ) );
1425 wave_radios[i] = radio;
1426 g_signal_connect( G_OBJECT( radio ), "toggled", G_CALLBACK( general_wave ), GINT_TO_POINTER( i ) );
1429 frame = ui::Frame( "Orientation" );
1430 gtk_widget_show( frame );
1431 gtk_table_attach( GTK_TABLE( table ), frame, 0, 1, 1, 2,
1432 (GtkAttachOptions) ( GTK_EXPAND | GTK_FILL ),
1433 (GtkAttachOptions) ( GTK_EXPAND | GTK_FILL ), 0, 0 );
1435 vbox = ui::VBox( TRUE, 5 );
1438 gtk_container_set_border_width( GTK_CONTAINER( vbox ), 5 );
1440 for ( i = 0, group = NULL; i < 6; i++ )
1442 radio = gtk_radio_button_new_with_label( group, orientations[i] );
1443 gtk_widget_show( radio );
1444 gtk_box_pack_start( GTK_BOX( vbox ), radio, TRUE, TRUE, 0 );
1445 group = gtk_radio_button_get_group( GTK_RADIO_BUTTON( radio ) );
1446 plane_radios[i] = radio;
1447 g_signal_connect( G_OBJECT( radio ), "toggled", G_CALLBACK( general_plane ), GINT_TO_POINTER( i ) );
1450 table2 = ui::Table( 4, 2, FALSE );
1451 gtk_widget_show( table2 );
1452 gtk_table_set_row_spacings( GTK_TABLE( table2 ), 5 );
1453 gtk_table_set_col_spacings( GTK_TABLE( table2 ), 5 );
1454 gtk_table_attach( GTK_TABLE( table ), table2, 1, 2, 1, 2,
1455 (GtkAttachOptions) ( GTK_EXPAND | GTK_FILL ),
1456 (GtkAttachOptions) ( GTK_EXPAND | GTK_FILL ), 0, 0 );
1458 label = ui::Label( "Wavelength:" );
1459 gtk_widget_show( label );
1460 gtk_table_attach( GTK_TABLE( table2 ), label, 0, 1, 0, 1,
1461 (GtkAttachOptions) ( GTK_EXPAND | GTK_FILL ),
1462 (GtkAttachOptions) ( GTK_EXPAND | GTK_FILL ), 0, 0 );
1463 gtk_misc_set_alignment( GTK_MISC( label ), 1, 0.5 );
1464 gtk_label_set_justify( GTK_LABEL( label ), GTK_JUSTIFY_RIGHT );
1466 label = ui::Label( "Max. amplitude:" );
1467 gtk_widget_show( label );
1468 gtk_table_attach( GTK_TABLE( table2 ), label, 0, 1, 1, 2,
1469 (GtkAttachOptions) ( GTK_EXPAND | GTK_FILL ),
1470 (GtkAttachOptions) ( GTK_EXPAND | GTK_FILL ), 0, 0 );
1471 gtk_misc_set_alignment( GTK_MISC( label ), 1, 0.5 );
1472 gtk_label_set_justify( GTK_LABEL( label ), GTK_JUSTIFY_RIGHT );
1474 label = ui::Label( "Roughness:" );
1475 gtk_widget_show( label );
1476 gtk_table_attach( GTK_TABLE( table2 ), label, 0, 1, 2, 3,
1477 (GtkAttachOptions) ( GTK_EXPAND | GTK_FILL ),
1478 (GtkAttachOptions) ( GTK_EXPAND | GTK_FILL ), 0, 0 );
1479 gtk_misc_set_alignment( GTK_MISC( label ), 1, 0.5 );
1480 gtk_label_set_justify( GTK_LABEL( label ), GTK_JUSTIFY_RIGHT );
1482 label = ui::Label( "Random seed:" );
1483 gtk_widget_show( label );
1484 gtk_table_attach( GTK_TABLE( table2 ), label, 0, 1, 3, 4,
1485 (GtkAttachOptions) ( GTK_EXPAND | GTK_FILL ),
1486 (GtkAttachOptions) ( GTK_EXPAND | GTK_FILL ), 0, 0 );
1487 gtk_misc_set_alignment( GTK_MISC( label ), 1, 0.5 );
1488 gtk_label_set_justify( GTK_LABEL( label ), GTK_JUSTIFY_RIGHT );
1490 entry = ui::Entry();
1491 gtk_widget_show( entry );
1492 gtk_table_attach( GTK_TABLE( table2 ), entry, 1, 2, 0, 1,
1493 (GtkAttachOptions) ( GTK_EXPAND | GTK_FILL ),
1494 (GtkAttachOptions) ( GTK_EXPAND | GTK_FILL ), 0, 0 );
1495 gtk_widget_set_size_request( entry, 50, -1 );
1496 g_object_set_data( G_OBJECT( dlg ), "wavelength", entry );
1497 g_signal_connect( G_OBJECT( entry ), "focus_out_event", G_CALLBACK( doublevariable_entryfocusout ), &WaveLength );
1499 entry = ui::Entry();
1500 gtk_widget_show( entry );
1501 gtk_table_attach( GTK_TABLE( table2 ), entry, 1, 2, 1, 2,
1502 (GtkAttachOptions) ( GTK_EXPAND | GTK_FILL ),
1503 (GtkAttachOptions) ( GTK_EXPAND | GTK_FILL ), 0, 0 );
1504 gtk_widget_set_size_request( entry, 50, -1 );
1505 g_object_set_data( G_OBJECT( dlg ), "amplitude", entry );
1506 g_signal_connect( G_OBJECT( entry ), "focus_out_event", G_CALLBACK( doublevariable_entryfocusout ), &Amplitude );
1508 entry = ui::Entry();
1509 gtk_widget_show( entry );
1510 gtk_table_attach( GTK_TABLE( table2 ), entry, 1, 2, 2, 3,
1511 (GtkAttachOptions) ( GTK_EXPAND | GTK_FILL ),
1512 (GtkAttachOptions) ( GTK_EXPAND | GTK_FILL ), 0, 0 );
1513 gtk_widget_set_size_request( entry, 50, -1 );
1514 g_object_set_data( G_OBJECT( dlg ), "roughness", entry );
1515 g_signal_connect( G_OBJECT( entry ), "focus_out_event", G_CALLBACK( doublevariable_entryfocusout ), &Roughness );
1517 adj = ui::Adjustment( 1, 1, 32767, 1, 10, 0 );
1518 g_signal_connect( G_OBJECT( adj ), "value_changed", G_CALLBACK( general_random ), NULL );
1519 spin = ui::SpinButton( adj, 1, 0 );
1520 gtk_widget_show( spin );
1521 gtk_table_attach( GTK_TABLE( table2 ), spin, 1, 2, 3, 4,
1522 (GtkAttachOptions) ( GTK_EXPAND | GTK_FILL ),
1523 (GtkAttachOptions) ( GTK_EXPAND | GTK_FILL ), 0, 0 );
1524 gtk_widget_set_size_request( spin, 60, -1 );
1525 g_object_set_data( G_OBJECT( dlg ), "random", spin );
1527 vbox = ui::VBox( FALSE, 5 );
1528 gtk_widget_show( vbox );
1529 gtk_container_set_border_width( GTK_CONTAINER( vbox ), 5 );
1531 label = ui::Label( "Extents" );
1532 gtk_widget_show( label );
1533 gtk_notebook_append_page( GTK_NOTEBOOK( notebook ), vbox, label );
1535 hbox2 = ui::HBox( FALSE, 5 );
1536 gtk_widget_show( hbox2 );
1537 gtk_box_pack_start( GTK_BOX( vbox ), hbox2, FALSE, TRUE, 0 );
1539 frame = ui::Frame( "Extents" );
1540 gtk_widget_show( frame );
1541 gtk_box_pack_start( GTK_BOX( hbox2 ), frame, TRUE, TRUE, 0 );
1543 auto table = ui::Table( 3, 4, FALSE );
1545 gtk_container_set_border_width( GTK_CONTAINER( table ), 5 );
1547 gtk_table_set_row_spacings( GTK_TABLE( table ), 5 );
1548 gtk_table_set_col_spacings( GTK_TABLE( table ), 5 );
1550 label = ui::Label( "X:" );
1551 gtk_widget_show( label );
1552 gtk_table_attach( GTK_TABLE( table ), label, 0, 1, 1, 2,
1553 (GtkAttachOptions) ( GTK_FILL ),
1554 (GtkAttachOptions) ( GTK_FILL ), 0, 0 );
1555 g_object_set_data( G_OBJECT( dlg ), "hmin_text", label );
1557 label = ui::Label( "X:" );
1558 gtk_widget_show( label );
1559 gtk_table_attach( GTK_TABLE( table ), label, 2, 3, 1, 2,
1560 (GtkAttachOptions) ( GTK_FILL ),
1561 (GtkAttachOptions) ( GTK_FILL ), 0, 0 );
1562 g_object_set_data( G_OBJECT( dlg ), "hmax_text", label );
1564 label = ui::Label( "Y:" );
1565 gtk_widget_show( label );
1566 gtk_table_attach( GTK_TABLE( table ), label, 0, 1, 2, 3,
1567 (GtkAttachOptions) ( GTK_FILL ),
1568 (GtkAttachOptions) ( GTK_FILL ), 0, 0 );
1569 g_object_set_data( G_OBJECT( dlg ), "vmin_text", label );
1571 label = ui::Label( "Y:" );
1572 gtk_widget_show( label );
1573 gtk_table_attach( GTK_TABLE( table ), label, 2, 3, 2, 3,
1574 (GtkAttachOptions) ( GTK_FILL ),
1575 (GtkAttachOptions) ( GTK_FILL ), 0, 0 );
1576 g_object_set_data( G_OBJECT( dlg ), "vmax_text", label );
1578 label = ui::Label( "Lower-left" );
1579 gtk_widget_show( label );
1580 gtk_table_attach( GTK_TABLE( table ), label, 1, 2, 0, 1,
1581 (GtkAttachOptions) ( GTK_FILL ),
1582 (GtkAttachOptions) ( GTK_FILL ), 0, 0 );
1584 label = ui::Label( "Upper-right" );
1585 gtk_widget_show( label );
1586 gtk_table_attach( GTK_TABLE( table ), label, 3, 4, 0, 1,
1587 (GtkAttachOptions) ( GTK_FILL ),
1588 (GtkAttachOptions) ( GTK_FILL ), 0, 0 );
1590 entry = ui::Entry();
1591 gtk_widget_show( entry );
1592 gtk_table_attach( GTK_TABLE( table ), entry, 1, 2, 1, 2,
1593 (GtkAttachOptions) ( GTK_EXPAND | GTK_FILL ),
1594 (GtkAttachOptions) ( GTK_EXPAND | GTK_FILL ), 0, 0 );
1595 gtk_widget_set_size_request( entry, 50, -1 );
1596 g_object_set_data( G_OBJECT( dlg ), "hmin", entry );
1597 g_signal_connect( G_OBJECT( entry ), "focus_out_event", G_CALLBACK( doublevariable_entryfocusout ), &Hll );
1599 entry = ui::Entry();
1600 gtk_widget_show( entry );
1601 gtk_table_attach( GTK_TABLE( table ), entry, 3, 4, 1, 2,
1602 (GtkAttachOptions) ( GTK_EXPAND | GTK_FILL ),
1603 (GtkAttachOptions) ( GTK_EXPAND | GTK_FILL ), 0, 0 );
1604 gtk_widget_set_size_request( entry, 50, -1 );
1605 g_object_set_data( G_OBJECT( dlg ), "hmax", entry );
1606 g_signal_connect( G_OBJECT( entry ), "focus_out_event", G_CALLBACK( doublevariable_entryfocusout ), &Hur );
1608 entry = ui::Entry();
1609 gtk_widget_show( entry );
1610 gtk_table_attach( GTK_TABLE( table ), entry, 1, 2, 2, 3,
1611 (GtkAttachOptions) ( GTK_EXPAND | GTK_FILL ),
1612 (GtkAttachOptions) ( GTK_EXPAND | GTK_FILL ), 0, 0 );
1613 gtk_widget_set_size_request( entry, 50, -1 );
1614 g_object_set_data( G_OBJECT( dlg ), "vmin", entry );
1615 g_signal_connect( G_OBJECT( entry ), "focus_out_event", G_CALLBACK( doublevariable_entryfocusout ), &Vll );
1617 entry = ui::Entry();
1618 gtk_widget_show( entry );
1619 gtk_table_attach( GTK_TABLE( table ), entry, 3, 4, 2, 3,
1620 (GtkAttachOptions) ( GTK_EXPAND | GTK_FILL ),
1621 (GtkAttachOptions) ( GTK_EXPAND | GTK_FILL ), 0, 0 );
1622 gtk_widget_set_size_request( entry, 50, -1 );
1623 g_object_set_data( G_OBJECT( dlg ), "vmax", entry );
1624 g_signal_connect( G_OBJECT( entry ), "focus_out_event", G_CALLBACK( doublevariable_entryfocusout ), &Vur );
1626 frame = ui::Frame( "Divisions" );
1627 gtk_widget_show( frame );
1628 gtk_box_pack_start( GTK_BOX( hbox2 ), frame, TRUE, TRUE, 0 );
1630 table = ui::Table( 2, 2, FALSE );
1632 gtk_container_set_border_width( GTK_CONTAINER( table ), 5 );
1634 gtk_table_set_row_spacings( GTK_TABLE( table ), 5 );
1635 gtk_table_set_col_spacings( GTK_TABLE( table ), 5 );
1637 label = ui::Label( "X:" );
1638 gtk_widget_show( label );
1639 gtk_table_attach( GTK_TABLE( table ), label, 0, 1, 0, 1,
1640 (GtkAttachOptions) ( GTK_FILL ),
1641 (GtkAttachOptions) ( GTK_EXPAND | GTK_FILL ), 0, 0 );
1642 g_object_set_data( G_OBJECT( dlg ), "nh_text", label );
1644 label = ui::Label( "Y:" );
1645 gtk_widget_show( label );
1646 gtk_table_attach( GTK_TABLE( table ), label, 0, 1, 1, 2,
1647 (GtkAttachOptions) ( GTK_FILL ),
1648 (GtkAttachOptions) ( GTK_EXPAND | GTK_FILL ), 0, 0 );
1649 g_object_set_data( G_OBJECT( dlg ), "nv_text", label );
1651 adj = ui::Adjustment( 8, 1, MAX_ROWS, 1, 10, 0 );
1652 g_signal_connect( G_OBJECT( adj ), "value_changed", G_CALLBACK( extents_nhnv_spin ), &NH );
1653 spin = ui::SpinButton( adj, 1, 0 );
1654 gtk_widget_show( spin );
1655 gtk_table_attach( GTK_TABLE( table ), spin, 1, 2, 0, 1,
1656 (GtkAttachOptions) ( GTK_EXPAND | GTK_FILL ),
1657 (GtkAttachOptions) ( GTK_EXPAND | GTK_FILL ), 0, 0 );
1658 gtk_widget_set_size_request( spin, 60, -1 );
1659 g_object_set_data( G_OBJECT( dlg ), "nh", spin );
1661 adj = ui::Adjustment( 8, 1, MAX_ROWS, 1, 10, 0 );
1662 g_signal_connect( G_OBJECT( adj ), "value_changed", G_CALLBACK( extents_nhnv_spin ), &NV );
1663 spin = ui::SpinButton( adj, 1, 0 );
1664 gtk_widget_show( spin );
1665 gtk_table_attach( GTK_TABLE( table ), spin, 1, 2, 1, 2,
1666 (GtkAttachOptions) ( GTK_EXPAND | GTK_FILL ),
1667 (GtkAttachOptions) ( GTK_EXPAND | GTK_FILL ), 0, 0 );
1668 gtk_widget_set_size_request( spin, 60, -1 );
1669 g_object_set_data( G_OBJECT( dlg ), "nv", spin );
1671 check = ui::CheckButton( "Use Bezier patches" );
1672 gtk_widget_show( check );
1673 gtk_box_pack_start( GTK_BOX( vbox ), check, FALSE, TRUE, 0 );
1674 g_object_set_data( G_OBJECT( dlg ), "use_patches", check );
1675 g_signal_connect( G_OBJECT( check ), "toggled", G_CALLBACK( extents_use_patches ), NULL );
1677 // ^Fishman - Snap to grid, replaced scroll bar with a texbox.
1678 label = ui::Label( "Snap to grid:" );
1679 gtk_widget_show( label );
1680 gtk_box_pack_start( GTK_BOX( vbox ), label, FALSE, TRUE, 0 );
1681 gtk_object_set_data( GTK_OBJECT( dlg ), "snap_text", label );
1683 adj = ui::Adjustment( 8, 0, 256, 1, 10, 0 );
1684 g_signal_connect( G_OBJECT( adj ), "value_changed", G_CALLBACK( extents_snaptogrid_spin ), &SP );
1685 spin = ui::SpinButton( adj, 1, 0 );
1686 gtk_widget_show( spin );
1687 gtk_box_pack_start( GTK_BOX( vbox ), spin, FALSE, TRUE, 0 );
1688 gtk_widget_set_size_request( spin, 60, -1 );
1689 g_object_set_data( G_OBJECT( dlg ), "sp", spin );
1690 // ^Fishman - End of Snap to grid code.
1692 hbox2 = ui::HBox( FALSE, 5 );
1693 gtk_widget_show( hbox2 );
1694 gtk_box_pack_start( GTK_BOX( vbox ), hbox2, FALSE, TRUE, 10 );
1696 label = ui::Label( "Decimate:" );
1697 gtk_widget_show( label );
1698 gtk_box_pack_start( GTK_BOX( hbox2 ), label, FALSE, TRUE, 0 );
1700 adj = ui::Adjustment( 0, 0, 110, 1, 10, 0 );
1701 g_signal_connect( G_OBJECT( adj ), "value_changed", G_CALLBACK( extents_decimate ), NULL );
1702 g_object_set_data( G_OBJECT( dlg ), "decimate_adj", adj );
1703 scale = ui::HScale( adj );
1704 gtk_widget_show( scale );
1705 gtk_box_pack_start( GTK_BOX( hbox2 ), scale, TRUE, TRUE, 0 );
1706 gtk_scale_set_value_pos( GTK_SCALE( scale ), GTK_POS_RIGHT );
1707 gtk_scale_set_digits( GTK_SCALE( scale ), 0 );
1708 g_object_set_data( G_OBJECT( dlg ), "decimate", scale );
1710 frame = ui::Frame( "Corner values" );
1711 gtk_widget_show( frame );
1712 gtk_box_pack_start( GTK_BOX( vbox ), frame, FALSE, TRUE, 0 );
1714 table = ui::Table( 3, 4, FALSE );
1716 gtk_container_set_border_width( GTK_CONTAINER( table ), 5 );
1718 gtk_table_set_row_spacings( GTK_TABLE( table ), 5 );
1719 gtk_table_set_col_spacings( GTK_TABLE( table ), 5 );
1721 label = ui::Label( "Upper-left:" );
1722 gtk_widget_show( label );
1723 gtk_table_attach( GTK_TABLE( table ), label, 0, 1, 0, 1,
1724 (GtkAttachOptions) ( GTK_FILL ),
1725 (GtkAttachOptions) ( GTK_FILL ), 0, 0 );
1727 label = ui::Label( "Lower-left:" );
1728 gtk_widget_show( label );
1729 gtk_table_attach( GTK_TABLE( table ), label, 0, 1, 1, 2,
1730 (GtkAttachOptions) ( GTK_FILL ),
1731 (GtkAttachOptions) ( GTK_FILL ), 0, 0 );
1733 label = ui::Label( "Upper-right:" );
1734 gtk_widget_show( label );
1735 gtk_table_attach( GTK_TABLE( table ), label, 2, 3, 0, 1,
1736 (GtkAttachOptions) ( GTK_FILL ),
1737 (GtkAttachOptions) ( GTK_FILL ), 0, 0 );
1739 label = ui::Label( "Lower-right:" );
1740 gtk_widget_show( label );
1741 gtk_table_attach( GTK_TABLE( table ), label, 2, 3, 1, 2,
1742 (GtkAttachOptions) ( GTK_FILL ),
1743 (GtkAttachOptions) ( GTK_FILL ), 0, 0 );
1745 entry = ui::Entry();
1746 gtk_widget_show( entry );
1747 gtk_table_attach( GTK_TABLE( table ), entry, 1, 2, 0, 1,
1748 (GtkAttachOptions) ( GTK_EXPAND | GTK_FILL ),
1749 (GtkAttachOptions) ( GTK_EXPAND | GTK_FILL ), 0, 0 );
1750 gtk_widget_set_size_request( entry, 50, -1 );
1751 g_object_set_data( G_OBJECT( dlg ), "z01", entry );
1752 g_signal_connect( G_OBJECT( entry ), "focus_out_event", G_CALLBACK( doublevariable_entryfocusout ), &Z01 );
1754 entry = ui::Entry();
1755 gtk_widget_show( entry );
1756 gtk_table_attach( GTK_TABLE( table ), entry, 1, 2, 1, 2,
1757 (GtkAttachOptions) ( GTK_EXPAND | GTK_FILL ),
1758 (GtkAttachOptions) ( GTK_EXPAND | GTK_FILL ), 0, 0 );
1759 gtk_widget_set_size_request( entry, 50, -1 );
1760 g_object_set_data( G_OBJECT( dlg ), "z00", entry );
1761 g_signal_connect( G_OBJECT( entry ), "focus_out_event", G_CALLBACK( doublevariable_entryfocusout ), &Z00 );
1763 entry = ui::Entry();
1764 gtk_widget_show( entry );
1765 gtk_table_attach( GTK_TABLE( table ), entry, 3, 4, 0, 1,
1766 (GtkAttachOptions) ( GTK_EXPAND | GTK_FILL ),
1767 (GtkAttachOptions) ( GTK_EXPAND | GTK_FILL ), 0, 0 );
1768 gtk_widget_set_size_request( entry, 50, -1 );
1769 g_object_set_data( G_OBJECT( dlg ), "z11", entry );
1770 g_signal_connect( G_OBJECT( entry ), "focus_out_event", G_CALLBACK( doublevariable_entryfocusout ), &Z11 );
1772 entry = ui::Entry();
1773 gtk_widget_show( entry );
1774 gtk_table_attach( GTK_TABLE( table ), entry, 3, 4, 1, 2,
1775 (GtkAttachOptions) ( GTK_EXPAND | GTK_FILL ),
1776 (GtkAttachOptions) ( GTK_EXPAND | GTK_FILL ), 0, 0 );
1777 gtk_widget_set_size_request( entry, 50, -1 );
1778 g_object_set_data( G_OBJECT( dlg ), "z10", entry );
1779 g_signal_connect( G_OBJECT( entry ), "focus_out_event", G_CALLBACK( doublevariable_entryfocusout ), &Z10 );
1781 check = ui::CheckButton( "Linear borders" );
1782 gtk_widget_show( check );
1783 gtk_table_attach( GTK_TABLE( table ), check, 0, 4, 2, 3,
1784 (GtkAttachOptions) ( GTK_EXPAND | GTK_FILL ),
1785 (GtkAttachOptions) ( GTK_EXPAND | GTK_FILL ), 0, 0 );
1786 g_object_set_data( G_OBJECT( dlg ), "linearborder", check );
1787 g_signal_connect( G_OBJECT( check ), "toggled", G_CALLBACK( extents_linearborder ), NULL );
1789 vbox = ui::VBox( FALSE, 10 );
1790 gtk_widget_show( vbox );
1791 gtk_container_set_border_width( GTK_CONTAINER( vbox ), 5 );
1793 label = ui::Label( "Bitmap" );
1794 gtk_widget_show( label );
1795 gtk_notebook_append_page( GTK_NOTEBOOK( notebook ), vbox, label );
1797 label = ui::Label( "" );
1798 gtk_widget_show( label );
1799 gtk_box_pack_start( GTK_BOX( vbox ), label, FALSE, TRUE, 0 );
1800 g_object_set_data( G_OBJECT( dlg ), "bmp_note", label );
1802 table = ui::Table( 2, 2, FALSE );
1803 gtk_widget_show( table );
1804 gtk_container_set_border_width( GTK_CONTAINER( table ), 5 );
1805 gtk_box_pack_start( GTK_BOX( vbox ), table, FALSE, TRUE, 0 );
1806 gtk_table_set_row_spacings( GTK_TABLE( table ), 5 );
1807 gtk_table_set_col_spacings( GTK_TABLE( table ), 5 );
1809 label = ui::Label( "Filename:" );
1810 gtk_widget_show( label );
1811 gtk_table_attach( GTK_TABLE( table ), label, 0, 1, 0, 1,
1812 (GtkAttachOptions) ( GTK_FILL ),
1813 (GtkAttachOptions) ( GTK_FILL ), 0, 0 );
1814 g_object_set_data( G_OBJECT( dlg ), "bmp_text1", label );
1816 entry = ui::Entry();
1817 gtk_widget_show( entry );
1818 gtk_table_attach( GTK_TABLE( table ), entry, 1, 2, 0, 1,
1819 (GtkAttachOptions) ( GTK_EXPAND | GTK_FILL ),
1820 (GtkAttachOptions) ( GTK_FILL ), 0, 0 );
1821 g_object_set_data( G_OBJECT( dlg ), "bmp_file", entry );
1822 g_signal_connect( G_OBJECT( entry ), "focus_out_event", G_CALLBACK( bitmap_file_entryfocusout ), NULL );
1824 hbox2 = ui::HBox( TRUE, 5 );
1825 gtk_widget_show( hbox2 );
1826 gtk_table_attach( GTK_TABLE( table ), hbox2, 1, 2, 1, 2,
1827 (GtkAttachOptions) ( 0 ),
1828 (GtkAttachOptions) ( GTK_EXPAND | GTK_FILL ), 0, 0 );
1830 button = ui::Button( "Browse..." );
1831 gtk_widget_show( button );
1832 gtk_box_pack_start( GTK_BOX( hbox2 ), button, FALSE, FALSE, 0 );
1833 gtk_widget_set_size_request( button, 60, -1 );
1834 g_object_set_data( G_OBJECT( dlg ), "bmp_file_browse", button );
1835 g_signal_connect( G_OBJECT( button ), "clicked", G_CALLBACK( bitmap_browse ), NULL );
1837 button = ui::Button( "Reload" );
1838 gtk_widget_show( button );
1839 gtk_box_pack_start( GTK_BOX( hbox2 ), button, FALSE, FALSE, 0 );
1840 gtk_widget_set_size_request( button, 60, -1 );
1841 g_object_set_data( G_OBJECT( dlg ), "bmp_reload", button );
1842 g_signal_connect( G_OBJECT( button ), "clicked", G_CALLBACK( bitmap_reload ), NULL );
1844 table = ui::Table( 2, 2, TRUE );
1845 gtk_widget_show( table );
1846 gtk_container_set_border_width( GTK_CONTAINER( table ), 5 );
1847 gtk_box_pack_start( GTK_BOX( vbox ), table, FALSE, TRUE, 0 );
1848 gtk_table_set_row_spacings( GTK_TABLE( table ), 5 );
1849 gtk_table_set_col_spacings( GTK_TABLE( table ), 5 );
1851 label = ui::Label( "Map color 0 to:" );
1852 gtk_widget_show( label );
1853 gtk_table_attach( GTK_TABLE( table ), label, 0, 1, 0, 1,
1854 (GtkAttachOptions) ( GTK_FILL | GTK_EXPAND ),
1855 (GtkAttachOptions) ( GTK_FILL ), 0, 0 );
1856 g_object_set_data( G_OBJECT( dlg ), "bmp_text2", label );
1857 gtk_misc_set_alignment( GTK_MISC( label ), 1, 0.5 );
1858 gtk_label_set_justify( GTK_LABEL( label ), GTK_JUSTIFY_RIGHT );
1860 label = ui::Label( "Map color 255 to:" );
1861 gtk_widget_show( label );
1862 gtk_table_attach( GTK_TABLE( table ), label, 0, 1, 1, 2,
1863 (GtkAttachOptions) ( GTK_FILL | GTK_EXPAND ),
1864 (GtkAttachOptions) ( GTK_FILL ), 0, 0 );
1865 g_object_set_data( G_OBJECT( dlg ), "bmp_text3", label );
1866 gtk_misc_set_alignment( GTK_MISC( label ), 1, 0.5 );
1867 gtk_label_set_justify( GTK_LABEL( label ), GTK_JUSTIFY_RIGHT );
1869 hbox2 = ui::HBox( FALSE, 5 );
1870 gtk_widget_show( hbox2 );
1871 gtk_table_attach( GTK_TABLE( table ), hbox2, 1, 2, 0, 1,
1872 (GtkAttachOptions) ( GTK_EXPAND | GTK_FILL ),
1873 (GtkAttachOptions) ( GTK_EXPAND | GTK_FILL ), 0, 0 );
1875 entry = ui::Entry();
1876 gtk_widget_show( entry );
1877 gtk_box_pack_start( GTK_BOX( hbox2 ), entry, FALSE, FALSE, 0 );
1878 gtk_widget_set_size_request( entry, 50, -1 );
1879 g_object_set_data( G_OBJECT( dlg ), "bmp_black", entry );
1880 g_signal_connect( G_OBJECT( entry ), "focus_out_event", G_CALLBACK( doublevariable_entryfocusout ), &gbmp.black_value );
1882 hbox2 = ui::HBox( FALSE, 5 );
1883 gtk_widget_show( hbox2 );
1884 gtk_table_attach( GTK_TABLE( table ), hbox2, 1, 2, 1, 2,
1885 (GtkAttachOptions) ( GTK_EXPAND | GTK_FILL ),
1886 (GtkAttachOptions) ( GTK_EXPAND | GTK_FILL ), 0, 0 );
1888 entry = ui::Entry();
1889 gtk_widget_show( entry );
1890 gtk_box_pack_start( GTK_BOX( hbox2 ), entry, FALSE, FALSE, 0 );
1891 gtk_widget_set_size_request( entry, 50, -1 );
1892 g_object_set_data( G_OBJECT( dlg ), "bmp_white", entry );
1893 g_signal_connect( G_OBJECT( entry ), "focus_out_event", G_CALLBACK( doublevariable_entryfocusout ), &gbmp.white_value );
1895 vbox = ui::VBox( FALSE, 10 );
1896 gtk_widget_show( vbox );
1897 gtk_container_set_border_width( GTK_CONTAINER( vbox ), 5 );
1899 label = ui::Label( "Fix Points" );
1900 gtk_widget_show( label );
1901 gtk_notebook_append_page( GTK_NOTEBOOK( notebook ), vbox, label );
1903 label = ui::Label( "Click on a vertex in the lower half of the preview window,\n"
1904 "then use the arrow keys or text box to assign a value.\n"
1905 "Use Ctrl+Click to select multiple vertices/toggle a\n"
1906 "selection. Use Shift+Click to select a range of vertices.\n\n"
1907 "Click \"Free\" to unlock a vertex. Vertices within \"Range\n"
1908 "affected\" will be influenced by this vertex." );
1909 gtk_widget_show( label );
1910 gtk_box_pack_start( GTK_BOX( vbox ), label, FALSE, TRUE, 0 );
1912 table = ui::Table( 3, 3, FALSE );
1913 gtk_widget_show( table );
1914 gtk_container_set_border_width( GTK_CONTAINER( table ), 5 );
1915 gtk_box_pack_start( GTK_BOX( vbox ), table, FALSE, TRUE, 0 );
1916 gtk_table_set_row_spacings( GTK_TABLE( table ), 5 );
1917 gtk_table_set_col_spacings( GTK_TABLE( table ), 5 );
1919 label = ui::Label( "Value:" );
1920 gtk_widget_show( label );
1921 gtk_table_attach( GTK_TABLE( table ), label, 0, 1, 0, 1,
1922 (GtkAttachOptions) ( GTK_FILL ),
1923 (GtkAttachOptions) ( GTK_FILL ), 0, 0 );
1924 gtk_misc_set_alignment( GTK_MISC( label ), 1, 0.5 );
1925 g_object_set_data( G_OBJECT( dlg ), "fix_value_text", label );
1927 label = ui::Label( "Range affected:" );
1928 gtk_widget_show( label );
1929 gtk_table_attach( GTK_TABLE( table ), label, 0, 1, 1, 2,
1930 (GtkAttachOptions) ( GTK_FILL ),
1931 (GtkAttachOptions) ( GTK_FILL ), 0, 0 );
1932 gtk_misc_set_alignment( GTK_MISC( label ), 1, 0.5 );
1933 g_object_set_data( G_OBJECT( dlg ), "fix_range_text", label );
1935 label = ui::Label( "Rate of change:" );
1936 gtk_widget_show( label );
1937 gtk_table_attach( GTK_TABLE( table ), label, 0, 1, 2, 3,
1938 (GtkAttachOptions) ( GTK_FILL ),
1939 (GtkAttachOptions) ( GTK_FILL ), 0, 0 );
1940 gtk_misc_set_alignment( GTK_MISC( label ), 1, 0.5 );
1941 g_object_set_data( G_OBJECT( dlg ), "fix_rate_text", label );
1943 adj = ui::Adjustment( 0, -65536, 65536, 1, 16, 0 );
1944 g_signal_connect( G_OBJECT( adj ), "value_changed", G_CALLBACK( fix_value_changed ), NULL );
1945 spin = ui::SpinButton( adj, 1, 0 );
1946 gtk_widget_show( spin );
1947 gtk_table_attach( GTK_TABLE( table ), spin, 1, 2, 0, 1,
1948 (GtkAttachOptions) ( GTK_EXPAND ),
1949 (GtkAttachOptions) ( GTK_EXPAND ), 0, 0 );
1950 gtk_widget_set_size_request( spin, 60, -1 );
1951 g_object_set_data( G_OBJECT( dlg ), "fix_value", spin );
1952 g_signal_connect( G_OBJECT( spin ), "focus_out_event", G_CALLBACK( fix_value_entryfocusout ), NULL );
1954 entry = ui::Entry();
1955 gtk_widget_show( entry );
1956 gtk_table_attach( GTK_TABLE( table ), entry, 1, 2, 1, 2,
1957 (GtkAttachOptions) ( GTK_EXPAND ),
1958 (GtkAttachOptions) ( GTK_FILL ), 0, 0 );
1959 gtk_widget_set_size_request( entry, 60, -1 );
1960 g_object_set_data( G_OBJECT( dlg ), "fix_range", entry );
1961 g_signal_connect( G_OBJECT( entry ), "focus_out_event", G_CALLBACK( fix_range_entryfocusout ), NULL );
1963 entry = ui::Entry();
1964 gtk_widget_show( entry );
1965 gtk_table_attach( GTK_TABLE( table ), entry, 1, 2, 2, 3,
1966 (GtkAttachOptions) ( GTK_EXPAND ),
1967 (GtkAttachOptions) ( GTK_FILL ), 0, 0 );
1968 gtk_widget_set_size_request( entry, 60, -1 );
1969 g_object_set_data( G_OBJECT( dlg ), "fix_rate", entry );
1970 g_signal_connect( G_OBJECT( entry ), "focus_out_event", G_CALLBACK( fix_rate_entryfocusout ), NULL );
1972 button = ui::Button( "Free" );
1973 gtk_widget_show( button );
1974 gtk_table_attach( GTK_TABLE( table ), button, 2, 3, 0, 1,
1975 (GtkAttachOptions) ( GTK_EXPAND ),
1976 (GtkAttachOptions) ( GTK_FILL ), 0, 0 );
1977 gtk_widget_set_size_request( button, 60, -1 );
1978 g_object_set_data( G_OBJECT( dlg ), "fix_free", button );
1979 g_signal_connect( G_OBJECT( button ), "clicked", G_CALLBACK( fix_free ), NULL );
1981 button = ui::Button( "Free All" );
1982 gtk_widget_show( button );
1983 gtk_table_attach( GTK_TABLE( table ), button, 2, 3, 1, 2,
1984 (GtkAttachOptions) ( GTK_EXPAND ),
1985 (GtkAttachOptions) ( GTK_FILL ), 0, 0 );
1986 gtk_widget_set_size_request( button, 60, -1 );
1987 g_object_set_data( G_OBJECT( dlg ), "fix_freeall", button );
1988 g_signal_connect( G_OBJECT( button ), "clicked", G_CALLBACK( fix_freeall ), NULL );
1990 vbox = ui::VBox( FALSE, 10 );
1991 gtk_widget_show( vbox );
1992 gtk_container_set_border_width( GTK_CONTAINER( vbox ), 5 );
1994 label = ui::Label( "Texture" );
1995 gtk_widget_show( label );
1996 gtk_notebook_append_page( GTK_NOTEBOOK( notebook ), vbox, label );
1998 // ^Fishman - Modified to add more labels and textboxes.
1999 table = ui::Table( 5, 2, FALSE );
2000 gtk_widget_show( table );
2001 gtk_box_pack_start( GTK_BOX( vbox ), table, FALSE, TRUE, 0 );
2002 gtk_table_set_row_spacings( GTK_TABLE( table ), 5 );
2003 gtk_table_set_col_spacings( GTK_TABLE( table ), 5 );
2005 label = ui::Label( "Surface:" );
2006 gtk_widget_show( label );
2007 gtk_table_attach( GTK_TABLE( table ), label, 0, 1, 0, 1,
2008 (GtkAttachOptions) ( GTK_FILL ),
2009 (GtkAttachOptions) ( GTK_FILL ), 0, 0 );
2010 gtk_misc_set_alignment( GTK_MISC( label ), 1, 0.5 );
2012 label = ui::Label( "Other:" );
2013 gtk_widget_show( label );
2014 gtk_table_attach( GTK_TABLE( table ), label, 0, 1, 1, 2,
2015 (GtkAttachOptions) ( GTK_FILL ),
2016 (GtkAttachOptions) ( GTK_FILL ), 0, 0 );
2017 gtk_misc_set_alignment( GTK_MISC( label ), 1, 0.5 );
2019 label = ui::Label( "Steep:" );
2020 gtk_widget_show( label );
2021 gtk_table_attach( GTK_TABLE( table ), label, 0, 1, 2, 3,
2022 (GtkAttachOptions) ( GTK_FILL ),
2023 (GtkAttachOptions) ( GTK_FILL ), 0, 0 );
2024 gtk_misc_set_alignment( GTK_MISC( label ), 1, 0.5 );
2026 entry = ui::Entry();
2027 gtk_widget_show( entry );
2028 gtk_table_attach( GTK_TABLE( table ), entry, 1, 2, 0, 1,
2029 (GtkAttachOptions) ( GTK_EXPAND | GTK_FILL ),
2030 (GtkAttachOptions) ( GTK_FILL ), 0, 0 );
2031 gtk_widget_set_size_request( entry, 60, -1 );
2032 g_object_set_data( G_OBJECT( dlg ), "texture1", entry );
2033 g_signal_connect( G_OBJECT( entry ), "focus_out_event", G_CALLBACK( texture_entryfocusout ), GINT_TO_POINTER( 0 ) );
2035 entry = ui::Entry();
2036 gtk_widget_show( entry );
2037 gtk_table_attach( GTK_TABLE( table ), entry, 1, 2, 1, 2,
2038 (GtkAttachOptions) ( GTK_EXPAND | GTK_FILL ),
2039 (GtkAttachOptions) ( GTK_FILL ), 0, 0 );
2040 gtk_widget_set_size_request( entry, 60, -1 );
2041 g_object_set_data( G_OBJECT( dlg ), "texture2", entry );
2042 g_signal_connect( G_OBJECT( entry ), "focus_out_event", G_CALLBACK( texture_entryfocusout ), GINT_TO_POINTER( 1 ) );
2044 entry = ui::Entry();
2045 gtk_widget_show( entry );
2046 gtk_table_attach( GTK_TABLE( table ), entry, 1, 2, 2, 3,
2047 (GtkAttachOptions) ( GTK_EXPAND | GTK_FILL ),
2048 (GtkAttachOptions) ( GTK_FILL ), 0, 0 );
2049 gtk_widget_set_size_request( entry, 60, -1 );
2050 g_object_set_data( G_OBJECT( dlg ), "texture3", entry );
2052 hbox2 = ui::HBox( FALSE, 5 );
2053 gtk_widget_show( hbox2 );
2054 gtk_box_pack_start( GTK_BOX( vbox ), hbox2, FALSE, TRUE, 0 );
2056 label = ui::Label( "\"Steep\" angle:" );
2057 gtk_widget_show( label );
2058 gtk_box_pack_start( GTK_BOX( hbox2 ), label, FALSE, TRUE, 0 );
2060 adj = ui::Adjustment( 60, 0, 90, 1, 10, 0 );
2061 spin = ui::SpinButton( adj, 1, 0 );
2062 gtk_widget_show( spin );
2063 gtk_box_pack_start( GTK_BOX( hbox2 ), spin, FALSE, TRUE, 0 );
2064 g_object_set_data( G_OBJECT( dlg ), "tex_slant", spin );
2066 table = ui::Table( 2, 4, TRUE );
2067 gtk_widget_show( table );
2068 gtk_box_pack_start( GTK_BOX( vbox ), table, FALSE, TRUE, 0 );
2069 gtk_table_set_row_spacings( GTK_TABLE( table ), 5 );
2070 gtk_table_set_col_spacings( GTK_TABLE( table ), 5 );
2072 label = ui::Label( "Offset <h,v>" );
2073 gtk_widget_show( label );
2074 gtk_table_attach( GTK_TABLE( table ), label, 0, 2, 0, 1,
2075 (GtkAttachOptions) ( GTK_FILL ),
2076 (GtkAttachOptions) ( GTK_FILL ), 0, 0 );
2078 label = ui::Label( "Scale <h,v>" );
2079 gtk_widget_show( label );
2080 gtk_table_attach( GTK_TABLE( table ), label, 2, 4, 0, 1,
2081 (GtkAttachOptions) ( GTK_FILL ),
2082 (GtkAttachOptions) ( GTK_FILL ), 0, 0 );
2084 entry = ui::Entry();
2085 gtk_widget_show( entry );
2086 gtk_table_attach( GTK_TABLE( table ), entry, 0, 1, 1, 2,
2087 (GtkAttachOptions) ( GTK_EXPAND | GTK_FILL ),
2088 (GtkAttachOptions) ( GTK_FILL ), 0, 0 );
2089 gtk_widget_set_size_request( entry, 60, -1 );
2090 g_object_set_data( G_OBJECT( dlg ), "texoffsetx", entry );
2092 entry = ui::Entry();
2093 gtk_widget_show( entry );
2094 gtk_table_attach( GTK_TABLE( table ), entry, 1, 2, 1, 2,
2095 (GtkAttachOptions) ( GTK_EXPAND | GTK_FILL ),
2096 (GtkAttachOptions) ( GTK_FILL ), 0, 0 );
2097 gtk_widget_set_size_request( entry, 60, -1 );
2098 g_object_set_data( G_OBJECT( dlg ), "texoffsety", entry );
2100 entry = ui::Entry();
2101 gtk_widget_show( entry );
2102 gtk_table_attach( GTK_TABLE( table ), entry, 2, 3, 1, 2,
2103 (GtkAttachOptions) ( GTK_EXPAND | GTK_FILL ),
2104 (GtkAttachOptions) ( GTK_FILL ), 0, 0 );
2105 gtk_widget_set_size_request( entry, 60, -1 );
2106 g_object_set_data( G_OBJECT( dlg ), "texscalex", entry );
2108 entry = ui::Entry();
2109 gtk_widget_show( entry );
2110 gtk_table_attach( GTK_TABLE( table ), entry, 3, 4, 1, 2,
2111 (GtkAttachOptions) ( GTK_EXPAND | GTK_FILL ),
2112 (GtkAttachOptions) ( GTK_FILL ), 0, 0 );
2113 gtk_widget_set_size_request( entry, 60, -1 );
2114 g_object_set_data( G_OBJECT( dlg ), "texscaley", entry );
2118 check = ui::CheckButton( "Use detail brushes" );
2119 gtk_widget_show( check );
2120 gtk_box_pack_start( GTK_BOX( vbox ), check, FALSE, TRUE, 0 );
2121 g_object_set_data( G_OBJECT( dlg ), "detail", check );
2122 g_signal_connect( G_OBJECT( check ), "toggled", G_CALLBACK( texture_detail ), NULL );
2124 check = ui::CheckButton( "Detail hint brushes" );
2125 gtk_widget_show( check );
2126 gtk_box_pack_start( GTK_BOX( vbox ), check, FALSE, TRUE, 0 );
2127 g_object_set_data( G_OBJECT( dlg ), "hint", check );
2128 g_signal_connect( G_OBJECT( check ), "toggled", G_CALLBACK( texture_hint ), NULL );
2130 // ^Fishman - Add terrain key to func_group.
2131 check = ui::CheckButton( "Add terrain key" );
2132 gtk_widget_show( check );
2133 gtk_box_pack_start( GTK_BOX( vbox ), check, FALSE, TRUE, 0 );
2134 g_object_set_data( G_OBJECT( dlg ), "terrain_ent", check );
2135 g_signal_connect( G_OBJECT( check ), "toggled", G_CALLBACK( texture_terrainent ), NULL );
2137 vbox = ui::VBox( FALSE, 5 );
2138 gtk_widget_show( vbox );
2139 gtk_box_pack_start( GTK_BOX( hbox ), vbox, FALSE, TRUE, 0 );
2141 button = ui::Button( "OK" );
2142 gtk_widget_show( button );
2143 gtk_box_pack_start( GTK_BOX( vbox ), button, FALSE, TRUE, 0 );
2144 gtk_widget_set_size_request( button, 60, -1 );
2145 g_object_set_data( G_OBJECT( dlg ), "go", button );
2146 g_signal_connect( G_OBJECT( button ), "clicked", G_CALLBACK( main_go ), NULL );
2148 label = ui::Label( "Settings:" );
2149 gtk_widget_show( label );
2150 gtk_box_pack_start( GTK_BOX( vbox ), label, FALSE, TRUE, 0 );
2152 button = ui::Button( "Open..." );
2153 gtk_widget_show( button );
2154 gtk_box_pack_start( GTK_BOX( vbox ), button, FALSE, TRUE, 0 );
2155 g_object_set_data( G_OBJECT( dlg ), "open", button );
2156 g_signal_connect( G_OBJECT( button ), "clicked", G_CALLBACK( main_open ), NULL );
2158 button = ui::Button( "Save as..." );
2159 gtk_widget_show( button );
2160 gtk_box_pack_start( GTK_BOX( vbox ), button, FALSE, TRUE, 0 );
2161 g_object_set_data( G_OBJECT( dlg ), "save", button );
2162 g_signal_connect( G_OBJECT( button ), "clicked", G_CALLBACK( main_save ), NULL );
2164 button = ui::Button( "Defaults" );
2165 gtk_widget_show( button );
2166 gtk_box_pack_start( GTK_BOX( vbox ), button, FALSE, TRUE, 0 );
2167 g_object_set_data( G_OBJECT( dlg ), "defaults", button );
2168 g_signal_connect( G_OBJECT( button ), "clicked", G_CALLBACK( main_defaults ), NULL );
2170 button = ui::Button( "About..." );
2171 gtk_widget_show( button );
2172 gtk_box_pack_start( GTK_BOX( vbox ), button, FALSE, TRUE, 0 );
2173 g_signal_connect( G_OBJECT( button ), "clicked", G_CALLBACK( main_about ), NULL );
2175 check = ui::CheckButton( "Preview" );
2176 gtk_widget_show( check );
2177 gtk_box_pack_start( GTK_BOX( vbox ), check, FALSE, TRUE, 0 );
2178 g_signal_connect( G_OBJECT( check ), "toggled", G_CALLBACK( main_preview ), NULL );
2179 g_object_set_data( G_OBJECT( dlg ), "main_preview", check );
2181 // ^Fishman - Antializing for the preview window.
2182 check = ui::CheckButton( "Antialised lines" );
2183 gtk_widget_show( check );
2184 gtk_box_pack_start( GTK_BOX( vbox ), check, FALSE, TRUE, 0 );
2185 g_object_set_data( G_OBJECT( dlg ), "main_antialiasing", check );
2186 g_signal_connect( G_OBJECT( check ), "toggled", G_CALLBACK( main_antialiasing ), NULL );
2188 for ( i = 0; i < 5; i++ )
2195 FirstPassComplete = 1;
2203 HWND hwndDisplay = (HWND)NULL;
2204 HWND ghwndTab = (HWND)NULL;
2209 char GenSurfURL[40] = {"http://tarot.telefragged.com/gensurf"};
2210 char GenSurfBoard[40] = {"http://tarot.telefragged.com/board"};
2213 * AboutDlgProc - processes messages for the about dialog.
2216 qboolean CALLBACK AboutDlgProc( HWND hwnd, unsigned msg, UINT wparam, LONG lparam ){
2218 DRAWITEMSTRUCT *dis;
2225 lparam = lparam; /* turn off warning */
2229 strcpy( szText,"About " );
2230 strcat( szText,gszCaption );
2231 SetWindowText( hwnd,gszCaption );
2232 SetDlgItemText( hwnd,DLG_ABOUT_APP,szText );
2233 /* Application icon: */
2234 SendDlgItemMessage( hwnd, DLG_ABOUT_ICON,
2235 STM_SETICON, (WPARAM)(HICON)LoadIcon( ghInst,"GENSURF" ),
2238 hwndURL = GetDlgItem( hwnd,DLG_ABOUT_URL );
2239 hdc = GetDC( hwndURL );
2240 GetTextExtentPoint( hdc,GenSurfURL,strlen( GenSurfURL ),&size );
2241 ReleaseDC( hwndURL,hdc );
2242 GetWindowRect( hwndURL,&rc );
2243 SetWindowPos( hwndURL,(HWND)NULL,0,0,size.cx,size.cy + 2,
2244 SWP_NOMOVE | SWP_NOZORDER );
2246 hwndURL = GetDlgItem( hwnd,DLG_ABOUT_BOARD );
2247 hdc = GetDC( hwndURL );
2248 GetTextExtentPoint( hdc,GenSurfBoard,strlen( GenSurfBoard ),&size );
2249 ReleaseDC( hwndURL,hdc );
2250 GetWindowRect( hwndURL,&rc );
2251 SetWindowPos( hwndURL,(HWND)NULL,0,0,size.cx,size.cy + 2,
2252 SWP_NOMOVE | SWP_NOZORDER );
2257 switch ( LOWORD( wparam ) )
2262 case DLG_ABOUT_BOARD:
2263 HTTP( GenSurfBoard );
2266 EndDialog( hwnd,1 );
2272 if ( wparam == DLG_ABOUT_URL ) {
2273 dis = (LPDRAWITEMSTRUCT)lparam;
2274 SetTextColor( dis->hDC,RGB( 0,0,255 ) );
2275 TextOut( dis->hDC,0,0,GenSurfURL,strlen( GenSurfURL ) );
2276 GetWindowRect( dis->hwndItem,&rc );
2277 GetTextExtentPoint( dis->hDC,GenSurfURL,strlen( GenSurfURL ),&size );
2278 hpen = CreatePen( PS_SOLID,0,RGB( 0,0,255 ) );
2279 SelectObject( dis->hDC,hpen );
2280 MoveToEx( dis->hDC,0,size.cy,NULL );
2281 LineTo( dis->hDC,size.cx,size.cy );
2282 SelectObject( dis->hDC,GetStockObject( BLACK_PEN ) );
2283 DeleteObject( hpen );
2285 else if ( wparam == DLG_ABOUT_BOARD ) {
2286 dis = (LPDRAWITEMSTRUCT)lparam;
2287 SetTextColor( dis->hDC,RGB( 0,0,255 ) );
2288 TextOut( dis->hDC,0,0,GenSurfBoard,strlen( GenSurfBoard ) );
2289 GetWindowRect( dis->hwndItem,&rc );
2290 GetTextExtentPoint( dis->hDC,GenSurfBoard,strlen( GenSurfBoard ),&size );
2291 hpen = CreatePen( PS_SOLID,0,RGB( 0,0,255 ) );
2292 SelectObject( dis->hDC,hpen );
2293 MoveToEx( dis->hDC,0,size.cy,NULL );
2294 LineTo( dis->hDC,size.cx,size.cy );
2295 SelectObject( dis->hDC,GetStockObject( BLACK_PEN ) );
2296 DeleteObject( hpen );
2301 EndDialog( hwnd,1 );
2309 } /* AboutDlgProc */
2312 if ( DialogBox( ghInst,"About", ghwnd_main, (DLGPROC)AboutDlgProc ) < 0 ) {
2314 sprintf( Text,"In About(), GetLastError()=0x%08x",GetLastError() );
2315 MessageBox( ghwnd_main,Text,"GenSurf",eMB_ICONWARNING );