/* GenSurf plugin for GtkRadiant Copyright (C) 2001 David Hyde, Loki software and qeradiant.com This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #include #include #include #include #include #include "gensurf.h" #include #define GENERAL_TAB 0 #define EXTENTS_TAB 1 #define BITMAP_TAB 2 #define FIXPOINTS_TAB 3 #define TEXTURE_TAB 4 //#define BUFF_SIZE 32768 #define ENABLE_WIDGET(name,enable) \ gtk_widget_set_sensitive (GTK_WIDGET (g_object_get_data (G_OBJECT (g_pWnd), (name))), (enable)) #define CHECK_WIDGET(name,check) \ gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (g_object_get_data (G_OBJECT (g_pWnd), name)), check) static GtkWidget *game_radios[NUMGAMES]; static GtkWidget *wave_radios[5]; static GtkWidget *plane_radios[6]; static guint current_tab; static int OldPreview; static int WasDetail; static GtkTooltips *tooltips; static int FirstPassComplete = 0; void About (GtkWidget *parent) { /* char *icon_xpm[] = { "32 32 4 1", " c None", ". c #000000", "+ c #FFFFFF", "@ c #838183", "................................", "................................", "................................", "................................", "................................", "................................", "................................", "...............++...............", ".............++++++.............", "............++@+++@+............", "..........+++..++..+++..........", "........++.+.++..++.+.@+........", ".......+..+..+.++.+..+..++......", ".....++..++.+..++..+.++..++.....", "...++..++...+.+..+.++..++..++...", "..++.+.++....++..++....++.+..+..", ".+.+..+..++....++....++..++.+.+.", "..+++....+.++++++++++.+....+++..", "....++.@@+++++.++.++++@++.++....", "......+++++++......++@+++++.....", ".......+++.+.++..++.+..++.......", ".........++..+.++.+..++.........", "...........++..++..++...........", ".............++..+.+............", "..............+..+@.............", "...............@@...............", "................................", "................................", "................................", "................................", "................................", "................................" }; */ // leo: I'm too lazy to create a nice about box // ^Fishman - I am lazy too :P. g_FuncTable.m_pfnMessageBox (parent, "GtkGenSurf 1.05\n\n" "Original version\n" "David Hyde (rascal@vicksburg.com)\n\n" "Porting\n" "Leonardo Zide (leo@lokigames.com)\n\n" "Enhancements\n" "Pablo Zurita (pablo@qeradiant.com)\n" "Hydra (hydra@hydras-world.com)", "About GtkGenSurf", MB_OK, NULL); } // ============================================================================= // main dialog static void SetupControls () { switch (current_tab) { case GENERAL_TAB: break; case EXTENTS_TAB: if (Game != QUAKE3) { gtk_widget_hide (GTK_WIDGET (g_object_get_data (G_OBJECT (g_pWnd), "use_patches"))); ENABLE_WIDGET ("use_patches", FALSE); } else { gtk_widget_show (GTK_WIDGET (g_object_get_data (G_OBJECT (g_pWnd), "use_patches"))); ENABLE_WIDGET ("use_patches", TRUE); } if (Game == QUAKE3 && UsePatches != 0) { ENABLE_WIDGET ("decimate", FALSE); } gtk_label_set_text (GTK_LABEL (g_object_get_data (G_OBJECT (g_pWnd), "snap_text")), "Snap to grid:"); // ^Fishman - Snap to grid. break; case BITMAP_TAB: if (WaveType != WAVE_BITMAP) { ENABLE_WIDGET ("bmp_file", FALSE); ENABLE_WIDGET ("bmp_file_browse", FALSE); ENABLE_WIDGET ("bmp_black", FALSE); ENABLE_WIDGET ("bmp_white", FALSE); ENABLE_WIDGET ("bmp_text1", FALSE); ENABLE_WIDGET ("bmp_text2", FALSE); ENABLE_WIDGET ("bmp_text3", FALSE); ENABLE_WIDGET ("bmp_reload", FALSE); gtk_label_set_text (GTK_LABEL (g_object_get_data (G_OBJECT (g_pWnd), "bmp_note")), "These options are disabled unless \"From Bitmap\"\n" "is selected as the Waveform on the General tab."); } else { ENABLE_WIDGET ("bmp_file", TRUE); ENABLE_WIDGET ("bmp_file_browse", TRUE); ENABLE_WIDGET ("bmp_black", TRUE); ENABLE_WIDGET ("bmp_white", TRUE); ENABLE_WIDGET ("bmp_text1", TRUE); ENABLE_WIDGET ("bmp_text2", TRUE); ENABLE_WIDGET ("bmp_text3", TRUE); ENABLE_WIDGET ("bmp_reload", strlen(gbmp.name) != 0); gtk_label_set_text (GTK_LABEL (g_object_get_data (G_OBJECT (g_pWnd), "bmp_note")), "GenSurf works only with 8-bit bitmaps. Color indices are\n" "mapped to values for each vertex. Generally, gray scale\n" "images are stored with black as color 0, white as color 255."); } break; case FIXPOINTS_TAB: ENABLE_WIDGET ("fix_value", (NumVerticesSelected != 0)); ENABLE_WIDGET ("fix_value_text", (NumVerticesSelected != 0)); ENABLE_WIDGET ("fix_free", (NumVerticesSelected != 0)); ENABLE_WIDGET ("fix_range", ((NumVerticesSelected != 0) && (WaveType != WAVE_ROUGH_ONLY))); ENABLE_WIDGET ("fix_range_text", ((NumVerticesSelected != 0) && (WaveType != WAVE_ROUGH_ONLY))); ENABLE_WIDGET ("fix_rate", ((NumVerticesSelected != 0) && (WaveType != WAVE_ROUGH_ONLY))); ENABLE_WIDGET ("fix_rate_text", ((NumVerticesSelected != 0) && (WaveType != WAVE_ROUGH_ONLY))); break; case TEXTURE_TAB: ENABLE_WIDGET ("texture2", (UsePatches == 0)); ENABLE_WIDGET ("texture3", (UsePatches == 0)); ENABLE_WIDGET ("tex_slant", (UsePatches == 0)); ENABLE_WIDGET ("detail", (UsePatches == 0)); if (Game != QUAKE3 ) { ENABLE_WIDGET ("terrain_ent", FALSE); // ^Fishman - Adds terrain key to func_group. ENABLE_WIDGET ("hint", (UsePatches == 0)); } break; } switch (WaveType) { case WAVE_HCYLINDER: case WAVE_VCYLINDER: ENABLE_WIDGET ("amplitude", TRUE); ENABLE_WIDGET ("wavelength", TRUE); ENABLE_WIDGET ("z00", TRUE); ENABLE_WIDGET ("z01", TRUE); ENABLE_WIDGET ("z10", TRUE); ENABLE_WIDGET ("z11", TRUE); ENABLE_WIDGET ("linearborder", TRUE); ENABLE_WIDGET ("go", TRUE); break; case WAVE_BITMAP: ENABLE_WIDGET ("amplitude", FALSE); ENABLE_WIDGET ("wavelength", FALSE); ENABLE_WIDGET ("z00", FALSE); ENABLE_WIDGET ("z01", FALSE); ENABLE_WIDGET ("z10", FALSE); ENABLE_WIDGET ("z11", FALSE); ENABLE_WIDGET ("linearborder", FALSE); ENABLE_WIDGET ("go", (gbmp.colors != NULL ? TRUE : FALSE)); break; case WAVE_ROUGH_ONLY: ENABLE_WIDGET ("amplitude", FALSE); ENABLE_WIDGET ("wavelength", FALSE); ENABLE_WIDGET ("z00", TRUE); ENABLE_WIDGET ("z01", TRUE); ENABLE_WIDGET ("z10", TRUE); ENABLE_WIDGET ("z11", TRUE); ENABLE_WIDGET ("linearborder", TRUE); ENABLE_WIDGET ("go", TRUE); break; default: ENABLE_WIDGET ("amplitude", TRUE); ENABLE_WIDGET ("wavelength", TRUE); ENABLE_WIDGET ("z00", TRUE); ENABLE_WIDGET ("z01", TRUE); ENABLE_WIDGET ("z10", TRUE); ENABLE_WIDGET ("z11", TRUE); ENABLE_WIDGET ("linearborder", TRUE); ENABLE_WIDGET ("go", TRUE); } switch (Plane) { case PLANE_XZ0: case PLANE_XZ1: gtk_label_set_text (GTK_LABEL (g_object_get_data (G_OBJECT (g_pWnd), "hmin_text")), "X:"); gtk_label_set_text (GTK_LABEL (g_object_get_data (G_OBJECT (g_pWnd), "hmax_text")), "X:"); gtk_label_set_text (GTK_LABEL (g_object_get_data (G_OBJECT (g_pWnd), "vmin_text")), "Z:"); gtk_label_set_text (GTK_LABEL (g_object_get_data (G_OBJECT (g_pWnd), "vmax_text")), "Z:"); gtk_label_set_text (GTK_LABEL (g_object_get_data (G_OBJECT (g_pWnd), "nh_text")), "X:"); gtk_label_set_text (GTK_LABEL (g_object_get_data (G_OBJECT (g_pWnd), "nv_text")), "Z:"); break; case PLANE_YZ0: case PLANE_YZ1: gtk_label_set_text (GTK_LABEL (g_object_get_data (G_OBJECT (g_pWnd), "hmin_text")), "Y:"); gtk_label_set_text (GTK_LABEL (g_object_get_data (G_OBJECT (g_pWnd), "hmax_text")), "Y:"); gtk_label_set_text (GTK_LABEL (g_object_get_data (G_OBJECT (g_pWnd), "vmin_text")), "Z:"); gtk_label_set_text (GTK_LABEL (g_object_get_data (G_OBJECT (g_pWnd), "vmax_text")), "Z:"); gtk_label_set_text (GTK_LABEL (g_object_get_data (G_OBJECT (g_pWnd), "nh_text")), "Y:"); gtk_label_set_text (GTK_LABEL (g_object_get_data (G_OBJECT (g_pWnd), "nv_text")), "Z:"); break; default: gtk_label_set_text (GTK_LABEL (g_object_get_data (G_OBJECT (g_pWnd), "hmin_text")), "X:"); gtk_label_set_text (GTK_LABEL (g_object_get_data (G_OBJECT (g_pWnd), "hmax_text")), "X:"); gtk_label_set_text (GTK_LABEL (g_object_get_data (G_OBJECT (g_pWnd), "vmin_text")), "Y:"); gtk_label_set_text (GTK_LABEL (g_object_get_data (G_OBJECT (g_pWnd), "vmax_text")), "Y:"); gtk_label_set_text (GTK_LABEL (g_object_get_data (G_OBJECT (g_pWnd), "nh_text")), "X:"); gtk_label_set_text (GTK_LABEL (g_object_get_data (G_OBJECT (g_pWnd), "nv_text")), "Y:"); break; } } // SetDlgValues fills in text boxes and initializes other input controls static void SetDlgValues (int tab) { char Text[256]; char RForm[16] = "%.5g"; switch (tab) { case GENERAL_TAB: // mattn: Deactivated because one wasn't able to switch the gametype or orientation #if 0 // Hell if I know why, but in the release build the 2nd pass thru the // set_sensitive loop for game_radios crashes. No need to do this more // than once anyhow. if (!FirstPassComplete) { int i; for (i = 0; i < NUMGAMES; i++) gtk_widget_set_sensitive (game_radios[i], (i == Game ? TRUE : FALSE)); for (i = 0; i < 6; i++) gtk_widget_set_sensitive (plane_radios[i], (i == Plane ? TRUE : FALSE)); } #endif gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (game_radios[Game]), TRUE); gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (plane_radios[Plane]), TRUE); gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (wave_radios[WaveType]), TRUE); gtk_spin_button_set_value (GTK_SPIN_BUTTON (g_object_get_data (G_OBJECT (g_pWnd), "random")), RandomSeed); sprintf (Text, RForm, WaveLength); gtk_entry_set_text (GTK_ENTRY (g_object_get_data (G_OBJECT (g_pWnd), "wavelength")), Text); sprintf (Text, RForm, Amplitude); gtk_entry_set_text (GTK_ENTRY (g_object_get_data (G_OBJECT (g_pWnd), "amplitude")), Text); sprintf (Text, RForm, Roughness); gtk_entry_set_text (GTK_ENTRY (g_object_get_data (G_OBJECT (g_pWnd), "roughness")), Text); gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (g_object_get_data (G_OBJECT (g_pWnd), "main_antialiasing")), Antialiasing); break; case EXTENTS_TAB: sprintf (Text,RForm,Hll); gtk_entry_set_text (GTK_ENTRY (g_object_get_data (G_OBJECT (g_pWnd), "hmin")), Text); sprintf (Text,RForm,Vll); gtk_entry_set_text (GTK_ENTRY (g_object_get_data (G_OBJECT (g_pWnd), "vmin")), Text); sprintf (Text,RForm,Hur); gtk_entry_set_text (GTK_ENTRY (g_object_get_data (G_OBJECT (g_pWnd), "hmax")), Text); sprintf (Text,RForm,Vur); gtk_entry_set_text (GTK_ENTRY (g_object_get_data (G_OBJECT (g_pWnd), "vmax")), Text); sprintf (Text,RForm,Z00); gtk_entry_set_text (GTK_ENTRY (g_object_get_data (G_OBJECT (g_pWnd), "z00")), Text); sprintf (Text,RForm,Z01); gtk_entry_set_text (GTK_ENTRY (g_object_get_data (G_OBJECT (g_pWnd), "z01")), Text); sprintf (Text,RForm,Z10); gtk_entry_set_text (GTK_ENTRY (g_object_get_data (G_OBJECT (g_pWnd), "z10")), Text); sprintf (Text,RForm,Z11); gtk_entry_set_text (GTK_ENTRY (g_object_get_data (G_OBJECT (g_pWnd), "z11")), Text); gtk_spin_button_set_value (GTK_SPIN_BUTTON (g_object_get_data (G_OBJECT (g_pWnd), "nh")), NH); gtk_spin_button_set_value (GTK_SPIN_BUTTON (g_object_get_data (G_OBJECT (g_pWnd), "nv")), NV); gtk_spin_button_set_value (GTK_SPIN_BUTTON (g_object_get_data (G_OBJECT (g_pWnd), "sp")), SP); // ^Fishman - Snap to grid. gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (g_object_get_data (G_OBJECT (g_pWnd), "linearborder")), FixBorders); gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (g_object_get_data (G_OBJECT (g_pWnd), "use_patches")), UsePatches); gtk_adjustment_set_value (GTK_ADJUSTMENT (g_object_get_data (G_OBJECT (g_pWnd), "decimate_adj")), Decimate); if (Game == QUAKE3 && UsePatches) { gtk_widget_set_sensitive (GTK_WIDGET (g_object_get_data (G_OBJECT (g_pWnd), "decimate")), FALSE); if (NH % 2) { NH++; if (NH > MAX_ROWS) NH -= 2; SetDlgValues (current_tab); } if (NV % 2) { NV++; if (NV > MAX_ROWS) NV -= 2; SetDlgValues (current_tab); } if (NH % 2 ) NH++; if (NH < 2 ) NH = 2; if (NH > MAX_ROWS) NH = MAX_ROWS; if (NV % 2 ) NV++; if (NV < 2 ) NV = 2; if (NV > MAX_ROWS) NV = MAX_ROWS; gpointer spin = g_object_get_data (G_OBJECT (g_pWnd), "nh"); GtkAdjustment *adj = gtk_spin_button_get_adjustment (GTK_SPIN_BUTTON (spin)); adj->lower = 2; gtk_adjustment_changed (adj); spin = g_object_get_data (G_OBJECT (g_pWnd), "nv"); adj = gtk_spin_button_get_adjustment (GTK_SPIN_BUTTON (spin)); adj->lower = 2; gtk_adjustment_changed (adj); } else { gtk_widget_set_sensitive (GTK_WIDGET (g_object_get_data (G_OBJECT (g_pWnd), "decimate")), TRUE); gpointer spin = g_object_get_data (G_OBJECT (g_pWnd), "nh"); GtkAdjustment *adj = gtk_spin_button_get_adjustment (GTK_SPIN_BUTTON (spin)); adj->lower = 1; gtk_adjustment_changed (adj); spin = g_object_get_data (G_OBJECT (g_pWnd), "nv"); adj = gtk_spin_button_get_adjustment (GTK_SPIN_BUTTON (spin)); adj->lower = 1; gtk_adjustment_changed (adj); } gtk_spin_button_set_value (GTK_SPIN_BUTTON (g_object_get_data (G_OBJECT (g_pWnd), "nh")), NH); gtk_spin_button_set_value (GTK_SPIN_BUTTON (g_object_get_data (G_OBJECT (g_pWnd), "nv")), NV); break; case BITMAP_TAB: gtk_entry_set_text (GTK_ENTRY (g_object_get_data (G_OBJECT (g_pWnd), "bmp_file")), gbmp.name); sprintf(Text,"%g",gbmp.black_value); gtk_entry_set_text (GTK_ENTRY (g_object_get_data (G_OBJECT (g_pWnd), "bmp_black")), Text); sprintf(Text,"%g",gbmp.white_value); gtk_entry_set_text (GTK_ENTRY (g_object_get_data (G_OBJECT (g_pWnd), "bmp_white")), Text); break; case FIXPOINTS_TAB: break; case TEXTURE_TAB: gtk_entry_set_text (GTK_ENTRY (g_object_get_data (G_OBJECT (g_pWnd), "texture1")), Texture[Game][0]); gtk_entry_set_text (GTK_ENTRY (g_object_get_data (G_OBJECT (g_pWnd), "texture2")), Texture[Game][1]); gtk_entry_set_text (GTK_ENTRY (g_object_get_data (G_OBJECT (g_pWnd), "texture3")), Texture[Game][2]); gtk_spin_button_set_value (GTK_SPIN_BUTTON (g_object_get_data (G_OBJECT (g_pWnd), "tex_slant")), SlantAngle); sprintf(Text,RForm,TexOffset[0]); gtk_entry_set_text (GTK_ENTRY (g_object_get_data (G_OBJECT (g_pWnd), "texoffsetx")), Text); sprintf(Text,RForm,TexOffset[1]); gtk_entry_set_text (GTK_ENTRY (g_object_get_data (G_OBJECT (g_pWnd), "texoffsety")), Text); sprintf(Text,RForm,TexScale[0]); gtk_entry_set_text (GTK_ENTRY (g_object_get_data (G_OBJECT (g_pWnd), "texscalex")), Text); sprintf(Text,RForm,TexScale[1]); gtk_entry_set_text (GTK_ENTRY (g_object_get_data (G_OBJECT (g_pWnd), "texscaley")), Text); CHECK_WIDGET ("detail", UseDetail); if (Game==QUAKE3) { ENABLE_WIDGET ("hint", FALSE); AddHints=0; } else ENABLE_WIDGET ("hint", TRUE); CHECK_WIDGET ("hint", AddHints); /* if (Game==SIN) { // ArghRad doesn't currently support SiN EnableWindow(GetDlgItem(hwndDisplay,DLG_ARGHRAD2), 0); EnableWindow(GetDlgItem(hwndDisplay,DLG_ARGHRAD2_SPIN), 0); ShowWindow(GetDlgItem(hwndDisplay,DLG_ARGHRAD2_TEXT), SW_HIDE); ShowWindow(GetDlgItem(hwndDisplay,DLG_ARGHRAD2), SW_HIDE); ShowWindow(GetDlgItem(hwndDisplay,DLG_ARGHRAD2_SPIN), SW_HIDE); SetDlgItemText(hwndDisplay,DLG_TEX_USEPAK,"Use sin file"); SetDlgItemText(hwndDisplay,DLG_TEX_PAK_TEXT,"Sin:"); } */ if(Game==QUAKE3) { /* // ArghRad sun is inapplicable (so far) EnableWindow(GetDlgItem(hwndDisplay,DLG_ARGHRAD2), 0); EnableWindow(GetDlgItem(hwndDisplay,DLG_ARGHRAD2_SPIN), 0); ShowWindow(GetDlgItem(hwndDisplay,DLG_ARGHRAD2_TEXT), SW_HIDE); ShowWindow(GetDlgItem(hwndDisplay,DLG_ARGHRAD2), SW_HIDE); ShowWindow(GetDlgItem(hwndDisplay,DLG_ARGHRAD2_SPIN), SW_HIDE); // No ladders in Q3 EnableWindow(GetDlgItem(hwndDisplay,DLG_LADDER), 0); ShowWindow(GetDlgItem(hwndDisplay,DLG_LADDER), SW_HIDE); SetDlgItemText(hwndDisplay,DLG_TEX_USEPAK,"Use pk3 file"); SetDlgItemText(hwndDisplay,DLG_TEX_PAK_TEXT,"PK3:"); */ } /*trix if(Game==HERETIC2) { // ArghRad doesn't currently support Heretic2 EnableWindow(GetDlgItem(hwndDisplay,DLG_ARGHRAD2), 0); EnableWindow(GetDlgItem(hwndDisplay,DLG_ARGHRAD2_SPIN), 0); ShowWindow(GetDlgItem(hwndDisplay,DLG_ARGHRAD2_TEXT), SW_HIDE); ShowWindow(GetDlgItem(hwndDisplay,DLG_ARGHRAD2), SW_HIDE); ShowWindow(GetDlgItem(hwndDisplay,DLG_ARGHRAD2_SPIN), SW_HIDE); SetDlgItemText(hwndDisplay,DLG_TEX_USEPAK,"Use pak file"); SetDlgItemText(hwndDisplay,DLG_TEX_PAK_TEXT,"Pak:"); } */ /* if(Game==HALFLIFE) { // A bunch of controls aren't applicable to HL EnableWindow(GetDlgItem(hwndDisplay,DLG_TEXTURE_BROWSE), 0); EnableWindow(GetDlgItem(hwndDisplay,DLG_TEXTURE2_BROWSE),0); EnableWindow(GetDlgItem(hwndDisplay,DLG_TEXTURE3_BROWSE),0); EnableWindow(GetDlgItem(hwndDisplay,DLG_DETAIL), 0); EnableWindow(GetDlgItem(hwndDisplay,DLG_LADDER), 0); EnableWindow(GetDlgItem(hwndDisplay,DLG_ARGHRAD2), 0); EnableWindow(GetDlgItem(hwndDisplay,DLG_ARGHRAD2_SPIN), 0); ShowWindow(GetDlgItem(hwndDisplay,DLG_TEXTURE_BROWSE), SW_HIDE); ShowWindow(GetDlgItem(hwndDisplay,DLG_TEXTURE2_BROWSE),SW_HIDE); ShowWindow(GetDlgItem(hwndDisplay,DLG_TEXTURE3_BROWSE),SW_HIDE); ShowWindow(GetDlgItem(hwndDisplay,DLG_DETAIL), SW_HIDE); ShowWindow(GetDlgItem(hwndDisplay,DLG_LADDER), SW_HIDE); ShowWindow(GetDlgItem(hwndDisplay,DLG_ARGHRAD2_TEXT), SW_HIDE); ShowWindow(GetDlgItem(hwndDisplay,DLG_ARGHRAD2), SW_HIDE); ShowWindow(GetDlgItem(hwndDisplay,DLG_ARGHRAD2_SPIN), SW_HIDE); SetDlgItemText(hwndDisplay,DLG_TEX_USEPAK,"Use wad file"); SetDlgItemText(hwndDisplay,DLG_TEX_PAK_TEXT,"Wad:"); SetDlgItemText(hwndDisplay,DLG_HINT,"Hint brushes"); } if(Game==GENESIS3D) { // No Q2-type compilers support Genesis3D (including ArghRad) EnableWindow(GetDlgItem(hwndDisplay,DLG_ARGHRAD2), 0); EnableWindow(GetDlgItem(hwndDisplay,DLG_ARGHRAD2_SPIN), 0); ShowWindow(GetDlgItem(hwndDisplay,DLG_ARGHRAD2_TEXT), SW_HIDE); ShowWindow(GetDlgItem(hwndDisplay,DLG_ARGHRAD2), SW_HIDE); ShowWindow(GetDlgItem(hwndDisplay,DLG_ARGHRAD2_SPIN), SW_HIDE); SetDlgItemText(hwndDisplay,DLG_TEX_USEPAK,"Use sin file"); SetDlgItemText(hwndDisplay,DLG_TEX_PAK_TEXT,"Sin:"); } */ break; } SetupControls (); } static void ReadDlgValues (int tab) { // char Text[256]; // int i; switch (tab) { case GENERAL_TAB: gpointer spin; Roughness = atof ( gtk_entry_get_text (GTK_ENTRY (g_object_get_data (G_OBJECT (g_pWnd), "roughness")))); WaveLength = atof ( gtk_entry_get_text (GTK_ENTRY (g_object_get_data (G_OBJECT (g_pWnd), "wavelength")))); Amplitude = atof ( gtk_entry_get_text (GTK_ENTRY (g_object_get_data (G_OBJECT (g_pWnd), "amplitude")))); spin = g_object_get_data (G_OBJECT (g_pWnd), "random"); RandomSeed = gtk_spin_button_get_value_as_int (GTK_SPIN_BUTTON (spin)); break; case EXTENTS_TAB: SP = atoi (gtk_entry_get_text (GTK_ENTRY (g_object_get_data (G_OBJECT (g_pWnd), "sp")))); NH = atoi (gtk_entry_get_text (GTK_ENTRY (g_object_get_data (G_OBJECT (g_pWnd), "nh")))); NV = atoi (gtk_entry_get_text (GTK_ENTRY (g_object_get_data (G_OBJECT (g_pWnd), "nv")))); if (Game == QUAKE3 && UsePatches != 0) { if (NH % 2 ) NH++; if (NH < 2 ) NH = 2; if (NH > MAX_ROWS) NH = MAX_ROWS; if (NV % 2 ) NV++; if (NV < 2 ) NV = 2; if (NV > MAX_ROWS) NV = MAX_ROWS; } break; #if 0 case BITMAP_TAB: if (WaveType == WAVE_BITMAP) { GetDlgItemText(hwnd,DLG_BMP_FILE,gbmp.name,sizeof(gbmp.name)); CheckValidDIB(hwnd); GetDlgItemText(hwnd,DLG_BMP_BLACK,Text,sizeof(Text)); gbmp.black_value = atof(Text); GetDlgItemText(hwnd,DLG_BMP_WHITE,Text,sizeof(Text)); gbmp.white_value = atof(Text); UpdatePreview(TRUE); } break; case FIXPOINTS_TAB: GetDlgItemText(hwnd,DLG_FIX_VALUE,Text,sizeof(Text)); temp.fixed_value = atoi(Text); GetDlgItemText(hwnd,DLG_FIX_RANGE,Text,sizeof(Text)); temp.range = atoi(Text); GetDlgItemText(hwnd,DLG_FIX_RATE, Text,sizeof(Text)); temp.rate = atof(Text); for(k=0; k MAX_ROWS) { sprintf (Text, "The number of divisions must be > 0 and no greater than %d.", MAX_ROWS); g_FuncTable.m_pfnMessageBox (g_pWnd, Text, "GenSurf", MB_ICONEXCLAMATION, NULL); gtk_notebook_set_page (GTK_NOTEBOOK (notebook), EXTENTS_TAB); return; } if (NV < 1 || NV > MAX_ROWS) { sprintf (Text, "The number of divisions must be > 0 and no greater than %d.", MAX_ROWS); g_FuncTable.m_pfnMessageBox (g_pWnd, Text, "GenSurf", MB_ICONEXCLAMATION, NULL); gtk_notebook_set_page (GTK_NOTEBOOK (notebook), EXTENTS_TAB); return; } if (Hll >= Hur) { g_FuncTable.m_pfnMessageBox (g_pWnd, "The \"lower-left\" values must be less than " "the corresponding \"upper-right\" values in " "the \"Extent\" box.","GenSurf", MB_OK | MB_ICONEXCLAMATION, NULL); gtk_notebook_set_page (GTK_NOTEBOOK (notebook), EXTENTS_TAB); return; } if (Vll >= Vur) { g_FuncTable.m_pfnMessageBox (g_pWnd,"The \"lower-left\" values must be less than " "the corresponding \"upper-right\" values in " "the \"Extent\" box.","GenSurf", MB_OK | MB_ICONEXCLAMATION, NULL); gtk_notebook_set_page (GTK_NOTEBOOK (notebook), EXTENTS_TAB); return; } if (!strlen (Texture[Game][0])) { g_FuncTable.m_pfnMessageBox (g_pWnd, "You must supply a texture name.", "GenSurf", MB_ICONEXCLAMATION, NULL); gtk_notebook_set_page (GTK_NOTEBOOK (notebook), EXTENTS_TAB); return; } /* if (Decimate>0 && GimpHints!=0) { MessageBox(hwnd,"You've elected to use a decimated grid and gimp's non-detail hint brushes. " "This combination usually produces bizarre visual errors in the game, " "so GenSurf has turned off the hint brush option.", "GenSurf",MB_ICONEXCLAMATION); GimpHints = 0; } */ gtk_widget_hide (g_pWnd); if (g_pWndPreview) gtk_widget_hide (g_pWndPreview); GenerateMap(); WriteIniFile(gszIni); } // ============================================================================= // general tab callbacks static void general_game (GtkToggleButton *widget, gpointer data) { if (gtk_toggle_button_get_active (widget)) { Game = GPOINTER_TO_INT (data); UpdatePreview (TRUE); } } static void general_plane (GtkToggleButton *widget, gpointer data) { if (gtk_toggle_button_get_active (widget)) { Plane = GPOINTER_TO_INT (data); SetupControls (); UpdatePreview (TRUE); } } static void general_wave (GtkToggleButton *widget, gpointer data) { if (gtk_toggle_button_get_active (widget)) { WaveType = GPOINTER_TO_INT (data); SetupControls (); UpdatePreview (TRUE); } } static void general_random (GtkAdjustment *adj, gpointer data) { int nPos = (int)adj->value; if (RandomSeed != nPos) { RandomSeed = nPos; UpdatePreview (true); } } // ============================================================================= // extents tab callbacks static void extents_linearborder (GtkToggleButton *check, gpointer data) { FixBorders = gtk_toggle_button_get_active (check); UpdatePreview (true); } static void extents_use_patches (GtkToggleButton *check, gpointer data) { if (Game != QUAKE3) return; UsePatches = gtk_toggle_button_get_active (check); SetDlgValues (current_tab); SetupControls (); UpdatePreview (true); } static void extents_nhnv_spin (GtkAdjustment *adj, int *data) { int nPos = (int)adj->value; if (*data != nPos) { if (Game==QUAKE3 && UsePatches && (nPos % 2)) { if (*data < nPos) *data += 2; else *data -= 2; gtk_adjustment_set_value (adj, *data); } else *data = nPos; UpdatePreview (true); } } static void extents_decimate (GtkAdjustment *adj, gpointer data) { int nPos = (int)adj->value; Decimate = nPos; UpdatePreview (true); } // Hydra : snap to grid begin /*static void extents_snaptogrid (GtkAdjustment *adj, gpointer data) { int nPos = (int)adj->value; SnapToGrid = nPos; UpdatePreview (true); }*/ // ^Fishman - Modified version of Hydra's snap to grid code. static void extents_snaptogrid_spin (GtkAdjustment *adj, int *data) { int nPos = (int)adj->value; SnapToGrid = nPos; UpdatePreview (true); } // ============================================================================= // bitmap tab callbacks static gint bitmap_file_entryfocusout(GtkWidget* widget, GdkEventFocus* event, gpointer data) { char filename[NAME_MAX]; strcpy (filename, gtk_entry_get_text (GTK_ENTRY(widget))); if(strcmp (filename,gbmp.name)) { strcpy (gbmp.name,filename); if (strlen(gbmp.name) ) OpenBitmap (); ENABLE_WIDGET ("go", (gbmp.colors != NULL ? TRUE : FALSE)); } return FALSE; } static void bitmap_browse (GtkWidget *widget, gpointer data) { const char *filename; char *ptr; filename = g_FuncTable.m_pfnFileDialog (g_pWnd, TRUE, "Bitmap File", gbmp.defpath, "gtkgensurf", NULL); if (filename != NULL) { strcpy (gbmp.name, filename); ptr = strrchr (filename, G_DIR_SEPARATOR); if (ptr != NULL) { *(ptr+1) = '\0'; strcpy (gbmp.defpath, filename); } OpenBitmap (); ENABLE_WIDGET ("go", (gbmp.colors != NULL ? TRUE : FALSE)); } } static void bitmap_reload (GtkWidget *widget, gpointer data) { strcpy (gbmp.name, gtk_entry_get_text (GTK_ENTRY (g_object_get_data (G_OBJECT (g_pWnd), "bmp_file")))); if(strlen (gbmp.name) ) { OpenBitmap (); ENABLE_WIDGET ("go", (gbmp.colors != NULL ? TRUE : FALSE)); } else ENABLE_WIDGET ("go", FALSE ); } // ============================================================================= // fix points tab callbacks static gint fix_value_entryfocusout (GtkWidget* widget, GdkEventFocus *event, gpointer data) { int i = atoi (gtk_entry_get_text (GTK_ENTRY(widget))), k; char Text[32]; if (i < -65536 || i > 65536) { gdk_beep (); g_FuncTable.m_pfnMessageBox (g_pWnd, "The value must be between -65536 and 65536, inclusive.", "GenSurf", MB_OK | MB_ICONEXCLAMATION, NULL); sprintf (Text, "%d", (int)xyz[Vertex[0].i][Vertex[0].j].fixed_value); gtk_entry_set_text (GTK_ENTRY(widget), Text); gtk_window_set_focus (GTK_WINDOW (gtk_widget_get_toplevel (widget)), widget); } else if (i != xyz[Vertex[0].i][Vertex[0].j].fixed_value) { for(k=0; kvalue; if (xyz[Vertex[0].i][Vertex[0].j].fixed_value != i) { for(k=0; k(data)); return FALSE; } // ============================================================================= // create tooltips void create_tooltips () { tooltips = gtk_tooltips_new (); // Main gtk_tooltips_set_tip(GTK_TOOLTIPS (tooltips), GTK_WIDGET (g_object_get_data (G_OBJECT (g_pWnd), "go")), "Accept all input and generate a surface in Q3Radiant", ""); gtk_tooltips_set_tip(GTK_TOOLTIPS (tooltips), GTK_WIDGET (g_object_get_data (G_OBJECT (g_pWnd), "open")), "Open a previously saved GenSurf settings file.", ""); gtk_tooltips_set_tip(GTK_TOOLTIPS (tooltips), GTK_WIDGET (g_object_get_data (G_OBJECT (g_pWnd), "save")), "Save all settings to a file.", ""); gtk_tooltips_set_tip(GTK_TOOLTIPS (tooltips), GTK_WIDGET (g_object_get_data (G_OBJECT (g_pWnd), "defaults")), "Restore default values from DEFAULTS.SRF. If this file does not exist, GenSurf " "initializes all input parameters to reasonable values. You can create your own " "default surface by setting all parameters to your liking, then saving a settings " "file as DEFAULTS.SRF with the Save As button.", ""); gtk_tooltips_set_tip(GTK_TOOLTIPS (tooltips), GTK_WIDGET (g_object_get_data (G_OBJECT (g_pWnd), "main_preview")), "View a wire-frame representation of the surface", ""); gtk_tooltips_set_tip(GTK_TOOLTIPS (tooltips), GTK_WIDGET (g_object_get_data (G_OBJECT (g_pWnd), "main_antialiasing")), "The lines in the preview window are antialiased for better quality", ""); // General tab gtk_tooltips_set_tip(GTK_TOOLTIPS (tooltips), GTK_WIDGET (wave_radios[0]), "Builds a surface with alternating hills and valleys. Uses the general form Z=cos(X) " "x sin(Y)", ""); gtk_tooltips_set_tip(GTK_TOOLTIPS (tooltips), GTK_WIDGET (wave_radios[1]), "Builds a surface with ridges parallel to the vertical axis.", ""); gtk_tooltips_set_tip(GTK_TOOLTIPS (tooltips), GTK_WIDGET (wave_radios[2]), "Builds a surface with ridges parallel to the horizontal axis.", ""); gtk_tooltips_set_tip(GTK_TOOLTIPS (tooltips), GTK_WIDGET (wave_radios[3]), "Builds a map from a bitmap image representing a contour plot. Click the \"Bitmap\" " "tab to select the image. GenSurf only supports 256-color (8 bit) " "bitmaps. GenSurf will work with any 256-color bitmap, but gray scale bitmaps are a bit " "more intuitive.", "" ); gtk_tooltips_set_tip(GTK_TOOLTIPS (tooltips), GTK_WIDGET (wave_radios[4]), "Builds a random surface using the Plasma Cloud technique. Variance is controlled " "by the Roughness input. To build a surface with completely random values not " "dependent on neighboring vertices, use one of the other waveforms with 0 amplitude.", ""); gtk_tooltips_set_tip(GTK_TOOLTIPS (tooltips), GTK_WIDGET (g_object_get_data (G_OBJECT (g_pWnd), "wavelength")), "Enter the wavelength (distance between crests). NOTE: Wavelengths equal to the grid " "size or 2 times the grid size will result in 0 amplitudes. For best results, the " "wavelength value should be at least 4 times the grid size (extents divided by the " "number of divisions", ""); gtk_tooltips_set_tip(GTK_TOOLTIPS (tooltips), GTK_WIDGET (g_object_get_data (G_OBJECT (g_pWnd), "amplitude")), "Enter the height of hills/ridges.", ""); gtk_tooltips_set_tip(GTK_TOOLTIPS (tooltips), GTK_WIDGET (g_object_get_data (G_OBJECT (g_pWnd), "roughness")), "Enter the roughness value (noise) for the surface. For fractal surfaces, this value " "is used as a variance in the fractal calculations.", ""); gtk_tooltips_set_tip(GTK_TOOLTIPS (tooltips), GTK_WIDGET (g_object_get_data (G_OBJECT (g_pWnd), "random")), "Seed value for the pseudo-random number generator.", ""); // Extents tab gtk_tooltips_set_tip(GTK_TOOLTIPS (tooltips), GTK_WIDGET (g_object_get_data (G_OBJECT (g_pWnd), "hmin")), "Minimum horizontal coordinate of the surface, i.e. X for a surface parallel to " "the XY or XZ planes, Y for a surface parallel to the YZ plane. For best results, " "the extents (maximum-minimum values) in a given direction should be evenly " "divisible by the number of divisions in that direction.", ""); gtk_tooltips_set_tip(GTK_TOOLTIPS (tooltips), GTK_WIDGET (g_object_get_data (G_OBJECT (g_pWnd), "hmax")), "Maximum horizontal coordinate of the surface, i.e. X for a surface parallel to " "the XY or XZ planes, Y for a surface parallel to the YZ plane. For best results, " "the extents (maximum-minimum values) in a given direction should be evenly " "divisible by the number of divisions in that direction.", ""); gtk_tooltips_set_tip(GTK_TOOLTIPS (tooltips), GTK_WIDGET (g_object_get_data (G_OBJECT (g_pWnd), "vmin")), "Minimum vertical coordinate of the surface, i.e. Y for a surface parallel to " "the XY plane, Z for a surface parallel to the XZ or YZ planes. For best results, " "the extents (maximum-minimum values) in a given direction should be evenly " "divisible by the number of divisions in that direction.", ""); gtk_tooltips_set_tip(GTK_TOOLTIPS (tooltips), GTK_WIDGET (g_object_get_data (G_OBJECT (g_pWnd), "vmax")), "Maximum vertical coordinate of the surface, i.e. Y for a surface parallel to " "the XY plane, Z for a surface parallel to the XZ or YZ planes. For best results, " "the extents (maximum-minimum values) in a given direction should be evenly " "divisible by the number of divisions in that direction.", ""); gtk_tooltips_set_tip(GTK_TOOLTIPS (tooltips), GTK_WIDGET (g_object_get_data (G_OBJECT (g_pWnd), "nh")), "Number of divisions in the horizontal direction. For best results, the extents " "in a given direction should be evenly divisible by the number of divisions in " "that direction.", ""); gtk_tooltips_set_tip(GTK_TOOLTIPS (tooltips), GTK_WIDGET (g_object_get_data (G_OBJECT (g_pWnd), "nv")), "Number of divisions in the vertical direction. For best results, the extents " "in a given direction should be evenly divisible by the number of divisions in " "that direction.", ""); gtk_tooltips_set_tip(GTK_TOOLTIPS (tooltips), GTK_WIDGET (g_object_get_data (G_OBJECT (g_pWnd), "use_patches")), "Produce one or more curved patches in the shape of your selected surface rather " "than producing solid brushes. Depending on the size of your surface (and the " "user's graphic detail settings, which you cannot control), curved surfaces will " "be represented in the game by a very large number of polygons. Read the warnings " "concerning curved surfaces on the GenSurf web page before using this feature.", ""); gtk_tooltips_set_tip(GTK_TOOLTIPS (tooltips), GTK_WIDGET (g_object_get_data (G_OBJECT (g_pWnd), "decimate")), "Use the slider to control the number of vertices discarded by GenSurf. For many " "surfaces, you can produce roughly the same shape surface with a high decimation " "value. This will generally result in a map with lower polygon counts (and better " "in-game performance). However, this feature should NOT be used for large terrain " "surfaces in Q3", ""); gtk_tooltips_set_tip(GTK_TOOLTIPS (tooltips), GTK_WIDGET (g_object_get_data (G_OBJECT (g_pWnd), "z00")), "Enter the height of the surface at the lower left corner. This value will likely " "be modified unless \"Linear Borders\" is checked.", ""); gtk_tooltips_set_tip(GTK_TOOLTIPS (tooltips), GTK_WIDGET (g_object_get_data (G_OBJECT (g_pWnd), "z01")), "Enter the height of the surface at the upper left corner. This value will likely " "be modified unless \"Linear Borders\" is checked.", ""); gtk_tooltips_set_tip(GTK_TOOLTIPS (tooltips), GTK_WIDGET (g_object_get_data (G_OBJECT (g_pWnd), "z10")), "Enter the height of the surface at the lower right corner. This value will likely " "be modified unless \"Linear Borders\" is checked.", ""); gtk_tooltips_set_tip(GTK_TOOLTIPS (tooltips), GTK_WIDGET (g_object_get_data (G_OBJECT (g_pWnd), "z11")), "Enter the height of the surface at the upper right corner. This value will likely " "be modified unless \"Linear Borders\" is checked.", ""); gtk_tooltips_set_tip(GTK_TOOLTIPS (tooltips), GTK_WIDGET (g_object_get_data (G_OBJECT (g_pWnd), "linearborder")), "Restrict the edges of the surface to a straight line. This will help match up " "brush edges if you drop this surface into another map.", ""); // Bitmap tab gtk_tooltips_set_tip(GTK_TOOLTIPS (tooltips), GTK_WIDGET (g_object_get_data (G_OBJECT (g_pWnd), "bmp_file")), "Type the name of an 8-bit bitmap image file, or click Browse to select an image " "from a list of those available on your system.", ""); gtk_tooltips_set_tip(GTK_TOOLTIPS (tooltips), GTK_WIDGET (g_object_get_data (G_OBJECT (g_pWnd), "bmp_file_browse")), "Select a bitmap image file from a list of those available on your system.", ""); gtk_tooltips_set_tip(GTK_TOOLTIPS (tooltips), GTK_WIDGET (g_object_get_data (G_OBJECT (g_pWnd), "bmp_reload")), "Reload the selected bitmap file after making changes in an external image editor.", ""); gtk_tooltips_set_tip(GTK_TOOLTIPS (tooltips), GTK_WIDGET (g_object_get_data (G_OBJECT (g_pWnd), "bmp_black")), "Enter the value corresponding to color index 0 in the bitmap file. For gray scale " "images, color 0 is normally black.", ""); gtk_tooltips_set_tip(GTK_TOOLTIPS (tooltips), GTK_WIDGET (g_object_get_data (G_OBJECT (g_pWnd), "bmp_white")), "Enter the value corresponding to color index 255 in the bitmap file. For gray scale " "images, color 255 is normally white.", ""); // Fixpoints tab gtk_tooltips_set_tip(GTK_TOOLTIPS (tooltips), GTK_WIDGET (g_object_get_data (G_OBJECT (g_pWnd), "fix_value")), "Enter a value for the selected vertex. This value will not be adjusted when applying " "a waveform or roughness to the surface. Unlock this vertex (so that it will be " "adjusted normally) by clicking \"Free\". This vertex will influence vertices within " "the \"Range affected\" of this vertex.", ""); gtk_tooltips_set_tip(GTK_TOOLTIPS (tooltips), GTK_WIDGET (g_object_get_data (G_OBJECT (g_pWnd), "fix_range")), "Enter the range away from the selected vertex that other vertices will be affected. " "Use 0 if you don't want other vertices to be influenced by the currently selected " "one. Note: this box is disabled if you've chosen the fractal generator, as it uses " "a completely different method for determining values.", ""); gtk_tooltips_set_tip(GTK_TOOLTIPS (tooltips), GTK_WIDGET (g_object_get_data (G_OBJECT (g_pWnd), "fix_rate")), "Enter a rate of change for the surface affected by the fixed value. 0 gives a smooth " "sinusoidal curve, values less than 0 give progressively sharper spikes, and values " "greater than 0 take on a square shape. Values less than -30 or greater than 30 are " "set to -30 and 30, respectively. Note that this entry will have no effect unless " "you also specify a \"range affected\".", ""); gtk_tooltips_set_tip(GTK_TOOLTIPS (tooltips), GTK_WIDGET (g_object_get_data (G_OBJECT (g_pWnd), "fix_free")), "Click this to free (unlock the value of) the currently selected vertex.", ""); gtk_tooltips_set_tip(GTK_TOOLTIPS (tooltips), GTK_WIDGET (g_object_get_data (G_OBJECT (g_pWnd), "fix_freeall")), "Click this to free (unlock the values of) all vertices.", ""); // Texture tab gtk_tooltips_set_tip(GTK_TOOLTIPS (tooltips), GTK_WIDGET (g_object_get_data (G_OBJECT (g_pWnd), "texture1")), "Enter the name of the texture or shader used for the surface faces.", ""); gtk_tooltips_set_tip(GTK_TOOLTIPS (tooltips), GTK_WIDGET (g_object_get_data (G_OBJECT (g_pWnd), "texture2")), "Enter the name of the texture or shader used for faces other than the surface. Under " "normal circumstances this should be \"common/caulk\"", ""); gtk_tooltips_set_tip(GTK_TOOLTIPS (tooltips), GTK_WIDGET (g_object_get_data (G_OBJECT (g_pWnd), "texture3")), "Enter the name of the texture or shader used for \"steep\" surface faces, where \"steep\" " "is the angle specified below. If this entry is left blank or if the \"steep\" angle is 0, " "all surface faces will use the texture specified by \"Surface\".", ""); gtk_tooltips_set_tip(GTK_TOOLTIPS (tooltips), GTK_WIDGET (g_object_get_data (G_OBJECT (g_pWnd), "detail")), "Check this box to use the detail content property on the generated brushes. Compile " "times will be considerably shorter if the detail property is used, though the surface " "will not block visibility at all. If you use the detail property, you should make sure " "that \"common/caulk\" is used for the non-surface faces, or the polygon count will be " "much higher than necessary.", ""); } // ============================================================================= // create main dialog GtkWidget* create_main_dialog () { GtkWidget *dlg, *vbox, *hbox, *hbox2, *button, *notebook, *frame, *table, *table2; GtkWidget *check, *spin, *radio, *label, *entry, *scale; GtkObject *adj; GSList *group; int i; const char *games[] = { "Quake 2", "Half-Life", "SiN", "Heretic 2", "Kingpin", "Genesis3D", "Quake 3 Arena" }; const char *waveforms[] = { "Alternating hill/valley", "Cylindrical left-to-right", "Cylindrical top-to-bottom", "From bitmap", "Fractal" }; const char *orientations[] = { "Ground surface", "Ceiling", "Wall facing 0", "Wall facing 90", "Wall facing 180","Wall facing 270" }; g_pWnd = dlg = gtk_window_new (GTK_WINDOW_TOPLEVEL); gtk_window_set_title (GTK_WINDOW (dlg), gszCaption); g_signal_connect (G_OBJECT (dlg), "delete_event", G_CALLBACK (main_close), NULL); // g_signal_connect (G_OBJECT (dlg), "destroy", G_CALLBACK (gtk_widget_destroy), NULL); gtk_window_set_transient_for (GTK_WINDOW (dlg), GTK_WINDOW (g_pRadiantWnd)); hbox = gtk_hbox_new (FALSE, 5); gtk_widget_show (hbox); gtk_container_add (GTK_CONTAINER (dlg), hbox); gtk_container_set_border_width (GTK_CONTAINER (hbox), 5); notebook = gtk_notebook_new (); gtk_widget_show (notebook); gtk_box_pack_start (GTK_BOX (hbox), notebook, TRUE, TRUE, 0); g_signal_connect (G_OBJECT (notebook), "switch_page", G_CALLBACK (switch_page), NULL); gtk_notebook_set_tab_pos (GTK_NOTEBOOK (notebook), GTK_POS_TOP); g_object_set_data (G_OBJECT (dlg), "notebook", notebook); table = gtk_table_new (2, 2, FALSE); gtk_widget_show (table); gtk_container_set_border_width (GTK_CONTAINER (table), 5); gtk_table_set_row_spacings (GTK_TABLE (table), 5); gtk_table_set_col_spacings (GTK_TABLE (table), 5); label = gtk_label_new (_("General")); gtk_widget_show (label); gtk_notebook_append_page (GTK_NOTEBOOK (notebook), table, label); frame = gtk_frame_new (_("Game")); gtk_widget_show (frame); gtk_table_attach (GTK_TABLE (table), frame, 0, 1, 0, 1, (GtkAttachOptions) (GTK_EXPAND|GTK_FILL), (GtkAttachOptions) (GTK_EXPAND|GTK_FILL), 0, 0); vbox = gtk_vbox_new (TRUE, 5); gtk_widget_show (vbox); gtk_container_add (GTK_CONTAINER (frame), vbox); gtk_container_set_border_width (GTK_CONTAINER (vbox), 5); for (i = 0, group = NULL; i < NUMGAMES; i++) { radio = gtk_radio_button_new_with_label (group, games[i]); gtk_widget_show (radio); gtk_box_pack_start (GTK_BOX (vbox), radio, TRUE, TRUE, 0); group = gtk_radio_button_group (GTK_RADIO_BUTTON (radio)); game_radios[i] = radio; g_signal_connect (G_OBJECT (radio), "toggled", G_CALLBACK (general_game), GINT_TO_POINTER (i)); } frame = gtk_frame_new (_("Waveform")); gtk_widget_show (frame); gtk_table_attach (GTK_TABLE (table), frame, 1, 2, 0, 1, (GtkAttachOptions) (GTK_EXPAND|GTK_FILL), (GtkAttachOptions) (GTK_EXPAND|GTK_FILL), 0, 0); vbox = gtk_vbox_new (TRUE, 5); gtk_widget_show (vbox); gtk_container_add (GTK_CONTAINER (frame), vbox); gtk_container_set_border_width (GTK_CONTAINER (vbox), 5); for (i = 0, group = NULL; i < 5; i++) { radio = gtk_radio_button_new_with_label (group, waveforms[i]); gtk_widget_show (radio); gtk_box_pack_start (GTK_BOX (vbox), radio, TRUE, TRUE, 0); group = gtk_radio_button_group (GTK_RADIO_BUTTON (radio)); wave_radios[i] = radio; g_signal_connect (G_OBJECT (radio), "toggled", G_CALLBACK (general_wave), GINT_TO_POINTER (i)); } frame = gtk_frame_new (_("Orientation")); gtk_widget_show (frame); gtk_table_attach (GTK_TABLE (table), frame, 0, 1, 1, 2, (GtkAttachOptions) (GTK_EXPAND|GTK_FILL), (GtkAttachOptions) (GTK_EXPAND|GTK_FILL), 0, 0); vbox = gtk_vbox_new (TRUE, 5); gtk_widget_show (vbox); gtk_container_add (GTK_CONTAINER (frame), vbox); gtk_container_set_border_width (GTK_CONTAINER (vbox), 5); for (i = 0, group = NULL; i < 6; i++) { radio = gtk_radio_button_new_with_label (group, orientations[i]); gtk_widget_show (radio); gtk_box_pack_start (GTK_BOX (vbox), radio, TRUE, TRUE, 0); group = gtk_radio_button_group (GTK_RADIO_BUTTON (radio)); plane_radios[i] = radio; g_signal_connect (G_OBJECT (radio), "toggled", G_CALLBACK (general_plane), GINT_TO_POINTER (i)); } table2 = gtk_table_new (4, 2, FALSE); gtk_widget_show (table2); gtk_table_set_row_spacings (GTK_TABLE (table2), 5); gtk_table_set_col_spacings (GTK_TABLE (table2), 5); gtk_table_attach (GTK_TABLE (table), table2, 1, 2, 1, 2, (GtkAttachOptions) (GTK_EXPAND|GTK_FILL), (GtkAttachOptions) (GTK_EXPAND|GTK_FILL), 0, 0); label = gtk_label_new (_("Wavelength:")); gtk_widget_show (label); gtk_table_attach (GTK_TABLE (table2), label, 0, 1, 0, 1, (GtkAttachOptions) (GTK_EXPAND|GTK_FILL), (GtkAttachOptions) (GTK_EXPAND|GTK_FILL), 0, 0); gtk_misc_set_alignment (GTK_MISC (label), 1, 0.5); gtk_label_set_justify (GTK_LABEL (label), GTK_JUSTIFY_RIGHT); label = gtk_label_new (_("Max. amplitude:")); gtk_widget_show (label); gtk_table_attach (GTK_TABLE (table2), label, 0, 1, 1, 2, (GtkAttachOptions) (GTK_EXPAND|GTK_FILL), (GtkAttachOptions) (GTK_EXPAND|GTK_FILL), 0, 0); gtk_misc_set_alignment (GTK_MISC (label), 1, 0.5); gtk_label_set_justify (GTK_LABEL (label), GTK_JUSTIFY_RIGHT); label = gtk_label_new (_("Roughness:")); gtk_widget_show (label); gtk_table_attach (GTK_TABLE (table2), label, 0, 1, 2, 3, (GtkAttachOptions) (GTK_EXPAND|GTK_FILL), (GtkAttachOptions) (GTK_EXPAND|GTK_FILL), 0, 0); gtk_misc_set_alignment (GTK_MISC (label), 1, 0.5); gtk_label_set_justify (GTK_LABEL (label), GTK_JUSTIFY_RIGHT); label = gtk_label_new (_("Random seed:")); gtk_widget_show (label); gtk_table_attach (GTK_TABLE (table2), label, 0, 1, 3, 4, (GtkAttachOptions) (GTK_EXPAND|GTK_FILL), (GtkAttachOptions) (GTK_EXPAND|GTK_FILL), 0, 0); gtk_misc_set_alignment (GTK_MISC (label), 1, 0.5); gtk_label_set_justify (GTK_LABEL (label), GTK_JUSTIFY_RIGHT); entry = gtk_entry_new (); gtk_widget_show (entry); gtk_table_attach (GTK_TABLE (table2), entry, 1, 2, 0, 1, (GtkAttachOptions) (GTK_EXPAND|GTK_FILL), (GtkAttachOptions) (GTK_EXPAND|GTK_FILL), 0, 0); gtk_widget_set_usize (entry, 50, -2); g_object_set_data (G_OBJECT (dlg), "wavelength", entry); g_signal_connect (G_OBJECT (entry), "focus_out_event", G_CALLBACK (doublevariable_entryfocusout), &WaveLength); entry = gtk_entry_new (); gtk_widget_show (entry); gtk_table_attach (GTK_TABLE (table2), entry, 1, 2, 1, 2, (GtkAttachOptions) (GTK_EXPAND|GTK_FILL), (GtkAttachOptions) (GTK_EXPAND|GTK_FILL), 0, 0); gtk_widget_set_usize (entry, 50, -2); g_object_set_data (G_OBJECT (dlg), "amplitude", entry); g_signal_connect (G_OBJECT (entry), "focus_out_event", G_CALLBACK (doublevariable_entryfocusout), &Amplitude); entry = gtk_entry_new (); gtk_widget_show (entry); gtk_table_attach (GTK_TABLE (table2), entry, 1, 2, 2, 3, (GtkAttachOptions) (GTK_EXPAND|GTK_FILL), (GtkAttachOptions) (GTK_EXPAND|GTK_FILL), 0, 0); gtk_widget_set_usize (entry, 50, -2); g_object_set_data (G_OBJECT (dlg), "roughness", entry); g_signal_connect (G_OBJECT (entry), "focus_out_event", G_CALLBACK (doublevariable_entryfocusout), &Roughness); adj = gtk_adjustment_new (1, 1, 32767, 1, 10, 10); g_signal_connect (G_OBJECT (adj), "value_changed", G_CALLBACK (general_random), NULL); spin = gtk_spin_button_new (GTK_ADJUSTMENT (adj), 1, 0); gtk_widget_show (spin); gtk_table_attach (GTK_TABLE (table2), spin, 1, 2, 3, 4, (GtkAttachOptions) (GTK_EXPAND|GTK_FILL), (GtkAttachOptions) (GTK_EXPAND|GTK_FILL), 0, 0); gtk_widget_set_usize (spin, 60, -2); g_object_set_data (G_OBJECT (dlg), "random", spin); vbox = gtk_vbox_new (FALSE, 5); gtk_widget_show (vbox); gtk_container_set_border_width (GTK_CONTAINER (vbox), 5); label = gtk_label_new (_("Extents")); gtk_widget_show (label); gtk_notebook_append_page (GTK_NOTEBOOK (notebook), vbox, label); hbox2 = gtk_hbox_new (FALSE, 5); gtk_widget_show (hbox2); gtk_box_pack_start (GTK_BOX (vbox), hbox2, FALSE, TRUE, 0); frame = gtk_frame_new (_("Extents")); gtk_widget_show (frame); gtk_box_pack_start (GTK_BOX (hbox2), frame, TRUE, TRUE, 0); table = gtk_table_new (3, 4, FALSE); gtk_widget_show (table); gtk_container_set_border_width (GTK_CONTAINER (table), 5); gtk_container_add (GTK_CONTAINER (frame), table); gtk_table_set_row_spacings (GTK_TABLE (table), 5); gtk_table_set_col_spacings (GTK_TABLE (table), 5); label = gtk_label_new (_("X:")); gtk_widget_show (label); gtk_table_attach (GTK_TABLE (table), label, 0, 1, 1, 2, (GtkAttachOptions) (GTK_FILL), (GtkAttachOptions) (GTK_FILL), 0, 0); g_object_set_data (G_OBJECT (dlg), "hmin_text", label); label = gtk_label_new (_("X:")); gtk_widget_show (label); gtk_table_attach (GTK_TABLE (table), label, 2, 3, 1, 2, (GtkAttachOptions) (GTK_FILL), (GtkAttachOptions) (GTK_FILL), 0, 0); g_object_set_data (G_OBJECT (dlg), "hmax_text", label); label = gtk_label_new (_("Y:")); gtk_widget_show (label); gtk_table_attach (GTK_TABLE (table), label, 0, 1, 2, 3, (GtkAttachOptions) (GTK_FILL), (GtkAttachOptions) (GTK_FILL), 0, 0); g_object_set_data (G_OBJECT (dlg), "vmin_text", label); label = gtk_label_new (_("Y:")); gtk_widget_show (label); gtk_table_attach (GTK_TABLE (table), label, 2, 3, 2, 3, (GtkAttachOptions) (GTK_FILL), (GtkAttachOptions) (GTK_FILL), 0, 0); g_object_set_data (G_OBJECT (dlg), "vmax_text", label); label = gtk_label_new (_("Lower-left")); gtk_widget_show (label); gtk_table_attach (GTK_TABLE (table), label, 1, 2, 0, 1, (GtkAttachOptions) (GTK_FILL), (GtkAttachOptions) (GTK_FILL), 0, 0); label = gtk_label_new (_("Upper-right")); gtk_widget_show (label); gtk_table_attach (GTK_TABLE (table), label, 3, 4, 0, 1, (GtkAttachOptions) (GTK_FILL), (GtkAttachOptions) (GTK_FILL), 0, 0); entry = gtk_entry_new (); gtk_widget_show (entry); gtk_table_attach (GTK_TABLE (table), entry, 1, 2, 1, 2, (GtkAttachOptions) (GTK_EXPAND|GTK_FILL), (GtkAttachOptions) (GTK_EXPAND|GTK_FILL), 0, 0); gtk_widget_set_usize (entry, 50, -2); g_object_set_data (G_OBJECT (dlg), "hmin", entry); g_signal_connect (G_OBJECT (entry), "focus_out_event", G_CALLBACK (doublevariable_entryfocusout), &Hll); entry = gtk_entry_new (); gtk_widget_show (entry); gtk_table_attach (GTK_TABLE (table), entry, 3, 4, 1, 2, (GtkAttachOptions) (GTK_EXPAND|GTK_FILL), (GtkAttachOptions) (GTK_EXPAND|GTK_FILL), 0, 0); gtk_widget_set_usize (entry, 50, -2); g_object_set_data (G_OBJECT (dlg), "hmax", entry); g_signal_connect (G_OBJECT (entry), "focus_out_event", G_CALLBACK (doublevariable_entryfocusout), &Hur); entry = gtk_entry_new (); gtk_widget_show (entry); gtk_table_attach (GTK_TABLE (table), entry, 1, 2, 2, 3, (GtkAttachOptions) (GTK_EXPAND|GTK_FILL), (GtkAttachOptions) (GTK_EXPAND|GTK_FILL), 0, 0); gtk_widget_set_usize (entry, 50, -2); g_object_set_data (G_OBJECT (dlg), "vmin", entry); g_signal_connect (G_OBJECT (entry), "focus_out_event", G_CALLBACK (doublevariable_entryfocusout), &Vll); entry = gtk_entry_new (); gtk_widget_show (entry); gtk_table_attach (GTK_TABLE (table), entry, 3, 4, 2, 3, (GtkAttachOptions) (GTK_EXPAND|GTK_FILL), (GtkAttachOptions) (GTK_EXPAND|GTK_FILL), 0, 0); gtk_widget_set_usize (entry, 50, -2); g_object_set_data (G_OBJECT (dlg), "vmax", entry); g_signal_connect (G_OBJECT (entry), "focus_out_event", G_CALLBACK (doublevariable_entryfocusout), &Vur); frame = gtk_frame_new (_("Divisions")); gtk_widget_show (frame); gtk_box_pack_start (GTK_BOX (hbox2), frame, TRUE, TRUE, 0); table = gtk_table_new (2, 2, FALSE); gtk_widget_show (table); gtk_container_set_border_width (GTK_CONTAINER (table), 5); gtk_container_add (GTK_CONTAINER (frame), table); gtk_table_set_row_spacings (GTK_TABLE (table), 5); gtk_table_set_col_spacings (GTK_TABLE (table), 5); label = gtk_label_new (_("X:")); gtk_widget_show (label); gtk_table_attach (GTK_TABLE (table), label, 0, 1, 0, 1, (GtkAttachOptions) (GTK_FILL), (GtkAttachOptions) (GTK_EXPAND|GTK_FILL), 0, 0); g_object_set_data (G_OBJECT (dlg), "nh_text", label); label = gtk_label_new (_("Y:")); gtk_widget_show (label); gtk_table_attach (GTK_TABLE (table), label, 0, 1, 1, 2, (GtkAttachOptions) (GTK_FILL), (GtkAttachOptions) (GTK_EXPAND|GTK_FILL), 0, 0); g_object_set_data (G_OBJECT (dlg), "nv_text", label); adj = gtk_adjustment_new (8, 1, MAX_ROWS, 1, 10, 10); g_signal_connect (G_OBJECT (adj), "value_changed", G_CALLBACK (extents_nhnv_spin), &NH); spin = gtk_spin_button_new (GTK_ADJUSTMENT (adj), 1, 0); gtk_widget_show (spin); gtk_table_attach (GTK_TABLE (table), spin, 1, 2, 0, 1, (GtkAttachOptions) (GTK_EXPAND|GTK_FILL), (GtkAttachOptions) (GTK_EXPAND|GTK_FILL), 0, 0); gtk_widget_set_usize (spin, 60, -2); g_object_set_data (G_OBJECT (dlg), "nh", spin); adj = gtk_adjustment_new (8, 1, MAX_ROWS, 1, 10, 10); g_signal_connect (G_OBJECT (adj), "value_changed", G_CALLBACK (extents_nhnv_spin), &NV); spin = gtk_spin_button_new (GTK_ADJUSTMENT (adj), 1, 0); gtk_widget_show (spin); gtk_table_attach (GTK_TABLE (table), spin, 1, 2, 1, 2, (GtkAttachOptions) (GTK_EXPAND|GTK_FILL), (GtkAttachOptions) (GTK_EXPAND|GTK_FILL), 0, 0); gtk_widget_set_usize (spin, 60, -2); g_object_set_data (G_OBJECT (dlg), "nv", spin); check = gtk_check_button_new_with_label ("Use Bezier patches"); gtk_widget_show (check); gtk_box_pack_start (GTK_BOX (vbox), check, FALSE, TRUE, 0); g_object_set_data (G_OBJECT (dlg), "use_patches", check); g_signal_connect (G_OBJECT (check), "toggled", G_CALLBACK (extents_use_patches), NULL); // ^Fishman - Snap to grid, replaced scroll bar with a texbox. label = gtk_label_new (_("Snap to grid:")); gtk_widget_show (label); gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, TRUE, 0); gtk_object_set_data (GTK_OBJECT (dlg), "snap_text", label); adj = gtk_adjustment_new (8, 0, 256, 1, 10, 10); g_signal_connect (G_OBJECT (adj), "value_changed", G_CALLBACK (extents_snaptogrid_spin), &SP); spin = gtk_spin_button_new (GTK_ADJUSTMENT (adj), 1, 0); gtk_widget_show (spin); gtk_box_pack_start (GTK_BOX (vbox), spin, FALSE, TRUE, 0); gtk_widget_set_usize (spin, 60, -2); g_object_set_data (G_OBJECT (dlg), "sp", spin); // ^Fishman - End of Snap to grid code. hbox2 = gtk_hbox_new (FALSE, 5); gtk_widget_show (hbox2); gtk_box_pack_start (GTK_BOX (vbox), hbox2, FALSE, TRUE, 10); label = gtk_label_new (_("Decimate:")); gtk_widget_show (label); gtk_box_pack_start (GTK_BOX (hbox2), label, FALSE, TRUE, 0); adj = gtk_adjustment_new (0, 0, 110, 1, 10, 10); g_signal_connect (G_OBJECT (adj), "value_changed", G_CALLBACK (extents_decimate), NULL); g_object_set_data (G_OBJECT (dlg), "decimate_adj", adj); scale = gtk_hscale_new (GTK_ADJUSTMENT (adj)); gtk_widget_show (scale); gtk_box_pack_start (GTK_BOX (hbox2), scale, TRUE, TRUE, 0); gtk_scale_set_value_pos (GTK_SCALE (scale), GTK_POS_RIGHT); gtk_scale_set_digits (GTK_SCALE (scale), 0); g_object_set_data (G_OBJECT (dlg), "decimate", scale); frame = gtk_frame_new (_("Corner values")); gtk_widget_show (frame); gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, TRUE, 0); table = gtk_table_new (3, 4, FALSE); gtk_widget_show (table); gtk_container_set_border_width (GTK_CONTAINER (table), 5); gtk_container_add (GTK_CONTAINER (frame), table); gtk_table_set_row_spacings (GTK_TABLE (table), 5); gtk_table_set_col_spacings (GTK_TABLE (table), 5); label = gtk_label_new (_("Upper-left:")); gtk_widget_show (label); gtk_table_attach (GTK_TABLE (table), label, 0, 1, 0, 1, (GtkAttachOptions) (GTK_FILL), (GtkAttachOptions) (GTK_FILL), 0, 0); label = gtk_label_new (_("Lower-left:")); gtk_widget_show (label); gtk_table_attach (GTK_TABLE (table), label, 0, 1, 1, 2, (GtkAttachOptions) (GTK_FILL), (GtkAttachOptions) (GTK_FILL), 0, 0); label = gtk_label_new (_("Upper-right:")); gtk_widget_show (label); gtk_table_attach (GTK_TABLE (table), label, 2, 3, 0, 1, (GtkAttachOptions) (GTK_FILL), (GtkAttachOptions) (GTK_FILL), 0, 0); label = gtk_label_new (_("Lower-right:")); gtk_widget_show (label); gtk_table_attach (GTK_TABLE (table), label, 2, 3, 1, 2, (GtkAttachOptions) (GTK_FILL), (GtkAttachOptions) (GTK_FILL), 0, 0); entry = gtk_entry_new (); gtk_widget_show (entry); gtk_table_attach (GTK_TABLE (table), entry, 1, 2, 0, 1, (GtkAttachOptions) (GTK_EXPAND|GTK_FILL), (GtkAttachOptions) (GTK_EXPAND|GTK_FILL), 0, 0); gtk_widget_set_usize (entry, 50, -2); g_object_set_data (G_OBJECT (dlg), "z01", entry); g_signal_connect (G_OBJECT (entry), "focus_out_event", G_CALLBACK (doublevariable_entryfocusout), &Z01); entry = gtk_entry_new (); gtk_widget_show (entry); gtk_table_attach (GTK_TABLE (table), entry, 1, 2, 1, 2, (GtkAttachOptions) (GTK_EXPAND|GTK_FILL), (GtkAttachOptions) (GTK_EXPAND|GTK_FILL), 0, 0); gtk_widget_set_usize (entry, 50, -2); g_object_set_data (G_OBJECT (dlg), "z00", entry); g_signal_connect (G_OBJECT (entry), "focus_out_event", G_CALLBACK (doublevariable_entryfocusout), &Z00); entry = gtk_entry_new (); gtk_widget_show (entry); gtk_table_attach (GTK_TABLE (table), entry, 3, 4, 0, 1, (GtkAttachOptions) (GTK_EXPAND|GTK_FILL), (GtkAttachOptions) (GTK_EXPAND|GTK_FILL), 0, 0); gtk_widget_set_usize (entry, 50, -2); g_object_set_data (G_OBJECT (dlg), "z11", entry); g_signal_connect (G_OBJECT (entry), "focus_out_event", G_CALLBACK (doublevariable_entryfocusout), &Z11); entry = gtk_entry_new (); gtk_widget_show (entry); gtk_table_attach (GTK_TABLE (table), entry, 3, 4, 1, 2, (GtkAttachOptions) (GTK_EXPAND|GTK_FILL), (GtkAttachOptions) (GTK_EXPAND|GTK_FILL), 0, 0); gtk_widget_set_usize (entry, 50, -2); g_object_set_data (G_OBJECT (dlg), "z10", entry); g_signal_connect (G_OBJECT (entry), "focus_out_event", G_CALLBACK (doublevariable_entryfocusout), &Z10); check = gtk_check_button_new_with_label ("Linear borders"); gtk_widget_show (check); gtk_table_attach (GTK_TABLE (table), check, 0, 4, 2, 3, (GtkAttachOptions) (GTK_EXPAND|GTK_FILL), (GtkAttachOptions) (GTK_EXPAND|GTK_FILL), 0, 0); g_object_set_data (G_OBJECT (dlg), "linearborder", check); g_signal_connect (G_OBJECT (check), "toggled", G_CALLBACK (extents_linearborder), NULL); vbox = gtk_vbox_new (FALSE, 10); gtk_widget_show (vbox); gtk_container_set_border_width (GTK_CONTAINER (vbox), 5); label = gtk_label_new (_("Bitmap")); gtk_widget_show (label); gtk_notebook_append_page (GTK_NOTEBOOK (notebook), vbox, label); label = gtk_label_new (""); gtk_widget_show (label); gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, TRUE, 0); g_object_set_data (G_OBJECT (dlg), "bmp_note", label); table = gtk_table_new (2, 2, FALSE); gtk_widget_show (table); gtk_container_set_border_width (GTK_CONTAINER (table), 5); gtk_box_pack_start (GTK_BOX (vbox), table, FALSE, TRUE, 0); gtk_table_set_row_spacings (GTK_TABLE (table), 5); gtk_table_set_col_spacings (GTK_TABLE (table), 5); label = gtk_label_new (_("Filename:")); gtk_widget_show (label); gtk_table_attach (GTK_TABLE (table), label, 0, 1, 0, 1, (GtkAttachOptions) (GTK_FILL), (GtkAttachOptions) (GTK_FILL), 0, 0); g_object_set_data (G_OBJECT (dlg), "bmp_text1", label); entry = gtk_entry_new (); gtk_widget_show (entry); gtk_table_attach (GTK_TABLE (table), entry, 1, 2, 0, 1, (GtkAttachOptions) (GTK_EXPAND|GTK_FILL), (GtkAttachOptions) (GTK_FILL), 0, 0); g_object_set_data (G_OBJECT (dlg), "bmp_file", entry); g_signal_connect (G_OBJECT (entry), "focus_out_event", G_CALLBACK (bitmap_file_entryfocusout), NULL); hbox2 = gtk_hbox_new (TRUE, 5); gtk_widget_show (hbox2); gtk_table_attach (GTK_TABLE (table), hbox2, 1, 2, 1, 2, (GtkAttachOptions) (0), (GtkAttachOptions) (GTK_EXPAND|GTK_FILL), 0, 0); button = gtk_button_new_with_label (_("Browse...")); gtk_widget_show (button); gtk_box_pack_start (GTK_BOX (hbox2), button, FALSE, FALSE, 0); gtk_widget_set_usize (button, 60, -2); g_object_set_data (G_OBJECT (dlg), "bmp_file_browse", button); g_signal_connect (G_OBJECT (button), "clicked", G_CALLBACK (bitmap_browse), NULL); button = gtk_button_new_with_label (_("Reload")); gtk_widget_show (button); gtk_box_pack_start (GTK_BOX (hbox2), button, FALSE, FALSE, 0); gtk_widget_set_usize (button, 60, -2); g_object_set_data (G_OBJECT (dlg), "bmp_reload", button); g_signal_connect (G_OBJECT (button), "clicked", G_CALLBACK (bitmap_reload), NULL); table = gtk_table_new (2, 2, TRUE); gtk_widget_show (table); gtk_container_set_border_width (GTK_CONTAINER (table), 5); gtk_box_pack_start (GTK_BOX (vbox), table, FALSE, TRUE, 0); gtk_table_set_row_spacings (GTK_TABLE (table), 5); gtk_table_set_col_spacings (GTK_TABLE (table), 5); label = gtk_label_new (_("Map color 0 to:")); gtk_widget_show (label); gtk_table_attach (GTK_TABLE (table), label, 0, 1, 0, 1, (GtkAttachOptions) (GTK_FILL|GTK_EXPAND), (GtkAttachOptions) (GTK_FILL), 0, 0); g_object_set_data (G_OBJECT (dlg), "bmp_text2", label); gtk_misc_set_alignment (GTK_MISC (label), 1, 0.5); gtk_label_set_justify (GTK_LABEL (label), GTK_JUSTIFY_RIGHT); label = gtk_label_new (_("Map color 255 to:")); gtk_widget_show (label); gtk_table_attach (GTK_TABLE (table), label, 0, 1, 1, 2, (GtkAttachOptions) (GTK_FILL|GTK_EXPAND), (GtkAttachOptions) (GTK_FILL), 0, 0); g_object_set_data (G_OBJECT (dlg), "bmp_text3", label); gtk_misc_set_alignment (GTK_MISC (label), 1, 0.5); gtk_label_set_justify (GTK_LABEL (label), GTK_JUSTIFY_RIGHT); hbox2 = gtk_hbox_new (FALSE, 5); gtk_widget_show (hbox2); gtk_table_attach (GTK_TABLE (table), hbox2, 1, 2, 0, 1, (GtkAttachOptions) (GTK_EXPAND|GTK_FILL), (GtkAttachOptions) (GTK_EXPAND|GTK_FILL), 0, 0); entry = gtk_entry_new (); gtk_widget_show (entry); gtk_box_pack_start (GTK_BOX (hbox2), entry, FALSE, FALSE, 0); gtk_widget_set_usize (entry, 50, -2); g_object_set_data (G_OBJECT (dlg), "bmp_black", entry); g_signal_connect (G_OBJECT (entry), "focus_out_event", G_CALLBACK (doublevariable_entryfocusout), &gbmp.black_value); hbox2 = gtk_hbox_new (FALSE, 5); gtk_widget_show (hbox2); gtk_table_attach (GTK_TABLE (table), hbox2, 1, 2, 1, 2, (GtkAttachOptions) (GTK_EXPAND|GTK_FILL), (GtkAttachOptions) (GTK_EXPAND|GTK_FILL), 0, 0); entry = gtk_entry_new (); gtk_widget_show (entry); gtk_box_pack_start (GTK_BOX (hbox2), entry, FALSE, FALSE, 0); gtk_widget_set_usize (entry, 50, -2); g_object_set_data (G_OBJECT (dlg), "bmp_white", entry); g_signal_connect (G_OBJECT (entry), "focus_out_event", G_CALLBACK (doublevariable_entryfocusout), &gbmp.white_value); vbox = gtk_vbox_new (FALSE, 10); gtk_widget_show (vbox); gtk_container_set_border_width (GTK_CONTAINER (vbox), 5); label = gtk_label_new (_("Fix Points")); gtk_widget_show (label); gtk_notebook_append_page (GTK_NOTEBOOK (notebook), vbox, label); label = gtk_label_new (_("Click on a vertex in the lower half of the preview window,\n" "then use the arrow keys or text box to assign a value.\n" "Use Ctrl+Click to select multiple vertices/toggle a\n" "selection. Use Shift+Click to select a range of vertices.\n\n" "Click \"Free\" to unlock a vertex. Vertices within \"Range\n" "affected\" will be influenced by this vertex.")); gtk_widget_show (label); gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, TRUE, 0); table = gtk_table_new (3, 3, FALSE); gtk_widget_show (table); gtk_container_set_border_width (GTK_CONTAINER (table), 5); gtk_box_pack_start (GTK_BOX (vbox), table, FALSE, TRUE, 0); gtk_table_set_row_spacings (GTK_TABLE (table), 5); gtk_table_set_col_spacings (GTK_TABLE (table), 5); label = gtk_label_new (_("Value:")); gtk_widget_show (label); gtk_table_attach (GTK_TABLE (table), label, 0, 1, 0, 1, (GtkAttachOptions) (GTK_FILL), (GtkAttachOptions) (GTK_FILL), 0, 0); gtk_misc_set_alignment (GTK_MISC (label), 1, 0.5); g_object_set_data (G_OBJECT (dlg), "fix_value_text", label); label = gtk_label_new (_("Range affected:")); gtk_widget_show (label); gtk_table_attach (GTK_TABLE (table), label, 0, 1, 1, 2, (GtkAttachOptions) (GTK_FILL), (GtkAttachOptions) (GTK_FILL), 0, 0); gtk_misc_set_alignment (GTK_MISC (label), 1, 0.5); g_object_set_data (G_OBJECT (dlg), "fix_range_text", label); label = gtk_label_new (_("Rate of change:")); gtk_widget_show (label); gtk_table_attach (GTK_TABLE (table), label, 0, 1, 2, 3, (GtkAttachOptions) (GTK_FILL), (GtkAttachOptions) (GTK_FILL), 0, 0); gtk_misc_set_alignment (GTK_MISC (label), 1, 0.5); g_object_set_data (G_OBJECT (dlg), "fix_rate_text", label); adj = gtk_adjustment_new (0, -65536, 65536, 1, 16, 16); g_signal_connect (G_OBJECT (adj), "value_changed", G_CALLBACK (fix_value_changed), NULL); spin = gtk_spin_button_new (GTK_ADJUSTMENT (adj), 1, 0); gtk_widget_show (spin); gtk_table_attach (GTK_TABLE (table), spin, 1, 2, 0, 1, (GtkAttachOptions) (GTK_EXPAND), (GtkAttachOptions) (GTK_EXPAND), 0, 0); gtk_widget_set_usize (spin, 60, -2); g_object_set_data (G_OBJECT (dlg), "fix_value", spin); g_signal_connect (G_OBJECT (spin), "focus_out_event", G_CALLBACK (fix_value_entryfocusout), NULL); entry = gtk_entry_new (); gtk_widget_show (entry); gtk_table_attach (GTK_TABLE (table), entry, 1, 2, 1, 2, (GtkAttachOptions) (GTK_EXPAND), (GtkAttachOptions) (GTK_FILL), 0, 0); gtk_widget_set_usize (entry, 60, -2); g_object_set_data (G_OBJECT (dlg), "fix_range", entry); g_signal_connect (G_OBJECT (entry), "focus_out_event", G_CALLBACK (fix_range_entryfocusout), NULL); entry = gtk_entry_new (); gtk_widget_show (entry); gtk_table_attach (GTK_TABLE (table), entry, 1, 2, 2, 3, (GtkAttachOptions) (GTK_EXPAND), (GtkAttachOptions) (GTK_FILL), 0, 0); gtk_widget_set_usize (entry, 60, -2); g_object_set_data (G_OBJECT (dlg), "fix_rate", entry); g_signal_connect (G_OBJECT (entry), "focus_out_event", G_CALLBACK (fix_rate_entryfocusout), NULL); button = gtk_button_new_with_label (_("Free")); gtk_widget_show (button); gtk_table_attach (GTK_TABLE (table), button, 2, 3, 0, 1, (GtkAttachOptions) (GTK_EXPAND), (GtkAttachOptions) (GTK_FILL), 0, 0); gtk_widget_set_usize (button, 60, -2); g_object_set_data (G_OBJECT (dlg), "fix_free", button); g_signal_connect (G_OBJECT (button), "clicked", G_CALLBACK (fix_free), NULL); button = gtk_button_new_with_label (_("Free All")); gtk_widget_show (button); gtk_table_attach (GTK_TABLE (table), button, 2, 3, 1, 2, (GtkAttachOptions) (GTK_EXPAND), (GtkAttachOptions) (GTK_FILL), 0, 0); gtk_widget_set_usize (button, 60, -2); g_object_set_data (G_OBJECT (dlg), "fix_freeall", button); g_signal_connect (G_OBJECT (button), "clicked", G_CALLBACK (fix_freeall), NULL); vbox = gtk_vbox_new (FALSE, 10); gtk_widget_show (vbox); gtk_container_set_border_width (GTK_CONTAINER (vbox), 5); label = gtk_label_new (_("Texture")); gtk_widget_show (label); gtk_notebook_append_page (GTK_NOTEBOOK (notebook), vbox, label); // ^Fishman - Modified to add more labels and textboxes. table = gtk_table_new (5, 2, FALSE); gtk_widget_show (table); gtk_box_pack_start (GTK_BOX (vbox), table, FALSE, TRUE, 0); gtk_table_set_row_spacings (GTK_TABLE (table), 5); gtk_table_set_col_spacings (GTK_TABLE (table), 5); label = gtk_label_new (_("Surface:")); gtk_widget_show (label); gtk_table_attach (GTK_TABLE (table), label, 0, 1, 0, 1, (GtkAttachOptions) (GTK_FILL), (GtkAttachOptions) (GTK_FILL), 0, 0); gtk_misc_set_alignment (GTK_MISC (label), 1, 0.5); label = gtk_label_new (_("Other:")); gtk_widget_show (label); gtk_table_attach (GTK_TABLE (table), label, 0, 1, 1, 2, (GtkAttachOptions) (GTK_FILL), (GtkAttachOptions) (GTK_FILL), 0, 0); gtk_misc_set_alignment (GTK_MISC (label), 1, 0.5); label = gtk_label_new (_("Steep:")); gtk_widget_show (label); gtk_table_attach (GTK_TABLE (table), label, 0, 1, 2, 3, (GtkAttachOptions) (GTK_FILL), (GtkAttachOptions) (GTK_FILL), 0, 0); gtk_misc_set_alignment (GTK_MISC (label), 1, 0.5); entry = gtk_entry_new (); gtk_widget_show (entry); gtk_table_attach (GTK_TABLE (table), entry, 1, 2, 0, 1, (GtkAttachOptions) (GTK_EXPAND|GTK_FILL), (GtkAttachOptions) (GTK_FILL), 0, 0); gtk_widget_set_usize (entry, 60, -2); g_object_set_data (G_OBJECT (dlg), "texture1", entry); g_signal_connect (G_OBJECT (entry), "focus_out_event", G_CALLBACK(texture_entryfocusout), GINT_TO_POINTER (0)); entry = gtk_entry_new (); gtk_widget_show (entry); gtk_table_attach (GTK_TABLE (table), entry, 1, 2, 1, 2, (GtkAttachOptions) (GTK_EXPAND|GTK_FILL), (GtkAttachOptions) (GTK_FILL), 0, 0); gtk_widget_set_usize (entry, 60, -2); g_object_set_data (G_OBJECT (dlg), "texture2", entry); g_signal_connect (G_OBJECT (entry), "focus_out_event", G_CALLBACK(texture_entryfocusout), GINT_TO_POINTER (1)); entry = gtk_entry_new (); gtk_widget_show (entry); gtk_table_attach (GTK_TABLE (table), entry, 1, 2, 2, 3, (GtkAttachOptions) (GTK_EXPAND|GTK_FILL), (GtkAttachOptions) (GTK_FILL), 0, 0); gtk_widget_set_usize (entry, 60, -2); g_object_set_data (G_OBJECT (dlg), "texture3", entry); hbox2 = gtk_hbox_new (FALSE, 5); gtk_widget_show (hbox2); gtk_box_pack_start (GTK_BOX (vbox), hbox2, FALSE, TRUE, 0); label = gtk_label_new (_("\"Steep\" angle:")); gtk_widget_show (label); gtk_box_pack_start (GTK_BOX (hbox2), label, FALSE, TRUE, 0); adj = gtk_adjustment_new (60, 0, 90, 1, 10, 10); spin = gtk_spin_button_new (GTK_ADJUSTMENT (adj), 1, 0); gtk_widget_show (spin); gtk_box_pack_start (GTK_BOX (hbox2), spin, FALSE, TRUE, 0); g_object_set_data (G_OBJECT (dlg), "tex_slant", spin); table = gtk_table_new (2, 4, TRUE); gtk_widget_show (table); gtk_box_pack_start (GTK_BOX (vbox), table, FALSE, TRUE, 0); gtk_table_set_row_spacings (GTK_TABLE (table), 5); gtk_table_set_col_spacings (GTK_TABLE (table), 5); label = gtk_label_new (_("Offset ")); gtk_widget_show (label); gtk_table_attach (GTK_TABLE (table), label, 0, 2, 0, 1, (GtkAttachOptions) (GTK_FILL), (GtkAttachOptions) (GTK_FILL), 0, 0); label = gtk_label_new (_("Scale ")); gtk_widget_show (label); gtk_table_attach (GTK_TABLE (table), label, 2, 4, 0, 1, (GtkAttachOptions) (GTK_FILL), (GtkAttachOptions) (GTK_FILL), 0, 0); entry = gtk_entry_new (); gtk_widget_show (entry); gtk_table_attach (GTK_TABLE (table), entry, 0, 1, 1, 2, (GtkAttachOptions) (GTK_EXPAND|GTK_FILL), (GtkAttachOptions) (GTK_FILL), 0, 0); gtk_widget_set_usize (entry, 60, -2); g_object_set_data (G_OBJECT (dlg), "texoffsetx", entry); entry = gtk_entry_new (); gtk_widget_show (entry); gtk_table_attach (GTK_TABLE (table), entry, 1, 2, 1, 2, (GtkAttachOptions) (GTK_EXPAND|GTK_FILL), (GtkAttachOptions) (GTK_FILL), 0, 0); gtk_widget_set_usize (entry, 60, -2); g_object_set_data (G_OBJECT (dlg), "texoffsety", entry); entry = gtk_entry_new (); gtk_widget_show (entry); gtk_table_attach (GTK_TABLE (table), entry, 2, 3, 1, 2, (GtkAttachOptions) (GTK_EXPAND|GTK_FILL), (GtkAttachOptions) (GTK_FILL), 0, 0); gtk_widget_set_usize (entry, 60, -2); g_object_set_data (G_OBJECT (dlg), "texscalex", entry); entry = gtk_entry_new (); gtk_widget_show (entry); gtk_table_attach (GTK_TABLE (table), entry, 3, 4, 1, 2, (GtkAttachOptions) (GTK_EXPAND|GTK_FILL), (GtkAttachOptions) (GTK_FILL), 0, 0); gtk_widget_set_usize (entry, 60, -2); g_object_set_data (G_OBJECT (dlg), "texscaley", entry); check = gtk_check_button_new_with_label (_("Use detail brushes")); gtk_widget_show (check); gtk_box_pack_start (GTK_BOX (vbox), check, FALSE, TRUE, 0); g_object_set_data (G_OBJECT (dlg), "detail", check); g_signal_connect (G_OBJECT (check), "toggled", G_CALLBACK (texture_detail), NULL); check = gtk_check_button_new_with_label (_("Detail hint brushes")); gtk_widget_show (check); gtk_box_pack_start (GTK_BOX (vbox), check, FALSE, TRUE, 0); g_object_set_data (G_OBJECT (dlg), "hint", check); g_signal_connect (G_OBJECT (check), "toggled", G_CALLBACK (texture_hint), NULL); // ^Fishman - Add terrain key to func_group. check = gtk_check_button_new_with_label (_("Add terrain key")); gtk_widget_show (check); gtk_box_pack_start (GTK_BOX (vbox), check, FALSE, TRUE, 0); g_object_set_data (G_OBJECT (dlg), "terrain_ent", check); g_signal_connect (G_OBJECT (check), "toggled", G_CALLBACK (texture_terrainent), NULL); vbox = gtk_vbox_new (FALSE, 5); gtk_widget_show (vbox); gtk_box_pack_start (GTK_BOX (hbox), vbox, FALSE, TRUE, 0); button = gtk_button_new_with_label (_("OK")); gtk_widget_show (button); gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, TRUE, 0); gtk_widget_set_usize (button, 60, -2); g_object_set_data (G_OBJECT (dlg), "go", button); g_signal_connect (G_OBJECT (button), "clicked", G_CALLBACK (main_go), NULL); label = gtk_label_new (_("Settings:")); gtk_widget_show (label); gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, TRUE, 0); button = gtk_button_new_with_label ("Open..."); gtk_widget_show (button); gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, TRUE, 0); g_object_set_data (G_OBJECT (dlg), "open", button); g_signal_connect (G_OBJECT (button), "clicked", G_CALLBACK (main_open), NULL); button = gtk_button_new_with_label (_("Save as...")); gtk_widget_show (button); gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, TRUE, 0); g_object_set_data (G_OBJECT (dlg), "save", button); g_signal_connect (G_OBJECT (button), "clicked", G_CALLBACK (main_save), NULL); button = gtk_button_new_with_label (_("Defaults")); gtk_widget_show (button); gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, TRUE, 0); g_object_set_data (G_OBJECT (dlg), "defaults", button); g_signal_connect (G_OBJECT (button), "clicked", G_CALLBACK (main_defaults), NULL); button = gtk_button_new_with_label (_("About...")); gtk_widget_show (button); gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, TRUE, 0); g_signal_connect (G_OBJECT (button), "clicked", G_CALLBACK (main_about), NULL); check = gtk_check_button_new_with_label (_("Preview")); gtk_widget_show (check); gtk_box_pack_start (GTK_BOX (vbox), check, FALSE, TRUE, 0); g_signal_connect (G_OBJECT (check), "toggled", G_CALLBACK (main_preview), NULL); g_object_set_data (G_OBJECT (dlg), "main_preview", check); // ^Fishman - Antializing for the preview window. check = gtk_check_button_new_with_label (_("Antialised lines")); gtk_widget_show (check); gtk_box_pack_start (GTK_BOX (vbox), check, FALSE, TRUE, 0); g_object_set_data (G_OBJECT (dlg), "main_antialiasing", check); g_signal_connect (G_OBJECT (check), "toggled", G_CALLBACK (main_antialiasing), NULL); for (i = 0; i < 5; i++) SetDlgValues (i); CreateViewWindow (); create_tooltips(); FirstPassComplete = 1; return dlg; } #if 0 HWND hwndDisplay = (HWND)NULL; HWND ghwndTab = (HWND)NULL; int iTab=0; RECT rcTab; FILE *ftex; char GenSurfURL[40] = {"http://tarot.telefragged.com/gensurf"}; char GenSurfBoard[40]={"http://tarot.telefragged.com/board"}; /* * AboutDlgProc - processes messages for the about dialog. */ qboolean CALLBACK AboutDlgProc( HWND hwnd, unsigned msg, UINT wparam, LONG lparam ) { char szText[256]; DRAWITEMSTRUCT *dis; HDC hdc; HPEN hpen; HWND hwndURL; RECT rc; SIZE size; lparam = lparam; /* turn off warning */ switch( msg ) { case WM_INITDIALOG: strcpy(szText,"About " ); strcat(szText,gszCaption); SetWindowText(hwnd,gszCaption); SetDlgItemText(hwnd,DLG_ABOUT_APP,szText); /* Application icon: */ SendDlgItemMessage( hwnd, DLG_ABOUT_ICON, STM_SETICON, (WPARAM)(HICON)LoadIcon(ghInst,"GENSURF"), (LPARAM) NULL); hwndURL = GetDlgItem(hwnd,DLG_ABOUT_URL); hdc = GetDC(hwndURL); GetTextExtentPoint(hdc,GenSurfURL,strlen(GenSurfURL),&size); ReleaseDC(hwndURL,hdc); GetWindowRect(hwndURL,&rc); SetWindowPos(hwndURL,(HWND)NULL,0,0,size.cx,size.cy+2, SWP_NOMOVE | SWP_NOZORDER); hwndURL = GetDlgItem(hwnd,DLG_ABOUT_BOARD); hdc = GetDC(hwndURL); GetTextExtentPoint(hdc,GenSurfBoard,strlen(GenSurfBoard),&size); ReleaseDC(hwndURL,hdc); GetWindowRect(hwndURL,&rc); SetWindowPos(hwndURL,(HWND)NULL,0,0,size.cx,size.cy+2, SWP_NOMOVE | SWP_NOZORDER); return TRUE; case WM_COMMAND: switch(LOWORD(wparam)) { case DLG_ABOUT_URL: HTTP(GenSurfURL); break; case DLG_ABOUT_BOARD: HTTP(GenSurfBoard); break; case IDOK: EndDialog(hwnd,1); return TRUE; } break; case WM_DRAWITEM: if(wparam == DLG_ABOUT_URL) { dis = (LPDRAWITEMSTRUCT)lparam; SetTextColor(dis->hDC,RGB(0,0,255)); TextOut(dis->hDC,0,0,GenSurfURL,strlen(GenSurfURL)); GetWindowRect(dis->hwndItem,&rc); GetTextExtentPoint(dis->hDC,GenSurfURL,strlen(GenSurfURL),&size); hpen = CreatePen(PS_SOLID,0,RGB(0,0,255)); SelectObject(dis->hDC,hpen); MoveToEx(dis->hDC,0,size.cy,NULL); LineTo(dis->hDC,size.cx,size.cy); SelectObject(dis->hDC,GetStockObject(BLACK_PEN)); DeleteObject(hpen); } else if(wparam==DLG_ABOUT_BOARD) { dis = (LPDRAWITEMSTRUCT)lparam; SetTextColor(dis->hDC,RGB(0,0,255)); TextOut(dis->hDC,0,0,GenSurfBoard,strlen(GenSurfBoard)); GetWindowRect(dis->hwndItem,&rc); GetTextExtentPoint(dis->hDC,GenSurfBoard,strlen(GenSurfBoard),&size); hpen = CreatePen(PS_SOLID,0,RGB(0,0,255)); SelectObject(dis->hDC,hpen); MoveToEx(dis->hDC,0,size.cy,NULL); LineTo(dis->hDC,size.cx,size.cy); SelectObject(dis->hDC,GetStockObject(BLACK_PEN)); DeleteObject(hpen); } break; case WM_CLOSE: EndDialog(hwnd,1); return TRUE; default: return FALSE; } return FALSE; } /* AboutDlgProc */ void About() { if( DialogBox( ghInst,"About", ghwnd_main, (DLGPROC)AboutDlgProc ) < 0) { char Text[256]; sprintf(Text,"In About(), GetLastError()=0x%08x",GetLastError()); MessageBox(ghwnd_main,Text,"GenSurf",MB_ICONEXCLAMATION); } } #endif