diff --git a/README b/README index c68a1b9..7f038e2 100644 --- a/README +++ b/README @@ -5,8 +5,8 @@ |_/ |_|____/ \___/|_/ |_|___/_/\_\ This is a novelty engine rendering in software mode, aka on your CPU. -It uses standard X11 functions, so aside from that no dependencies are necessary. -For sound, please get the Open Sound System running. +It uses GTK/GDK functions, aside from that no dependencies are necessary. +For sound, please get the Open Sound System running (or wait until I'm done with the OpenAL backend) It can run Q1 with all its fancy waterwarping, too. @@ -14,19 +14,19 @@ It can run Q1 with all its fancy waterwarping, too. Features ************ -- Full software-rendered 3D-Engine -- Colored lighting, 8-bit, 16-bit and 24-bit dithered lightmaps +- Fully software-rendered 3D-Engine +- Colored lighting, 8-bit, "16-bit" and "24-bit" dithered lightmaps - Particle and (non-clipped) decal system - Coronas with support for light styles - Model blob shadows - Sound pitch variation - Server side QCVM gamecode with enhanced extensions (such as file i/o, traceboxes...) -- Texture filtering on level textures +- Texture filtering on level textures (Fabien Sanglard's) - Water translucency and refractions - Low detail modes - Distance fog -- Video output and window handling done with GDK/GTK -- Music playback via DUMB, X Multimedia System and FModEx if desired +- Video output, window handling and input powered by GDK/GTK (Version 2) +- Music playback via DUMB, X Multimedia System (and FModEx if desired) ************* Compiling @@ -42,6 +42,9 @@ For a release build (smaller and faster) issue 'make build_release'. - Originally based on engoo by leileilol - Carried over soundfixes from reQuiem - Main sound is done via OSS, not ALSA - aoss will most likely not work +- Caching of lookup tables is done on disk, taking up 1541120 bytes/1.5mb +- Engine contains an integrated palette as well as colormap generation +- It also contains an integrated (fallback) conchars - If you want to run Q1 with it, launch it with -data id1. You can get a particles.spr file for Q1 here: http://euksy.oldtimes-software.com/files/NGUNIX/particle.spr @@ -53,5 +56,8 @@ For a release build (smaller and faster) issue 'make build_release'. - Menu system done primarily using CSQC or similar - HUD system done primarily using CSQC or similar - Make the bots less Q1 specific, controllable via SSQC +- Make the engine run without any external content +- Integrate its own GUI toolset to create and edit lumps - Ship with a game directory that can be used as a base and torn apart for any use -- Ship with a free scratch QC base demo-ing the new engine extensions +- Ship with a free, scratch QC base demo-ing the new engine extensions +- Bring back the Windows version (for those who don't 'get' UNIX) diff --git a/engine/screen.c b/engine/screen.c index 9cad6d6..5b9b1a0 100644 --- a/engine/screen.c +++ b/engine/screen.c @@ -1018,44 +1018,32 @@ SCR_ScreenShot_f */ void SCR_ScreenShot_f (void) { - int i; char pcxname[80]; - char pcxnametwo[80]; char checkname[MAX_OSPATH]; + int i; -// -// find a file name to save it to -// -#ifndef linux - strcpy(pcxname,"scrsh00.pcx"); -#else - strcpy(pcxname,"scrsh00.xwd"); -#endif - - for (i=0 ; i<=99 ; i++) + for (i=0 ; i<=255 ; i++) { - pcxname[5] = i/10 + '0'; - pcxname[6] = i%10 + '0'; - sprintf (checkname, "%s/%s", com_gamedir, pcxname); + if(sv.active) + sprintf(pcxname, "%s%03i.pcx", sv.name, i); + else + sprintf(pcxname, "console%03i.pcx", i); + + sprintf(checkname, "%s/%s", com_gamedir, pcxname); + if (Sys_FileTime(checkname) == -1) break; // file doesn't exist } - if (i==100) + + if (i==256) { - Con_Printf ("[ENGINE] Couldn't dump screenshot!\n"); + Con_Printf ("[ENGINE] Couldn't dump screenshot! (limit reached)\n"); return; } -#ifndef linux - D_EnableBackBufferAccess (); // enable direct drawing of console to back - WritePCXfile (pcxname, vid.buffer, vid.width, vid.height, vid.rowbytes, vid_curpal); -// WritePCXfile (pcxname, vid.buffer, vid.width, vid.height, vid.rowbytes, host_basepal); - D_DisableBackBufferAccess (); // for adapters that can't stay mapped in -#else - sprintf(pcxnametwo, "xwd -name \"NGUNIX X11\" -display :0 -out ./%s/%s", com_gamedir, pcxname); - system(pcxnametwo); -#endif + WritePCXfile (pcxname, vid.buffer, vid.width, vid.height, vid.rowbytes, host_basepal); + D_DisableBackBufferAccess (); Con_Printf ("[ENGINE] Dumped %s/%s\n", com_gamedir, pcxname); } diff --git a/video/vid_gdk.c b/video/vid_gdk.c index 7df07ad..ce708ba 100644 --- a/video/vid_gdk.c +++ b/video/vid_gdk.c @@ -42,19 +42,15 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. viddef_t vid; // global video state unsigned short d_8to16table[256]; -int num_shades = 32; -int gdk_initialized = 0; +static int gdk_initialized = 0; static int vid_frame[4]; -float mouse_x, mouse_y; -float old_mouse_x, old_mouse_y; -qboolean mouse_enabled; +static float mouse_x, mouse_y; +static float old_mouse_x, old_mouse_y; +static qboolean mouse_enabled; cvar_t *m_filter; extern int deathcam_yesiamdead; -int p_mouse_x; -int p_mouse_y; -int d_con_indirect = 0; -int vid_buffersize; +extern vec3_t deathcam_angles; static GtkWidget *x_win; static GdkGC *x_gc; @@ -68,26 +64,29 @@ static int verbose = 0; static long X11_highhunkmark; static long X11_buffersize; -int vid_surfcachesize; +static int vid_buffersize; +static int vid_surfcachesize; void *vid_surfcache; static int vid_center_x, vid_center_y; +static int vid_mouseposx, vid_mouseposy; void (*vid_menudrawfn) (void); void (*vid_menukeyfn) (int key); void VID_MenuKey(int key); -// ======================================================================== -// Tragic death handler -// ======================================================================== +int config_notify=0; +int config_notify_width; +int config_notify_height; -void TragicDeath(int signal_num) +void VID_HandleDeath(int signal_num) { - Sys_Error("This death brought to you by the number %d\n", signal_num); + Sys_Error("[VIDEO] This death brought to you by the number %d\n", signal_num); } void ResetFrameBuffer(void) { - if (d_pzbuffer) { + if (d_pzbuffer) + { D_FlushCaches(); Hunk_FreeToHighMark(X11_highhunkmark); d_pzbuffer = NULL; @@ -115,18 +114,10 @@ void ResetFrameBuffer(void) if (!x_framebuffer) Sys_Error("[VIDE] Failed to reset framebuffer!\n"); - //vid.buffer = (byte *) (x_framebuffer); - // vid.conbuffer = vid.buffer; + vid.buffer = (byte *) (x_framebuffer); + vid.conbuffer = vid.buffer; } -// Called at startup to set up translation tables, takes 256 8 bit RGB values -// the palette data will go away after the call, so it must be copied off if -// the video driver will need it again - -int config_notify=0; -int config_notify_width; -int config_notify_height; - void VID_Init(unsigned char *palette) { int pnum; @@ -175,7 +166,7 @@ void VID_Init(unsigned char *palette) gdk_initialized = 1;; sigaction(SIGINT, 0, &sa); - sa.sa_handler = TragicDeath; + sa.sa_handler = VID_HandleDeath; sigaction(SIGINT, &sa, 0); sigaction(SIGTERM, &sa, 0); @@ -185,34 +176,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_widget_set_size_request(x_win, vid.width, vid.height); gtk_window_set_default_size(x_win, vid.width, vid.height); - gtk_widget_set_size_request(x_win, 320, 200); 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); - // FOR LATER! -/* - GtkWidget *menubar; - GtkWidget *fileMenu; - GtkWidget *fileMi; - GtkWidget *quitMi; - GtkWidget *vbox; - vbox = gtk_vbox_new(FALSE, 0); - gtk_container_add(GTK_CONTAINER(x_win), vbox); - - menubar = gtk_menu_bar_new(); - fileMenu = gtk_menu_new(); - - fileMi = gtk_menu_item_new_with_label("File"); - quitMi = gtk_menu_item_new_with_label("Quit"); - - gtk_menu_item_set_submenu(GTK_MENU_ITEM(fileMi), fileMenu); - gtk_menu_shell_append(GTK_MENU_SHELL(fileMenu), quitMi); - gtk_menu_shell_append(GTK_MENU_SHELL(menubar), fileMi); - gtk_box_pack_start(GTK_BOX(vbox), menubar, FALSE, FALSE, 0);*/ - if ((pnum=COM_CheckParm("-noborder"))) gtk_window_set_decorated(x_win, FALSE); @@ -310,6 +280,7 @@ int XLateKey(int keysym) key = K_ESCAPE; break; case GDK_Return: + case GDK_KEY_KP_Enter: key = K_ENTER; break; case GDK_Tab: @@ -397,9 +368,6 @@ int XLateKey(int keysym) case GDK_KEY_KP_Delete: key = ','; break; - case GDK_KEY_KP_Enter: - key = K_ENTER; - break; case GDK_KEY_KP_0 : key = '0'; break; @@ -471,7 +439,10 @@ void GetEvent(void) case GDK_ENTER_NOTIFY: break; case GDK_LEAVE_NOTIFY: - IN_DeactivateMouse(); + if(mouse_enabled) + gdk_display_warp_pointer (display, screen, vid_center_x, vid_center_y); + else + IN_DeactivateMouse(); break; case GDK_CONFIGURE: gtk_window_get_size(GTK_WINDOW(x_win), &w, &h); @@ -533,10 +504,8 @@ void VID_Update(vrect_t * rects) vid.conrowbytes = vid.rowbytes; vid.conwidth = vid.width; vid.conheight = vid.height; - vid.recalc_refdef = 1; Con_CheckResize(); - //Con_Clear_f(); return; } @@ -612,11 +581,6 @@ void D_EndDirectRect(int x, int y, int width, int height) } -/* -=========== -VID_HandlePause --eukara -=========== -*/ void VID_HandlePause (qboolean pause) { if (pause) @@ -631,8 +595,6 @@ void VID_HandlePause (qboolean pause) } } -static int vid_mouseposx, vid_mouseposy; -extern vec3_t deathcam_angles; //eukara - deathcam void IN_Move (usercmd_t *cmd) { vec3_t tangles; // eukara - deathcam @@ -715,12 +677,6 @@ void IN_Move (usercmd_t *cmd) mouse_x = mouse_y = 0; } -void IN_Commands() -{ - -} -void IN_Init(){} -void IN_Shutdown(){} gboolean VID_KillSplash(gpointer data){ gtk_widget_destroy((GtkWidget*)data); @@ -733,8 +689,6 @@ void VID_CreateSplash() GdkPixmap *splash_image; GtkWidget *x_splash, *x_splash_image; GdkPixbuf *icon_image; - GtkWidget *x_icon; - gtk_init(NULL, NULL); icon_image = gdk_pixbuf_new_from_xpm_data(icon_xpm); @@ -756,16 +710,11 @@ void VID_CreateSplash() gtk_main (); } -void VID_Init_Cvars() -{ - // Add stuff in here... later -} void IN_Init_Cvars() { m_filter = Cvar_Get ("m_filter", "0", CVAR_ARCHIVE|CVAR_ORIGINAL); } - /* * Mouse related functions * that have nothing todo with aiming or pushing buttons @@ -793,3 +742,9 @@ void IN_ShowMouse (void) GdkCursor* cursor_arrow = gdk_cursor_new(GDK_ARROW); gdk_window_set_cursor(gtk_widget_get_window(x_win), cursor_arrow); } + +// Commdand graveyard TODO: Get rid of this +void IN_Commands(){} +void IN_Init(){} +void IN_Shutdown(){} +void VID_Init_Cvars(){}