diff --git a/engine/Makefile b/engine/Makefile index 65b603834..01a4d31c9 100644 --- a/engine/Makefile +++ b/engine/Makefile @@ -117,7 +117,7 @@ ifeq ($(FTE_TARGET),droid) STRIP=$(TOOLCHAIN)strip CC=$(TOOLCHAIN)gcc -I$(NDK_PATH)/platforms/android-$(DROID_API_LEVEL)/$(DROID_PLAT_INC)/usr/include/ -DANDROID $(DROID_ABI) -fno-strict-aliasing - DO_LD=$(CC) -Wl,-soname,libftedroid.so -shared -Wl,--no-undefined -Wl,-z,noexecstack --sysroot=$(NDK_PATH)/platforms/android-$(DROID_API_LEVEL)/$(DROID_PLAT_INC) -L$(NDK_PATH)/platforms/android-$(DROID_API_LEVEL)/$(DROID_PLAT_INC)/usr/lib -o $@ $(LTO_LD) $(WCFLAGS) $(CFLAGS) -llog -lc -lz -lm + DO_LD=$(DO_ECHO) $(CC) -Wl,-soname,libftedroid.so -shared -Wl,--no-undefined -Wl,-z,noexecstack --sysroot=$(NDK_PATH)/platforms/android-$(DROID_API_LEVEL)/$(DROID_PLAT_INC) -L$(NDK_PATH)/platforms/android-$(DROID_API_LEVEL)/$(DROID_PLAT_INC)/usr/lib -o $@ $(LTO_LD) $(WCFLAGS) $(CFLAGS) -llog -lc -lz -lm endif #correct the gcc build when cross compiling @@ -287,7 +287,9 @@ ifneq ($(LTO),) LTO_LD=-flto endif -DO_CC=@echo $< && $(CC) $(LTO_CC) $(ALL_CFLAGS) -o $@ -c $< +#DO_ECHO=@echo $< && +DO_ECHO=@ +DO_CC=$(DO_ECHO) $(CC) $(LTO_CC) $(ALL_CFLAGS) -o $@ -c $< ifeq ($(FTE_TARGET),vc) BASELDFLAGS= @@ -333,7 +335,7 @@ ifeq ($(FTE_TARGET),vc) WARNINGFLAGS=-W3 -D_CRT_SECURE_NO_WARNINGS GNUC_FUNCS= else - WARNINGFLAGS=-Wall -Wno-pointer-sign + WARNINGFLAGS=-Wall -Wno-pointer-sign -Wno-unknown-pragmas -Wno-format-zero-length GNUC_FUNCS= -Dstrnicmp=strncasecmp -Dstricmp=strcasecmp endif @@ -781,7 +783,7 @@ ifeq ($(FTE_TARGET),vc) RELEASE_LDFLAGS = /LTCG:PGOPTIMIZE DO_CC=@$(CC) /nologo $(ALL_CFLAGS) -Fo$@ -c $< - DO_LD=@"$(MSVCPATH)link" /nologo /out:"$@" /nodefaultlib:libc.lib /LARGEADDRESSAWARE /nodefaultlib:MSVCRT $(MSVCLIB) /manifest:no /OPT:REF wsock32.lib user32.lib advapi32.lib winmm.lib libs/zlib$(BITS).lib shell32.lib + DO_LD=$(DO_ECHO) "$(MSVCPATH)link" /nologo /out:"$@" /nodefaultlib:libc.lib /LARGEADDRESSAWARE /nodefaultlib:MSVCRT $(MSVCLIB) /manifest:no /OPT:REF wsock32.lib user32.lib advapi32.lib winmm.lib libs/zlib$(BITS).lib shell32.lib PRECOMPHEADERS = NODEPS = 1 @@ -1171,7 +1173,7 @@ PRECOMPHEADERS ?= $(OUT_DIR)/quakedef.h.gch #god knows how gcc loads the list properly. #or at least I hope he does. It makes no sence to mortals. -DO_LD ?= $(CC) -o $@ $(LTO_LD) $(WCFLAGS) $(CFLAGS) +DO_LD ?=$(DO_ECHO) $(CC) -o $@ $(LTO_LD) $(WCFLAGS) $(CFLAGS) $(OUT_DIR)/$(EXE_NAME): $(PRECOMPHEADERS) $(foreach fn, $(CUSTOMOBJS) $(foreach ol, $(OBJS), $($(ol))),$(if $(findstring ltox,$(fn)),,$(OUT_DIR)/$(fn))) $(DO_LD) $(foreach fn, $(CUSTOMOBJS) $(foreach ol, $(OBJS) $(LTO_END), $($(ol))),$(if $(findstring ltox,$(fn)),$(subst ltox,-x ,$(fn)),$(OUT_DIR)/$(fn)) ) $(LDFLAGS) diff --git a/engine/client/cl_demo.c b/engine/client/cl_demo.c index 50f9998ed..4ef752afb 100644 --- a/engine/client/cl_demo.c +++ b/engine/client/cl_demo.c @@ -1689,7 +1689,7 @@ void CL_QTVPoll (void) if (qtvrequestsize >= sizeof(qtvrequestbuffer) - 1) { - Con_Printf("%i of %i...\n", qtvrequestsize, sizeof(qtvrequestbuffer)); + Con_Printf("%i of %i...\n", qtvrequestsize, (int)sizeof(qtvrequestbuffer)); len = -1; } if (!qtvrequestsize && len == 0) diff --git a/engine/client/cl_ents.c b/engine/client/cl_ents.c index a2798b3ad..6dd4c0e89 100644 --- a/engine/client/cl_ents.c +++ b/engine/client/cl_ents.c @@ -2359,7 +2359,6 @@ void CL_AddDecal(shader_t *shader, vec3_t origin, vec3_t up, vec3_t side, vec3_t { int num, v; vec3_t tang; - float radius = 1; float *verts; float tx, ty, tz; scenetris_t *t; diff --git a/engine/client/cl_ignore.c b/engine/client/cl_ignore.c index 5922846d2..5f9c7be97 100644 --- a/engine/client/cl_ignore.c +++ b/engine/client/cl_ignore.c @@ -164,7 +164,7 @@ static void Display_Ignorelist(void) else if (x) Con_Printf ("\n"); - if (ignoreteamlist[i][0]) + if (ignoreteamlist[0][0]) { x = 0; Con_Printf ("\x02" "Team Ignore List:\n"); diff --git a/engine/client/cl_input.c b/engine/client/cl_input.c index 8708bc81f..21d1fe29c 100644 --- a/engine/client/cl_input.c +++ b/engine/client/cl_input.c @@ -605,18 +605,20 @@ int MakeChar (int i) void CL_ClampPitch (int pnum) { - vec3_t view[4]; - vec3_t impact, norm; - float mat[16], mat2[16]; - vec3_t cross; + float mat[16]; float roll; - float dot; static float oldtime; float timestep = realtime - oldtime; oldtime = realtime; #if 0 if (cl.pmovetype[pnum] == PM_WALLWALK) { + vec3_t impact; + vec3_t norm; + float mat2[16]; + vec3_t cross; + vec3_t view[4]; + float dot; AngleVectors(cl.viewangles[pnum], view[0], view[1], view[2]); Matrix4x4_RM_FromVectors(mat, view[0], view[1], view[2], vec3_origin); @@ -654,7 +656,6 @@ void CL_ClampPitch (int pnum) float viewm[16]; vec3_t view[4]; vec3_t surf[3]; - vec3_t fwd, up; vec3_t vang; void PerpendicularVector( vec3_t dst, const vec3_t src ); @@ -1496,7 +1497,6 @@ void CL_SendCmd (double frametime, qboolean mainloop) int msecstouse; qboolean dontdrop=false; - extern cvar_t cl_maxfps; clcmdbuf_t *next; if (runningindepphys) diff --git a/engine/client/cl_main.c b/engine/client/cl_main.c index c42d7c539..a1a300bad 100644 --- a/engine/client/cl_main.c +++ b/engine/client/cl_main.c @@ -26,7 +26,7 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #include "cl_master.h" #include "cl_ignore.h" #include "shader.h" - +#include // callbacks void CL_Sbar_Callback(struct cvar_s *var, char *oldvalue); void Name_Callback(struct cvar_s *var, char *oldvalue); @@ -3125,8 +3125,8 @@ void CL_Init (void) cls.state = ca_disconnected; #ifdef SVNREVISION - if (strcmp(SVNREVISION, "-")) - ver = va("%s v%i.%02i %s", DISTRIBUTION, FTE_VER_MAJOR, FTE_VER_MINOR, SVNREVISION); + if (strcmp(STRINGIFY(SVNREVISION), "-")) + ver = va("%s v%i.%02i %s", DISTRIBUTION, FTE_VER_MAJOR, FTE_VER_MINOR, STRINGIFY(SVNREVISION)); else #endif ver = va("%s v%i.%02i", DISTRIBUTION, FTE_VER_MAJOR, FTE_VER_MINOR); diff --git a/engine/client/cl_parse.c b/engine/client/cl_parse.c index 51439d375..457258764 100644 --- a/engine/client/cl_parse.c +++ b/engine/client/cl_parse.c @@ -583,9 +583,7 @@ void CL_SendDownloadStartRequest(char *filename, char *localname, unsigned int f void CL_DownloadFinished(void) { int i; - extern int mod_numknown; char *ext; - extern model_t mod_known[]; char *filename = cls.downloadlocalname; char *tempname = cls.downloadtempname; @@ -659,6 +657,8 @@ void CL_DownloadFinished(void) if (!cl.sendprespawn) { /* + extern int mod_numknown; + extern model_t mod_known[]; for (i = 0; i < mod_numknown; i++) //go and load this model now. { if (!strcmp(mod_known[i].name, filename)) @@ -1776,7 +1776,7 @@ void CL_ParseChunkedDownload(void) } if (ridx == MAXBLOCKS) { - Con_DPrintf("dupe/invalid chunk received\n", chunknum); + Con_DPrintf("dupe/invalid chunk received\n"); return; } dlblock[ridx].chunkno = ~0; @@ -2506,6 +2506,8 @@ void CLQW_ParseServerData (void) pnum = MSG_ReadByte (); for (clnum = 0; ; clnum++) { + if (clnum == MAX_SPLITS) + Host_EndGame("Server sent us too many alternate clients\n"); cl.playernum[clnum] = pnum; if (cl.playernum[clnum] & 128) { @@ -2520,12 +2522,8 @@ void CLQW_ParseServerData (void) break; pnum = MSG_ReadByte (); - if (pnum == 128) break; - - if (clnum == MAX_SPLITS) - Host_EndGame("Server sent us too many alternate clients\n"); } cl.splitclients = clnum+1; } @@ -4870,15 +4868,15 @@ void CL_PrintChat(player_info_t *plr, char *rawmsg, char *msg, int plrflags) if (plrflags & (TPM_TEAM|TPM_OBSERVEDTEAM)) // for team chat don't highlight the name, just the brackets { - Q_strncatz(fullchatmessage, va("(^[^7%s%s^d\\player\\%i^])", name_coloured?"^m":"", name, plr-cl.players), sizeof(fullchatmessage)); + Q_strncatz(fullchatmessage, va("(^[^7%s%s^d\\player\\%i^])", name_coloured?"^m":"", name, (int)(plr-cl.players)), sizeof(fullchatmessage)); } else if (cl_standardchat.ival) { - Q_strncatz(fullchatmessage, va("^[^7%s%s^d\\player\\%i^]", name_coloured?"^m":"", name, plr-cl.players), sizeof(fullchatmessage)); + Q_strncatz(fullchatmessage, va("^[^7%s%s^d\\player\\%i^]", name_coloured?"^m":"", name, (int)(plr-cl.players)), sizeof(fullchatmessage)); } else { - Q_strncatz(fullchatmessage, va("^[^7%s^%c%s^d\\player\\%i^]", name_coloured?"^m":"", c, name, plr-cl.players), sizeof(fullchatmessage)); + Q_strncatz(fullchatmessage, va("^[^7%s^%c%s^d\\player\\%i^]", name_coloured?"^m":"", c, name, (int)(plr-cl.players)), sizeof(fullchatmessage)); } if (!memessage) @@ -5032,7 +5030,7 @@ void CL_PrintStandardMessage(char *msg, int printlevel) c = '0' + CL_PlayerColor(p, &coloured); // print name - Q_strncatz(fullmessage, va("^[%s^%c%s^d\\player\\%i^]", coloured?"^m":"", c, name, p - cl.players), sizeof(fullmessage)); + Q_strncatz(fullmessage, va("^[%s^%c%s^d\\player\\%i^]", coloured?"^m":"", c, name, (int)(p - cl.players)), sizeof(fullmessage)); break; } } diff --git a/engine/client/cl_screen.c b/engine/client/cl_screen.c index e760f20f7..449e1efa6 100644 --- a/engine/client/cl_screen.c +++ b/engine/client/cl_screen.c @@ -1637,7 +1637,7 @@ void SCR_DrawLoading (void) if (cls.downloadmethod) Draw_FunString(x+8, y+4, va("Downloading %s... %i%%", cls.downloadlocalname, - cls.downloadpercent)); + (int)cls.downloadpercent)); if (tsize > 1024*1024*16) { @@ -2234,7 +2234,7 @@ void SCR_BringDownConsole (void) void SCR_TileClear (void) { #ifdef PLUGINS - extern cvar_t plug_sbar; +// extern cvar_t plug_sbar; #endif if (cl.splitclients>1) diff --git a/engine/client/cl_tent.c b/engine/client/cl_tent.c index 3f94a834b..7bac43f9a 100644 --- a/engine/client/cl_tent.c +++ b/engine/client/cl_tent.c @@ -1686,7 +1686,7 @@ void CL_SpawnCustomTEnd(custtentinst_t *info) } else { - if (t->netstyle & CTE_CUSTOMVELOCITY|CTE_CUSTOMDIRECTION) + if (t->netstyle & (CTE_CUSTOMVELOCITY|CTE_CUSTOMDIRECTION)) failed = P_RunParticleEffectType(info->pos, info->dir, info->count, t->particleeffecttype); else failed = P_RunParticleEffectType(info->pos, NULL, info->count, t->particleeffecttype); diff --git a/engine/client/console.c b/engine/client/console.c index dd78a64e6..80914c046 100644 --- a/engine/client/console.c +++ b/engine/client/console.c @@ -1680,7 +1680,6 @@ char *Con_CopyConsole(qboolean nomarkup) conchar_t *cur; conline_t *l; conchar_t *lend; - conchar_t col = CON_WHITEMASK; char *result; int outlen, maxlen; int finalendoffset; diff --git a/engine/client/keys.c b/engine/client/keys.c index faa05031f..4ab675fb8 100644 --- a/engine/client/keys.c +++ b/engine/client/keys.c @@ -900,7 +900,6 @@ void Key_Console (unsigned int unicode, int key) if ((key == K_MOUSE1 || key == K_MOUSE2)) { - extern cvar_t vid_conwidth, vid_conheight; int xpos, ypos; xpos = (int)((mousecursor_x*vid.width)/(vid.pixelwidth*8)); ypos = (int)((mousecursor_y*vid.height)/(vid.pixelheight*8)); diff --git a/engine/client/m_download.c b/engine/client/m_download.c index 86de4a2d4..e3d7a8dda 100644 --- a/engine/client/m_download.c +++ b/engine/client/m_download.c @@ -265,7 +265,7 @@ static void MD_Draw (int x, int y, struct menucustom_s *c, struct menu_s *m) { package_t *p; int fl; - p = c->data; + p = c->dptr; if (p) { Draw_FunString (x+4, y, "^Ue080^Ue082"); @@ -303,7 +303,7 @@ static void MD_Draw (int x, int y, struct menucustom_s *c, struct menu_s *m) static qboolean MD_Key (struct menucustom_s *c, struct menu_s *m, int key) { package_t *p, *p2; - p = c->data; + p = c->dptr; if (key == K_ENTER || key == K_MOUSE1) { p->flags ^= DPF_WANTTOINSTALL; @@ -431,7 +431,7 @@ void M_AddItemsToDownloadMenu(menu_t *m) } else { - c = MC_AddCustom(m, 0, y, p); + c = MC_AddCustom(m, 0, y, p, 0); c->draw = MD_Draw; c->key = MD_Key; c->common.width = 320; diff --git a/engine/client/m_items.c b/engine/client/m_items.c index bea7da1b1..a98ede5c5 100644 --- a/engine/client/m_items.c +++ b/engine/client/m_items.c @@ -361,7 +361,7 @@ static void M_CheckMouseMove(void) foundexclusive=true; } - for(option = menu->options; option; option = option = option->common.next) + for(option = menu->options; option; option = option->common.next) { if (mousemoved && !bindingactive && !option->common.ishidden) { @@ -454,7 +454,7 @@ static void MenuDrawItems(int xpos, int ypos, menuoption_t *option, menu_t *menu if (p) R2D_ScalePic(xpos+option->common.posx, ypos+option->common.posy, option->common.width, option->common.height, p); break; case mt_childwindow: - MenuDrawItems(xpos+option->common.posx, ypos+option->common.posy, ((menu_t *)option->custom.data)->options, (menu_t *)option->custom.data); + MenuDrawItems(xpos+option->common.posx, ypos+option->common.posy, ((menu_t *)option->custom.dptr)->options, (menu_t *)option->custom.dptr); break; case mt_box: Draw_TextBox(xpos+option->common.posx, ypos+option->common.posy, option->box.width, option->box.height); @@ -920,14 +920,15 @@ menubox_t *MC_AddBox(menu_t *menu, int x, int y, int width, int height) return n; } -menucustom_t *MC_AddCustom(menu_t *menu, int x, int y, void *data) +menucustom_t *MC_AddCustom(menu_t *menu, int x, int y, void *dptr, int dint) { menucustom_t *n = Z_Malloc(sizeof(menucustom_t)); n->common.type = mt_custom; n->common.iszone = true; n->common.posx = x; n->common.posy = y; - n->data = data; + n->dptr = dptr; + n->dint = dint; n->common.next = menu->options; menu->options = (menuoption_t *)n; diff --git a/engine/client/m_master.c b/engine/client/m_master.c index 602ea9650..28b0fd4b3 100644 --- a/engine/client/m_master.c +++ b/engine/client/m_master.c @@ -215,7 +215,7 @@ static void SL_ServerDraw (int x, int y, menucustom_t *ths, menu_t *menu) { serverlist_t *info = (serverlist_t*)(menu + 1); serverinfo_t *si; - int thisone = (int)ths->data + info->scrollpos; + int thisone = ths->dint + info->scrollpos; servertypes_t stype; char adr[MAX_ADR_SIZE]; @@ -407,9 +407,9 @@ static void SL_ServerPlayer (int x, int y, menucustom_t *ths, menu_t *menu) if (selectedserver.inuse) { if (selectedserver.detail) - if ((int)ths->data < selectedserver.detail->numplayers) + if (ths->dint < selectedserver.detail->numplayers) { - int i = (int)ths->data; + int i = ths->dint; R2D_ImagePaletteColour (Sbar_ColorForMap(selectedserver.detail->players[i].topc), 1.0); R2D_FillBlock (x, y, 28, 4); R2D_ImagePaletteColour (Sbar_ColorForMap(selectedserver.detail->players[i].botc), 1.0); @@ -603,7 +603,7 @@ void M_Menu_ServerList2_f(void) info = (serverlist_t*)(menu + 1); y = 8; - cust = MC_AddCustom(menu, 0, y, 0); + cust = MC_AddCustom(menu, 0, y, NULL, 0); cust->draw = SL_TitlesDraw; cust->key = SL_TitlesKey; cust->common.height = 8; @@ -611,7 +611,7 @@ void M_Menu_ServerList2_f(void) info->visibleslots = (vid.height-16 - 64); - cust = MC_AddCustom(menu, vid.width-8, 16, NULL); + cust = MC_AddCustom(menu, vid.width-8, 16, NULL, 0); cust->draw = SL_SliderDraw; cust->key = SL_SliderKey; cust->common.height = info->visibleslots; @@ -620,7 +620,7 @@ void M_Menu_ServerList2_f(void) info->visibleslots = (info->visibleslots-7)/8; for (i = 0, y = 16; i <= info->visibleslots; y +=8, i++) { - cust = MC_AddCustom(menu, 0, y, (void*)i); + cust = MC_AddCustom(menu, 0, y, NULL, i); cust->draw = SL_ServerDraw; cust->key = SL_ServerKey; cust->common.height = 8; @@ -634,7 +634,7 @@ void M_Menu_ServerList2_f(void) { for (y = vid.height-64+8; y < vid.height; y += 8, i++) { - cust = MC_AddCustom(menu, x+16, y, (void*)i); + cust = MC_AddCustom(menu, x+16, y, NULL, i); cust->draw = SL_ServerPlayer; cust->key = NULL; cust->common.height = 8; @@ -773,7 +773,7 @@ void M_QuickConnect_f(void) menu->key = M_QuickConnect_Key; menu->remove = M_QuickConnect_Remove; - cust = MC_AddCustom(menu, 64, 64, NULL); + cust = MC_AddCustom(menu, 64, 64, NULL, 0); cust->draw = M_QuickConnect_DrawStatus; cust->common.height = 8; cust->common.width = vid.width-8; diff --git a/engine/client/m_mp3.c b/engine/client/m_mp3.c index 1ebac71d2..ab9d5c989 100644 --- a/engine/client/m_mp3.c +++ b/engine/client/m_mp3.c @@ -2687,7 +2687,6 @@ qboolean Media_UnregisterEncoder(struct plugin_s *plug, media_encoder_funcs_t *f { qboolean success = true; int i; - static media_decoder_funcs_t deadfuncs; for (i = 0; i < sizeof(pluginencodersfunc)/sizeof(pluginencodersfunc[0]); i++) { diff --git a/engine/client/m_multi.c b/engine/client/m_multi.c index 1dd926f29..859add846 100644 --- a/engine/client/m_multi.c +++ b/engine/client/m_multi.c @@ -356,7 +356,7 @@ void M_Menu_Setup_f (void) (info->nameedit = MC_AddEdit(menu, 64, 40, "Your name", name.string)); (info->modeledit = MC_AddCvarCombo(menu, 64, 72, "model", &skin, (const char **)modeloptions, (const char **)modeloptions)); info->modeledit->selectedoption = !strncmp(skin.string, "female", 6); - cu = MC_AddCustom(menu, 172-16, 88+16, NULL); + cu = MC_AddCustom(menu, 172-16, 88+16, NULL, 0); cu->draw = MSetupQ2_TransDraw; cu->key = MSetupQ2_ChangeSkin; @@ -420,7 +420,7 @@ void M_Menu_Setup_f (void) else (info->skinedit = MC_AddEdit(menu, 64, 72, "Your skin", skin.string)); - ci = MC_AddCustom(menu, 172+32, 88, NULL); + ci = MC_AddCustom(menu, 172+32, 88, NULL, 0); ci->draw = MSetup_TransDraw; ci->key = NULL; diff --git a/engine/client/m_options.c b/engine/client/m_options.c index dd486a320..3b8509750 100644 --- a/engine/client/m_options.c +++ b/engine/client/m_options.c @@ -65,8 +65,7 @@ qboolean M_Options_InvertMouse (menucheck_t *option, struct menu_s *menu, chk_se //options menu. void M_Menu_Options_f (void) { - extern cvar_t cl_standardchat; - extern cvar_t cl_standardmsg, crosshair; + extern cvar_t crosshair; #ifdef _WIN32 extern qboolean vid_isfullscreen; #endif @@ -238,7 +237,8 @@ menucombo_t *MC_AddCvarCombo(menu_t *menu, int x, int y, const char *caption, cv void M_Menu_Audio_f (void) { menu_t *menu; - extern cvar_t nosound, precache, snd_leftisright, snd_khz, snd_eax, snd_speakers, ambient_level, bgmvolume, snd_playersoundvolume, ambient_fade, cl_staticsounds, snd_inactive, _snd_mixahead, snd_usemultipledevices, snd_noextraupdate; + extern cvar_t nosound, snd_leftisright, snd_khz, snd_speakers, ambient_level, bgmvolume, snd_playersoundvolume, ambient_fade, cl_staticsounds, snd_inactive, _snd_mixahead, snd_usemultipledevices; +// extern cvar_t snd_noextraupdate, snd_eax, precache; extern cvar_t cl_voip_play, cl_voip_send; static const char *soundqualityoptions[] = { @@ -324,9 +324,10 @@ void M_Menu_Audio_f (void) void M_Menu_Particles_f (void) { menu_t *menu; - extern cvar_t r_bouncysparks, r_part_rain, gl_part_flame, r_particlesystem, r_grenadetrail, r_rockettrail, r_part_sparks_textured, r_part_sparks_trifan, r_part_rain_quantity, r_particledesc, r_particle_tracelimit, r_part_contentswitch, r_bloodstains; + extern cvar_t r_bouncysparks, r_part_rain, gl_part_flame, r_grenadetrail, r_rockettrail, r_part_rain_quantity, r_particledesc, r_particle_tracelimit, r_part_contentswitch, r_bloodstains; +// extern cvar_t r_part_sparks_trifan, r_part_sparks_textured, r_particlesystem; - static const char *psystemopts[] = +/* static const char *psystemopts[] = { "Classic", "Script", @@ -340,7 +341,7 @@ void M_Menu_Particles_f (void) "null", NULL }; - +*/ static const char *pdescopts[] = { "Classic", @@ -889,10 +890,11 @@ void M_Menu_Lighting_f (void) extern cvar_t r_vertexlight, r_vertexdlights; #endif extern cvar_t r_stains, r_shadows, r_shadow_realtime_world, r_loadlits, r_dynamic; - extern cvar_t r_lightstylesmooth, r_lightstylespeed, r_nolightdir; - extern cvar_t r_shadow_realtime_world_lightmaps, r_shadow_realtime_dlight, r_shadow_realtime_dlight_shadows; - extern cvar_t r_fb_bmodels, r_fb_models, r_rocketlight, r_powerupglow; + extern cvar_t r_lightstylesmooth, r_nolightdir; + extern cvar_t r_shadow_realtime_dlight, r_shadow_realtime_dlight_shadows; + extern cvar_t r_fb_models, r_rocketlight, r_powerupglow; extern cvar_t v_powerupshell, r_explosionlight; + //extern cvar_t r_fb_bmodels, r_shadow_realtime_world_lightmaps, r_lightstylespeed; static const char *lightingopts[] = { @@ -2108,18 +2110,29 @@ qboolean M_VideoApply (union menuoption_s *op, struct menu_s *menu, int key) void M_Menu_Video_f (void) { - extern cvar_t v_contrast, vid_width, vid_height, vid_conwidth, vid_conheight; + extern cvar_t v_contrast, vid_conwidth, vid_conheight; +// extern cvar_t vid_width, vid_height, vid_preservegamma, vid_hardwaregamma, vid_desktopgamma; extern cvar_t vid_fullscreen, vid_desktopsettings, vid_conautoscale; - extern cvar_t vid_desktopgamma, vid_hardwaregamma, vid_preservegamma; - extern cvar_t vid_bpp, vid_refreshrate, vid_renderer, vid_multisample; + extern cvar_t vid_bpp, vid_refreshrate, vid_multisample; +#if defined(GLQUAKE) && (defined(D3DQUAKE) || defined(SWQUAKE)) +#define MULTIRENDERER +#endif +#ifdef MULTIRENDERER + extern cvar_t vid_renderer; static const char *rendererops[] = { #ifdef GLQUAKE "OpenGL", #endif -#ifdef D3DQUAKE - "Direct3D", +#ifdef D3D9QUAKE + "Direct3D 9", +#endif +#ifdef D3D11QUAKE + "Direct3D 11", +#endif +#ifdef SWQUAKE + "Software Rendering", #endif NULL }; @@ -2128,11 +2141,18 @@ void M_Menu_Video_f (void) #ifdef GLQUAKE "gl", #endif -#ifdef D3DQUAKE - "d3d", +#ifdef D3D9QUAKE + "d3d9", +#endif +#ifdef D3D11QUAKE + "d3d11", +#endif +#ifdef SWQUAKE + "sw", #endif NULL }; +#endif static const char *aaopts[] = { "1x", @@ -2194,7 +2214,7 @@ void M_Menu_Video_f (void) NULL }; static const char *scalevalues[] = { "1", "1.5", "2", "2.5", "3", "4", "5", "6", NULL}; - +/* static const char *vsyncoptions[] = { "Off", @@ -2202,11 +2222,11 @@ void M_Menu_Video_f (void) "Wait for Display Enable", NULL }; - + extern cvar_t _vid_wait_override; +*/ videomenuinfo_t *info; static char current3dres[32]; // enough to fit 1920x1200 - extern cvar_t _vid_wait_override; int y; int resmodechoice, res2dmodechoice; @@ -2251,7 +2271,7 @@ void M_Menu_Video_f (void) MB_COMBOCVARRETURN("Color Depth", vid_bpp, bppopts, bppvalues, info->bppfixed, vid_bpp.description), MB_COMBOCVARRETURN("Refresh Rate", vid_refreshrate, refreshopts, refreshvalues, info->hzfixed, vid_refreshrate.description), MB_SPACING(-24), // really hacky... - // custom enteries + // custom entries MB_EDITCVARSLIMRETURN("Width", "vid_width", info->width), MB_EDITCVARSLIMRETURN("Height", "vid_height", info->height), MB_EDITCVARSLIMRETURN("Color Depth", "vid_bpp", info->bpp), diff --git a/engine/client/m_single.c b/engine/client/m_single.c index 2d65511d4..47cde6e34 100644 --- a/engine/client/m_single.c +++ b/engine/client/m_single.c @@ -702,7 +702,7 @@ void M_Menu_Demos_f (void) MC_AddWhiteText(menu, 24, 8, "Choose a Demo", false); MC_AddWhiteText(menu, 16, 24, "\35\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\37", false); - info->list = MC_AddCustom(menu, 0, 32, NULL); + info->list = MC_AddCustom(menu, 0, 32, NULL, 0); info->list->draw = M_DemoDraw; info->list->key = M_DemoKey; @@ -744,7 +744,7 @@ void M_Menu_MediaFiles_f (void) MC_AddWhiteText(menu, 24, 8, "Media List", false); MC_AddWhiteText(menu, 16, 24, "\35\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\37", false); - info->list = MC_AddCustom(menu, 0, 32, NULL); + info->list = MC_AddCustom(menu, 0, 32, NULL, 0); info->list->draw = M_DemoDraw; info->list->key = M_DemoKey; diff --git a/engine/client/menu.h b/engine/client/menu.h index 558f221b7..7d7304b99 100644 --- a/engine/client/menu.h +++ b/engine/client/menu.h @@ -199,7 +199,8 @@ typedef struct { typedef struct menucustom_s { menucommon_t common; - void *data; + void *dptr; + int dint; void (*draw) (int x, int y, struct menucustom_s *, struct menu_s *); qboolean (*key) (struct menucustom_s *, struct menu_s *, int key); } menucustom_t; @@ -305,7 +306,7 @@ menubutton_t *MC_AddCommand(menu_t *menu, int x, int y, char *text, qboolean (*c menuedit_t *MC_AddEdit(menu_t *menu, int x, int y, char *text, char *def); menuedit_t *MC_AddEditCvar(menu_t *menu, int x, int y, char *text, char *name); menuedit_t *MC_AddEditCvarSlim(menu_t *menu, int x, int y, char *text, char *name); -menucustom_t *MC_AddCustom(menu_t *menu, int x, int y, void *data); +menucustom_t *MC_AddCustom(menu_t *menu, int x, int y, void *dptr, int dint); menucombo_t *MC_AddCvarCombo(menu_t *menu, int x, int y, const char *caption, cvar_t *cvar, const char **ops, const char **values); typedef struct menubulk_s { diff --git a/engine/client/net_master.c b/engine/client/net_master.c index 9f822c1ba..dc6ae3b87 100644 --- a/engine/client/net_master.c +++ b/engine/client/net_master.c @@ -161,12 +161,14 @@ qboolean Master_CompareInteger(int a, int b, slist_test_t rule) return a<=b; case SLIST_TEST_LESS: return ab; case SLIST_TEST_GREATEREQUAL: return a>=b; + case SLIST_TEST_NOTSTARTSWITH: case SLIST_TEST_NOTEQUAL: return a!=b; } @@ -176,6 +178,10 @@ qboolean Master_CompareString(char *a, char *b, slist_test_t rule) { switch(rule) { + case SLIST_TEST_STARTSWITH: + return strnicmp(a, b, strlen(b))==0; + case SLIST_TEST_NOTSTARTSWITH: + return strnicmp(a, b, strlen(b))!=0; case SLIST_TEST_CONTAINS: return !!strstr(a, b); case SLIST_TEST_NOTCONTAIN: @@ -2119,7 +2125,8 @@ void CL_MasterListParse(netadrtype_t adrtype, int type, qboolean slashpad) ((qbyte *)&info->adr.address)[i] = MSG_ReadByte(); break; - // warning: enumeration value ‘NA_*’ not handled in switch + // warning: enumeration value 'NA_*' not handled in switch + case NA_WEBSOCKET: case NA_INVALID: case NA_LOOPBACK: case NA_BROADCAST_IP: diff --git a/engine/client/pr_csqc.c b/engine/client/pr_csqc.c index 5cbd3b49e..339048cce 100644 --- a/engine/client/pr_csqc.c +++ b/engine/client/pr_csqc.c @@ -899,6 +899,12 @@ static void QCBUILTIN PF_R_DynamicLight_Add(pubprogfuncs_t *prinst, struct globa dl->corona = 1; else dl->corona = 0; + dl->style = style; + Q_strncpyz(dl->cubemapname, cubemapname, sizeof(dl->cubemapname)); + if (*dl->cubemapname) + dl->cubetexture = R_LoadReplacementTexture(dl->cubemapname, "", IF_CUBEMAP); + else + dl->cubetexture = r_nulltex; G_FLOAT(OFS_RETURN) = dl - cl_dlights; } diff --git a/engine/client/pr_menu.c b/engine/client/pr_menu.c index 359780e82..1e7dd4992 100644 --- a/engine/client/pr_menu.c +++ b/engine/client/pr_menu.c @@ -716,9 +716,9 @@ qboolean M_Vid_GetMode(int num, int *w, int *h); //a bit pointless really void QCBUILTIN PF_cl_getresolution (pubprogfuncs_t *prinst, struct globalvars_s *pr_globals) { - extern cvar_t vid_fullscreen; +// extern cvar_t vid_fullscreen; float mode = G_FLOAT(OFS_PARM0); - qboolean forfullscreen = (prinst->callargc >= 2)?G_FLOAT(OFS_PARM1):vid_fullscreen.ival; +// qboolean forfullscreen = (prinst->callargc >= 2)?G_FLOAT(OFS_PARM1):vid_fullscreen.ival; float *ret = G_VECTOR(OFS_RETURN); int w, h; diff --git a/engine/client/pr_skelobj.c b/engine/client/pr_skelobj.c index 6370949cb..71d9f8247 100644 --- a/engine/client/pr_skelobj.c +++ b/engine/client/pr_skelobj.c @@ -200,7 +200,7 @@ static void bonemat_fromqcvectors(float *out, const float vx[3], const float vy[ out[10] = vz[2]; out[11] = t[2]; } -static void bonemat_fromaxisorg(float *out, const vec3_t axis[3], const float t[3]) +static void bonemat_fromaxisorg(float *out, vec3_t axis[3], const float t[3]) { out[0] = axis[0][0]; out[1] = axis[1][0]; diff --git a/engine/client/renderer.c b/engine/client/renderer.c index 78fe0512c..491e27f7d 100644 --- a/engine/client/renderer.c +++ b/engine/client/renderer.c @@ -389,8 +389,6 @@ void GLD3DRenderer_Init(void) #if defined(GLQUAKE) void GLRenderer_Init(void) { - extern cvar_t gl_contrast; - //gl-specific video vars Cvar_Register (&gl_workaround_ati_shadersource, GLRENDEREROPTIONS); Cvar_Register (&vid_gl_context_version, GLRENDEREROPTIONS); @@ -1386,6 +1384,11 @@ TRACE(("dbg: R_ApplyRenderer: efrags\n")); "-----------------------------\n" "Dedicated console created\n"); break; + case QR_SOFTWARE: + Con_Printf( "\n" + "-----------------------------\n" + "Software renderer initialized\n"); + break; case QR_OPENGL: Con_Printf( "\n" diff --git a/engine/client/sbar.c b/engine/client/sbar.c index df6af5ac6..627245230 100644 --- a/engine/client/sbar.c +++ b/engine/client/sbar.c @@ -2633,7 +2633,7 @@ void Sbar_TeamOverlay (void) // Draw_String(x, y, "------------ ---- ----- -------"); x = l; #undef COLUMN -#define COLUMN(title, cwidth, code) {char buf[64*6]; int t = (cwidth)/8; int c=0; while (t-->0) {buf[c++] = '^'; buf[c++] = 'U'; buf[c++] = 'e'; buf[c++] = '0'; buf[c++] = '1'; buf[c++] = (c==5?'d':(!t?'f':'e'));} buf[c] = 0; Draw_FunString(x, y, buf); x += cwidth + 8;} +#define COLUMN(title, cwidth, code) {char buf[64*6]; int t = (cwidth)/8; int c=0; while (t-->0) {buf[c++] = '^'; buf[c++] = 'U'; buf[c++] = 'e'; buf[c++] = '0'; buf[c++] = '1'; buf[c] = (c==5?'d':(!t?'f':'e')); c++;} buf[c] = 0; Draw_FunString(x, y, buf); x += cwidth + 8;} ALL_TEAM_COLUMNS // Draw_FunString(x, y, "^Ue01d^Ue01e^Ue01e^Ue01e^Ue01e^Ue01e^Ue01e^Ue01e^Ue01e^Ue01e^Ue01e^Ue01f ^Ue01d^Ue01e^Ue01e^Ue01f ^Ue01d^Ue01e^Ue01e^Ue01e^Ue01f ^Ue01d^Ue01e^Ue01e^Ue01e^Ue01e^Ue01e^Ue01f"); y += 8; diff --git a/engine/client/sys_linux.c b/engine/client/sys_linux.c index e08b8119e..b9e081bfa 100644 --- a/engine/client/sys_linux.c +++ b/engine/client/sys_linux.c @@ -599,11 +599,11 @@ void alarm_handler(int x) char *Sys_ConsoleInput(void) { -#if 0 +#if 1 static char text[256]; int len; - if (cls.state == ca_dedicated) +// if (!qrenderer) { len = read (0, text, sizeof(text)); if (len < 1) @@ -741,6 +741,7 @@ qboolean Sys_GetDesktopParameters(int *width, int *height, int *bpp, int *refres #endif } +#ifndef GLQUAKE #define SYS_CLIPBOARD_SIZE 256 static char clipboard_buffer[SYS_CLIPBOARD_SIZE] = {0}; @@ -755,6 +756,7 @@ void Sys_CloseClipboard(char *bf) void Sys_SaveClipboard(char *text) { Q_strncpyz(clipboard_buffer, text, SYS_CLIPBOARD_SIZE); } +#endif #ifdef MULTITHREAD /* Thread creation calls */ diff --git a/engine/client/textedit.c b/engine/client/textedit.c index e9972b28d..80439e587 100644 --- a/engine/client/textedit.c +++ b/engine/client/textedit.c @@ -84,7 +84,6 @@ static char OpenEditorFile[256]; qboolean editoractive; //(export) qboolean editormodal; //doesn't return. (export) -static qboolean editorblocking; static qboolean madechanges; static qboolean editenabled; static qboolean insertkeyhit=true; @@ -1227,7 +1226,7 @@ int QCLibEditor(pubprogfuncs_t *prfncs, char *filename, int line, int statement, firstblock = GenAsm(cursorlinenum); cursorblock = firstblock; - for (i = cursorlinenum; i > 0 && i > cursorlinenum - 20; i) + for (i = cursorlinenum; i > 0 && i > cursorlinenum - 20; ) { i--; firstblock->prev = GenAsm(i); diff --git a/engine/common/com_mesh.c b/engine/common/com_mesh.c index a368d9ffb..e324781f1 100644 --- a/engine/common/com_mesh.c +++ b/engine/common/com_mesh.c @@ -1348,8 +1348,8 @@ static void Alias_BuildSkeletalMesh(mesh_t *mesh, float *bonepose, galiasinfo_t qbyte *fte_restrict bidx = (qbyte*)((char*)inf + inf->ofs_skel_idx); float *fte_restrict xyzin = (float*)((char*)inf + inf->ofs_skel_xyz); float *fte_restrict normin = (float*)((char*)inf + inf->ofs_skel_norm); - float *fte_restrict svect = (float*)((char*)inf + inf->ofs_skel_svect); - float *fte_restrict tvect = (float*)((char*)inf + inf->ofs_skel_tvect); +// float *fte_restrict svect = (float*)((char*)inf + inf->ofs_skel_svect); +// float *fte_restrict tvect = (float*)((char*)inf + inf->ofs_skel_tvect); float *fte_restrict weight = (float*)((char*)inf + inf->ofs_skel_weight); Alias_TransformVerticies_VN(bonepose, inf->numverts, bidx, weight, xyzin, xyzout, normin, normout); @@ -4865,7 +4865,7 @@ qboolean Mod_LoadPSKModel(model_t *mod, void *buffer) if (j == chunk->numrecords) { fail = true; - Con_Printf("PSK bone %s does not exist in PSA %s\n", boneinfo[i].name); + Con_Printf("PSK bone %s does not exist in PSA %s\n", boneinfo[i].name, basename); break; } } diff --git a/engine/common/common.c b/engine/common/common.c index 041dd1796..4b202b2f0 100644 --- a/engine/common/common.c +++ b/engine/common/common.c @@ -2116,7 +2116,7 @@ unsigned int utf8_encode(void *out, unsigned int unicode, int maxlen) unsigned int qchar_encode(char *out, unsigned int unicode, int maxlen) { static const char hex[16] = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'}; - if (((unicode >= 32 || unicode == '\n' || unicode == '\t' || unicode == '\r') && unicode < 128) || unicode >= 0xe000 && unicode <= 0xe0ff) + if (((unicode >= 32 || unicode == '\n' || unicode == '\t' || unicode == '\r') && unicode < 128) || (unicode >= 0xe000 && unicode <= 0xe0ff)) { //quake compatible chars if (maxlen < 1) return 0; @@ -2671,8 +2671,6 @@ conchar_t *COM_ParseFunString(conchar_t defaultflags, const char *str, conchar_t { //we don't support the full 12bit colour depth (only 4-bit CGA) //so find the closest that we do support - int best = 1; - float bd = 255*255*255; int r, g, b; if (str[2] >= '0' && str[2] <= '9') r = (str[2]-'0'); diff --git a/engine/common/fs_stdio.c b/engine/common/fs_stdio.c index 217e876ac..9316b698c 100644 --- a/engine/common/fs_stdio.c +++ b/engine/common/fs_stdio.c @@ -223,7 +223,7 @@ static void FSSTDIO_ClosePath(void *handle) } static qboolean FSSTDIO_PollChanges(void *handle) { - stdiopath_t *np = handle; +// stdiopath_t *np = handle; return true; //can't verify that or not, so we have to assume the worst } static void *FSSTDIO_OpenPath(vfsfile_t *mustbenull, const char *desc) diff --git a/engine/common/gl_q2bsp.c b/engine/common/gl_q2bsp.c index 62d53bf0e..2f3cc2335 100644 --- a/engine/common/gl_q2bsp.c +++ b/engine/common/gl_q2bsp.c @@ -1198,8 +1198,10 @@ qboolean CMod_LoadTexInfo (lump_t *l) //yes I know these load from the same plac { out->flags = LittleLong (in->flags); - for (j=0 ; j<8 ; j++) + for (j=0 ; j<4 ; j++) out->vecs[0][j] = LittleFloat (in->vecs[0][j]); + for (j=0 ; j<4 ; j++) + out->vecs[1][j] = LittleFloat (in->vecs[1][j]); len1 = Length (out->vecs[0]); len2 = Length (out->vecs[1]); len1 = (len1 + len2)/2; @@ -5934,7 +5936,7 @@ qboolean Q2BSP_RecursiveHullCheck (hull_t *hull, int num, float p1f, float p2f, }*/ unsigned int Q2BSP_PointContents(model_t *mod, vec3_t axis[3], vec3_t p) { - int pc, ret = FTECONTENTS_EMPTY; + int pc; pc = CM_PointContents (mod, p); return pc; } diff --git a/engine/common/net_wins.c b/engine/common/net_wins.c index e3fed48a6..4c6313cf1 100644 --- a/engine/common/net_wins.c +++ b/engine/common/net_wins.c @@ -1642,7 +1642,6 @@ int FTENET_Generic_GetLocalAddress(ftenet_generic_connection_t *con, netadr_t *o netadr_t adr; char adrs[MAX_ADR_SIZE]; int b; - struct hostent *h; int idx = 0; if (getsockname (con->thesocket, (struct sockaddr*)&from, &fromsize) != -1) @@ -1730,6 +1729,7 @@ int FTENET_Generic_GetLocalAddress(ftenet_generic_connection_t *con, netadr_t *o else #endif { + struct hostent *h; h = gethostbyname(adrs); b = 0; #ifdef HAVE_IPV4 diff --git a/engine/common/qvm.c b/engine/common/qvm.c index 0143d6d3a..931bc9be6 100644 --- a/engine/common/qvm.c +++ b/engine/common/qvm.c @@ -565,7 +565,7 @@ static void inline QVM_Return(qvm_t *vm, int size) if(fp[1]>=vm->len_cs*2) if ((size_t)(vm->cs+fp[1]) != (size_t)RETURNOFFSETMARKER) //this being false causes the program to quit. - Sys_Error("VM run time error: program returned to hyperspace (%p, %p)\n", (char*)vm->cs, (char*)fp[1]); + Sys_Error("VM run time error: program returned to hyperspace (%p, %#x)\n", (char*)vm->cs, fp[1]); if(fp[1]<0) if ((size_t)(vm->cs+fp[1]) != (size_t)RETURNOFFSETMARKER) Sys_Error("VM run time error: program returned to negative hyperspace\n"); diff --git a/engine/common/unzip.c b/engine/common/unzip.c index 780b4895c..7bccdd835 100644 --- a/engine/common/unzip.c +++ b/engine/common/unzip.c @@ -145,28 +145,40 @@ local int unzlocal_getShortSane(vfsfile_t *fin, unsigned short *pi) } } -local int unzlocal_getShort(vfsfile_t *fin,unsigned long *pi) { - unsigned short c; +local int unzlocal_getShort(vfsfile_t *fin,unsigned long *pi) +{ + unsigned short c; int err = VFS_READ(fin, &c, 2); - if (err==2) { - *pi = LittleShort(c); - return UNZ_OK; - } else { - if (VFS_TELL(fin) != VFS_GETLEN(fin)) return UNZ_ERRNO; - else return UNZ_EOF; - } + if (err==2) + { + *pi = LittleShort(c); + return UNZ_OK; + } + else + { + *pi = 0; + if (VFS_TELL(fin) != VFS_GETLEN(fin)) return UNZ_ERRNO; + else return UNZ_EOF; + } } -local int unzlocal_getLong(vfsfile_t *fin,unsigned long *pi) { +local int unzlocal_getLong(vfsfile_t *fin,unsigned long *pi) +{ unsigned int c; int err = VFS_READ(fin, &c, 4); - if (err==4) { - *pi = LittleLong(c); - return UNZ_OK; - } else { - if (VFS_TELL(fin) != VFS_GETLEN(fin)) return UNZ_ERRNO; - else return UNZ_EOF; - } + if (err==4) + { + *pi = LittleLong(c); + return UNZ_OK; + } + else + { + *pi = 0; + if (VFS_TELL(fin) != VFS_GETLEN(fin)) + return UNZ_ERRNO; + else + return UNZ_EOF; + } } diff --git a/engine/gl/gl_alias.c b/engine/gl/gl_alias.c index 9c9b538e4..2404967d4 100644 --- a/engine/gl/gl_alias.c +++ b/engine/gl/gl_alias.c @@ -1153,6 +1153,7 @@ void RotateLightVector(const vec3_t *axis, const vec3_t origin, const vec3_t lig } #if defined(RTLIGHTS) +/* static void GL_LightMesh (mesh_t *mesh, vec3_t lightpos, vec3_t colours, float radius) { vec3_t dir; @@ -1216,6 +1217,7 @@ static void GL_LightMesh (mesh_t *mesh, vec3_t lightpos, vec3_t colours, float r } } } +*/ //courtesy of DP static void R_BuildBumpVectors(const float *v0, const float *v1, const float *v2, const float *tc0, const float *tc1, const float *tc2, float *svector3f, float *tvector3f, float *normal3f) diff --git a/engine/gl/gl_backend.c b/engine/gl/gl_backend.c index 3a6c92c90..3510d2396 100644 --- a/engine/gl/gl_backend.c +++ b/engine/gl/gl_backend.c @@ -217,7 +217,7 @@ static void BE_PolyOffset(qboolean pushdepth) } #ifndef FORCESTATE - if (((int*)&shaderstate.curpolyoffset)[0] != ((int*)&po)[0] || ((int*)&shaderstate.curpolyoffset)[1] != ((int*)&po)[1]) + if (shaderstate.curpolyoffset.factor != po.factor || shaderstate.curpolyoffset.unit != po.unit) #endif { shaderstate.curpolyoffset = po; @@ -2534,7 +2534,6 @@ static void BE_SubmitMeshChain(void) static void DrawPass(const shaderpass_t *pass) { - extern cvar_t temp1; int i, j, k; int tmu; int lastpass = pass->numMergedPasses; @@ -3073,6 +3072,8 @@ void GLBE_SelectMode(backendmode_t mode) shaderstate.flags = 0; switch (mode) { + default: + break; case BEM_DEPTHONLY: GL_DeSelectProgram(); /*BEM_DEPTHONLY does support mesh writing, but its not the only way its used... FIXME!*/ @@ -3189,7 +3190,7 @@ void GLBE_SelectEntity(entity_t *ent) shaderstate.lastuniform = 0; shaderstate.curtime = shaderstate.updatetime - shaderstate.curentity->shaderTime; } - +#if 0 static void BE_SelectFog(vec3_t colour, float alpha, float density) { float zscale; @@ -3202,7 +3203,7 @@ static void BE_SelectFog(vec3_t colour, float alpha, float density) qglColor4f(colour[0], colour[1], colour[2], alpha); } - +#endif #ifdef RTLIGHTS static qboolean GLBE_RegisterLightShader(int mode) { @@ -3295,7 +3296,7 @@ void GLBE_PushOffsetShadow(qboolean pushdepth) } #ifndef FORCESTATE - if (((int*)&shaderstate.curpolyoffset)[0] != ((int*)&po)[0] || ((int*)&shaderstate.curpolyoffset)[1] != ((int*)&po)[1]) + if (shaderstate.curpolyoffset.factor != po.factor || shaderstate.curpolyoffset.unit != po.unit) #endif { shaderstate.curpolyoffset = po; @@ -4140,7 +4141,6 @@ void GLBE_RenderToTexture(texid_t sourcecol, texid_t sourcedepth, texid_t destco void GLBE_DrawLightPrePass(qbyte *vis) { - extern cvar_t temp1; if (!shaderstate.initeddepthnorm) { shaderstate.initeddepthnorm = true; diff --git a/engine/gl/gl_font.c b/engine/gl/gl_font.c index 18bf318dc..abf9c26ae 100644 --- a/engine/gl/gl_font.c +++ b/engine/gl/gl_font.c @@ -6,6 +6,7 @@ #ifdef _WIN32 #include #endif +#include void Font_Init(void); void Font_Shutdown(void); diff --git a/engine/gl/gl_heightmap.c b/engine/gl/gl_heightmap.c index eebe1928a..fb3e74fa6 100644 --- a/engine/gl/gl_heightmap.c +++ b/engine/gl/gl_heightmap.c @@ -3253,7 +3253,6 @@ qboolean Terr_LoadTerrainModel (model_t *mod, void *buffer) vec3_t skyaxis; char shadername[MAX_QPATH]; char skyname[MAX_QPATH]; - int numsegsx = 0, numsegsy = 0; int sectsize = 0; COM_FileBase(mod->name, shadername, sizeof(shadername)); diff --git a/engine/gl/gl_hlmdl.c b/engine/gl/gl_hlmdl.c index 81054be96..c0fa54707 100644 --- a/engine/gl/gl_hlmdl.c +++ b/engine/gl/gl_hlmdl.c @@ -702,8 +702,6 @@ void R_HalfLife_WalkMeshes(entity_t *rent, batch_t *b, batch_t **batches) hlmdl_bodypart_t *bodypart = (hlmdl_bodypart_t *) ((qbyte *) model.header + model.header->bodypartindex) + body; int bodyindex = (0 / bodypart->base) % bodypart->nummodels; hlmdl_model_t *amodel = (hlmdl_model_t *) ((qbyte *) model.header + bodypart->modelindex) + bodyindex; - qbyte *bone = ((qbyte *) model.header + amodel->vertinfoindex); - vec3_t *verts = (vec3_t *) ((qbyte *) model.header + amodel->vertindex); /*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/ diff --git a/engine/gl/gl_screen.c b/engine/gl/gl_screen.c index 237b365f8..d1a9c4b55 100644 --- a/engine/gl/gl_screen.c +++ b/engine/gl/gl_screen.c @@ -59,7 +59,6 @@ needs almost the entire 256k of stack space! void GLSCR_UpdateScreen (void) { - extern cvar_t vid_conheight; int uimenu; #ifdef TEXTEDITOR extern qboolean editormodal; diff --git a/engine/gl/gl_shader.c b/engine/gl/gl_shader.c index b4c383738..24154e34a 100644 --- a/engine/gl/gl_shader.c +++ b/engine/gl/gl_shader.c @@ -160,7 +160,7 @@ skipwhite: if (len == MAX_TOKEN_CHARS) { - Con_DPrintf ("Token exceeded %i chars, discarded.\n", MAX_TOKEN_CHARS); + Con_DPrintf ("Token exceeded %i chars, discarded.\n", (int)MAX_TOKEN_CHARS); len = 0; } com_token[len] = 0; diff --git a/engine/gl/gl_shadow.c b/engine/gl/gl_shadow.c index 6cfd4ef30..bd99bd27f 100644 --- a/engine/gl/gl_shadow.c +++ b/engine/gl/gl_shadow.c @@ -287,24 +287,30 @@ static void SH_FreeShadowMesh_(shadowmesh_t *sm) switch (qrenderer) { -#ifdef GLQUAKE + case QR_NONE: + case QR_SOFTWARE: + case QR_DIRECT3D11: + default: + break; + case QR_OPENGL: +#ifdef GLQUAKE if (qglDeleteBuffersARB) qglDeleteBuffersARB(2, sm->vebo); sm->vebo[0] = 0; sm->vebo[1] = 0; - break; #endif -#ifdef D3D9QUAKE + break; case QR_DIRECT3D9: +#ifdef D3D9QUAKE if (sm->d3d_ibuffer) IDirect3DIndexBuffer9_Release(sm->d3d_ibuffer); sm->d3d_ibuffer = NULL; if (sm->d3d_vbuffer) IDirect3DVertexBuffer9_Release(sm->d3d_vbuffer); sm->d3d_vbuffer = NULL; - break; #endif + break; } } void SH_FreeShadowMesh(shadowmesh_t *sm) @@ -425,8 +431,14 @@ static struct shadowmesh_s *SHM_FinishShadowMesh(dlight_t *dl) { switch (qrenderer) { -#ifdef GLQUAKE + case QR_NONE: + case QR_SOFTWARE: + case QR_DIRECT3D11: + default: + break; + case QR_OPENGL: +#ifdef GLQUAKE qglGenBuffersARB(2, sh_shmesh->vebo); GL_DeselectVAO(); @@ -435,10 +447,10 @@ static struct shadowmesh_s *SHM_FinishShadowMesh(dlight_t *dl) GL_SelectEBO(sh_shmesh->vebo[1]); qglBufferDataARB(GL_ELEMENT_ARRAY_BUFFER_ARB, sizeof(*sh_shmesh->indicies) * sh_shmesh->numindicies, sh_shmesh->indicies, GL_STATIC_DRAW_ARB); - break; #endif -#ifdef D3D9QUAKE + break; case QR_DIRECT3D9: +#ifdef D3D9QUAKE if (sh_shmesh->numindicies && sh_shmesh->numverts) { void *map; @@ -453,8 +465,8 @@ static struct shadowmesh_s *SHM_FinishShadowMesh(dlight_t *dl) IDirect3DVertexBuffer9_Unlock(sh_shmesh->d3d_vbuffer); } - break; #endif + break; } Z_Free(sh_shmesh->verts); @@ -1429,11 +1441,17 @@ typedef struct } srect_t; static void Sh_Scissor (srect_t r) { - float xs = vid.pixelwidth / (float)vid.width, ys = vid.pixelheight / (float)vid.height; + //float xs = vid.pixelwidth / (float)vid.width, ys = vid.pixelheight / (float)vid.height; switch(qrenderer) { -#ifdef GLQUAKE + case QR_NONE: + case QR_SOFTWARE: + case QR_DIRECT3D11: + default: + break; + case QR_OPENGL: +#ifdef GLQUAKE qglScissor( floor(r_refdef.pxrect.x + r.x*r_refdef.pxrect.width), floor((r_refdef.pxrect.y + r.y*r_refdef.pxrect.height) - r_refdef.pxrect.height), @@ -1446,10 +1464,10 @@ static void Sh_Scissor (srect_t r) qglDepthBoundsEXT(r.dmin, r.dmax); qglEnable(GL_DEPTH_BOUNDS_TEST_EXT); } - break; #endif -#ifdef D3D9QUAKE + break; case QR_DIRECT3D9: +#ifdef D3D9QUAKE { RECT rect; rect.left = r.x; @@ -1458,25 +1476,27 @@ static void Sh_Scissor (srect_t r) rect.bottom = r.y + r.height; IDirect3DDevice9_SetScissorRect(pD3DDev9, &rect); } - break; #endif + break; } } static void Sh_ScissorOff (void) { switch(qrenderer) { -#ifdef GLQUAKE + default: + break; case QR_OPENGL: +#ifdef GLQUAKE qglDisable(GL_SCISSOR_TEST); if (qglDepthBoundsEXT) qglDisable(GL_DEPTH_BOUNDS_TEST_EXT); - break; #endif -#ifdef D3D9QUAKE + break; case QR_DIRECT3D9: - break; +#ifdef D3D9QUAKE #endif + break; } } @@ -1532,7 +1552,7 @@ static qboolean Sh_ScissorForSphere(vec3_t center, float radius, vrect_t *rect) #define BoxesOverlap(a,b,c,d) ((a)[0] <= (d)[0] && (b)[0] >= (c)[0] && (a)[1] <= (d)[1] && (b)[1] >= (c)[1] && (a)[2] <= (d)[2] && (b)[2] >= (c)[2]) static qboolean Sh_ScissorForBox(vec3_t mins, vec3_t maxs, srect_t *r) { - static const edge[12][2] = + static const int edge[12][2] = { {0, 1}, {0, 2}, {1, 3}, {2, 3}, {4, 5}, {4, 6}, {5, 7}, {6, 7}, @@ -1997,16 +2017,18 @@ GL_CullFace(0); switch(qrenderer) { -#ifdef GLQUAKE + default: + break; case QR_OPENGL: +#ifdef GLQUAKE GLBE_BaseEntTextures(); - break; #endif -#ifdef D3D9QUAKE + break; case QR_DIRECT3D9: +#ifdef D3D9QUAKE D3D9BE_BaseEntTextures(); - break; #endif + break; } r_refdef.externalview = oxv; @@ -2275,16 +2297,18 @@ static void Sh_DrawEntLighting(dlight_t *light, vec3_t colour) switch(qrenderer) { -#ifdef GLQUAKE + default: + break; case QR_OPENGL: +#ifdef GLQUAKE GLBE_BaseEntTextures(); - break; #endif -#ifdef D3D9QUAKE + break; case QR_DIRECT3D9: +#ifdef D3D9QUAKE D3D9BE_BaseEntTextures(); - break; #endif + break; } } } @@ -2416,16 +2440,22 @@ static void Sh_DrawStencilLightShadows(dlight_t *dl, qbyte *lvis, qbyte *vvis, q { switch (qrenderer) { -#ifdef D3D9QUAKE + case QR_NONE: + case QR_SOFTWARE: + case QR_DIRECT3D11: + default: + break; + case QR_DIRECT3D9: +#ifdef D3D9QUAKE D3D9BE_RenderShadowBuffer(sm->numverts, sm->d3d_vbuffer, sm->numindicies, sm->d3d_ibuffer); - break; #endif -#ifdef GLQUAKE + break; case QR_OPENGL: +#ifdef GLQUAKE GLBE_RenderShadowBuffer(sm->numverts, sm->vebo[0], sm->verts, sm->numindicies, sm->vebo[1], sm->indicies); - break; #endif + break; } } if (!r_drawentities.value) @@ -2545,6 +2575,8 @@ static qboolean Sh_DrawStencilLight(dlight_t *dl, vec3_t colour, qbyte *vvis) switch(qrenderer) { + default: + break; #ifdef GLQUAKE case QR_OPENGL: { diff --git a/engine/gl/gl_vidlinuxglx.c b/engine/gl/gl_vidlinuxglx.c index aabd72819..53d4ecb84 100644 --- a/engine/gl/gl_vidlinuxglx.c +++ b/engine/gl/gl_vidlinuxglx.c @@ -30,6 +30,8 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #include #include "quakedef.h" +#include +#include #include "glquake.h" #include @@ -52,16 +54,15 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #endif -#define WARP_WIDTH 320 -#define WARP_HEIGHT 200 - static Display *vid_dpy = NULL; static Cursor vid_nullcursor; static Window vid_window; +static Window vid_decoywindow; //for legacy mode, this is a boring window that we can reparent into as needed +static Window vid_root; static GLXContext ctx = NULL; -int scrnum; +static int scrnum; -static qboolean vidglx_fullscreen; +extern cvar_t vid_conautoscale; static float old_windowed_mouse = 0; @@ -76,32 +77,42 @@ static int dgamouse = 0; #define X_MASK (KEY_MASK | MOUSE_MASK | ResizeRequest | StructureNotifyMask | FocusChangeMask | VisibilityChangeMask) +#define FULLSCREEN_VMODE 1 //using xf86 vidmode +#define FULLSCREEN_VMODEACTIVE 2 //xf86 vidmode currently forced +#define FULLSCREEN_LEGACY 4 //override redirect used +#define FULLSCREEN_WM 8 //fullscreen hint used +#define FULLSCREEN_ACTIVE 16 //currently fullscreen +static int fullscreenflags; +static int fullscreenwidth; +static int fullscreenheight; + #ifdef WITH_VMODE static int vidmode_ext = 0; static XF86VidModeModeInfo **vidmodes; static int num_vidmodes; -static qboolean vidmode_active = false; static int vidmode_usemode = -1; //so that it can be reset if they switch away. -unsigned short originalramps[3][256]; -qboolean originalapplied; //states that the origionalramps arrays are valid, and contain stuff that we should revert to on close +static unsigned short originalramps[3][256]; +static qboolean originalapplied; //states that the origionalramps arrays are valid, and contain stuff that we should revert to on close #endif +void X_GoFullscreen(void); +void X_GoWindowed(void); +/*when alt-tabbing or whatever, the window manager creates a window, then destroys it again, resulting in weird focus events that trigger mode switches and grabs. using a timer reduces the weirdness and allows alt-tab to work properly. or at least better than it was working. that's the theory anyway*/ +static unsigned int modeswitchtime; +static int modeswitchpending; + extern cvar_t _windowed_mouse; /*-----------------------------------------------------------------------*/ -float gldepthmin, gldepthmax; - -const char *gl_vendor; -const char *gl_renderer; -const char *gl_version; -const char *gl_extensions; - -qboolean is8bit = false; -qboolean isPermedia = false; -qboolean mouseactive = false; +//qboolean is8bit = false; +//qboolean isPermedia = false; qboolean ActiveApp = false; +static qboolean gracefulexit; + +#define SYS_CLIPBOARD_SIZE 512 +char clipboard_buffer[SYS_CLIPBOARD_SIZE]; /*-----------------------------------------------------------------------*/ @@ -341,7 +352,7 @@ static void uninstall_grabs(void) // XSync(vid_dpy, True); } -void ClearAllStates (void) +static void ClearAllStates (void) { int i; @@ -357,14 +368,11 @@ void ClearAllStates (void) static void GetEvent(void) { - XEvent event; + XEvent event, rep; int b; unsigned int uc; - qboolean wantwindowed; qboolean x11violations = true; - - if (!vid_dpy) - return; + Window mw; XNextEvent(vid_dpy, &event); @@ -372,10 +380,24 @@ static void GetEvent(void) case ResizeRequest: vid.pixelwidth = event.xresizerequest.width; vid.pixelheight = event.xresizerequest.height; + Cvar_ForceCallback(&vid_conautoscale); +// if (fullscreenflags & FULLSCREEN_ACTIVE) +// XMoveWindow(vid_dpy, vid_window, 0, 0); break; case ConfigureNotify: - vid.pixelwidth = event.xconfigurerequest.width; - vid.pixelheight = event.xconfigurerequest.height; + if (event.xconfigurerequest.window == vid_window) + { + vid.pixelwidth = event.xconfigurerequest.width; + vid.pixelheight = event.xconfigurerequest.height; + Cvar_ForceCallback(&vid_conautoscale); + } + else if (event.xconfigurerequest.window == vid_decoywindow) + { + if (!(fullscreenflags & FULLSCREEN_ACTIVE)) + XResizeWindow(vid_dpy, vid_window, event.xconfigurerequest.width, event.xconfigurerequest.height); + } +// if (fullscreenflags & FULLSCREEN_ACTIVE) +// XMoveWindow(vid_dpy, vid_window, 0, 0); break; case KeyPress: b = XLateKey(&event.xkey, &uc); @@ -446,14 +468,16 @@ static void GetEvent(void) if (b>=0) IN_KeyEvent(0, true, b, 0); -#ifdef WITH_VMODE - if (vidmode_ext && vidmode_usemode>=0) + +/* + if (fullscreenflags & FULLSCREEN_LEGACY) + if (fullscreenflags & FULLSCREEN_VMODE) if (!ActiveApp) { //KDE doesn't seem to like us, in that you can't alt-tab back or click to activate. //This allows us to steal input focus back from the window manager XSetInputFocus(vid_dpy, vid_window, RevertToParent, CurrentTime); } -#endif +*/ break; case ButtonRelease: @@ -492,43 +516,50 @@ static void GetEvent(void) break; case FocusIn: + //activeapp is if the game window is focused ActiveApp = true; -#ifdef WITH_VMODE - if (vidmode_ext && vidmode_usemode>=0) + + //but change modes to track the desktop window +// if (!(fullscreenflags & FULLSCREEN_ACTIVE) || event.xfocus.window != vid_decoywindow) { - if (!vidmode_active) - { - // change to the mode - XF86VidModeSwitchToMode(vid_dpy, scrnum, vidmodes[vidmode_usemode]); - vidmode_active = true; - // Move the viewport to top left - } - XF86VidModeSetViewPort(vid_dpy, scrnum, 0, 0); + modeswitchpending = 1; + modeswitchtime = Sys_Milliseconds() + 1500; /*fairly slow, to make sure*/ } -#endif - Cvar_ForceCallback(&v_gamma); + + //we we're focusing onto the game window and we're currently fullscreen, hide the other one so alt-tab won't select that instead of a real alternate app. +// if ((fullscreenflags & FULLSCREEN_ACTIVE) && (fullscreenflags & FULLSCREEN_LEGACY) && event.xfocus.window == vid_window) +// XUnmapWindow(vid_dpy, vid_decoywindow); break; case FocusOut: + //if we're already active, the decoy window shouldn't be focused anyway. + if ((fullscreenflags & FULLSCREEN_ACTIVE) && event.xfocus.window == vid_decoywindow) + { + break; + } + #ifdef WITH_VMODE if (originalapplied) XF86VidModeSetGammaRamp(vid_dpy, scrnum, 256, originalramps[0], originalramps[1], originalramps[2]); - if (!COM_CheckParm("-stayactive")) - { //a parameter that leaves the program fullscreen if you taskswitch. - //sounds pointless, works great with two moniters. :D - if (originalapplied) - XF86VidModeSetGammaRamp(vid_dpy, scrnum, 256, originalramps[0], originalramps[1], originalramps[2]); - if (vidmode_active) - { - XF86VidModeSwitchToMode(vid_dpy, scrnum, vidmodes[0]); - vidmode_active = false; - } - } #endif + mw = vid_window; + if ((fullscreenflags & FULLSCREEN_LEGACY) && (fullscreenflags & FULLSCREEN_ACTIVE)) + mw = vid_decoywindow; - ActiveApp = false; - ClearAllStates(); - + if (event.xfocus.window == mw) + { + ActiveApp = false; + if (old_windowed_mouse) + { + Con_DPrintf("uninstall grabs\n"); + uninstall_grabs(); + XUndefineCursor(vid_dpy, vid_window); + old_windowed_mouse = false; + } + ClearAllStates(); + } + modeswitchpending = -1; + modeswitchtime = Sys_Milliseconds() + 100; /*fairly fast, so we don't unapply stuff when switching to other progs with delays*/ break; case ClientMessage: { @@ -537,7 +568,10 @@ static void GetEvent(void) { char *protname = XGetAtomName(vid_dpy, event.xclient.data.l[0]); if (!strcmp(protname, "WM_DELETE_WINDOW")) - Cmd_ExecuteString("menu_quit", RESTRICT_LOCAL); + { + Cmd_ExecuteString("menu_quit prompt", RESTRICT_LOCAL); + XSetInputFocus(vid_dpy, vid_window, RevertToParent, CurrentTime); + } else Con_Printf("Got message %s\n", protname); XFree(protname); @@ -547,37 +581,40 @@ static void GetEvent(void) XFree(name); } break; + +#if 1 + case SelectionRequest: //needed for copy-to-clipboard + { + Atom xa_string = XInternAtom(vid_dpy, "UTF8_STRING", false); + memset(&rep, 0, sizeof(rep)); + if (event.xselectionrequest.property == None) + event.xselectionrequest.property = XInternAtom(vid_dpy, "foobar2000", false); + if (event.xselectionrequest.property != None && event.xselectionrequest.target == xa_string) + { + XChangeProperty(vid_dpy, event.xselectionrequest.requestor, event.xselectionrequest.property, event.xselectionrequest.target, 8, PropModeReplace, (void*)clipboard_buffer, strlen(clipboard_buffer)); + rep.xselection.property = event.xselectionrequest.property; + } + else + { + rep.xselection.property = None; + } + rep.xselection.type = SelectionNotify; + rep.xselection.serial = 0; + rep.xselection.send_event = true; + rep.xselection.display = rep.xselection.display; + rep.xselection.requestor = event.xselectionrequest.requestor; + rep.xselection.selection = event.xselectionrequest.selection; + rep.xselection.target = event.xselectionrequest.target; + rep.xselection.time = event.xselectionrequest.time; + XSendEvent(vid_dpy, event.xselectionrequest.requestor, 0, 0, &rep); + } + break; +#endif + default: // Con_Printf("%x\n", event.type); break; } - - wantwindowed = !!_windowed_mouse.value; - if (!ActiveApp) - wantwindowed = false; - if (Key_MouseShouldBeFree() && !vidglx_fullscreen) - wantwindowed = false; - - if (old_windowed_mouse != wantwindowed) - { - old_windowed_mouse = wantwindowed; - - if (!wantwindowed) - { - Con_DPrintf("uninstall grabs\n"); - /* ungrab the pointer */ - uninstall_grabs(); - XUndefineCursor(vid_dpy, vid_window); - } - else - { - Con_DPrintf("install grabs\n"); - /* grab the pointer */ - install_grabs(); - /*hide the cursor*/ - XDefineCursor(vid_dpy, vid_window, vid_nullcursor); - } - } } @@ -610,10 +647,11 @@ void GLVID_Shutdown(void) if (vid_nullcursor) XFreeCursor(vid_dpy, vid_nullcursor); #ifdef WITH_VMODE - if (vid_dpy) { - if (vidmode_active) + if (vid_dpy) + { + if (fullscreenflags & FULLSCREEN_VMODEACTIVE) XF86VidModeSwitchToMode(vid_dpy, scrnum, vidmodes[0]); - vidmode_active = false; + fullscreenflags &= ~FULLSCREEN_VMODEACTIVE; if (vidmodes) XFree(vidmodes); @@ -639,11 +677,16 @@ void signal_handler(int sig) Sys_Quit(); exit(0); } +void signal_handler_graceful(int sig) +{ + gracefulexit = true; +// signal(sig, signal_handler); +} void InitSig(void) { signal(SIGHUP, signal_handler); - signal(SIGINT, signal_handler); + signal(SIGINT, signal_handler_graceful); signal(SIGQUIT, signal_handler); signal(SIGILL, signal_handler); signal(SIGTRAP, signal_handler); @@ -712,7 +755,7 @@ void GLVID_SetPalette (unsigned char *palette) // // 8 8 8 encoding // - Con_Printf("Converting 8to24\n"); + Con_DPrintf("Converting 8to24\n"); pal = palette; table = d_8to24rgbtable; @@ -755,13 +798,180 @@ void GL_EndRendering (void) #endif } -qboolean GLVID_Is8bit(void) +#include "bymorphed.h" +void X_StoreIcon(Window wnd) { - return is8bit; + int i; + unsigned long data[64*64+2]; + unsigned int *indata = (unsigned int*)icon.pixel_data; + Atom propname = XInternAtom(vid_dpy, "_NET_WM_ICON", false); + Atom proptype = XInternAtom(vid_dpy, "CARDINAL", false); + + data[0] = icon.width; + data[1] = icon.height; + for (i = 0; i < data[0]*data[1]; i++) + data[i+2] = indata[i]; + + XChangeProperty(vid_dpy, wnd, propname, proptype, 32, PropModeReplace, (void*)data, data[0]*data[1]+2); +} + +void X_GoFullscreen(void) +{ + XEvent xev; + + //for NETWM window managers + memset(&xev, 0, sizeof(xev)); + xev.type = ClientMessage; + xev.xclient.window = vid_window; + xev.xclient.message_type = XInternAtom(vid_dpy, "_NET_WM_STATE", False); + xev.xclient.format = 32; + xev.xclient.data.l[0] = 1; //add + xev.xclient.data.l[1] = XInternAtom(vid_dpy, "_NET_WM_STATE_FULLSCREEN", False); + xev.xclient.data.l[2] = 0; + XSync(vid_dpy, False); + XSendEvent(vid_dpy, DefaultRootWindow(vid_dpy), False, SubstructureNotifyMask, &xev); + XSync(vid_dpy, False); + + //for any other window managers, and broken NETWM + XMoveResizeWindow(vid_dpy, vid_window, 0, 0, fullscreenwidth, fullscreenheight); + XSync(vid_dpy, False); +} +void X_GoWindowed(void) +{ + XEvent xev; + XFlush(vid_dpy); + XSync(vid_dpy, False); + + memset(&xev, 0, sizeof(xev)); + xev.type = ClientMessage; + xev.xclient.window = vid_window; + xev.xclient.message_type = XInternAtom(vid_dpy, "_NET_WM_STATE", False); + xev.xclient.format = 32; + xev.xclient.data.l[0] = 0; //remove + xev.xclient.data.l[1] = XInternAtom(vid_dpy, "_NET_WM_STATE_FULLSCREEN", False); + xev.xclient.data.l[2] = 0; + XSendEvent(vid_dpy, DefaultRootWindow(vid_dpy), False, SubstructureNotifyMask, &xev); + XSync(vid_dpy, False); + + //XMoveResizeWindow(vid_dpy, vid_window, 0, 0, 640, 480); +} +qboolean X_CheckWMFullscreenAvailable(void) +{ + //root window must have _NET_SUPPORTING_WM_CHECK which is a Window created by the WM + //the WM's window must have _NET_WM_NAME set, which is the name of the window manager + //if we can find those, then the window manager has not crashed. + //if we can then find _NET_WM_STATE_FULLSCREEN in the _NET_SUPPORTED atom list on the root, then we can get fullscreen mode from the WM + //and we'll have no alt-tab issues whatsoever. + + Atom xa_net_supporting_wm_check = XInternAtom(vid_dpy, "_NET_SUPPORTING_WM_CHECK", False); + Atom xa_net_wm_name = XInternAtom(vid_dpy, "_NET_WM_NAME", False); + Atom xa_net_supported = XInternAtom(vid_dpy, "_NET_SUPPORTED", False); + Atom xa_net_wm_state_fullscreen = XInternAtom(vid_dpy, "_NET_WM_STATE_FULLSCREEN", False); + Window wmwindow; + unsigned char *prop; + unsigned long bytes_after, nitems; + Atom type; + int format; + qboolean success = false; + unsigned char *wmname; + int i; + + + if (XGetWindowProperty(vid_dpy, vid_root, xa_net_supporting_wm_check, 0, 16384, False, AnyPropertyType, &type, &format, &nitems, &bytes_after, &prop) != Success || prop == NULL) + { + Con_Printf("Window manager not identified\n"); + return success; + } + wmwindow = *(Window *)prop; + XFree(prop); + + if (XGetWindowProperty(vid_dpy, wmwindow, xa_net_wm_name, 0, 16384, False, AnyPropertyType, &type, &format, &nitems, &bytes_after, &wmname) != Success || wmname == NULL) + { + Con_Printf("Window manager crashed or something\n"); + return success; + } + else + { + if (XGetWindowProperty(vid_dpy, vid_root, xa_net_supported, 0, 16384, False, AnyPropertyType, &type, &format, &nitems, &bytes_after, &prop) != Success || prop == NULL) + { + Con_Printf("Window manager \"%s\" support nothing\n", wmname); + } + else + { + for (i = 0; i < nitems; i++) + { +// Con_Printf("supported: %s\n", XGetAtomName(vid_dpy, ((Atom*)prop)[i])); + if (((Atom*)prop)[i] == xa_net_wm_state_fullscreen) + { + success = true; + break; + } + } + if (!success) + Con_Printf("Window manager \"%s\" does not appear to support fullscreen\n", wmname); + else + Con_Printf("Window manager \"%s\" supports fullscreen\n", wmname); + XFree(prop); + } + XFree(wmname); + } + return success; +} + +Window X_CreateWindow(qboolean override, XVisualInfo *visinfo, unsigned int width, unsigned int height) +{ + Window wnd; + XSetWindowAttributes attr; + XSizeHints szhints; + unsigned int mask; + Atom prots[1]; + + /* window attributes */ + attr.background_pixel = 0; + attr.border_pixel = 0; + attr.colormap = XCreateColormap(vid_dpy, vid_root, visinfo->visual, AllocNone); + attr.event_mask = X_MASK; + attr.backing_store = NotUseful; + attr.save_under = False; + mask = CWBackPixel | CWBorderPixel | CWColormap | CWEventMask | CWBackingStore |CWSaveUnder; + + // override redirect prevents the windowmanager from finding out about us, and thus will not apply borders to our window. + if (override) + { + mask |= CWOverrideRedirect; + attr.override_redirect = True; + } + + memset(&szhints, 0, sizeof(szhints)); + szhints.flags = PMinSize; + szhints.min_width = 320; + szhints.min_height = 200; + szhints.x = 0; + szhints.y = 0; + szhints.width = width; + szhints.height = height; + + wnd = XCreateWindow(vid_dpy, vid_root, 0, 0, width, height, + 0, visinfo->depth, InputOutput, + visinfo->visual, mask, &attr); + /*ask the window manager to stop triggering bugs in Xlib*/ + prots[0] = XInternAtom(vid_dpy, "WM_DELETE_WINDOW", False); + XSetWMProtocols(vid_dpy, wnd, prots, sizeof(prots)/sizeof(prots[0])); + XSetWMNormalHints(vid_dpy, wnd, &szhints); + /*set caption*/ + XStoreName(vid_dpy, wnd, "FTE QuakeWorld"); + XSetIconName(vid_dpy, wnd, "FTEQW"); + X_StoreIcon(wnd); + /*make it visible*/ + XMapWindow(vid_dpy, wnd); + + return wnd; } qboolean GLVID_Init (rendererstate_t *info, unsigned char *palette) { + int width = info->width; //can override these if vmode isn't available + int height = info->height; int i; int attrib[] = { GLX_RGBA, @@ -773,15 +983,11 @@ qboolean GLVID_Init (rendererstate_t *info, unsigned char *palette) GLX_STENCIL_SIZE, 8, None }; - XSetWindowAttributes attr; - unsigned long mask; - Window root; #ifdef USE_EGL XVisualInfo vinfodef; #endif XVisualInfo *visinfo; qboolean fullscreen = false; - Atom prots[1]; #ifdef WITH_VMODE int MajorVersion, MinorVersion; @@ -807,26 +1013,6 @@ qboolean GLVID_Init (rendererstate_t *info, unsigned char *palette) } #endif -// interpret command-line params - -// set vid parameters - if ((i = COM_CheckParm("-conwidth")) != 0) - vid.width = Q_atoi(com_argv[i+1]); - else - vid.width = 640; - - vid.width &= ~7; // make it a multiple of eight - - if (vid.width < 320) - vid.width = 320; - - // pick a conheight that matches with correct aspect - vid.height = vid.width*3 / 4; - - if ((i = COM_CheckParm("-conheight")) != 0) - vid.height = Q_atoi(com_argv[i+1]); - if (vid.height < 200) - vid.height = 200; if (!vid_dpy) vid_dpy = XOpenDisplay(NULL); if (!vid_dpy) @@ -836,7 +1022,7 @@ qboolean GLVID_Init (rendererstate_t *info, unsigned char *palette) } scrnum = DefaultScreen(vid_dpy); - root = RootWindow(vid_dpy, scrnum); + vid_root = RootWindow(vid_dpy, scrnum); #ifdef WITH_VMODE //find out if it's supported on this pc. MajorVersion = MinorVersion = 0; @@ -851,6 +1037,8 @@ qboolean GLVID_Init (rendererstate_t *info, unsigned char *palette) } #endif + fullscreenflags = 0; + #ifdef WITH_VMODE vidmode_usemode = -1; if (vidmode_ext) @@ -866,12 +1054,12 @@ qboolean GLVID_Init (rendererstate_t *info, unsigned char *palette) for (i = 0; i < num_vidmodes; i++) { - if (info->width > vidmodes[i]->hdisplay || - info->height > vidmodes[i]->vdisplay) + if (width > vidmodes[i]->hdisplay || + height > vidmodes[i]->vdisplay) continue; - x = info->width - vidmodes[i]->hdisplay; - y = info->height - vidmodes[i]->vdisplay; + x = width - vidmodes[i]->hdisplay; + y = height - vidmodes[i]->vdisplay; dist = (x * x) + (y * y); if (dist < best_dist) { @@ -880,22 +1068,42 @@ qboolean GLVID_Init (rendererstate_t *info, unsigned char *palette) } } - if (best_fit != -1 && (!best_dist || COM_CheckParm("-fullscreen"))) + if (best_fit != -1) { // change to the mode - XF86VidModeSwitchToMode(vid_dpy, scrnum, vidmodes[vidmode_usemode=best_fit]); - vidmode_active = true; - // Move the viewport to top left - XF86VidModeSetViewPort(vid_dpy, scrnum, 0, 0); + if (XF86VidModeSwitchToMode(vid_dpy, scrnum, vidmodes[vidmode_usemode=best_fit])) + { + width = vidmodes[best_fit]->hdisplay; + height = vidmodes[best_fit]->vdisplay; + // Move the viewport to top left + XF86VidModeSetViewPort(vid_dpy, scrnum, 0, 0); + XSync(vid_dpy, False); + fullscreenflags |= FULLSCREEN_VMODE | FULLSCREEN_VMODEACTIVE; + } + else + Con_Printf("Failed to apply mode %i*%i\n", vidmodes[best_fit]->hdisplay, vidmodes[best_fit]->vdisplay); } - else - fullscreen = 0; } } #endif - vidglx_fullscreen = fullscreen; + if (fullscreen) + { + if (!(fullscreenflags & FULLSCREEN_VMODE)) + { + //if we can't actually change the mode, our fullscreen is the size of the root window + XWindowAttributes xwa; + XGetWindowAttributes(vid_dpy, DefaultRootWindow(vid_dpy), &xwa); + width = xwa.width; + height = xwa.height; + } + + if (X_CheckWMFullscreenAvailable()) + fullscreenflags |= FULLSCREEN_WM; + else + fullscreenflags |= FULLSCREEN_LEGACY; + } #ifdef USE_EGL visinfo = &vinfodef; @@ -912,43 +1120,21 @@ qboolean GLVID_Init (rendererstate_t *info, unsigned char *palette) } #endif - /* window attributes */ - attr.background_pixel = 0; - attr.border_pixel = 0; - attr.colormap = XCreateColormap(vid_dpy, root, visinfo->visual, AllocNone); - attr.event_mask = X_MASK; - mask = CWBackPixel | CWBorderPixel | CWColormap | CWEventMask; - -#ifdef WITH_VMODE //get rid of borders - // fullscreen - if (vidmode_active) { - mask = CWBackPixel | CWColormap | CWSaveUnder | CWBackingStore | - CWEventMask | CWOverrideRedirect; - attr.override_redirect = True; - attr.backing_store = NotUseful; - attr.save_under = False; - } -#endif - - vid_window = XCreateWindow(vid_dpy, root, 0, 0, info->width, info->height, - 0, visinfo->depth, InputOutput, - visinfo->visual, mask, &attr); - ActiveApp = false; - /*ask the window manager to stop triggering bugs in Xlib*/ - prots[0] = XInternAtom(vid_dpy, "WM_DELETE_WINDOW", False); - XSetWMProtocols(vid_dpy, vid_window, prots, sizeof(prots)/sizeof(prots[0])); - /*set caption*/ - XStoreName(vid_dpy, vid_window, FULLENGINENAME); - /*make it visibl*/ - XMapWindow(vid_dpy, vid_window); - /*put it somewhere*/ - XMoveWindow(vid_dpy, vid_window, 0, 0); + if (fullscreenflags & FULLSCREEN_LEGACY) + { + vid_decoywindow = X_CreateWindow(false, visinfo, 640, 480); + vid_window = X_CreateWindow(true, visinfo, width, height); + } + else + vid_window = X_CreateWindow(false, visinfo, width, height); - //XFree(visinfo); + CL_UpdateWindowTitle(); + /*make it visible*/ #ifdef WITH_VMODE - if (vidmode_active) { + if (fullscreen & FULLSCREEN_VMODE) + { XRaiseWindow(vid_dpy, vid_window); XWarpPointer(vid_dpy, None, vid_window, 0, 0, 0, 0, 0, 0); XFlush(vid_dpy); @@ -1008,17 +1194,19 @@ qboolean GLVID_Init (rendererstate_t *info, unsigned char *palette) InitSig(); // trap evil signals - vid.pixelwidth = info->width; - vid.pixelheight = info->height; - - if (vid.height > info->height) - vid.height = info->height; - if (vid.width > info->width) - vid.width = info->width; + //probably going to be resized in the event handler + vid.pixelwidth = fullscreenwidth = width; + vid.pixelheight = fullscreenheight = height; vid.numpages = 2; - Con_SafePrintf ("Video mode %dx%d initialized.\n", info->width, info->height); + Con_SafePrintf ("Video mode %dx%d initialized.\n", width, height); + if (fullscreenflags & FULLSCREEN_WM) + X_GoFullscreen(); + if (fullscreenflags & FULLSCREEN_LEGACY) + XMoveResizeWindow(vid_dpy, vid_window, 0, 0, fullscreenwidth, fullscreenheight); + if (fullscreenflags) + fullscreenflags |= FULLSCREEN_ACTIVE; vid.recalc_refdef = 1; // force a surface cache flush @@ -1030,15 +1218,131 @@ qboolean GLVID_Init (rendererstate_t *info, unsigned char *palette) else XSetInputFocus(vid_dpy, vid_window, RevertToParent, CurrentTime); XRaiseWindow(vid_dpy, vid_window); + if (fullscreenflags & FULLSCREEN_LEGACY) + XMoveResizeWindow(vid_dpy, vid_window, 0, 0, fullscreenwidth, fullscreenheight); return true; } void Sys_SendKeyEvents(void) { - if (vid_dpy && vid_window) { + if (gracefulexit) + { + Cbuf_AddText("\nquit\n", RESTRICT_LOCAL); + gracefulexit = false; + } + if (vid_dpy && vid_window) + { + qboolean wantwindowed; + while (XPending(vid_dpy)) GetEvent(); + + if (modeswitchpending && modeswitchtime < Sys_Milliseconds()) + { + if (old_windowed_mouse) + { + Con_DPrintf("uninstall grabs\n"); + uninstall_grabs(); + XUndefineCursor(vid_dpy, vid_window); + old_windowed_mouse = false; + } + if (modeswitchpending > 0) + { + //entering fullscreen mode +#ifdef WITH_VMODE + if (fullscreenflags & FULLSCREEN_VMODE) + { + if (!(fullscreenflags & FULLSCREEN_VMODEACTIVE)) + { + // change to the mode + XF86VidModeSwitchToMode(vid_dpy, scrnum, vidmodes[vidmode_usemode]); + fullscreenflags |= FULLSCREEN_VMODEACTIVE; + // Move the viewport to top left + } + XF86VidModeSetViewPort(vid_dpy, scrnum, 0, 0); + } +#endif + Cvar_ForceCallback(&v_gamma); + + /*release the mouse now, because we're paranoid about clip regions*/ + if (fullscreenflags & FULLSCREEN_WM) + X_GoFullscreen(); + if (fullscreenflags & FULLSCREEN_LEGACY) + { + XMoveWindow(vid_dpy, vid_window, 0, 0); + XReparentWindow(vid_dpy, vid_window, vid_root, 0, 0); + //XUnmapWindow(vid_dpy, vid_decoywindow); + //make sure we have it + XSetInputFocus(vid_dpy, vid_window, RevertToParent, CurrentTime); + XRaiseWindow(vid_dpy, vid_window); + XMoveResizeWindow(vid_dpy, vid_window, 0, 0, fullscreenwidth, fullscreenheight); + } + if (fullscreenflags) + fullscreenflags |= FULLSCREEN_ACTIVE; + } + if (modeswitchpending < 0) + { + //leave fullscreen mode + if (!COM_CheckParm("-stayactive")) + { //a parameter that leaves the program fullscreen if you taskswitch. + //sounds pointless, works great with two moniters. :D + if (fullscreenflags & FULLSCREEN_VMODE) + { + if (originalapplied) + XF86VidModeSetGammaRamp(vid_dpy, scrnum, 256, originalramps[0], originalramps[1], originalramps[2]); + if (fullscreenflags & FULLSCREEN_VMODEACTIVE) + { + XF86VidModeSwitchToMode(vid_dpy, scrnum, vidmodes[0]); + fullscreenflags &= ~FULLSCREEN_VMODEACTIVE; + } + } + } + if (fullscreenflags & FULLSCREEN_WM) + X_GoWindowed(); + if (fullscreenflags & FULLSCREEN_LEGACY) + { + XMapWindow(vid_dpy, vid_decoywindow); + XReparentWindow(vid_dpy, vid_window, vid_decoywindow, 0, 0); + XResizeWindow(vid_dpy, vid_decoywindow, 640, 480); + } + fullscreenflags &= ~FULLSCREEN_ACTIVE; + } + modeswitchpending = 0; + } + + if (modeswitchpending) + return; + + wantwindowed = !!_windowed_mouse.value; + if (!ActiveApp) + wantwindowed = false; + if (Key_MouseShouldBeFree() && !fullscreenflags) + wantwindowed = false; + + if (old_windowed_mouse != wantwindowed) + { + old_windowed_mouse = wantwindowed; + + if (!wantwindowed) + { + Con_DPrintf("uninstall grabs\n"); + /* ungrab the pointer */ + uninstall_grabs(); + XUndefineCursor(vid_dpy, vid_window); + } + else + { + Con_DPrintf("install grabs\n"); + /* grab the pointer */ + if (fullscreenflags & FULLSCREEN_ACTIVE) + install_grabs(); + else + uninstall_grabs(); //don't grab the mouse when fullscreen. its a: not needed. b: breaks gnome's alt-tab. + /*hide the cursor*/ + XDefineCursor(vid_dpy, vid_window, vid_nullcursor); + } + } } } @@ -1072,3 +1376,41 @@ void GLVID_SetCaption(char *text) XStoreName(vid_dpy, vid_window, text); } + +#if 1 +char *Sys_GetClipboard(void) +{ + Atom xa_clipboard = XInternAtom(vid_dpy, "PRIMARY", false); + Atom xa_string = XInternAtom(vid_dpy, "UTF8_STRING", false); + Window clipboardowner = XGetSelectionOwner(vid_dpy, xa_clipboard); + if (clipboardowner != None && clipboardowner != vid_window) + { + int fmt; + Atom type; + unsigned long nitems, bytesleft; + unsigned char *data; + XConvertSelection(vid_dpy, xa_clipboard, xa_string, None, vid_window, CurrentTime); + XFlush(vid_dpy); + XGetWindowProperty(vid_dpy, vid_window, xa_string, 0, 0, False, AnyPropertyType, &type, &fmt, &nitems, &bytesleft, &data); + + return data; + } + return clipboard_buffer; +} + +void Sys_CloseClipboard(char *bf) +{ + if (bf == clipboard_buffer) + return; + + XFree(bf); +} + +void Sys_SaveClipboard(char *text) +{ + Atom xa_clipboard = XInternAtom(vid_dpy, "PRIMARY", false); + Q_strncpyz(clipboard_buffer, text, SYS_CLIPBOARD_SIZE); + XSetSelectionOwner(vid_dpy, xa_clipboard, vid_window, CurrentTime); +} +#endif + diff --git a/engine/http/httpserver.c b/engine/http/httpserver.c index bdfff5ac2..595076545 100644 --- a/engine/http/httpserver.c +++ b/engine/http/httpserver.c @@ -78,7 +78,7 @@ void HTTP_ServerShutdown(void) } typedef struct HTTP_active_connections_s { - int datasock; + SOCKET datasock; vfsfile_t *file; struct HTTP_active_connections_s *next; @@ -88,19 +88,19 @@ typedef struct HTTP_active_connections_s { qboolean close; char *inbuffer; - int inbuffersize; - int inbufferused; + unsigned int inbuffersize; + unsigned int inbufferused; char *outbuffer; - int outbuffersize; - int outbufferused; + unsigned int outbuffersize; + unsigned int outbufferused; } HTTP_active_connections_t; static HTTP_active_connections_t *HTTP_ServerConnections; static int httpconnectioncount; -static void ExpandInBuffer(HTTP_active_connections_t *cl, int quant, qboolean fixedsize) +static void ExpandInBuffer(HTTP_active_connections_t *cl, unsigned int quant, qboolean fixedsize) { - int newsize; + unsigned int newsize; if (fixedsize) newsize = quant; else @@ -111,9 +111,9 @@ static void ExpandInBuffer(HTTP_active_connections_t *cl, int quant, qboolean fi cl->inbuffer = IWebRealloc(cl->inbuffer, newsize); cl->inbuffersize = newsize; } -static void ExpandOutBuffer(HTTP_active_connections_t *cl, int quant, qboolean fixedsize) +static void ExpandOutBuffer(HTTP_active_connections_t *cl, unsigned int quant, qboolean fixedsize) { - int newsize; + unsigned int newsize; if (fixedsize) newsize = quant; else @@ -133,7 +133,7 @@ void HTTP_RunExisting (void) char resource[256]; char mode[8]; qboolean hostspecified; - int contentlen; + unsigned int contentlen; int HTTPmarkup; //version int localerrno; @@ -171,7 +171,7 @@ void HTTP_RunExisting (void) case HTTP_WAITINGFORREQUEST: if (cl->outbufferused) Sys_Error("Persistant connection was waiting for input with unsent output"); - ammount = cl->inbuffersize - cl->inbufferused - 1; + ammount = cl->inbuffersize-1 - cl->inbufferused; if (ammount < 128) { if (cl->inbuffersize>128*1024) @@ -181,7 +181,7 @@ void HTTP_RunExisting (void) } ExpandInBuffer(cl, 1500, false); - ammount = cl->inbuffersize - cl->inbufferused - 1; + ammount = cl->inbuffersize-1 - cl->inbufferused; } if (cl->modeswitched) { @@ -278,7 +278,7 @@ cont: if (!strnicmp(msg, "Host: ", 6)) //parse needed header fields hostspecified = true; else if (!strnicmp(msg, "Content-Length: ", 16)) //parse needed header fields - contentlen = atoi(msg+16); + contentlen = strtoul(msg+16, NULL, 0); else if (!strnicmp(msg, "Transfer-Encoding: ", 18)) //parse needed header fields { cl->closeaftertransaction = true; diff --git a/engine/qclib/initlib.c b/engine/qclib/initlib.c index 94932e541..96513349b 100644 --- a/engine/qclib/initlib.c +++ b/engine/qclib/initlib.c @@ -108,12 +108,12 @@ void *PRAddressableExtend(progfuncs_t *progfuncs, int ammount) prinst.addressablesize = newsize; } #else - char *newblock; int newsize = (prinst.addressableused + ammount + 1024*1024) & ~(1024*1024-1); - newblock = realloc(newblock, prinst.addressablesize); + char *newblock = malloc(newsize); if (newblock) { PRAddressableRelocate(progfuncs, prinst.addressablehunk, newblock, prinst.addressableused); + free(prinst.addressablehunk); prinst.addressablehunk = newblock; prinst.addressablesize = newsize; } @@ -163,10 +163,10 @@ static void PF_fmem_unlink(progfuncs_t *pr, qcmemfreeblock_t *p) np->prev = p->prev; } } +/* static void PR_memvalidate (progfuncs_t *progfuncs) { qcmemfreeblock_t *p; - qcmemusedblock_t *ub = NULL; unsigned int b,l; b = prinst.mfreelist; @@ -182,7 +182,7 @@ static void PR_memvalidate (progfuncs_t *progfuncs) p = (qcmemfreeblock_t*)(progfuncs->funcs.stringtable + b); if (p->prev != l || - p->next && p->next < b + p->size || + (p->next && p->next < b + p->size) || p->next >= prinst.addressableused || b + p->size >= prinst.addressableused || p->prev >= b) @@ -195,6 +195,7 @@ static void PR_memvalidate (progfuncs_t *progfuncs) b = p->next; } } +*/ static void *PDECL PR_memalloc (pubprogfuncs_t *ppf, unsigned int size) { progfuncs_t *progfuncs = (progfuncs_t*)ppf; @@ -216,7 +217,7 @@ static void *PDECL PR_memalloc (pubprogfuncs_t *ppf, unsigned int size) p = (qcmemfreeblock_t*)(progfuncs->funcs.stringtable + b); if (p->size >= size) { - if (p->next && p->next < b + p->size || + if ((p->next && p->next < b + p->size) || p->next >= prinst.addressableused || b + p->size >= prinst.addressableused || p->prev >= b) @@ -297,10 +298,10 @@ static void PDECL PR_memfree (pubprogfuncs_t *ppf, void *memptr) { //the empty string is a point of contention. while we can detect it from fteqcc, its best to not give any special favours (other than nicer debugging, where possible) //we might not actually spot it from other qccs, so warning about it where possible is probably a very good thing. - printf("PF_memfree: unable to free the non-null empty string constant\n", ptr, prinst.addressableused); + printf("PF_memfree: unable to free the non-null empty string constant at %x\n", ptr); } else - printf("PF_memfree: pointer invalid - out of range (%u >= %u)\n", ptr, prinst.addressableused); + printf("PF_memfree: pointer invalid - out of range (%x >= %x)\n", ptr, prinst.addressableused); PR_StackTrace(&progfuncs->funcs); return; } @@ -764,7 +765,7 @@ struct edict_s *PDECL ProgsToEdict (pubprogfuncs_t *ppf, int progs) } int PDECL EdictToProgs (pubprogfuncs_t *ppf, struct edict_s *ed) { - progfuncs_t *progfuncs = (progfuncs_t*)ppf; +// progfuncs_t *progfuncs = (progfuncs_t*)ppf; return EDICT_TO_PROG(progfuncs, ed); } diff --git a/engine/qclib/pr_exec.c b/engine/qclib/pr_exec.c index 1b91634ac..8c29928ea 100644 --- a/engine/qclib/pr_exec.c +++ b/engine/qclib/pr_exec.c @@ -129,6 +129,8 @@ void PDECL PR_GenerateStatementString (pubprogfuncs_t *ppf, int statementnum, ch arg[1] = ((dstatement32_t*)current_progstate->statements + statementnum)->b; arg[2] = ((dstatement32_t*)current_progstate->statements + statementnum)->c; break; + default: + return; } if (current_progstate->linenums) diff --git a/engine/qclib/qcc_cmdlib.c b/engine/qclib/qcc_cmdlib.c index b173b8e89..ef751cef0 100644 --- a/engine/qclib/qcc_cmdlib.c +++ b/engine/qclib/qcc_cmdlib.c @@ -363,6 +363,11 @@ skipwhite: data++; } else if (c=='\"'||c=='\0') + { + if (len < sizeof(qcc_token)-1) + qcc_token[len++] = 0; + break; + } if (len >= sizeof(qcc_token)-1) ; else @@ -888,6 +893,9 @@ static char *decodeUTF(int type, unsigned char *inputf, unsigned int inbytes, in w = 4; maxperchar = 4; break; + default: + *outlen = inbytes; + return inputf; } chars = inbytes / w; utf8 = start = qccHunkAlloc(chars * maxperchar + 2); @@ -895,6 +903,7 @@ static char *decodeUTF(int type, unsigned char *inputf, unsigned int inbytes, in { switch(type) { + default: case UTF16LE: inc = *inputf++; inc|= (*inputf++)<<8; diff --git a/engine/qclib/qcc_pr_comp.c b/engine/qclib/qcc_pr_comp.c index b2403026f..3d153b9a9 100644 --- a/engine/qclib/qcc_pr_comp.c +++ b/engine/qclib/qcc_pr_comp.c @@ -3191,7 +3191,7 @@ PR_ParseFunctionCall */ QCC_def_t *QCC_PR_ParseFunctionCall (QCC_def_t *func) //warning, the func could have no name set if it's a field call. { - QCC_def_t *e, *d, *old = {0}, *oself, *out; // warning: ‘old’ may be used uninitialized in this function + QCC_def_t *e, *d, *oself, *out; int arg; QCC_type_t *t, *p; int extraparms=false; @@ -3265,13 +3265,16 @@ QCC_def_t *QCC_PR_ParseFunctionCall (QCC_def_t *func) //warning, the func could QCC_PR_Lex(); } else + { QCC_PR_ParseErrorPrintDef (ERR_TYPEMISMATCHPARM, func, "_() intrinsic accepts only a string immediate", 1); + d = NULL; + } QCC_PR_Expect(")"); return d; } if (!strcmp(func->name, "random")) { - old = NULL; + QCC_def_t *old = NULL; if (!func->initialized) func->initialized = 3; func->references++; @@ -3418,6 +3421,7 @@ QCC_def_t *QCC_PR_ParseFunctionCall (QCC_def_t *func) //warning, the func could } if (!strcmp(func->name, "randomv")) { + QCC_def_t *old; out = NULL; if (!func->initialized) func->initialized = 3; @@ -3446,6 +3450,7 @@ QCC_def_t *QCC_PR_ParseFunctionCall (QCC_def_t *func) //warning, the func could if (QCC_OPCodeValid(&pr_opcodes[OP_RANDV0])) { + old = NULL; if(def_ret.temp->used) out = QCC_GetTemp(type_vector); else @@ -3610,6 +3615,7 @@ QCC_def_t *QCC_PR_ParseFunctionCall (QCC_def_t *func) //warning, the func could } else if (!strcmp(func->name, "spawn")) { + QCC_def_t *old; QCC_type_t *rettype; if (QCC_PR_CheckToken(")")) { @@ -4389,6 +4395,8 @@ QCC_def_t *QCC_PR_ParseArrayPointer (QCC_def_t *d, pbool allowarrayassign) i = G_INT(tmp->ofs); else if (tmp->type->type == ev_float) i = G_FLOAT(tmp->ofs); + else + i = -1; if (i < 0 || i >= 3) QCC_PR_ParseErrorPrintDef(0, d, "(vector) array index out of bounds"); } @@ -4410,6 +4418,8 @@ QCC_def_t *QCC_PR_ParseArrayPointer (QCC_def_t *d, pbool allowarrayassign) i = G_INT(tmp->ofs); else if (tmp->type->type == ev_float) i = G_FLOAT(tmp->ofs); + else + i = -1; if (i < 0 || i >= ((!idx)?d->arraysize:t->arraysize)) QCC_PR_ParseErrorPrintDef(0, d, "(constant) array index out of bounds"); } @@ -5128,7 +5138,10 @@ QCC_def_t *QCC_PR_Term (int exprflags) e2->type = e->type->aux_type; } else + { + e2 = NULL; QCC_PR_ParseError (ERR_BADNOTTYPE, "type mismatch for *"); + } return e2; } else if (QCC_PR_CheckToken ("-")) @@ -7054,7 +7067,7 @@ static pbool QCC_FuncJumpsTo(int first, int last, int statement) } return false; } - +/* static pbool QCC_FuncJumpsToRange(int first, int last, int firstr, int lastr) { int st; @@ -7105,7 +7118,7 @@ static pbool QCC_FuncJumpsToRange(int first, int last, int firstr, int lastr) } return false; } - +*/ #if 0 void QCC_CompoundJumps(int first, int last) { diff --git a/engine/qclib/qcc_pr_lex.c b/engine/qclib/qcc_pr_lex.c index 78f08c5e1..9b0a1a0d4 100644 --- a/engine/qclib/qcc_pr_lex.c +++ b/engine/qclib/qcc_pr_lex.c @@ -244,7 +244,7 @@ int ParsePrecompilerIf(int level) { CompilerConstant_t *c; int eval = 0; - pbool notted = false; +// pbool notted = false; //single term end-of-chain if (level == PPI_VALUE) @@ -384,7 +384,7 @@ static void QCC_PR_SkipToEndOfLine(void) } if (*pr_file_p == '\n') pr_source_line++; - *pr_file_p++; + pr_file_p++; } } else if (*pr_file_p == '/' && pr_file_p[1] == '/' && handlecomments) diff --git a/engine/qclib/qccmain.c b/engine/qclib/qccmain.c index 65517b390..bafc3e0d0 100644 --- a/engine/qclib/qccmain.c +++ b/engine/qclib/qccmain.c @@ -1363,6 +1363,7 @@ strofs = (strofs+3)&~3; break; case QCF_DARKPLACES: case QCF_FTE: + case QCF_FTEH2: case QCF_FTEDEBUG: progs.version = PROG_EXTENDEDVERSION; diff --git a/engine/server/pr_cmds.c b/engine/server/pr_cmds.c index 22108eff3..e32c8bab3 100644 --- a/engine/server/pr_cmds.c +++ b/engine/server/pr_cmds.c @@ -7351,7 +7351,7 @@ static void QCBUILTIN PF_h2starteffect(pubprogfuncs_t *prinst, struct globalvars static void QCBUILTIN PF_h2endeffect(pubprogfuncs_t *prinst, struct globalvars_s *pr_globals) { - int ign = G_FLOAT(OFS_PARM0); +// int ign = G_FLOAT(OFS_PARM0); int index = G_FLOAT(OFS_PARM1); Con_DPrintf("Stop effect %i\n", index); @@ -10556,7 +10556,7 @@ void PR_DumpPlatform_f(void) {"SLIST_TEST_NOTEQUAL", "const float", MENU, SLIST_TEST_NOTEQUAL}, {"SLIST_TEST_STARTSWITH", "const float", MENU, SLIST_TEST_STARTSWITH}, {"SLIST_TEST_NOTSTARTSWITH", "const float", MENU, SLIST_TEST_NOTSTARTSWITH}, - NULL + {NULL} }; targ = 0; diff --git a/engine/server/server.h b/engine/server/server.h index 81525c510..7d8fb32c2 100644 --- a/engine/server/server.h +++ b/engine/server/server.h @@ -529,10 +529,10 @@ typedef struct client_s qboolean csqcactive; #ifdef PROTOCOL_VERSION_FTE qboolean pextknown; - unsigned long fteprotocolextensions; - unsigned long fteprotocolextensions2; + unsigned int fteprotocolextensions; + unsigned int fteprotocolextensions2; #endif - unsigned long zquake_extensions; + unsigned int zquake_extensions; unsigned int max_net_ents; /*highest entity number the client can receive (limited by either protocol or client's buffer size)*/ unsigned int maxmodels; /*max models supported by whatever the protocol is*/ diff --git a/engine/server/sv_ents.c b/engine/server/sv_ents.c index df7f32e28..57b241f93 100644 --- a/engine/server/sv_ents.c +++ b/engine/server/sv_ents.c @@ -109,7 +109,9 @@ int numnails; int nailcount = 0; extern int sv_nailmodel, sv_supernailmodel, sv_playermodel; +#ifdef SERVER_DEMO_PLAYBACK qboolean demonails; +#endif static edict_t *csqcent[MAX_EDICTS]; static int csqcnuments; @@ -122,7 +124,9 @@ qboolean SV_AddNailUpdate (edict_t *ent) if (sv_nailhack.value) return false; +#ifdef SERVER_DEMO_PLAYBACK demonails = false; +#endif if (numnails == MAX_NAILS) return true; @@ -131,7 +135,7 @@ qboolean SV_AddNailUpdate (edict_t *ent) numnails++; return true; } - +#ifdef SERVER_DEMO_PLAYBACK qboolean SV_DemoNailUpdate (int i) { demonails = true; @@ -142,6 +146,7 @@ qboolean SV_DemoNailUpdate (int i) numnails++; return true; } +#endif void SV_EmitNailUpdate (sizebuf_t *msg, qboolean recorder) { @@ -2891,7 +2896,7 @@ void SV_Snapshot_BuildStateQ1(entity_state_t *state, edict_t *ent, client_t *cli state->lightpflags = ent->xv->pflags; state->u.q1.traileffectnum = ent->xv->traileffectnum; - if (!ent->xv->gravitydir[0] && !ent->xv->gravitydir[1] && !ent->xv->gravitydir[2] || (ent->xv->gravitydir[2] == -1)) + if ((!ent->xv->gravitydir[0] && !ent->xv->gravitydir[1] && !ent->xv->gravitydir[2]) || (ent->xv->gravitydir[2] == -1)) { state->u.q1.gravitydir[0] = 0; state->u.q1.gravitydir[1] = 0; diff --git a/engine/server/sv_main.c b/engine/server/sv_main.c index 71416f72a..27520b0b3 100644 --- a/engine/server/sv_main.c +++ b/engine/server/sv_main.c @@ -2595,8 +2595,8 @@ client_t *SVC_DirectConnect(void) if (ISNQCLIENT(newcl)) { - //FIXME: we should delay this until we actually have a name. - SV_BroadcastPrintf(PRINT_LOW, "New client connected\n", newcl->name); + //FIXME: we should delay this until we actually have a name, because right now they'll be called unnamed or unconnected or something + SV_BroadcastPrintf(PRINT_LOW, "New client connected\n"); } else if (redirect) { diff --git a/engine/server/sv_mvd.c b/engine/server/sv_mvd.c index e419ed0d0..557030e73 100644 --- a/engine/server/sv_mvd.c +++ b/engine/server/sv_mvd.c @@ -30,12 +30,6 @@ void SV_MVDStop_f (void); #define demo_size_padding 0x1000 - -//#define MIN_MVD_MEMORY 0x100000 -//#define MAXSIZE (demobuffer->end < demobuffer->last ? \ -// demobuffer->start - demobuffer->end : \ -// demobuffer->maxsize - demobuffer->end) - static void SV_DemoDir_Callback(struct cvar_s *var, char *oldvalue); cvar_t sv_demoUseCache = CVARD("sv_demoUseCache", "0", "If set, demo data will be flushed only periodically"); @@ -2245,7 +2239,7 @@ void SV_MVDEasyRecord_f (void) { char *c; Q_strncpyz (name, Cmd_Argv(1), sizeof(name)); - while(c = strchr(name, ':')) + while((c = strchr(name, ':'))) *c = '-'; } else diff --git a/engine/server/sv_user.c b/engine/server/sv_user.c index 328acffbd..9e3fa18f5 100644 --- a/engine/server/sv_user.c +++ b/engine/server/sv_user.c @@ -425,7 +425,6 @@ void SVNQ_New_f (void) int i; int maxplayers = 0; int op; - extern cvar_t pr_maxedicts; unsigned int protext1 = 0, protext2 = 0, protmain = 0, protfl = 0; host_client->send_message = true; @@ -3494,7 +3493,7 @@ void SV_Rate_f (void) { int rate = SV_RateForClient(host_client); if (!rate) - SV_ClientPrintf (host_client, PRINT_HIGH, "Effective rate is unlimited\n", rate); + SV_ClientPrintf (host_client, PRINT_HIGH, "Effective rate is unlimited\n"); else SV_ClientPrintf (host_client, PRINT_HIGH, "Effective rate %i\n", rate); return; diff --git a/engine/server/svq2_game.c b/engine/server/svq2_game.c index 67406dc2a..8227dcc91 100644 --- a/engine/server/svq2_game.c +++ b/engine/server/svq2_game.c @@ -550,6 +550,7 @@ static q2trace_t VARGS SVQ2_Trace (vec3_t start, vec3_t mins, vec3_t maxs, vec3_ ret.surface = tr.surface; ret.fraction = tr.fraction; VectorCopy(tr.endpos, ret.endpos); + memset(&ret.plane, 0, sizeof(ret.plane)); VectorCopy(tr.plane.normal, ret.plane.normal); ret.plane.dist = tr.plane.dist; ret.ent = tr.ent;