From 362d8f820f318dd26b498fc6300aca070f873324 Mon Sep 17 00:00:00 2001 From: Spoike Date: Fri, 15 Aug 2014 02:20:41 +0000 Subject: [PATCH] I got into a discussion with gb. added fps_preset vanilla. this enables all sorts of vanillary things, even more so than faithful (which disables them again). added r_part_classic_square, cl_demoreel. fixed a couple of things that the ever vigilant gb spotted. I guess I don't play quake enough. fixed a load of random warnings reported by gcc. many many many warnings remain. I got bored. internal mrt feature implemented, not properly tested yet. git-svn-id: https://svn.code.sf.net/p/fteqw/code/trunk@4719 fc73d0e0-1445-4013-8a0c-d673dee63da5 --- engine/client/cl_demo.c | 3 + engine/client/cl_ents.c | 2 +- engine/client/cl_main.c | 42 +++++----- engine/client/cl_parse.c | 2 - engine/client/cl_pred.c | 10 ++- engine/client/cl_screen.c | 28 ++----- engine/client/client.h | 2 +- engine/client/in_sdl.c | 6 +- engine/client/m_items.c | 3 +- engine/client/m_options.c | 121 ++++++++++++++++----------- engine/client/menu.c | 16 ++-- engine/client/p_classic.c | 8 +- engine/client/pr_clcmd.c | 3 +- engine/client/pr_csqc.c | 2 + engine/client/render.h | 1 + engine/client/renderer.c | 16 +++- engine/client/sbar.c | 4 + engine/client/snd_directx.c | 1 - engine/client/snd_dma.c | 4 +- engine/client/snd_droid.c | 3 +- engine/client/sys_droid.c | 2 - engine/client/wad.c | 34 ++++---- engine/common/common.c | 10 ++- engine/common/common.h | 2 + engine/common/fs.c | 2 +- engine/common/gl_q2bsp.c | 12 +-- engine/common/pr_bgcmd.c | 8 +- engine/common/world.h | 2 +- engine/dotnet2005/droid.vcproj | 4 +- engine/gl/gl_backend.c | 40 ++++----- engine/gl/gl_bloom.c | 8 +- engine/gl/gl_rlight.c | 4 +- engine/gl/gl_rmain.c | 10 ++- engine/gl/gl_shader.c | 102 ++++++++++++++-------- engine/gl/gl_shadow.c | 10 ++- engine/gl/gl_vidcommon.c | 5 +- engine/gl/r_bishaders.h | 5 +- engine/gl/shader.h | 6 +- engine/nacl/snd_ppapi.c | 4 +- engine/qclib/initlib.c | 2 +- engine/qclib/pr_edict.c | 6 +- engine/qclib/pr_exec.c | 3 +- engine/qclib/progsint.h | 19 ++--- engine/qclib/progslib.h | 2 +- engine/qclib/qcc_pr_comp.c | 2 +- engine/server/pr_q1qvm.c | 8 +- engine/server/savegame.c | 5 ++ engine/server/sv_ccmds.c | 9 +- engine/server/sv_main.c | 1 + engine/server/sv_send.c | 9 +- engine/server/sv_user.c | 4 +- engine/server/svq3_game.c | 2 +- engine/shaders/glsl/defaultskin.glsl | 3 + engine/shaders/glsl/lpp_wall.glsl | 2 +- 54 files changed, 362 insertions(+), 262 deletions(-) diff --git a/engine/client/cl_demo.c b/engine/client/cl_demo.c index ec785426..7f59f841 100644 --- a/engine/client/cl_demo.c +++ b/engine/client/cl_demo.c @@ -1537,6 +1537,9 @@ void CL_PlayDemo_f (void) return; } + if (cls.state == ca_demostart) + cls.state = ca_disconnected; + #ifdef WEBCLIENT #ifdef warningmsg #pragma warningmsg("playdemo http://blah is broken right now") diff --git a/engine/client/cl_ents.c b/engine/client/cl_ents.c index 1518e74c..a20ed392 100644 --- a/engine/client/cl_ents.c +++ b/engine/client/cl_ents.c @@ -2874,7 +2874,7 @@ static void CL_TransitionPacketEntities(int newsequence, packet_entities_t *newp snew = &newpack->entities[newpnum]; sold = NULL; - for ( ; oldpnumnum_entities ; oldpnum) + for ( ; oldpnumnum_entities ; ) { sold = &oldpack->entities[oldpnum++]; if (sold->number >= snew->number) diff --git a/engine/client/cl_main.c b/engine/client/cl_main.c index 1c83b1a2..2f4ee84c 100644 --- a/engine/client/cl_main.c +++ b/engine/client/cl_main.c @@ -88,6 +88,7 @@ cvar_t qtvcl_forceversion1 = CVAR("qtvcl_forceversion1", "0"); cvar_t qtvcl_eztvextensions = CVAR("qtvcl_eztvextensions", "0"); cvar_t cl_demospeed = CVARAF("cl_demospeed", "1", "demo_setspeed", 0); +cvar_t cl_demoreel = CVARFD("cl_demoreel", "0", CVAR_SAVE, "When enabled, the engine will begin playing a demo loop on startup."); cvar_t cl_loopbackprotocol = CVARD("cl_loopbackprotocol", "qw", "Which protocol to use for single-player/the internal client. Should be one of: qw, qwid, nqid, nq, fitz, dp6, dp7. If empty, will use qw protocols for qw mods, and nq protocols for nq mods."); @@ -110,7 +111,7 @@ extern int total_loading_size, current_loading_size, loading_stage; // cvar_t password = CVARAF("password", "", "pq_password", CVAR_USERINFO | CVAR_NOUNSAFEEXPAND); //this is parhaps slightly dodgy... added pq_password alias because baker seems to be using this for user accounts. cvar_t spectator = CVARF("spectator", "", CVAR_USERINFO); -cvar_t name = CVARFC("name", "unnamed", CVAR_ARCHIVE | CVAR_USERINFO, Name_Callback); +cvar_t name = CVARFC("name", "Player", CVAR_ARCHIVE | CVAR_USERINFO, Name_Callback); cvar_t team = CVARF("team", "", CVAR_ARCHIVE | CVAR_USERINFO); cvar_t skin = CVARF("skin", "", CVAR_ARCHIVE | CVAR_USERINFO); cvar_t model = CVARF("model", "", CVAR_ARCHIVE | CVAR_USERINFO); @@ -1198,14 +1199,13 @@ void CL_Rcon_f (void) void CL_BlendFog(fogstate_t *result, fogstate_t *oldf, float time, fogstate_t *newf) { - float nfrac, ofrac; + float nfrac; if (time >= newf->time) nfrac = 1; else if (time < oldf->time) nfrac = 0; else nfrac = (time - oldf->time) / (newf->time - oldf->time); - ofrac = 1 - nfrac; FloatInterpolate(oldf->alpha, nfrac, newf->alpha, result->alpha); FloatInterpolate(oldf->depthbias, nfrac, newf->depthbias, result->depthbias); @@ -1742,7 +1742,7 @@ void CL_CheckServerInfo(void) oldteamplay = cl.teamplay; cl.teamplay = atoi(Info_ValueForKey(cl.serverinfo, "teamplay")); - cl.deathmatch = atoi(Info_ValueForKey(cl.serverinfo, "deathmatch")); + cls.deathmatch = cl.deathmatch = atoi(Info_ValueForKey(cl.serverinfo, "deathmatch")); cls.allow_cheats = false; cls.allow_semicheats=true; @@ -1803,8 +1803,6 @@ void CL_CheckServerInfo(void) if (cls.maxfps < 20) cls.maxfps = 72; - cls.deathmatch = atoi(Info_ValueForKey(cl.serverinfo, "deathmatch")); - cls.z_ext = atoi(Info_ValueForKey(cl.serverinfo, "*z_ext")); // movement vars for prediction @@ -2194,10 +2192,10 @@ void CL_NextDemo (void) { char str[1024]; - if (cls.demonum == -1) + if (cls.demonum < 0) return; // don't play demos - if (!cls.demos[cls.demonum][0] || cls.demonum == MAX_DEMOS) + if (!cls.demos[cls.demonum][0] || cls.demonum >= MAX_DEMOS) { cls.demonum = 0; if (!cls.demos[cls.demonum][0]) @@ -2214,6 +2212,9 @@ void CL_NextDemo (void) Q_snprintfz (str, sizeof(str), "playdemo %s\n", cls.demos[cls.demonum]); Cbuf_InsertText (str, RESTRICT_LOCAL, false); cls.demonum++; + + if (!cls.state) + cls.state = ca_demostart; } /* @@ -2245,17 +2246,8 @@ void CL_Startdemos_f (void) for (i=1 ; i QR_NONE && !m_state) - M_ToggleMenu_f(); + { + if (cl_demoreel.ival) + CL_NextDemo(); + if (!cls.state) + M_ToggleMenu_f(); + } //Con_ForceActiveNow(); } } @@ -4972,6 +4971,7 @@ void Host_Shutdown(void) #endif Con_Shutdown(); + COM_BiDi_Shutdown(); Memory_DeInit(); #ifndef CLIENTONLY diff --git a/engine/client/cl_parse.c b/engine/client/cl_parse.c index 962e5083..631296ce 100644 --- a/engine/client/cl_parse.c +++ b/engine/client/cl_parse.c @@ -2113,7 +2113,6 @@ static void DLC_RequestDownloadChunks(qdownload_t *dl, float frametime) void DLC_Poll(qdownload_t *dl) { - extern cvar_t drate; static float lasttime; DLC_RequestDownloadChunks(dl, realtime - lasttime); lasttime = realtime; @@ -5673,7 +5672,6 @@ void CL_DumpPacket(void) void CL_ParsePortalState(void) { - qboolean open = false; int mode = MSG_ReadByte(); int a1, a2; diff --git a/engine/client/cl_pred.c b/engine/client/cl_pred.c index 33c6bdf8..2621d863 100644 --- a/engine/client/cl_pred.c +++ b/engine/client/cl_pred.c @@ -434,6 +434,7 @@ void CL_PredictUsercmd (int pnum, int entnum, player_state_t *from, player_state //Used when cl_nopred is 1 to determine whether we are on ground, otherwise stepup smoothing code produces ugly jump physics void CL_CatagorizePosition (playerview_t *pv, float *org) { + //fixme: in nq, we are told by the server and should skip this, which avoids needing to know the player's size. if (cl.spectator) { pv->onground = false; // in air @@ -1056,7 +1057,12 @@ void CL_PredictMovePNum (int seat) cmdto = &cl.outframes[cl.ackedmovesequence & UPDATE_MASK].cmd[seat]; - if (!nopred) + if (nopred) + { //still need the player's size for onground detection and bobbing. + VectorCopy(tostate->szmins, pmove.player_mins); + VectorCopy(tostate->szmaxs, pmove.player_maxs); + } + else { for (i=1 ; imsec = bound(0, msec, 250); -// Con_DPrintf(" extrap %i: %f-%f\n", toframe, fromtime, simtime); +// Con_DPrintf(" extrap %i: %f-%f (%g)\n", toframe, fromtime, simtime, simtime-fromtime); CL_PredictUsercmd (seat, pv->viewentity, fromstate, tostate, cmdto); } } diff --git a/engine/client/cl_screen.c b/engine/client/cl_screen.c index 1bae0555..2685fabf 100644 --- a/engine/client/cl_screen.c +++ b/engine/client/cl_screen.c @@ -404,7 +404,6 @@ void SCR_CenterPrint (int pnum, char *str, qboolean skipgamecode) void SCR_CPrint_f(void) { - char *s = Cmd_Args(); if (Cmd_Argc() == 2) SCR_CenterPrint(0, Cmd_Argv(1), true); else @@ -1031,13 +1030,7 @@ void SCR_CrosshairPosition(playerview_t *pview, float *x, float *y) tr.fraction = 1; cl.worldmodel->funcs.NativeTrace(cl.worldmodel, 0, 0, NULL, start, end, vec3_origin, vec3_origin, MASK_WORLDSOLID, &tr); start[2]-=16; - if (tr.fraction == 1) - { - *x = rect.x + rect.width/2 + cl_crossx.value; - *y = rect.y + rect.height/2 + cl_crossy.value; - return; - } - else + if (tr.fraction != 1) { adj=pview->viewheight; if (v_viewheight.value < -7) @@ -1049,17 +1042,14 @@ void SCR_CrosshairPosition(playerview_t *pview, float *x, float *y) start[2]+=adj; Matrix4x4_CM_Project(tr.endpos, end, pview->simangles, start, r_refdef.fov_x, r_refdef.fov_y); - *x = rect.x+rect.width*end[0]; - *y = rect.y+rect.height*(1-end[1]); + *x = rect.x+rect.width*end[0] + cl_crossx.value; + *y = rect.y+rect.height*(1-end[1]) + cl_crossy.value; return; } } - else - { - *x = rect.x + rect.width/2 + cl_crossx.value; - *y = rect.y + rect.height/2 + cl_crossy.value; - return; - } + + *x = rect.x + rect.width/2 + cl_crossx.value; + *y = rect.y + rect.height/2 + cl_crossy.value; } /* @@ -1594,7 +1584,7 @@ void SCR_DrawLoading (qboolean opaque) { Draw_FunString(x+8, y+8+4, va("%5ukbps %8umb%s remaining (%i files)", (unsigned int)(CL_DownloadRate()/1000.0f), - tsize/(1024*1024), + (unsigned int)(tsize/(1024*1024)), sizeextra?"+":"", fcount)); } @@ -1602,7 +1592,7 @@ void SCR_DrawLoading (qboolean opaque) { Draw_FunString(x+8, y+8+4, va("%5ukbps %8ukb%s remaining (%i files)", (unsigned int)(CL_DownloadRate()/1000.0f), - tsize/1024, + (unsigned int)(tsize/1024), sizeextra?"+":"", fcount)); } @@ -1719,7 +1709,7 @@ void SCR_SetUpToDrawConsole (void) if ((!Key_Dest_Has(~(kdm_console|kdm_game))) && (!cl.sendprespawn && cl.worldmodel && cl.worldmodel->needload)) { //force console to fullscreen if we're loading stuff - Key_Dest_Add(kdm_console); +// Key_Dest_Add(kdm_console); scr_conlines = scr_con_current = vid.height * fullscreenpercent; } else if (!Key_Dest_Has(kdm_menu) && (!Key_Dest_Has(~(kdm_console|kdm_game))) && SCR_GetLoadingStage() == LS_NONE && cls.state < ca_active && !Media_PlayingFullScreen() && !CSQC_UnconnectedOkay(false)) diff --git a/engine/client/client.h b/engine/client/client.h index 69c1ffaa..bea3982e 100644 --- a/engine/client/client.h +++ b/engine/client/client.h @@ -474,7 +474,7 @@ typedef struct qboolean allow_rearview; qboolean allow_skyboxes; qboolean allow_mirrors; - qboolean allow_watervis; + qboolean allow_watervis; //fixme: not checked any more float allow_fbskins; //fraction of allowance qboolean allow_postproc; qboolean allow_cheats; diff --git a/engine/client/in_sdl.c b/engine/client/in_sdl.c index 131c3390..e6759ca6 100644 --- a/engine/client/in_sdl.c +++ b/engine/client/in_sdl.c @@ -65,7 +65,7 @@ static void J_ControllerAdded(int enumid) char *cname; int i; for (i = 0; i < MAX_JOYSTICKS; i++) - if (j_controller[i] == NULL) + if (sdljoy[i].controller == NULL) break; if (i == MAX_JOYSTICKS) return; @@ -233,14 +233,14 @@ static void J_Kill(int jid, qboolean verbose) { for (i = 0; i < 32; i++) J_ControllerButton(jid, i, false); - Con_Printf("Controller unplugged(%i): %s\n", joy - sdljoy, joy->devname); + Con_Printf("Controller unplugged(%i): %s\n", (int)(joy - sdljoy), joy->devname); SDL_GameControllerClose(joy->controller); } else { for (i = 0; i < 32; i++) J_JoystickButton(jid, i, false); - Con_Printf("Joystick unplugged(%i): %s\n", joy - sdljoy, joy->devname); + Con_Printf("Joystick unplugged(%i): %s\n", (int)(joy - sdljoy), joy->devname); SDL_JoystickClose(joy->joystick); } joy->controller = NULL; diff --git a/engine/client/m_items.c b/engine/client/m_items.c index 62411a6f..8fbd7512 100644 --- a/engine/client/m_items.c +++ b/engine/client/m_items.c @@ -1852,10 +1852,11 @@ qboolean MC_Main_Key (int key, menu_t *menu) //here purly to restart demos. if (key == K_ESCAPE) { extern int m_save_demonum; + extern cvar_t cl_demoreel; Key_Dest_Remove(kdm_menu); m_state = m_none; cls.demonum = m_save_demonum; - if (cls.demonum != -1 && !cls.demoplayback && cls.state == ca_disconnected && COM_CheckParm("-demos")) + if (cls.demonum != -1 && !cls.demoplayback && cls.state == ca_disconnected && cl_demoreel.ival) CL_NextDemo (); return true; } diff --git a/engine/client/m_options.c b/engine/client/m_options.c index da7e1c42..d6ccf39d 100644 --- a/engine/client/m_options.c +++ b/engine/client/m_options.c @@ -349,7 +349,7 @@ void M_Menu_Audio_f (void) "6", NULL }; - +#ifdef VOICECHAT static const char *voipcodecoptions[] = { "Speex (ez-compat)", // "Raw (11025)", @@ -379,7 +379,7 @@ void M_Menu_Audio_f (void) "2", NULL }; - +#endif menubulk_t bulk[] = { MB_REDTEXT("Sound Options", false), MB_TEXT("^Ue080^Ue081^Ue081^Ue081^Ue081^Ue081^Ue081^Ue081^Ue081^Ue081^Ue081^Ue081^Ue082", false), @@ -530,51 +530,57 @@ const char *presetname[] = { "286", //everything turned off to make it as fast as possible, even if you're crippled without it "Fast", //typical deathmatch settings. - "Normal", //some extra effects + "Vanilla", //vanilla effects enabled, no content replacement. + "Normal", //content replacement enabled "Nice", //potentially expensive, but not painful "Realtime", //everything on NULL }; -#define PRESET_NUM 5 +#define PRESET_NUM 6 // this is structured like this for a possible future feature // also don't include cvars that need a restart here const char *presetexec[] = { // 286 options (also the first commands to be execed in the chain) - "m_preset_chosen 1;" - "gl_texturemode nn;" - "gl_blendsprites 0;" - "r_particlesystem null;" - "r_particledesc \"\";" - "r_stains 0;" - "r_drawflat 1;" - "r_nolerp 1;" - "r_nolightdir 1;" - "r_dynamic 0;" - "gl_polyblend 0;" - "gl_flashblend 0;" - "gl_specular 0;" - "r_loadlit 0;" - "r_fastsky 1;" - "r_drawflame 0;" - "r_waterstyle 0;" - "r_lavastyle 0;" - "r_coronas 0;" - "r_shadow_realtime_dlight 0;" - "r_shadow_realtime_world 0;" - "r_glsl_offsetmapping 0;" -// "gl_detail 0;" - "gl_load24bit 0;" - "r_replacemodels \"\";" - "r_waterwarp 0;" - "r_lightstylesmooth 0;" - "r_part_density 0.25;" - "cl_nolerp 1;" - "r_lerpmuzzlehack 0;" - "v_gunkick 0;" - "cl_rollangle 0;" - "cl_bob 0;" + "seta m_preset_chosen 1;" + "seta gl_texturemode nn;" + "seta gl_blendsprites 0;" + "seta r_particlesystem null;" + "seta r_particledesc \"\";" + "seta r_part_classic_square 0;" + "seta r_stains 0;" + "seta r_drawflat 1;" + "seta r_nolerp 1;" + "seta r_nolightdir 1;" + "seta r_dynamic 0;" + "seta gl_polyblend 0;" + "seta gl_flashblend 0;" + "seta gl_specular 0;" + "seta r_loadlit 0;" + "seta r_fastsky 1;" + "seta r_drawflame 0;" + "seta r_waterstyle 1;" + "seta r_lavastyle 1;" //defer to water +// "seta r_slimestyle \"\";" //defer to water + "seta r_coronas 0;" + "seta r_shadow_realtime_dlight 0;" + "seta r_shadow_realtime_world 0;" + "seta r_glsl_offsetmapping 0;" +// "seta gl_detail 0;" + "seta gl_load24bit 0;" + "seta r_replacemodels \"\";" + "seta r_waterwarp 0;" + "seta r_lightstylesmooth 0;" + "seta r_part_density 0.25;" + "seta cl_nolerp 1;" + "seta r_lerpmuzzlehack 0;" + "seta v_gunkick 0;" + "seta cl_rollangle 0;" + "seta cl_bob 0;" + "seta cl_sbar 0;" + "seta sv_nqplayerphysics 0;" //server settings in a preset might be bad. + "seta cl_demoreel 0;" , // fast options "gl_texturemode ln;" @@ -589,6 +595,25 @@ const char *presetexec[] = "r_lavastyle 1;" "r_nolightdir 0;" + , //vanilla options. + "r_part_density 1;" + "gl_polyblend 1;" + "r_dynamic 1;" + "gl_flashblend 0;" + "cl_nolerp 0;" + "r_waterwarp 1;" + "r_drawflame 1;" + "v_gunkick 1;" + "cl_rollangle 2.0;" + "cl_bob 0.02;" + //these things are perhaps a little extreme + "gl_texturemode nn;" //yup, we went there. + "r_part_classic_square 1;" //blocky baby! + "cl_sbar 1;" //its a style thing + "sv_nqplayerphysics 1;" //gb wanted this + "cl_demoreel 1;" //yup, arcadey + //"d_mipcap \"0 3\";" //logically correct, but will fuck up on ATI drivers if increased mid-map, because ATI will just ignore any levels that are not currently enabled. + , // normal (faithful) options, but with content replacement thrown in #ifdef MINIMAL "r_particlesystem classic;" @@ -596,20 +621,15 @@ const char *presetexec[] = "r_particlesystem script;" "r_particledesc classic;" #endif - "r_part_density 1;" - "gl_polyblend 1;" - "r_dynamic 1;" - "gl_flashblend 0;" + "r_part_classic_square 0;" "gl_load24bit 1;" "r_replacemodels \"md3 md2\";" - "r_waterwarp 1;" - "r_drawflame 1;" "r_coronas 1;" - "cl_nolerp 0;" "r_lerpmuzzlehack 1;" - "v_gunkick 1;" - "cl_rollangle 2.0;" - "cl_bob 0.02;" + "gl_texturemode ln;" + "cl_sbar 0;" + "sv_nqplayerphysics 0;" + "cl_demoreel 0;" , // nice options "r_stains 0.75;" @@ -663,9 +683,10 @@ void M_Menu_Preset_f (void) { MB_REDTEXT("Please Choose Preset", false), MB_TEXT("^Ue080^Ue081^Ue081^Ue081^Ue081^Ue081^Ue081^Ue081^Ue081^Ue081^Ue081^Ue081^Ue081^Ue081^Ue081^Ue081^Ue082", false), - MB_CONSOLECMD("286 (untextured)", "fps_preset 286;menupop\n", "Lacks textures, particles, pretty much everything."), + MB_CONSOLECMD("simple (untextured)", "fps_preset 286;menupop\n", "Lacks textures, particles, pretty much everything."), MB_CONSOLECMD("fast (deathmatch)", "fps_preset fast;menupop\n", "Fullscreen effects off to give consistant framerates"), - MB_CONSOLECMD("normal (faithful)", "fps_preset normal;menupop\n", "This is for purists!"), + MB_CONSOLECMD("vanilla (softwarey)", "fps_preset vanilla;menupop\n", "This is for purists! Party like its 1995! No sanity spared!"), + MB_CONSOLECMD("normal (faithful)", "fps_preset normal;menupop\n", "An updated but still faithful appearance, using content replacements where applicable"), MB_CONSOLECMD("nice (dynamic)", "fps_preset nice;menupop\n", "For people who like nice things, but still want to actually play"), MB_CONSOLECMD("realtime (all on)", "fps_preset realtime;menupop\n", "For people who value pretty over fast/smooth. Not viable for deathmatch."), MB_END() @@ -2623,7 +2644,7 @@ static void M_ModelViewerDraw(int x, int y, struct menucustom_s *c, struct menu_ galiasbone_t *b = Mod_GetBoneInfo(ent.model, &bonecount); if (b && bonecount) { - Draw_FunString(0, y, va("Bones: ", mods->skingroup, fname)); + Draw_FunString(0, y, va("Bones: ")); y+=8; M_BoneDisplay(&ent, b, &y, 0, -1, 0, bonecount); } diff --git a/engine/client/menu.c b/engine/client/menu.c index a7026a1d..18b3309b 100644 --- a/engine/client/menu.c +++ b/engine/client/menu.c @@ -937,19 +937,19 @@ void M_Menu_Quit_f (void) } else if (!strcmp(arg, "save")) mode = 2; - else if (!strcmp(arg, "prompt")) - { //always prompt, though it might be about saving. - if (Cvar_UnsavedArchive()) - mode = 2; - else - mode = 1; - } else { //prompt to save, but not otherwise. if (Cvar_UnsavedArchive()) mode = 2; else - mode = 0; + { + if (!strcmp(arg, "prompt")) + mode = 1; + else if (!strcmp(arg, "noprompt")) + mode = 1; + else + mode = 0; + } } switch(mode) diff --git a/engine/client/p_classic.c b/engine/client/p_classic.c index b6fa3333..693cdd78 100644 --- a/engine/client/p_classic.c +++ b/engine/client/p_classic.c @@ -264,15 +264,19 @@ static qboolean PClassic_InitParticles (void) "{\n" "program defaultsprite\n" "nomipmaps\n" + "surfaceparm nodlight\n" "{\n" - "map $diffuse\n" + "if r_part_classic_square\n" + "map classicparticle_square\n" + "else\n" + "map classicparticle\n" + "endif\n" "rgbgen vertex\n" "alphagen vertex\n" "blendfunc blend\n" "}\n" "}\n" ); - TEXASSIGN(classicshader->defaulttextures.base, particlecqtexture); return true; } diff --git a/engine/client/pr_clcmd.c b/engine/client/pr_clcmd.c index e06b2f15..16a8f7e4 100644 --- a/engine/client/pr_clcmd.c +++ b/engine/client/pr_clcmd.c @@ -486,9 +486,8 @@ 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; float mode = G_FLOAT(OFS_PARM0); - qboolean fixedmodes = (prinst->callargc >= 2)?!G_FLOAT(OFS_PARM1):false; //if true, we should return sane-sized modes suitable for a window... or the mod could make up its own, but whatever. +// qboolean fixedmodes = (prinst->callargc >= 2)?!G_FLOAT(OFS_PARM1):false; //if true, we should return sane-sized modes suitable for a window... or the mod could make up its own, but whatever. float *ret = G_VECTOR(OFS_RETURN); int w, h; diff --git a/engine/client/pr_csqc.c b/engine/client/pr_csqc.c index d35e0370..3f8e23aa 100644 --- a/engine/client/pr_csqc.c +++ b/engine/client/pr_csqc.c @@ -5943,7 +5943,9 @@ qboolean CSQC_DrawView(void) qboolean CSQC_KeyPress(int key, int unicode, qboolean down, int devid) { void *pr_globals; +#ifdef TEXTEDITOR extern qboolean editormodal; +#endif if (!csqcprogs || !csqcg.input_event) return false; diff --git a/engine/client/render.h b/engine/client/render.h index 1005082f..e8156c60 100644 --- a/engine/client/render.h +++ b/engine/client/render.h @@ -535,6 +535,7 @@ extern cvar_t r_editlights_import_diffuse; extern cvar_t r_editlights_import_specular; extern cvar_t r_mirroralpha; extern cvar_t r_wateralpha; +extern cvar_t r_lavaalpha; extern cvar_t r_waterstyle; extern cvar_t r_slimestyle; extern cvar_t r_lavastyle; diff --git a/engine/client/renderer.c b/engine/client/renderer.c index 0c4cba62..7fa2d749 100644 --- a/engine/client/renderer.c +++ b/engine/client/renderer.c @@ -144,6 +144,8 @@ cvar_t r_walltexture = CVARF ("r_walltexture", "", CVAR_RENDERERCALLBACK|CVAR_SHADERSYSTEM); //FIXME: broken cvar_t r_wateralpha = CVARF ("r_wateralpha", "1", CVAR_ARCHIVE | CVAR_SHADERSYSTEM); +cvar_t r_lavaalpha = CVARF ("r_lavaalpha", "", + CVAR_ARCHIVE | CVAR_SHADERSYSTEM); cvar_t r_waterwarp = CVARF ("r_waterwarp", "1", CVAR_ARCHIVE); @@ -327,7 +329,7 @@ cvar_t gl_texture_anisotropic_filtering = CVARFC("gl_texture_anisotropic_filter CVAR_ARCHIVE | CVAR_RENDERERCALLBACK, GL_Texture_Anisotropic_Filtering_Callback); cvar_t gl_texturemode = CVARFC("gl_texturemode", "GL_LINEAR_MIPMAP_NEAREST", - CVAR_ARCHIVE | CVAR_RENDERERCALLBACK, + CVAR_ARCHIVE | CVAR_RENDERERCALLBACK | CVAR_SAVE, GL_Texturemode_Callback); cvar_t gl_mipcap = CVARFC("d_mipcap", "0 1000", CVAR_ARCHIVE | CVAR_RENDERERCALLBACK, @@ -696,6 +698,7 @@ void Renderer_Init(void) Cvar_Register (&r_fastsky, GRAPHICALNICETIES); Cvar_Register (&r_fastskycolour, GRAPHICALNICETIES); Cvar_Register (&r_wateralpha, GRAPHICALNICETIES); + Cvar_Register (&r_lavaalpha, GRAPHICALNICETIES); Cvar_Register (&gl_shadeq1_name, GLRENDEREROPTIONS); Cvar_Register (&r_clear, GLRENDEREROPTIONS); @@ -2496,10 +2499,17 @@ void R_InitParticleTexture (void) data[y*32+x][3] = 255; } } - particlecqtexture = R_LoadTexture32("classicparticle", 32, 32, data, IF_NOMIPMAP|IF_NOPICMIP); - + //draw a square in the top left. still a triangle. + for (x=0 ; x<16 ; x++) + { + for (y=0 ; y<16 ; y++) + { + data[y*32+x][3] = 255; + } + } + R_LoadTexture32("classicparticle_square", 32, 32, data, IF_NOMIPMAP|IF_NOPICMIP); diff --git a/engine/client/sbar.c b/engine/client/sbar.c index b929d4ce..e355139f 100644 --- a/engine/client/sbar.c +++ b/engine/client/sbar.c @@ -2550,7 +2550,11 @@ void Sbar_Draw (playerview_t *pv) if (pv == cl.playerview) { if (!cls.deathmatch) + { + if (cl_sbar.value) + Sbar_DrawPic (0, 0, 320, 24, sb_scorebar); Sbar_CoopScoreboard (); + } else Sbar_SoloScoreboard (); } diff --git a/engine/client/snd_directx.c b/engine/client/snd_directx.c index bc8955e1..a5903d16 100644 --- a/engine/client/snd_directx.c +++ b/engine/client/snd_directx.c @@ -899,7 +899,6 @@ static int DSOUND_InitCard_Internal (soundcardinfo_t *sc, char *cardname) #ifdef MULTITHREAD -int GetSoundtime(soundcardinfo_t *sc); static int DSOUND_Thread(void *arg) { soundcardinfo_t *sc = arg; diff --git a/engine/client/snd_dma.c b/engine/client/snd_dma.c index b7356bf5..58089c92 100644 --- a/engine/client/snd_dma.c +++ b/engine/client/snd_dma.c @@ -2813,7 +2813,7 @@ static void S_UpdateCard(soundcardinfo_t *sc) S_Update_(sc); } -int GetSoundtime(soundcardinfo_t *sc) +int S_GetMixerTime(soundcardinfo_t *sc) { int samplepos; int fullsamples; @@ -2896,7 +2896,7 @@ static void S_Update_(soundcardinfo_t *sc) int samps; // Updates DMA time - soundtime = GetSoundtime(sc); + soundtime = S_GetMixerTime(sc); if (sc->samplequeue) { diff --git a/engine/client/snd_droid.c b/engine/client/snd_droid.c index 848f1d29..abe510c8 100644 --- a/engine/client/snd_droid.c +++ b/engine/client/snd_droid.c @@ -27,6 +27,7 @@ JNIEXPORT jint JNICALL Java_com_fteqw_FTEDroidEngine_audioinfo(JNIEnv *env, jcla } } +extern int S_GetMixerTime(soundcardinfo_t *sc); //transfer the 'dma' buffer into the buffer it requests, called from a dedicated sound thread created by the java code. JNIEXPORT jint JNICALL Java_com_fteqw_FTEDroidEngine_paintaudio(JNIEnv *env, jclass this, jbyteArray stream, jint len) { @@ -38,7 +39,7 @@ JNIEXPORT jint JNICALL Java_com_fteqw_FTEDroidEngine_paintaudio(JNIEnv *env, jcl { int buffersize = sc->sn.samples*sc->sn.samplebits/8; - int curtime = GetSoundtime(sc); + int curtime = S_GetMixerTime(sc); framesz = sc->sn.numchannels * sc->sn.samplebits/8; S_PaintChannels (sc, curtime + (len / framesz)); diff --git a/engine/client/sys_droid.c b/engine/client/sys_droid.c index 7adac5bb..29b7db2d 100644 --- a/engine/client/sys_droid.c +++ b/engine/client/sys_droid.c @@ -207,8 +207,6 @@ JNIEXPORT void JNICALL Java_com_fteqw_FTEDroidEngine_init(JNIEnv *env, jobject o "", "" }; - char *basepack; - int align; quakeparms_t parms; Sys_Printf("reinit\n"); if (sys_memheap) diff --git a/engine/client/wad.c b/engine/client/wad.c index 892f0517..c8d07f81 100644 --- a/engine/client/wad.c +++ b/engine/client/wad.c @@ -593,22 +593,12 @@ void Mod_ParseInfoFromEntityLump(model_t *wmodel, char *data, char *mapname) //a return; #endif - // this hack is necessary to ensure Quake 2 maps get their - // default skybox + // this hack is necessary to ensure Quake 2 maps get their default skybox, without breaking q1 etc if (wmodel->fromgame == fg_quake2) strcpy(cl.skyname, "unit1_"); else cl.skyname[0] = '\0'; - for (msky = mapskies; msky; msky = msky->next) - { - if (!strcmp(msky->mapname, mapname)) - { - Q_strncpyz(cl.skyname, msky->skyname, sizeof(cl.skyname)); - break; - } - } - if (data) if ((data=COM_Parse(data))) //read the map info. if (com_token[0] == '{') @@ -636,7 +626,7 @@ void Mod_ParseInfoFromEntityLump(model_t *wmodel, char *data, char *mapname) //a { Q_strncpyz(cl.skyname, com_token, sizeof(cl.skyname)); } - else if (!strcmp("fog", key)) + else if (!strcmp("fog", key)) //q1 extension. FIXME: should be made temporary. { int oel = Cmd_ExecLevel; void CL_Fog_f(void); @@ -648,15 +638,20 @@ void Mod_ParseInfoFromEntityLump(model_t *wmodel, char *data, char *mapname) //a CL_Fog_f(); Cmd_ExecLevel=oel; } + else if (!strcmp("wateralpha", key)) //override cvars so mappers don't end up hacking cvars and fucking over configs (at least in other engines). + { + Cvar_LockFromServer(&r_wateralpha, com_token); + Cvar_LockFromServer(&r_waterstyle, "1"); //force vanilla-style water too. + } else if (!strcmp("sky", key)) // for Quake2 maps { Q_strncpyz(cl.skyname, com_token, sizeof(cl.skyname)); } - else if (!strcmp("skyrotate", key)) + else if (!strcmp("skyrotate", key)) //q2 feature { cl.skyrotate = atof(com_token); } - else if (!strcmp("skyaxis", key)) + else if (!strcmp("skyaxis", key)) //q2 feature { char *s; Q_strncpyz(key, com_token, sizeof(key)); @@ -675,6 +670,17 @@ void Mod_ParseInfoFromEntityLump(model_t *wmodel, char *data, char *mapname) //a } } } + + + //map-specific sky override feature + for (msky = mapskies; msky; msky = msky->next) + { + if (!strcmp(msky->mapname, mapname)) + { + Q_strncpyz(cl.skyname, msky->skyname, sizeof(cl.skyname)); + break; + } + } } //textures/fred.wad is the DP standard - I wanna go for that one. diff --git a/engine/common/common.c b/engine/common/common.c index de1cf617..cf05d205 100644 --- a/engine/common/common.c +++ b/engine/common/common.c @@ -2720,7 +2720,13 @@ char *COM_ParseStringSetSep (const char *data, char sep) com_token[len] = 0; return (char*)data; } -void COM_BiDi_Setup(void) +void COM_BiDi_Shutdown(void) +{ + bidi_charcount = 0; + BZ_Free(bidi_chartype); + bidi_chartype = NULL; +} +static void COM_BiDi_Setup(void) { char *file; char *line; @@ -2782,7 +2788,7 @@ void COM_BiDi_Setup(void) //bi-direction text is fun. //the text is specified in input order. the first in the string is the first entered on the keyboard. //this makes switching direction mid-line quite awkward. so lets hope you don't do that too often, mmkay? -void COM_BiDi_Parse(conchar_t *fte_restrict start, size_t length) +static void COM_BiDi_Parse(conchar_t *fte_restrict start, size_t length) { char fl[2048], next, run, prev, para = BIDI_LTR; size_t i, runstart, j, k; diff --git a/engine/common/common.h b/engine/common/common.h index 640bb3a5..f4660c49 100644 --- a/engine/common/common.h +++ b/engine/common/common.h @@ -304,6 +304,8 @@ unsigned int iso88591_encode(char *out, unsigned int unicode, int maxlen, qboole unsigned int qchar_encode(char *out, unsigned int unicode, int maxlen, qboolean markup); unsigned int COM_DeQuake(conchar_t chr); +void COM_BiDi_Shutdown(void); + //small macro to tell COM_ParseFunString (and related functions like con_printf) that the input is a utf-8 string. #define U8(s) "=`u8:"s"`=" diff --git a/engine/common/fs.c b/engine/common/fs.c index ffa67b8c..755e72c9 100644 --- a/engine/common/fs.c +++ b/engine/common/fs.c @@ -2342,7 +2342,7 @@ void COM_Gamedir (const char *dir) /*some modern non-compat settings*/ #define DMFCFG "set com_parseutf8 1\npm_airstep 1\nsv_demoExtensions 1\n" /*set some stuff so our regular qw client appears more like hexen2. sv_mintic is required to 'fix' the ravenstaff so that its projectiles don't impact upon each other*/ -#define HEX2CFG "set com_parseutf8 -1\nset gl_font gfx/hexen2\nset in_builtinkeymap 0\nset_calc cl_playerclass int (random * 5) + 1\nset sv_maxspeed 640\ncl_run 0\nset watervis 1\nset r_lavastyle -2\nset r_wateralpha 0.5\nset sv_pupglow 1\ngl_shaftlight 0.5\nsv_mintic 0.015\nset cl_model_bobbing 1\nsv_sound_land \"fx/thngland.wav\"\n" +#define HEX2CFG "set com_parseutf8 -1\nset gl_font gfx/hexen2\nset in_builtinkeymap 0\nset_calc cl_playerclass int (random * 5) + 1\nset sv_maxspeed 640\ncl_run 0\nset watervis 1\nset r_lavaalpha 1\nset r_lavastyle -2\nset r_wateralpha 0.5\nset sv_pupglow 1\ngl_shaftlight 0.5\nsv_mintic 0.015\nset cl_model_bobbing 1\nsv_sound_land \"fx/thngland.wav\"\n" /*yay q2!*/ #define Q2CFG "com_nogamedirnativecode 0\n" /*Q3's ui doesn't like empty model/headmodel/handicap cvars, even if the gamecode copes*/ diff --git a/engine/common/gl_q2bsp.c b/engine/common/gl_q2bsp.c index f074f53a..1ba4699a 100644 --- a/engine/common/gl_q2bsp.c +++ b/engine/common/gl_q2bsp.c @@ -4934,12 +4934,12 @@ static void CM_ClipBoxToPlanes (vec3_t trmins, vec3_t trmaxs, vec3_t p1, vec3_t // q2cbrushside_t *side, *leadside; static mplane_t bboxplanes[6] = //we change the dist, but nothing else { - {1, 0, 0}, - {0, 1, 0}, - {0, 0, 1}, - {-1, 0, 0}, - {0, -1, 0}, - {0, 0, -1}, + {{1, 0, 0}}, + {{0, 1, 0}}, + {{0, 0, 1}}, + {{-1, 0, 0}}, + {{0, -1, 0}}, + {{0, 0, -1}}, }; float nearfrac=0; diff --git a/engine/common/pr_bgcmd.c b/engine/common/pr_bgcmd.c index 05a03da2..da97e3de 100644 --- a/engine/common/pr_bgcmd.c +++ b/engine/common/pr_bgcmd.c @@ -1437,8 +1437,8 @@ void QCBUILTIN PF_hash_createtab (pubprogfuncs_t *prinst, struct globalvars_s *p { int i; int numbuckets = G_FLOAT(OFS_PARM0); - qboolean dupestrings = (prinst->callargc>1)?G_FLOAT(OFS_PARM1):false; - etype_t type = (prinst->callargc>2)?G_FLOAT(OFS_PARM2):ev_vector; +// qboolean dupestrings = (prinst->callargc>1)?G_FLOAT(OFS_PARM1):false; + etype_t type = (prinst->callargc>1)?G_FLOAT(OFS_PARM1):ev_vector; if (!type) type = ev_vector; if (numbuckets < 4) @@ -1516,7 +1516,7 @@ void QCBUILTIN PF_fopen (pubprogfuncs_t *prinst, struct globalvars_s *pr_globals const char *name = PR_GetStringOfs(prinst, OFS_PARM0); int fmode = G_FLOAT(OFS_PARM1); int fsize = G_FLOAT(OFS_PARM2); - char *fallbackread; + const char *fallbackread; int i; for (i = 0; i < MAX_QC_FILES; i++) @@ -3409,7 +3409,7 @@ void QCBUILTIN PF_buf_loadfile (pubprogfuncs_t *prinst, struct globalvars_s *pr int bufno = G_FLOAT(OFS_PARM1)-BUFSTRBASE; vfsfile_t *file; char line[8192]; - char *fallback; + const char *fallback; G_FLOAT(OFS_RETURN) = 0; diff --git a/engine/common/world.h b/engine/common/world.h index a750e47d..d29216b6 100644 --- a/engine/common/world.h +++ b/engine/common/world.h @@ -152,7 +152,7 @@ struct world_s { void (*Event_Touch)(struct world_s *w, wedict_t *s, wedict_t *o); void (*Event_Think)(struct world_s *w, wedict_t *s); - void (*Event_Sound) (float *origin, wedict_t *entity, int channel, char *sample, int volume, float attenuation, int pitchadj); + void (*Event_Sound) (float *origin, wedict_t *entity, int channel, const char *sample, int volume, float attenuation, int pitchadj); qboolean (*Event_ContentsTransition) (struct world_s *w, wedict_t *ent, int oldwatertype, int newwatertype); model_t *(*Get_CModel)(struct world_s *w, int modelindex); void (*Get_FrameState)(struct world_s *w, wedict_t *s, framestate_t *fstate); diff --git a/engine/dotnet2005/droid.vcproj b/engine/dotnet2005/droid.vcproj index 82135b68..6fa60b3c 100644 --- a/engine/dotnet2005/droid.vcproj +++ b/engine/dotnet2005/droid.vcproj @@ -23,9 +23,9 @@ > = 2) || (!gl_config.gles && gl_config.nofixedfunc)) + ; //doesn't exist in gles2 nor gl3+core contexts + else if (sbits & SBITS_AFFINE) qglHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_FASTEST); else qglHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST); } +#endif } static void BE_SubmitMeshChain(void) @@ -4285,7 +4289,7 @@ static void GLBE_SubmitMeshesSortList(batch_t *sortlist) qglTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); qglTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); } - oldfbo = GLBE_FBO_Update(&shaderstate.fbo_reflectrefrac, true, FBO_TEX_COLOUR|FBO_RB_DEPTH, shaderstate.tex_reflection, r_nulltex, vid.pixelwidth/2, vid.pixelheight/2); + oldfbo = GLBE_FBO_Update(&shaderstate.fbo_reflectrefrac, FBO_RB_DEPTH, &shaderstate.tex_reflection, 1, r_nulltex, vid.pixelwidth/2, vid.pixelheight/2); r_refdef.vrect.x = 0; r_refdef.vrect.y = 0; r_refdef.vrect.width = vid.fbvwidth/2; @@ -4334,11 +4338,11 @@ static void GLBE_SubmitMeshesSortList(batch_t *sortlist) qglTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); qglTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); } - oldfbo = GLBE_FBO_Update(&shaderstate.fbo_reflectrefrac, true, FBO_TEX_COLOUR|FBO_TEX_DEPTH, shaderstate.tex_refraction, shaderstate.tex_refractiondepth, vid.pixelwidth/2, vid.pixelheight/2); + oldfbo = GLBE_FBO_Update(&shaderstate.fbo_reflectrefrac, FBO_TEX_DEPTH, &shaderstate.tex_refraction, 1, shaderstate.tex_refractiondepth, vid.pixelwidth/2, vid.pixelheight/2); } else { - oldfbo = GLBE_FBO_Update(&shaderstate.fbo_reflectrefrac, true, FBO_TEX_COLOUR|FBO_RB_DEPTH, shaderstate.tex_refraction, r_nulltex, vid.pixelwidth/2, vid.pixelheight/2); + oldfbo = GLBE_FBO_Update(&shaderstate.fbo_reflectrefrac, FBO_RB_DEPTH, &shaderstate.tex_refraction, 1, r_nulltex, vid.pixelwidth/2, vid.pixelheight/2); } r_refdef.vrect.x = 0; @@ -4380,7 +4384,7 @@ static void GLBE_SubmitMeshesSortList(batch_t *sortlist) qglTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); qglTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); } - oldfbo = GLBE_FBO_Update(&shaderstate.fbo_reflectrefrac, true, FBO_TEX_COLOUR, shaderstate.tex_ripplemap, r_nulltex, vid.pixelwidth/2, vid.pixelheight/2); + oldfbo = GLBE_FBO_Update(&shaderstate.fbo_reflectrefrac, 0, &shaderstate.tex_ripplemap, 1, r_nulltex, vid.pixelwidth/2, vid.pixelheight/2); r_refdef.vrect.x = 0; r_refdef.vrect.y = 0; r_refdef.vrect.width = vid.fbvwidth/2; @@ -4526,7 +4530,7 @@ void GLBE_RenderToTextureUpdate2d(qboolean destchanged) if (*r_refdef.rt_destcolour[0].texname) { texid_t tex = R2D_RT_GetTexture(r_refdef.rt_destcolour[0].texname, &width, &height); - GLBE_FBO_Update(&shaderstate.fbo_2dfbo, true, FBO_TEX_COLOUR, tex, r_nulltex, width, height); + GLBE_FBO_Update(&shaderstate.fbo_2dfbo, 0, &tex, 1, r_nulltex, width, height); } else GLBE_FBO_Push(NULL); @@ -4589,21 +4593,19 @@ void GLBE_FBO_Destroy(fbostate_t *state) } //state->colour is created if usedepth is set and it doesn't previously exist -int GLBE_FBO_Update(fbostate_t *state, qboolean bind, unsigned int enables, texid_t destcol, texid_t destdepth, int width, int height) +int GLBE_FBO_Update(fbostate_t *state, unsigned int enables, texid_t *destcol, int mrt, texid_t destdepth, int width, int height) { + int i; int old; - if (TEXVALID(destcol)) - { - enables |= FBO_TEX_COLOUR; - enables &= ~FBO_RB_COLOUR; - } if (TEXVALID(destdepth)) { enables |= FBO_TEX_DEPTH; enables &= ~FBO_RB_DEPTH; } + enables |= (mrt<<16); + if ((state->enables ^ enables) & ~FBO_RESET) { GLBE_FBO_Destroy(state); @@ -4638,7 +4640,7 @@ int GLBE_FBO_Update(fbostate_t *state, qboolean bind, unsigned int enables, texi enables |= FBO_RESET; - if (enables & (FBO_TEX_COLOUR|FBO_RB_COLOUR)) + if (mrt) { qglDrawBuffer(GL_COLOR_ATTACHMENT0_EXT); qglReadBuffer(GL_COLOR_ATTACHMENT0_EXT); @@ -4687,8 +4689,8 @@ int GLBE_FBO_Update(fbostate_t *state, qboolean bind, unsigned int enables, texi } } - if (enables & FBO_TEX_COLOUR) - qglFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, GL_TEXTURE_2D, destcol.num, 0); + for (i = 0; i < mrt; i++) + qglFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT+i, GL_TEXTURE_2D, destcol[i].num, 0); return old; } /* @@ -4857,7 +4859,7 @@ void GLBE_DrawLightPrePass(qbyte *vis) } /*set the FB up to draw surface info*/ - oldfbo = GLBE_FBO_Update(&shaderstate.fbo_lprepass, true, FBO_TEX_COLOUR|FBO_RB_DEPTH, shaderstate.tex_normals, r_nulltex, vid.pixelwidth, vid.pixelheight); + oldfbo = GLBE_FBO_Update(&shaderstate.fbo_lprepass, FBO_RB_DEPTH, &shaderstate.tex_normals, 1, r_nulltex, vid.pixelwidth, vid.pixelheight); GL_ForceDepthWritable(); //FIXME: should probably clear colour buffer too. qglClear(GL_DEPTH_BUFFER_BIT); @@ -4873,7 +4875,7 @@ void GLBE_DrawLightPrePass(qbyte *vis) /*reconfigure - now drawing diffuse light info using the previous fb image as a source image*/ GLBE_FBO_Sources(shaderstate.tex_normals, r_nulltex); - GLBE_FBO_Update(&shaderstate.fbo_lprepass, true, FBO_TEX_COLOUR|FBO_RB_DEPTH, shaderstate.tex_diffuse, r_nulltex, vid.pixelwidth, vid.pixelheight); + GLBE_FBO_Update(&shaderstate.fbo_lprepass, FBO_RB_DEPTH, &shaderstate.tex_diffuse, 1, r_nulltex, vid.pixelwidth, vid.pixelheight); BE_SelectMode(BEM_STANDARD); qglClearColor (0,0,0,1); diff --git a/engine/gl/gl_bloom.c b/engine/gl/gl_bloom.c index a6722432..dd140dfd 100644 --- a/engine/gl/gl_bloom.c +++ b/engine/gl/gl_bloom.c @@ -215,7 +215,7 @@ void R_BloomBlend (void) if (i == 0) { /*filter the screen into a downscaled image*/ - oldfbo = GLBE_FBO_Update(&fbo_bloom, true, FBO_TEX_COLOUR, pingtex[0][0], r_nulltex, 0, 0); + oldfbo = GLBE_FBO_Update(&fbo_bloom, 0, &pingtex[0][0], 1, r_nulltex, 0, 0); GLBE_FBO_Sources(scrtex, r_nulltex); qglViewport (0, 0, texwidth[0], texheight[0]); R2D_ScalePic(0, vid.height, vid.width, -(int)vid.height, bloomfilter); @@ -223,7 +223,7 @@ void R_BloomBlend (void) else { /*simple downscale that multiple times*/ - GLBE_FBO_Update(&fbo_bloom, true, FBO_TEX_COLOUR, pingtex[0][i], r_nulltex, 0, 0); + GLBE_FBO_Update(&fbo_bloom, 0, &pingtex[0][i], 1, r_nulltex, 0, 0); GLBE_FBO_Sources(pingtex[0][i-1], r_nulltex); qglViewport (0, 0, texwidth[i], texheight[i]); R2D_ScalePic(0, vid.height, vid.width, -(int)vid.height, bloomrescale); @@ -237,14 +237,14 @@ void R_BloomBlend (void) */ r_worldentity.glowmod[0] = 1.2 / texwidth[i]; r_worldentity.glowmod[1] = 0; - GLBE_FBO_Update(&fbo_bloom, true, FBO_TEX_COLOUR, pingtex[1][i], r_nulltex, 0, 0); + GLBE_FBO_Update(&fbo_bloom, 0, &pingtex[1][i], 1, r_nulltex, 0, 0); GLBE_FBO_Sources(pingtex[0][i], r_nulltex); qglViewport (0, 0, texwidth[i], texheight[i]); R2D_ScalePic(0, vid.height, vid.width, -(int)vid.height, bloomblur); r_worldentity.glowmod[0] = 0; r_worldentity.glowmod[1] = 1.2 / texheight[i]; - GLBE_FBO_Update(&fbo_bloom, true, FBO_TEX_COLOUR, pingtex[0][i], r_nulltex, 0, 0); + GLBE_FBO_Update(&fbo_bloom, 0, &pingtex[0][i], 1, r_nulltex, 0, 0); GLBE_FBO_Sources(pingtex[1][i], r_nulltex); qglViewport (0, 0, texwidth[i], texheight[i]); R2D_ScalePic(0, vid.height, vid.width, -(int)vid.height, bloomblur); diff --git a/engine/gl/gl_rlight.c b/engine/gl/gl_rlight.c index 4000bd37..8ce19291 100644 --- a/engine/gl/gl_rlight.c +++ b/engine/gl/gl_rlight.c @@ -321,8 +321,8 @@ void R_RenderDlights (void) if (l->key == -(r_refdef.playerview->viewentity)) continue; //was a muzzleflash - coronastyle = (l->flags & (LFLAG_NORMALMODE|LFLAG_REALTIMEMODE)); - flashstyle = ((l->flags & LFLAG_FLASHBLEND) && r_flashblend.ival); + coronastyle = (l->flags & (LFLAG_NORMALMODE|LFLAG_REALTIMEMODE)) && r_coronas.value; + flashstyle = ((l->flags & LFLAG_FLASHBLEND) && r_flashblend.value); if (!coronastyle && !flashstyle) continue; diff --git a/engine/gl/gl_rmain.c b/engine/gl/gl_rmain.c index e5c19003..04a2342b 100644 --- a/engine/gl/gl_rmain.c +++ b/engine/gl/gl_rmain.c @@ -1268,11 +1268,11 @@ void GLR_SetupFog (void) static void R_RenderMotionBlur(void) { +#if !defined(ANDROID) && !defined(NACL) int vwidth = 1, vheight = 1; float vs, vt, cs, ct; shader_t *shader; -#if !defined(ANDROID) && !defined(NACL) //figure out the size of our texture. if (r_config.texture_non_power_of_two) { //we can use any size, supposedly @@ -1534,7 +1534,11 @@ void GLR_RenderView (void) for (mrt = 0; mrt < R_MAX_RENDERTARGETS; mrt++) { if (*r_refdef.rt_destcolour[mrt].texname) + { col[mrt] = R2D_RT_GetTexture(r_refdef.rt_destcolour[mrt].texname, &cw, &ch); + if (!TEXVALID(col[mrt])) + break; + } else { col[mrt] = r_nulltex; @@ -1559,13 +1563,11 @@ void GLR_RenderView (void) vid.fbvwidth = vid.fbpwidth = dw; vid.fbvheight = vid.fbpheight = dh; } - if (TEXVALID(col[0])) - flags |= FBO_TEX_COLOUR; if (TEXVALID(depth)) flags |= FBO_TEX_DEPTH; else flags |= FBO_RB_DEPTH; - GLBE_FBO_Update(&fbo_gameview, true, flags, col[0], depth, vid.fbpwidth, vid.fbpheight); + GLBE_FBO_Update(&fbo_gameview, flags, col, mrt, depth, vid.fbpwidth, vid.fbpheight); } else { diff --git a/engine/gl/gl_shader.c b/engine/gl/gl_shader.c index 76610d14..03becef2 100644 --- a/engine/gl/gl_shader.c +++ b/engine/gl/gl_shader.c @@ -878,7 +878,6 @@ static void Shader_EntityMergable ( shader_t *shader, shaderpass_t *pass, char * shader->flags |= SHADER_ENTITY_MERGABLE; } -static void Shader_ProgAutoFields(program_t *prog, char **cvarnames, int *cvartypes); /*program text is already loaded, this function parses the 'header' of it to see which permutations it provides, and how many times we need to recompile it*/ static qboolean Shader_LoadPermutations(char *name, program_t *prog, char *script, int qrtype, int ver, char *blobfilename) { @@ -895,7 +894,7 @@ static qboolean Shader_LoadPermutations(char *name, program_t *prog, char *scrip NULL }; #define MAXMODIFIERS 64 - char *permutationdefines[sizeof(permutationname)/sizeof(permutationname[0]) + MAXMODIFIERS + 1]; + const char *permutationdefines[sizeof(permutationname)/sizeof(permutationname[0]) + MAXMODIFIERS + 1]; unsigned int nopermutation = ~0u; int nummodifiers = 0; int p, n, pn; @@ -1088,22 +1087,22 @@ static qboolean Shader_LoadPermutations(char *name, program_t *prog, char *scrip } for (end = strchr(name, '#'); end && *end; ) { - char *start = end+1; + char *start = end+1, *d; end = strchr(start, '#'); if (!end) end = start + strlen(start); if (nummodifiers < MAXMODIFIERS) { - permutationdefines[nummodifiers] = BZ_Malloc(10 + end - start); - memcpy(permutationdefines[nummodifiers], "#define ", 8); - memcpy(permutationdefines[nummodifiers]+8, start, end - start); - memcpy(permutationdefines[nummodifiers]+8+(end-start), "\n", 2); + permutationdefines[nummodifiers] = d = BZ_Malloc(10 + end - start); + memcpy(d, "#define ", 8); + memcpy(d+8, start, end - start); + memcpy(d+8+(end-start), "\n", 2); - start = strchr(permutationdefines[nummodifiers]+8, '='); + start = strchr(d+8, '='); if (start) *start = ' '; - for (start = permutationdefines[nummodifiers]+8; *start; start++) + for (start = d+8; *start; start++) *start = toupper(*start); nummodifiers++; permutationdefines[nummodifiers] = NULL; @@ -1114,7 +1113,8 @@ static qboolean Shader_LoadPermutations(char *name, program_t *prog, char *scrip { unsigned int next; unsigned int argsz; - char *args, *mp, *mv; + char *args, *mp; + const char *mv; int ml, mi; unsigned int bloblink = 4; @@ -1235,7 +1235,7 @@ static qboolean Shader_LoadPermutations(char *name, program_t *prog, char *scrip } } while(nummodifiers) - Z_Free(permutationdefines[--nummodifiers]); + Z_Free((char*)permutationdefines[--nummodifiers]); if (sh_config.pProgAutoFields) sh_config.pProgAutoFields(prog, cvarnames, cvartypes); @@ -3418,12 +3418,12 @@ void Shader_Programify (shader_t *s) { char *prog = NULL; const char *mask; - enum +/* enum { T_UNKNOWN, T_WALL, T_MODEL - } type = 0; + } type = 0;*/ int i; shaderpass_t *pass, *lightmap = NULL, *modellighting = NULL; for (i = 0; i < s->numpasses; i++) @@ -4177,13 +4177,14 @@ void Shader_DefaultSkybox(const char *shortname, shader_t *s, const void *args) char *Shader_DefaultBSPWater(const char *shortname) { int wstyle; + int islava = !strncmp(shortname, "*lava", 5); - if (r_wateralpha.value == 0) + if (((islava && *r_lavaalpha.string)?r_lavaalpha.value:r_wateralpha.value) <= 0) wstyle = -1; else if (r_fastturb.ival) wstyle = 0; #ifdef GLQUAKE - else if (qrenderer == QR_OPENGL && gl_config.arb_shader_objects && !strncmp(shortname, "*lava", 5) && *r_lavastyle.string) + else if (qrenderer == QR_OPENGL && gl_config.arb_shader_objects && islava && *r_lavastyle.string) wstyle = r_lavastyle.ival; else if (qrenderer == QR_OPENGL && gl_config.arb_shader_objects && !strncmp(shortname, "*slime", 5) && *r_slimestyle.string) wstyle = r_slimestyle.ival; @@ -4231,27 +4232,54 @@ char *Shader_DefaultBSPWater(const char *shortname) ); default: case 1: //vanilla style - return ( - "{\n" - "program defaultwarp\n" + if (islava && *r_lavaalpha.string) + { + return ( "{\n" - "map $diffuse\n" - "tcmod turb 0.02 0.1 0.5 0.1\n" - "if !$#ALPHA\n" - "if r_wateralpha < 1\n" - "alphagen const $r_wateralpha\n" - "blendfunc gl_src_alpha gl_one_minus_src_alpha\n" + "program defaultwarp\n" + "{\n" + "map $diffuse\n" + "tcmod turb 0.02 0.1 0.5 0.1\n" + "if !$#ALPHA\n" + "if r_lavaalpha < 1\n" + "alphagen const $r_lavaalpha\n" + "blendfunc gl_src_alpha gl_one_minus_src_alpha\n" + "endif\n" + "else\n" + "if $#ALPHA < 1\n" + "alphagen const $#ALPHA\n" + "blendfunc gl_src_alpha gl_one_minus_src_alpha\n" + "endif\n" "endif\n" - "else\n" - "if $#ALPHA < 1\n" - "alphagen const $#ALPHA\n" - "blendfunc gl_src_alpha gl_one_minus_src_alpha\n" - "endif\n" - "endif\n" + "}\n" + "surfaceparm nodlight\n" "}\n" - "surfaceparm nodlight\n" - "}\n" - ); + ); + } + else + { + return ( + "{\n" + "program defaultwarp\n" + "{\n" + "map $diffuse\n" + "tcmod turb 0.02 0.1 0.5 0.1\n" + "if !$#ALPHA\n" + "if r_wateralpha < 1\n" + "alphagen const $r_wateralpha\n" + "blendfunc gl_src_alpha gl_one_minus_src_alpha\n" + "endif\n" + "else\n" + "if $#ALPHA < 1\n" + "alphagen const $#ALPHA\n" + "blendfunc gl_src_alpha gl_one_minus_src_alpha\n" + "endif\n" + "endif\n" + "}\n" + "surfaceparm nodlight\n" + "}\n" + ); + } case 2: //refraction of the underwater surface, with a fresnel return ( "{\n" @@ -4518,7 +4546,7 @@ void Shader_DefaultBSPQ1(const char *shortname, shader_t *s, const void *args) Shader_DefaultBSPLM(shortname, s, args); } -void Shader_DefaultBSPVertex(char *shortname, shader_t *s, const void *args) +void Shader_DefaultBSPVertex(const char *shortname, shader_t *s, const void *args) { shaderpass_t *pass; @@ -4555,7 +4583,7 @@ void Shader_DefaultBSPVertex(char *shortname, shader_t *s, const void *args) s->sort = SHADER_SORT_OPAQUE; s->uses = 1; } -void Shader_DefaultBSPFlare(char *shortname, shader_t *s, const void *args) +void Shader_DefaultBSPFlare(const char *shortname, shader_t *s, const void *args) { shaderpass_t *pass; if (Shader_ParseShader("defaultflare", s)) @@ -4586,7 +4614,7 @@ void Shader_DefaultBSPFlare(char *shortname, shader_t *s, const void *args) s->flags |= SHADER_NODRAW; } -void Shader_DefaultSkin(char *shortname, shader_t *s, const void *args) +void Shader_DefaultSkin(const char *shortname, shader_t *s, const void *args) { if (Shader_ParseShader("defaultskin", s)) return; @@ -4657,7 +4685,7 @@ void Shader_DefaultSkinShell(const char *shortname, shader_t *s, const void *arg "}\n" ); } -void Shader_Default2D(char *shortname, shader_t *s, const void *genargs) +void Shader_Default2D(const char *shortname, shader_t *s, const void *genargs) { if (Shader_ParseShader("default2d", s)) return; diff --git a/engine/gl/gl_shadow.c b/engine/gl/gl_shadow.c index 89182021..a872fcd6 100644 --- a/engine/gl/gl_shadow.c +++ b/engine/gl/gl_shadow.c @@ -578,6 +578,9 @@ static struct { int prev; } edge[MAX_MAP_EDGES]; static int firstedge; +//} *edge; +//static int firstedge; +//static int maxedge; static void SHM_RecursiveWorldNodeQ1_r (dlight_t *dl, mnode_t *node) { @@ -1404,6 +1407,11 @@ static struct shadowmesh_s *SHM_BuildShadowMesh(dlight_t *dl, unsigned char *lvi } firstedge=0; +// if (maxedge < cl.worldmodel->numedges) +// { +// maxedge = cl.worldmodel->numedges; +// edge = realloc(edge, sizeof(*edge) * maxedge); +// } if (cl.worldmodel->type == mod_brush) { @@ -3192,7 +3200,7 @@ void Sh_DrawCrepuscularLight(dlight_t *dl, float *colours) BE_Scissor(NULL); - oldfbo = GLBE_FBO_Update(&crepuscular_fbo, true, FBO_TEX_COLOUR, crepuscular_texture_id, r_nulltex, vid.pixelwidth, vid.pixelheight); + oldfbo = GLBE_FBO_Update(&crepuscular_fbo, 0, &crepuscular_texture_id, 1, r_nulltex, vid.pixelwidth, vid.pixelheight); BE_SelectMode(BEM_CREPUSCULAR); BE_SelectDLight(dl, colours, LSHADER_STANDARD); diff --git a/engine/gl/gl_vidcommon.c b/engine/gl/gl_vidcommon.c index d6fe9204..8c35e1ea 100644 --- a/engine/gl/gl_vidcommon.c +++ b/engine/gl/gl_vidcommon.c @@ -1639,7 +1639,7 @@ GLhandleARB GLSlang_CreateProgram(const char *name, int ver, const char **precom GLhandleARB handle; GLhandleARB vs; GLhandleARB fs; - char *nullconstants = NULL; + const char *nullconstants = NULL; if (!gl_config.arb_shader_objects) return 0; @@ -2044,7 +2044,10 @@ void GL_Init(void *(*getglfunction) (char *name)) if (qglDebugMessageControlARB) qglDebugMessageControlARB(0, 0, 0, 0, NULL, true); if (qglDebugMessageCallbackARB) + { qglDebugMessageCallbackARB(myGLDEBUGPROCAMD, NULL); + qglEnable(GL_DEBUG_OUTPUT_SYNCHRONOUS_ARB); + } qglGetError(); /*suck up the invalid operation error for non-debug contexts*/ #endif diff --git a/engine/gl/r_bishaders.h b/engine/gl/r_bishaders.h index cbbe02bb..bfaf36ee 100644 --- a/engine/gl/r_bishaders.h +++ b/engine/gl/r_bishaders.h @@ -601,6 +601,9 @@ YOU SHOULD NOT EDIT THIS FILE BY HAND "gl_Position = skeletaltransform_n(n);\n" "#endif\n" +"float d = dot(n,e_light_dir);\n" +"if (d < 0.0) //vertex shader. this might get ugly, but I don't really want to make it per vertex.\n" +"d = 0.0; //this avoids the dark side going below the ambient level.\n" "light = e_light_ambient + (dot(n,e_light_dir)*e_light_mul);\n" "tc = v_texcoord;\n" "}\n" @@ -1605,7 +1608,7 @@ YOU SHOULD NOT EDIT THIS FILE BY HAND "nst = (1.0 + nst) / 2.0;\n" "vec4 l = texture2D(s_t0, nst)*5.0;\n" "vec4 c = texture2D(s_t1, tc);\n" -"vec3 lmsamp = texture2D(s_t2, lm).rgb*lmscale;\n" +"vec3 lmsamp = texture2D(s_t2, lm).rgb*e_lmscale;\n" "vec3 diff = l.rgb;\n" "vec3 chrom = diff / (0.001 + dot(diff, vec3(0.3, 0.59, 0.11)));\n" "vec3 spec = chrom * l.a;\n" diff --git a/engine/gl/shader.h b/engine/gl/shader.h index 8ee03b1b..fc64259e 100644 --- a/engine/gl/shader.h +++ b/engine/gl/shader.h @@ -29,7 +29,7 @@ lights are then added over the top based upon the diffusemap, bumpmap and specul #ifndef SHADER_H #define SHADER_H -typedef void (shader_gen_t)(char *name, shader_t*, const void *args); +typedef void (shader_gen_t)(const char *name, shader_t*, const void *args); #define SHADER_TMU_MAX 16 #define SHADER_PASS_MAX 8 @@ -608,11 +608,9 @@ typedef struct texid_t colour; unsigned int enables; } fbostate_t; -#define FBO_RB_COLOUR 1 #define FBO_RB_DEPTH 2 #define FBO_RB_STENCIL 4 #define FBO_RESET 8 //resize all renderbuffers / free any that are not active. implied if the sizes differ -#define FBO_TEX_COLOUR 16 //internal #define FBO_TEX_DEPTH 32 //internal #define FBO_TEX_STENCIL 64 //internal @@ -667,7 +665,7 @@ void GLBE_FBO_Sources(texid_t sourcecolour, texid_t sourcedepth); int GLBE_FBO_Push(fbostate_t *state); void GLBE_FBO_Pop(int oldfbo); void GLBE_FBO_Destroy(fbostate_t *state); -int GLBE_FBO_Update(fbostate_t *state, qboolean bind, unsigned int enables, texid_t destcol, texid_t destdepth, int width, int height); +int GLBE_FBO_Update(fbostate_t *state, unsigned int enables, texid_t *destcol, int colourbuffers, texid_t destdepth, int width, int height); #endif #ifdef D3D9QUAKE void D3D9BE_Init(void); diff --git a/engine/nacl/snd_ppapi.c b/engine/nacl/snd_ppapi.c index 8eb3988f..902518ee 100644 --- a/engine/nacl/snd_ppapi.c +++ b/engine/nacl/snd_ppapi.c @@ -10,7 +10,7 @@ extern PP_Instance pp_instance; static PPB_Audio_Callback audio_callback; -extern int GetSoundtime(soundcardinfo_t *sc); +extern int S_GetMixerTime(soundcardinfo_t *sc); static void PPAPI_audio_callback(void *sample_buffer, uint32_t len, void *user_data) { @@ -18,7 +18,7 @@ static void PPAPI_audio_callback(void *sample_buffer, uint32_t len, void *user_d unsigned int framesz; if (sc) { - int curtime = GetSoundtime(sc); + int curtime = S_GetMixerTime(sc); framesz = sc->sn.numchannels * sc->sn.samplebits/8; //might as well dump it directly... diff --git a/engine/qclib/initlib.c b/engine/qclib/initlib.c index cb9d90d5..11e0abcc 100644 --- a/engine/qclib/initlib.c +++ b/engine/qclib/initlib.c @@ -895,7 +895,7 @@ char *PDECL PR_RemoveProgsString (pubprogfuncs_t *ppf, string_t str) return NULL; } -char *ASMCALL PR_StringToNative (pubprogfuncs_t *ppf, string_t str) +const char *ASMCALL PR_StringToNative (pubprogfuncs_t *ppf, string_t str) { progfuncs_t *progfuncs = (progfuncs_t*)ppf; if (((unsigned int)str & STRING_SPECMASK) == STRING_STATIC) diff --git a/engine/qclib/pr_edict.c b/engine/qclib/pr_edict.c index 63e8499e..dc6709bd 100644 --- a/engine/qclib/pr_edict.c +++ b/engine/qclib/pr_edict.c @@ -642,7 +642,7 @@ char *PDECL PR_UglyValueString (pubprogfuncs_t *ppf, etype_t type, eval_t *val) { char *outs = line; int outb = sizeof(line)-2; - char *ins = PR_StringToNative(&progfuncs->funcs, val->string); + const char *ins = PR_StringToNative(&progfuncs->funcs, val->string); //markup the output string. while(*ins && outb > 0) { @@ -2226,7 +2226,7 @@ int PDECL PR_LoadEnts(pubprogfuncs_t *ppf, const char *file, float killonspawnfl if (!resethunk) { - char *eclassname; + const char *eclassname; func_t f; if (!CheckSpawn) CheckSpawn = PR_FindFunc(&progfuncs->funcs, "CheckSpawn", -2); @@ -2327,7 +2327,7 @@ char *PDECL PR_SaveEnt (pubprogfuncs_t *ppf, char *buf, int *size, int maxsize, int *v; unsigned int i;unsigned int j; char *name, *mname; - char *classname = NULL; + const char *classname = NULL; int classnamelen = 0; int type; diff --git a/engine/qclib/pr_exec.c b/engine/qclib/pr_exec.c index 4c44fc39..b663cc02 100644 --- a/engine/qclib/pr_exec.c +++ b/engine/qclib/pr_exec.c @@ -262,7 +262,7 @@ static void PDECL PR_PrintRelevantLocals(progfuncs_t *progfuncs) eval_t *ptr; fdef_t *fdef; fdef_t *cnfd; - char *classname; + const char *classname; if (!ent || !fld) continue; //all this extra code to avoid printing dupes... @@ -1358,7 +1358,6 @@ PR_ExecuteProgram */ static void PR_ExecuteCode (progfuncs_t *progfuncs, int s) { - int swtchtype = 0; //warning about not being initialized before use int runaway; if (prinst.watch_ptr && prinst.watch_ptr->_int != prinst.watch_old._int) diff --git a/engine/qclib/progsint.h b/engine/qclib/progsint.h index 8ac40efd..6358b6d5 100644 --- a/engine/qclib/progsint.h +++ b/engine/qclib/progsint.h @@ -461,6 +461,7 @@ pbool PDECL ED_ParseEval (pubprogfuncs_t *progfuncs, eval_t *eval, int type, con QueryPerformanceFrequency(&li); return li.QuadPart; } + #define Sys_GetClock Sys_GetClock #endif #if 0//!defined(Sys_GetClock) && defined(__unix__) @@ -475,24 +476,16 @@ pbool PDECL ED_ParseEval (pubprogfuncs_t *progfuncs, eval_t *eval, int type, con clock_gettime(CLOCK_PROCESS_CPUTIME_ID, &c); return (c.tv_sec*1000000000ull) + c.tv_nsec; } - static unsigned long long Sys_GetClockRate(void) - { - return 1000000000ull; - } + #define Sys_GetClock Sys_GetClock + #define Sys_GetClockRate() 1000000000ull #endif #endif #endif #if !defined(Sys_GetClock) && defined(__unix__) #include - static unsigned long long Sys_GetClock(void) - { - return clock(); - } - static unsigned long long Sys_GetClockRate(void) - { - return CLOCKS_PER_SEC; - } + #define Sys_GetClock() clock() + #define Sys_GetClockRate() CLOCKS_PER_SEC #endif #ifndef Sys_GetClock @@ -551,7 +544,7 @@ ddef32_t *ED_FindGlobal32 (progfuncs_t *progfuncs, char *name); ddef32_t *ED_GlobalAtOfs32 (progfuncs_t *progfuncs, unsigned int ofs); string_t PDECL PR_StringToProgs (pubprogfuncs_t *inst, const char *str); -char *ASMCALL PR_StringToNative (pubprogfuncs_t *inst, string_t str); +const char *ASMCALL PR_StringToNative (pubprogfuncs_t *inst, string_t str); void PR_FreeTemps (progfuncs_t *progfuncs, int depth); diff --git a/engine/qclib/progslib.h b/engine/qclib/progslib.h index 66172d1f..bfcb3853 100644 --- a/engine/qclib/progslib.h +++ b/engine/qclib/progslib.h @@ -100,7 +100,7 @@ struct pubprogfuncs_s void (PDECL *ED_Print) (pubprogfuncs_t *prinst, struct edict_s *ed); char *(PDECL *save_ents) (pubprogfuncs_t *prinst, char *buf, int *size, int maxsize, int mode); //dump the entire progs info into one big self allocated string - int (PDECL *load_ents) (pubprogfuncs_t *prinst, char *s, float killonspawnflags); //restore the entire progs state (or just add some more ents) (returns edicts ize) + int (PDECL *load_ents) (pubprogfuncs_t *prinst, const char *s, float killonspawnflags); //restore the entire progs state (or just add some more ents) (returns edicts ize) char *(PDECL *saveent) (pubprogfuncs_t *prinst, char *buf, int *size, int maxsize, struct edict_s *ed); //will save just one entities vars struct edict_s *(PDECL *restoreent) (pubprogfuncs_t *prinst, const char *buf, int *size, struct edict_s *ed); //will restore the entity that had it's values saved (can use NULL for ed) diff --git a/engine/qclib/qcc_pr_comp.c b/engine/qclib/qcc_pr_comp.c index e9549943..6c3b8d64 100644 --- a/engine/qclib/qcc_pr_comp.c +++ b/engine/qclib/qcc_pr_comp.c @@ -7467,7 +7467,7 @@ void QCC_PR_ParseStatement (void) int old_numstatements; int numtemp, i; - QCC_statement_t temp[32]; + QCC_statement_t temp[256]; continues = num_continues; breaks = num_breaks; diff --git a/engine/server/pr_q1qvm.c b/engine/server/pr_q1qvm.c index 7f7960a4..a18cda1e 100755 --- a/engine/server/pr_q1qvm.c +++ b/engine/server/pr_q1qvm.c @@ -339,7 +339,7 @@ typedef enum { -static char *q1qvmentstring; +static const char *q1qvmentstring; static vm_t *q1qvm; static pubprogfuncs_t q1qvmprogfuncs; static edict_t *q1qvmedicts[MAX_Q1QVM_EDICTS]; @@ -465,7 +465,7 @@ static edict_t *QDECL Q1QVMPF_EntAlloc(pubprogfuncs_t *pf) return (struct edict_s *)e; } -static int QDECL Q1QVMPF_LoadEnts(pubprogfuncs_t *pf, char *mapstring, float spawnflags) +static int QDECL Q1QVMPF_LoadEnts(pubprogfuncs_t *pf, const char *mapstring, float spawnflags) { q1qvmentstring = mapstring; VM_Call(q1qvm, GAME_LOADENTS); @@ -500,7 +500,7 @@ static string_t QDECL Q1QVMPF_StringToProgs(pubprogfuncs_t *prinst, const char * return ret; } -static char *ASMCALL QDECL Q1QVMPF_StringToNative(pubprogfuncs_t *prinst, string_t str) +static const char *ASMCALL QDECL Q1QVMPF_StringToNative(pubprogfuncs_t *prinst, string_t str) { char *ret = (char*)VM_MemoryBase(q1qvm) + str; if (!ret) //qvms can never return a null. make sure native code can't crash things either. @@ -1534,7 +1534,7 @@ void Q1QVM_ClientConnect(client_t *cl) if (cl->edict->v->netname) { strcpy(cl->namebuf, cl->name); - cl->name = Q1QVMPF_StringToNative(svprogfuncs, cl->edict->v->netname); + cl->name = (char*)Q1QVMPF_StringToNative(svprogfuncs, cl->edict->v->netname); //FIXME: check this pointer strcpy(cl->name, cl->namebuf); } diff --git a/engine/server/savegame.c b/engine/server/savegame.c index 10a464fb..f4c9f944 100644 --- a/engine/server/savegame.c +++ b/engine/server/savegame.c @@ -1158,6 +1158,11 @@ void SV_Loadgame_f (void) SV_Loadgame_Legacy(filename, f, version); return; } +#ifndef SERVERONLY + if (cls.state) + CL_Disconnect_f(); +#endif + gametype = version - FTESAVEGAME_VERSION; VFS_GETS(f, str, sizeof(str)-1); #ifndef SERVERONLY diff --git a/engine/server/sv_ccmds.c b/engine/server/sv_ccmds.c index 169e5eca..d5793e88 100644 --- a/engine/server/sv_ccmds.c +++ b/engine/server/sv_ccmds.c @@ -1090,13 +1090,12 @@ static void SV_FilterIP_f (void) { bannedips_t proto; extern cvar_t filterban; - int arg=2; char *s; if (Cmd_Argc() < 2) { Con_Printf("%s
[flags] [+time] [reason]\n", Cmd_Argv(0)); - Con_Printf("allowed flags: ban,safe,cuff,mute,cripple,deaf,lag,blind,spec. time is in seconds (omitting the plus will be taken to mean unix time).\n", Cmd_Argv(0)); + Con_Printf("allowed flags: ban,safe,cuff,mute,cripple,deaf,lag,blind,spec. time is in seconds (omitting the plus will be taken to mean unix time).\n"); return; } @@ -1178,7 +1177,7 @@ static void SV_BanList_f (void) { *middlebit = 0; if (nb->expiretime) - Q_strncatz(middlebit, va(",\t%+llu", (unsigned long long)nb->expiretime - bantime), sizeof(middlebit)); + Q_strncatz(middlebit, va(",\t+%llu", (unsigned long long)nb->expiretime - bantime), sizeof(middlebit)); if (nb->reason[0]) Q_strncatz(middlebit, ",\t", sizeof(middlebit)); Con_Printf("%s%s%s\n", NET_AdrToStringMasked(adr, sizeof(adr), &nb->adr, &nb->adrmask), middlebit, nb->reason); @@ -1334,7 +1333,7 @@ static void SV_Unfilter_f (void) } static void SV_PenaltyToggle (unsigned int banflag, char *penaltyname) { - char *name = Cmd_Argv(1); + char *clname = Cmd_Argv(1); char *duration = Cmd_Argv(2); char *reason = Cmd_Argv(3); bannedips_t proto; @@ -1356,7 +1355,7 @@ static void SV_PenaltyToggle (unsigned int banflag, char *penaltyname) reason = duration; memset(&proto.adrmask.address, 0xff, sizeof(proto.adrmask.address)); - while((cl = SV_GetClientForString(Cmd_Argv(1), &clnum))) + while((cl = SV_GetClientForString(clname, &clnum))) { found = true; proto.adr = cl->netchan.remote_address; diff --git a/engine/server/sv_main.c b/engine/server/sv_main.c index 63c0aee5..67803934 100644 --- a/engine/server/sv_main.c +++ b/engine/server/sv_main.c @@ -283,6 +283,7 @@ void SV_Shutdown (void) IWebShutdown(); #endif + COM_BiDi_Shutdown(); Memory_DeInit(); } diff --git a/engine/server/sv_send.c b/engine/server/sv_send.c index 6532e373..558ea7f2 100644 --- a/engine/server/sv_send.c +++ b/engine/server/sv_send.c @@ -1157,10 +1157,15 @@ void SVQ1_StartSound (float *origin, wedict_t *wentity, int channel, const char //be warned that it does mean you might be able to hear people triggering stuff on the other side of the map however. channel |= 256; } - else - { + else if (progstype == PROG_QW) + { //quakeworld puts the sound ONLY at the entity's actual origin. this is annoying and stupid. I'm not really sure what to do here. it seems wrong. VectorCopy (entity->v->origin, origin); } + else + { //nq (and presumably h2) always put the sound in the middle of the ent's bbox. this is needed to avoid triggers breaking (like trigger_secret). + for (i=0 ; i<3 ; i++) + origin[i] = entity->v->origin[i]+0.5*(entity->v->mins[i]+entity->v->maxs[i]); + } } SV_StartSound(NUM_FOR_EDICT(svprogfuncs, entity), origin, entity->xv->dimension_seen, channel, sample, volume, attenuation, pitchadj); diff --git a/engine/server/sv_user.c b/engine/server/sv_user.c index 00ae4c95..beafb7d2 100644 --- a/engine/server/sv_user.c +++ b/engine/server/sv_user.c @@ -941,7 +941,7 @@ void SV_SendClientPrespawnInfo(client_t *client) ClientReliableWrite_Byte (client, track); if (!track && *sv.h2miditrack) - SV_StuffcmdToClient(client, va("cd loop \"%s\"\n")); + SV_StuffcmdToClient(client, va("cd loop \"%s\"\n", sv.h2miditrack)); } else if (client->prespawn_idx == 2) { @@ -1999,7 +1999,7 @@ void SV_DarkPlacesDownloadAck(client_t *cl) pos += csize; } - s = va("\ncl_downloadfinished %i %i \"\"\n", host_client->downloadsize, crc); + s = va("\ncl_downloadfinished %u %i \"\"\n", (unsigned int)host_client->downloadsize, crc); ClientReliableWrite_Begin (cl, svc_stufftext, 2+strlen(s)); ClientReliableWrite_String(cl, s); diff --git a/engine/server/svq3_game.c b/engine/server/svq3_game.c index 39f7cb13..a3a52265 100644 --- a/engine/server/svq3_game.c +++ b/engine/server/svq3_game.c @@ -3140,7 +3140,7 @@ void SVQ3_ParseClientMessage(client_t *client) // while(1) { - if(client->state < ca_connected) + if(client->state < cs_connected) return; // parsed command caused client to disconnect if(msg_readcount > net_message.cursize) diff --git a/engine/shaders/glsl/defaultskin.glsl b/engine/shaders/glsl/defaultskin.glsl index 0e78c7f0..3b4b331e 100644 --- a/engine/shaders/glsl/defaultskin.glsl +++ b/engine/shaders/glsl/defaultskin.glsl @@ -43,6 +43,9 @@ void main () gl_Position = skeletaltransform_n(n); #endif + float d = dot(n,e_light_dir); + if (d < 0.0) //vertex shader. this might get ugly, but I don't really want to make it per vertex. + d = 0.0; //this avoids the dark side going below the ambient level. light = e_light_ambient + (dot(n,e_light_dir)*e_light_mul); tc = v_texcoord; } diff --git a/engine/shaders/glsl/lpp_wall.glsl b/engine/shaders/glsl/lpp_wall.glsl index 556ce5eb..d77547c8 100644 --- a/engine/shaders/glsl/lpp_wall.glsl +++ b/engine/shaders/glsl/lpp_wall.glsl @@ -25,7 +25,7 @@ void main () nst = (1.0 + nst) / 2.0; vec4 l = texture2D(s_t0, nst)*5.0; vec4 c = texture2D(s_t1, tc); - vec3 lmsamp = texture2D(s_t2, lm).rgb*lmscale; + vec3 lmsamp = texture2D(s_t2, lm).rgb*e_lmscale; vec3 diff = l.rgb; vec3 chrom = diff / (0.001 + dot(diff, vec3(0.3, 0.59, 0.11))); vec3 spec = chrom * l.a;