First release of the editor stuff I've been working on, to test: 'editor' in console

This commit is contained in:
eukos 2015-09-20 09:19:46 +02:00
parent 13c4c8206e
commit 18c7f1ed7c
5 changed files with 378 additions and 49 deletions

View file

@ -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;

View file

@ -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

View file

@ -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++)

View file

@ -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);

View file

@ -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){}