From 18c7f1ed7cbe523bf0c41271b1aec85375e759d5 Mon Sep 17 00:00:00 2001 From: eukos Date: Sun, 20 Sep 2015 09:19:46 +0200 Subject: [PATCH] First release of the editor stuff I've been working on, to test: 'editor' in console --- engine/draw.c | 6 - engine/host.c | 4 +- engine/screen.c | 7 +- include/draw.h | 6 + video/vid_gdk.c | 404 +++++++++++++++++++++++++++++++++++++++++++----- 5 files changed, 378 insertions(+), 49 deletions(-) diff --git a/engine/draw.c b/engine/draw.c index 7c30a8b..99f48e7 100644 --- a/engine/draw.c +++ b/engine/draw.c @@ -59,12 +59,6 @@ qpic_t *draw_backtile; //============================================================================= /* Support Routines */ -typedef struct cachepic_s -{ - char name[MAX_QPATH]; - cache_user_t cache; -} cachepic_t; - #define MAX_CACHED_PICS 128 cachepic_t menu_cachepics[MAX_CACHED_PICS]; int menu_numcachepics; diff --git a/engine/host.c b/engine/host.c index dbe413d..3c6cc23 100644 --- a/engine/host.c +++ b/engine/host.c @@ -1034,7 +1034,7 @@ void Con_Init_Cvars (); void Mod_Init_Cvars(); void Chase_Init_Cvars (); void SCR_Init_Cvars (); -void VID_Init_Cvars(); +void VID_Init_Cmds(); void V_Init_Cvars(); void R_Init_Cvars (); void CL_Init_Cvars (); @@ -1313,12 +1313,12 @@ void Host_Init (quakeparms_t *parms) Cvar_Init (); Cbuf_Init (); Cmd_Init (); + VID_Init_Cmds(); COM_Init_Cvars (); // initialize all filesystem related variables Con_Init_Cvars (); // initialize all console related cvars Mod_Init_Cvars(); // initialize all model related cvars Chase_Init_Cvars (); // initialize all chase camera related cvars SCR_Init_Cvars (); // initialize all screen(?) related cvars - VID_Init_Cvars(); // initialize all video related cvars V_Init_Cvars(); // initialize all view related cvars R_Init_Cvars (); // initialize all rendering system related cvars CL_Init_Cvars (); // initialize all cl_* related cvars diff --git a/engine/screen.c b/engine/screen.c index 5b9b1a0..6a441f3 100644 --- a/engine/screen.c +++ b/engine/screen.c @@ -1008,9 +1008,6 @@ static int WritePCXfile (const char *filename, byte *data, int width, int height COM_WriteFile(filename, pcx, length); } -#ifdef _WIN32 -extern unsigned char vid_curpal[256*3]; -#endif /* ================== SCR_ScreenShot_f @@ -1018,8 +1015,8 @@ SCR_ScreenShot_f */ void SCR_ScreenShot_f (void) { - char pcxname[80]; - char checkname[MAX_OSPATH]; + char pcxname[80]; + char checkname[MAX_OSPATH]; int i; for (i=0 ; i<=255 ; i++) diff --git a/include/draw.h b/include/draw.h index c262a67..21116d1 100644 --- a/include/draw.h +++ b/include/draw.h @@ -21,6 +21,12 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. // draw.h -- these are the only functions outside the refresh allowed // to touch the vid buffer +typedef struct cachepic_s +{ + char name[MAX_QPATH]; + cache_user_t cache; +} cachepic_t; + extern qpic_t *draw_disc; // also used on sbar extern unsigned char d_15to8table[65536]; void Draw_Init (void); diff --git a/video/vid_gdk.c b/video/vid_gdk.c index ce708ba..570b043 100644 --- a/video/vid_gdk.c +++ b/video/vid_gdk.c @@ -39,7 +39,7 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #include "../splash.xpm" #include "../icon.xpm" -viddef_t vid; // global video state +viddef_t vid; unsigned short d_8to16table[256]; static int gdk_initialized = 0; @@ -64,7 +64,6 @@ static int verbose = 0; static long X11_highhunkmark; static long X11_buffersize; -static int vid_buffersize; static int vid_surfcachesize; void *vid_surfcache; static int vid_center_x, vid_center_y; @@ -78,12 +77,15 @@ int config_notify=0; int config_notify_width; int config_notify_height; +qboolean vid_ineditor; +static unsigned char *ed_palette; + void VID_HandleDeath(int signal_num) { Sys_Error("[VIDEO] This death brought to you by the number %d\n", signal_num); } -void ResetFrameBuffer(void) +void VID_ResetFrameBuffer(void) { if (d_pzbuffer) { @@ -150,6 +152,7 @@ void VID_Init(unsigned char *palette) Sys_Error("[VIDEO] Bad window height\n"); } + ed_palette = palette; vid.maxwarpwidth = WARP_WIDTH; vid.maxwarpheight = WARP_HEIGHT; vid.maxlowwidth = LOW_WIDTH; @@ -163,7 +166,6 @@ void VID_Init(unsigned char *palette) /* initialize GDK */ gtk_init(NULL, NULL); gdk_rgb_init(); - gdk_initialized = 1;; sigaction(SIGINT, 0, &sa); sa.sa_handler = VID_HandleDeath; @@ -175,14 +177,13 @@ void VID_Init(unsigned char *palette) /* create the main window */ x_win = gtk_window_new(GTK_WINDOW_TOPLEVEL); - gtk_window_set_title(x_win, "NGUNIX X11"); + gtk_window_set_title(x_win, "NGUNIX"); gtk_widget_set_size_request(x_win, vid.width, vid.height); gtk_window_set_default_size(x_win, vid.width, vid.height); gtk_window_set_position(x_win,GTK_WIN_POS_CENTER_ALWAYS); g_signal_connect (x_win, "destroy", G_CALLBACK (exit), NULL); gtk_widget_set_events(x_win, GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK); - if ((pnum=COM_CheckParm("-noborder"))) gtk_window_set_decorated(x_win, FALSE); @@ -194,7 +195,7 @@ void VID_Init(unsigned char *palette) /* map the window */ gtk_widget_show_all(x_win); - ResetFrameBuffer(); + VID_ResetFrameBuffer(); vid.rowbytes = vid.width; vid.buffer = x_framebuffer; @@ -212,6 +213,7 @@ void VID_Init(unsigned char *palette) vid_center_y = (int)(((float)vid_frame[2] / 2) + vid_frame[1]); vid_frame[2] += vid_frame[0]; vid_frame[3] += vid_frame[1]; + gdk_initialized = 1; } void VID_ShiftPalette(unsigned char *p) @@ -247,7 +249,7 @@ void VID_Shutdown(void) Con_Printf("[VIDEO] Shutting down...\n"); } -int XLateKey(int keysym) +int IN_LateKey(int keysym) { int key = 0; @@ -418,7 +420,7 @@ struct { int keyq_head = 0; int keyq_tail = 0; -void GetEvent(void) +void VID_GetEvent(void) { int w, h; GdkEvent *event; @@ -427,12 +429,12 @@ void GetEvent(void) if (event) switch (event->type) { case GDK_KEY_PRESS: - keyq[keyq_head].key = XLateKey(event->key.keyval); + keyq[keyq_head].key = IN_LateKey(event->key.keyval); keyq[keyq_head].down = true; keyq_head = (keyq_head + 1) & 63; break; case GDK_KEY_RELEASE: - keyq[keyq_head].key = XLateKey(event->key.keyval); + keyq[keyq_head].key = IN_LateKey(event->key.keyval); keyq[keyq_head].down = false; keyq_head = (keyq_head + 1) & 63; break; @@ -496,7 +498,7 @@ void VID_Update(vrect_t * rects) vid.width = config_notify_width & ~7; vid.height = config_notify_height; - ResetFrameBuffer(); + VID_ResetFrameBuffer(); vid.rowbytes = vid.width; vid.buffer = x_framebuffer; @@ -517,25 +519,6 @@ void VID_Update(vrect_t * rects) } } -static int dither; -void VID_DitherOn(void) -{ - if (dither == 0) - { - vid.recalc_refdef = 1; - dither = 1; - } -} - -void VID_DitherOff(void) -{ - if (dither) - { - vid.recalc_refdef = 1; - dither = 0; - } -} - int Sys_OpenWindow(void) { return 0; @@ -560,7 +543,7 @@ void Sys_SendKeyEvents(void) while (gdk_events_pending()) { - GetEvent(); + VID_GetEvent(); while (keyq_head != keyq_tail) { Key_Event(keyq[keyq_tail].key, keyq[keyq_tail].down); @@ -743,8 +726,357 @@ void IN_ShowMouse (void) gdk_window_set_cursor(gtk_widget_get_window(x_win), cursor_arrow); } +/* + * NGUNIX EDITOR GUFF + */ +static GtkWidget *ed_window; +static GdkGC *ed_pic; +static qpic_t *ed_file; +static GtkWidget *ed_menubar; +static GdkRgbCmap *ed_cmap = NULL; + +/* PALETTE SWITCHER + * =============== + * TODO: This somehow affects the main engine despite us using our own GdkColmap... + */ +gint VID_EditorLoadPalette(gpointer data) +{ + int i; + GtkWidget *dialog; + GtkFileChooserAction action = GTK_FILE_CHOOSER_ACTION_OPEN; + gint res; + loadedfile_t *palfile; + unsigned int colors[256]; + + dialog = gtk_file_chooser_dialog_new ("Open File", + NULL, + action, + ("_Cancel"), + GTK_RESPONSE_CANCEL, + ("_Open"), + GTK_RESPONSE_ACCEPT, + NULL); + + res = gtk_dialog_run (GTK_DIALOG (dialog)); + if (res == GTK_RESPONSE_ACCEPT) + { + char *filename; + GtkFileChooser *chooser = GTK_FILE_CHOOSER (dialog); + filename = gtk_file_chooser_get_filename (chooser); + + palfile = COM_LoadFile (filename, 2); + + if(palfile) + { + for(i=0; i < 16*16*3; i++) + ed_palette[i] = palfile->data[i]; + + if (ed_cmap) + gdk_rgb_cmap_free(ed_cmap); + + for (i = 0; i < 256; i++) + { + unsigned char r, g, b; + r = *ed_palette++; + g = *ed_palette++; + b = *ed_palette++; + colors[i] = r << 16 | g << 8 | b; + } + + ed_cmap = gdk_rgb_cmap_new(colors, 256); + + } + g_free (filename); + } + + gtk_widget_destroy (dialog); + return 0; +} + +/* COLORMAP VIEWER + * =============== + * Colormaps differ from lump files in the way that they don't start with a width | height header + * Otherwise they are identical in how they refer to palette indexes for their color*/ +gint VID_EditorViewColormap(gpointer data) +{ + int i; + GtkWidget *dialog; + GtkFileChooserAction action = GTK_FILE_CHOOSER_ACTION_OPEN; + gint res; + loadedfile_t *pic; + + dialog = gtk_file_chooser_dialog_new ("Open File", + NULL, + action, + ("_Cancel"), + GTK_RESPONSE_CANCEL, + ("_Open"), + GTK_RESPONSE_ACCEPT, + NULL); + + res = gtk_dialog_run (GTK_DIALOG (dialog)); + if (res == GTK_RESPONSE_ACCEPT) + { + char *filename; + GtkFileChooser *chooser = GTK_FILE_CHOOSER (dialog); + filename = gtk_file_chooser_get_filename (chooser); + + pic = COM_LoadFile (filename, 2); + + + if(pic) + { + ed_file = malloc(16385 + (sizeof(int) * 2)); + + ed_file->width = 256; + ed_file->height = 64; + + for(i = 0; i < 256 * 64; i++) + ed_file->data[i] = pic->data[i]; + + } + + gtk_window_resize(ed_window, ed_file->width, ed_file->height + ed_menubar->allocation.height); + g_free (filename); + } + + gtk_widget_destroy (dialog); + return 0; +} + +gint VID_EditorGenerateColormap(gpointer data) +{ + GtkWidget *dialog; + GtkFileChooser *chooser; + GtkFileChooserAction action = GTK_FILE_CHOOSER_ACTION_SAVE; + gint res; + byte *pic; + + dialog = gtk_file_chooser_dialog_new ("Save File", + NULL, + action, + ("_Cancel"), + GTK_RESPONSE_CANCEL, + ("_Save"), + GTK_RESPONSE_ACCEPT, + NULL); + chooser = GTK_FILE_CHOOSER (dialog); + gtk_file_chooser_set_do_overwrite_confirmation (chooser, TRUE); + + //if (user_edited_a_new_document) + gtk_file_chooser_set_current_name (chooser, + ("colormap.lmp")); + //else + // gtk_file_chooser_set_filename (chooser, + // existing_filename); + + res = gtk_dialog_run (GTK_DIALOG (dialog)); + if (res == GTK_RESPONSE_ACCEPT) + { + char *filename; + filename = gtk_file_chooser_get_filename (chooser); + unsigned char out_colormap[16384]; + Colormap_Generate(ed_palette, out_colormap); + COM_WriteFile (filename, out_colormap, 16384); + g_free (filename); + } + + gtk_widget_destroy (dialog); + return 0; +} + +gint VID_EditorSaveFile(gpointer data) +{ + GtkWidget *dialog; + GtkFileChooser *chooser; + GtkFileChooserAction action = GTK_FILE_CHOOSER_ACTION_SAVE; + gint res; + byte *pic; + + if(!ed_file) + return; + + dialog = gtk_file_chooser_dialog_new ("Save File", + NULL, + action, + ("_Cancel"), + GTK_RESPONSE_CANCEL, + ("_Save"), + GTK_RESPONSE_ACCEPT, + NULL); + chooser = GTK_FILE_CHOOSER (dialog); + gtk_file_chooser_set_do_overwrite_confirmation (chooser, TRUE); + + //if (user_edited_a_new_document) + gtk_file_chooser_set_current_name (chooser, + ("untitled.lmp")); + //else + // gtk_file_chooser_set_filename (chooser, + // existing_filename); + + res = gtk_dialog_run (GTK_DIALOG (dialog)); + if (res == GTK_RESPONSE_ACCEPT) + { + char *filename; + filename = gtk_file_chooser_get_filename (chooser); + //save_to_file (filename); + pic = malloc(2 + (ed_file->width * ed_file->height)); + + printf("Saving IMAGE: %i, %i\n", ed_file->width, ed_file->height); + + //memcpy(pic, &ed_file->width, sizeof(ed_file->width)); + //memcpy(pic + sizeof(ed_file->width), &ed_file->height, sizeof(ed_file->height)); + //memcpy(pic + (sizeof(ed_file->width) + sizeof(ed_file->height)), &ed_file->data, sizeof(ed_file->data)); + + pic[0] = ed_file->width; + pic[1] = ed_file->height; + + int i; + for(i = 0; i < ed_file->width * ed_file->height; i++) + pic[i+2] = ed_file->data[i]; + +#if 0 + printf("Saving IMAGE: %i, %i\n", pic[0], pic[1]); + for(i = 2; i < pic[0] * pic[1]+2; i++) + printf("%i,", pic[i]); + printf("\n...DONE\n"); +#endif + + COM_WriteFile (filename, pic, ed_file->width * ed_file->height + 2); + g_free (filename); + } + + gtk_widget_destroy (dialog); + return 0; +} + +gint VID_EditorLoadFile(gpointer data) +{ + GtkWidget *dialog; + GtkFileChooserAction action = GTK_FILE_CHOOSER_ACTION_OPEN; + gint res; + loadedfile_t *pic; + + dialog = gtk_file_chooser_dialog_new ("Open File", + NULL, + action, + ("_Cancel"), + GTK_RESPONSE_CANCEL, + ("_Open"), + GTK_RESPONSE_ACCEPT, + NULL); + + res = gtk_dialog_run (GTK_DIALOG (dialog)); + if (res == GTK_RESPONSE_ACCEPT) + { + char *filename; + GtkFileChooser *chooser = GTK_FILE_CHOOSER (dialog); + filename = gtk_file_chooser_get_filename (chooser); + + pic = COM_LoadFile (filename, 2); + + if(pic) + ed_file = (qpic_t *)pic->data; +#if 0 + int i; + printf("Loading IMAGE: %i, %i\n", ed_file->width, ed_file->height); + for(i = 0; i < ed_file->width * ed_file->height; i++) + printf("%i,", ed_file->data[i]); + printf("\n...DONE\n"); +#endif + gtk_window_resize(ed_window, ed_file->width, ed_file->height + ed_menubar->allocation.height); + g_free (filename); + //g_free(pic); + } + + gtk_widget_destroy (dialog); + return 0; +} + +void VID_EditorQuit(void) +{ + gtk_widget_destroy(ed_window); + vid_ineditor = false; + gtk_main_quit(); +} + +gint VID_EditorUpdate(gpointer data) +{ + if(ed_file) + gdk_draw_indexed_image(gtk_widget_get_window(ed_window), ed_pic, 0, ed_menubar->allocation.height, ed_file->width, ed_file->height, GDK_RGB_DITHER_NONE, ed_file->data, ed_file->width, ed_cmap); + + return 1; +} +void VID_LaunchEditor(void) +{ + GtkWidget *vbox; + GtkWidget *fileMenu; + GtkWidget *extraMenu; + + ed_cmap = x_cmap; + vid_ineditor = true; + ed_window = gtk_window_new(GTK_WINDOW_TOPLEVEL); + gtk_window_set_position(GTK_WINDOW(ed_window), GTK_WIN_POS_CENTER); + gtk_window_set_default_size(GTK_WINDOW(ed_window), 300, 200); + gtk_window_set_title(GTK_WINDOW(ed_window), "NGUNIX - 2D Lump Editor"); + + vbox = gtk_vbox_new(FALSE, 0); + gtk_container_add(GTK_CONTAINER(ed_window), vbox); + + ed_menubar = gtk_menu_bar_new(); + fileMenu = gtk_menu_new(); + extraMenu = gtk_menu_new(); + + GtkWidget *fileMi = gtk_menu_item_new_with_label("File"); + GtkWidget *newMi = gtk_menu_item_new_with_label("New"); + GtkWidget *loadMi = gtk_menu_item_new_with_label("Load..."); + GtkWidget *saveMi = gtk_menu_item_new_with_label("Save..."); + GtkWidget *quitMi = gtk_menu_item_new_with_label("Quit"); + + GtkWidget *extrMi = gtk_menu_item_new_with_label("Extra"); + GtkWidget *swipalMi = gtk_menu_item_new_with_label("Switch Palette..."); + GtkWidget *viewcolmapMi = gtk_menu_item_new_with_label("View Colormap..."); + GtkWidget *gencolmapMi = gtk_menu_item_new_with_label("Generate Colormap..."); + + gtk_menu_item_set_submenu(GTK_MENU_ITEM(fileMi), fileMenu); + gtk_menu_shell_append(GTK_MENU_SHELL(fileMenu), newMi); + gtk_menu_shell_append(GTK_MENU_SHELL(fileMenu), loadMi); + gtk_menu_shell_append(GTK_MENU_SHELL(fileMenu), saveMi); + gtk_menu_shell_append(GTK_MENU_SHELL(fileMenu), quitMi); + gtk_menu_shell_append(GTK_MENU_SHELL(ed_menubar), fileMi); + + gtk_menu_item_set_submenu(GTK_MENU_ITEM(extrMi), extraMenu); + gtk_menu_shell_append(GTK_MENU_SHELL(extraMenu), swipalMi); + gtk_menu_shell_append(GTK_MENU_SHELL(extraMenu), viewcolmapMi); + gtk_menu_shell_append(GTK_MENU_SHELL(extraMenu), gencolmapMi); + gtk_menu_shell_append(GTK_MENU_SHELL(ed_menubar), extrMi); + + gtk_box_pack_start(GTK_BOX(vbox), ed_menubar, FALSE, FALSE, 0); + + g_signal_connect(G_OBJECT(ed_window), "destroy", G_CALLBACK(VID_EditorQuit), NULL); + g_signal_connect(G_OBJECT(loadMi), "activate", G_CALLBACK(VID_EditorLoadFile), NULL); + g_signal_connect(G_OBJECT(saveMi), "activate", G_CALLBACK(VID_EditorSaveFile), NULL); + g_signal_connect(G_OBJECT(quitMi), "activate", G_CALLBACK(VID_EditorQuit), NULL); + g_signal_connect(G_OBJECT(swipalMi), "activate", G_CALLBACK(VID_EditorLoadPalette), NULL); + g_signal_connect(G_OBJECT(viewcolmapMi), "activate", G_CALLBACK(VID_EditorViewColormap), NULL); + g_signal_connect(G_OBJECT(gencolmapMi), "activate", G_CALLBACK(VID_EditorGenerateColormap), NULL); + + gtk_timeout_add(100, VID_EditorUpdate, NULL); + + gtk_widget_realize(ed_window); + gtk_widget_realize(ed_menubar); + ed_pic = gdk_gc_new(gtk_widget_get_window(ed_window)); + gtk_widget_show_all(ed_window); + + gtk_main(); +}; + +void VID_Init_Cmds(void) +{ + Cmd_AddCommand ("editor", VID_LaunchEditor); +} + // Commdand graveyard TODO: Get rid of this -void IN_Commands(){} -void IN_Init(){} -void IN_Shutdown(){} -void VID_Init_Cvars(){} +void IN_Init(void){} +void IN_Shutdown(void){} +void IN_Commands(void){}