From cd4412e807e6de3b170462bc7307dbec5ce6dd61 Mon Sep 17 00:00:00 2001 From: Spoike Date: Fri, 15 Dec 2017 06:56:40 +0000 Subject: [PATCH] add scr_showdisk cvar, to show the disk icon for a little time whenever something is accessed from disk. try to fix the recent network issues, the slightly more sane way. added a r_viewmodel_fov cvar, to optionally control the viewmodel's fov separately from view fov. updatesound now auto-starts the sound if it wasn't already playing, but only if a sound name was specified. small optimisation for xonotic. Delay the actual fopen until the first read. This avoids the worst of the hitches every time a footstep sound is played (no more zlib decompression). r_lightprepass now respects rtlight modes. optimised some rtlight pvs bits. should hopefully be slightly more efficient. git-svn-id: https://svn.code.sf.net/p/fteqw/code/trunk@5186 fc73d0e0-1445-4013-8a0c-d673dee63da5 --- engine/client/cl_input.c | 21 ++++--- engine/client/cl_screen.c | 116 ++++++++++++++++++++----------------- engine/client/r_surf.c | 14 ++--- engine/client/render.h | 4 +- engine/client/renderer.c | 3 + engine/client/screen.h | 1 + engine/client/snd_dma.c | 9 +++ engine/client/view.c | 42 +++++++++++++- engine/common/fs.c | 5 ++ engine/common/fs.h | 1 + engine/common/pr_bgcmd.c | 69 ++++++++++++++++++---- engine/common/pr_common.h | 2 + engine/d3d/d3d11_backend.c | 10 ++-- engine/d3d/d3d8_backend.c | 4 +- engine/d3d/d3d_backend.c | 4 +- engine/d3d/vid_d3d.c | 6 +- engine/d3d/vid_d3d11.c | 8 +-- engine/d3d/vid_d3d8.c | 6 +- engine/gl/gl_backend.c | 26 ++++++--- engine/gl/gl_draw.c | 8 +-- engine/gl/gl_rlight.c | 18 +++++- engine/gl/gl_rmain.c | 35 +++++++---- engine/gl/gl_shadow.c | 42 ++++++++------ engine/server/sv_user.c | 6 +- engine/sw/sw_backend.c | 10 ++-- engine/sw/sw_rast.c | 6 +- engine/vk/vk_backend.c | 11 +++- engine/vk/vk_init.c | 12 ++-- 28 files changed, 336 insertions(+), 163 deletions(-) diff --git a/engine/client/cl_input.c b/engine/client/cl_input.c index 110eb464e..6b6a9c530 100644 --- a/engine/client/cl_input.c +++ b/engine/client/cl_input.c @@ -1720,6 +1720,7 @@ void CL_SendCmd (double frametime, qboolean mainloop) float usetime; //how many msecs we can use for the new frame int msecstouse; //usetime truncated to network precision (how much we'll actually eat) float framemsecs; //how long we're saying the input frame should be (differs from realtime with nq as we want to send frames reguarly, but note this might end up with funny-duration frames). + qboolean xonoticworkaround; clcmdbuf_t *next; @@ -1824,7 +1825,8 @@ void CL_SendCmd (double frametime, qboolean mainloop) buf.data = data; buf.prim = cls.netchan.message.prim; - if (cls.protocol == CP_NETQUAKE && cl.time && !cl.paused) + xonoticworkaround = cls.protocol == CP_NETQUAKE && CPNQ_IS_DP && cl.time && !cl.paused; + if (xonoticworkaround) { if (cl.movesequence_time > cl.time + 0.5) cl.movesequence_time = cl.time + 0.5; //shouldn't really happen @@ -1833,7 +1835,7 @@ void CL_SendCmd (double frametime, qboolean mainloop) framemsecs = (cl.time - cl.movesequence_time)*1000; wantfps = cl_netfps.value; - usetime = CL_FilterTime(framemsecs, wantfps, 1.5, false); + usetime = CL_FilterTime(framemsecs, wantfps, 5, false); if (usetime > 0) { usetime = framemsecs - usetime; @@ -1844,7 +1846,8 @@ void CL_SendCmd (double frametime, qboolean mainloop) usetime = framemsecs - usetime; fullsend = false; } - framemsecs = usetime; + msecstouse = usetime; + framemsecs = msecstouse; msecs = 0; } else @@ -1881,7 +1884,7 @@ void CL_SendCmd (double frametime, qboolean mainloop) if (!runningindepphys && (cl_netfps.value > 0 || !fullsend)) { float spare; - spare = CL_FilterTime(msecs, wantfps, (cls.protocol == CP_NETQUAKE?0:1.5), false); + spare = CL_FilterTime(msecs, wantfps, (/*cls.protocol == CP_NETQUAKE*/0?0:1.5), false); usetime = msecsround + (msecs - spare); msecstouse = (int)usetime; if (!spare) @@ -1914,11 +1917,10 @@ void CL_SendCmd (double frametime, qboolean mainloop) if (usetime <= 0) return; //infinite frame times = weirdness. - cl.movesequence_time = cl.time; framemsecs = msecstouse; if (cls.protocol == CP_NETQUAKE) - framemsecs = 0; + framemsecs = 1000*(cl.time - cl.movesequence_time); } #ifdef HLCLIENT @@ -1956,7 +1958,7 @@ void CL_SendCmd (double frametime, qboolean mainloop) if (fullsend && (cl_pendingcmd[plnum].msec > 12.9 && cl_pendingcmd[plnum].msec < 13) && cls.maxfps == 77) cl_pendingcmd[plnum].msec = 13; } - msecstouse = cl_pendingcmd[0].msec; +// msecstouse = cl_pendingcmd[0].msec; //the main loop isn't allowed to send if (runningindepphys && mainloop) @@ -2030,7 +2032,10 @@ void CL_SendCmd (double frametime, qboolean mainloop) } } - cl.movesequence_time += framemsecs/1000.0; + if (xonoticworkaround) + cl.movesequence_time += msecstouse/1000.0; + else + cl.movesequence_time = cl.time; switch (cls.protocol) { #ifdef NQPROT diff --git a/engine/client/cl_screen.c b/engine/client/cl_screen.c index 0c1207cf4..88af4c786 100644 --- a/engine/client/cl_screen.c +++ b/engine/client/cl_screen.c @@ -206,6 +206,7 @@ extern cvar_t scr_sshot_compression; extern cvar_t crosshair; extern cvar_t scr_consize; cvar_t scr_neticontimeout = CVAR("scr_neticontimeout", "0.3"); +cvar_t scr_diskicontimeout = CVAR("scr_diskicontimeout", "0.3"); qboolean scr_initialized; // ready to draw @@ -223,8 +224,6 @@ qboolean scr_disabled_for_loading; qboolean scr_drawloading; float scr_disabled_time; -float oldsbar = 0; - cvar_t con_stayhidden = CVARFD("con_stayhidden", "0", CVAR_NOTFROMSERVER, "0: allow console to pounce on the user\n1: console stays hidden unless explicitly invoked\n2:toggleconsole command no longer works\n3: shift+escape key no longer works"); cvar_t show_fps = CVARFD("show_fps", "0", CVAR_ARCHIVE, "Displays the current framerate on-screen.\n1: framerate average over a second.\n2: Slowest frame over the last second (the game will play like shit if this is significantly lower than the average).\n3: Shows the rate of the fastest frame (not very useful).\n4: Shows the current frame's timings (this depends upon timer precision).\n5: Display a graph of how long it took to render each frame, large spikes are BAD BAD BAD.\n6: Displays the standard deviation of the frame times, if its greater than 3 then something is probably badly made, or you've a virus scanner running...\n7: Framegraph, for use with slower frames."); cvar_t show_fps_x = CVAR("show_fps_x", "-1"); @@ -238,6 +237,9 @@ cvar_t show_gameclock_y = CVAR("cl_gameclock_y", "-1"); cvar_t show_speed = CVAR("show_speed", "0"); cvar_t show_speed_x = CVAR("show_speed_x", "-1"); cvar_t show_speed_y = CVAR("show_speed_y", "-9"); +cvar_t scr_showdisk = CVAR("scr_showdisk", "0"); +cvar_t scr_showdisk_x = CVAR("scr_showdisk_x", "-24"); +cvar_t scr_showdisk_y = CVAR("scr_showdisk_y", "0"); cvar_t scr_showobituaries = CVAR("scr_showobituaries", "0"); cvar_t scr_loadingrefresh = CVARD("scr_loadingrefresh", "0", "Force redrawing of the loading screen, in order to display EVERY resource that is loaded"); @@ -283,6 +285,10 @@ void CLSCR_Init(void) Cvar_Register(&show_speed_x, cl_screengroup); Cvar_Register(&show_speed_y, cl_screengroup); Cvar_Register(&scr_neticontimeout, cl_screengroup); + Cvar_Register(&scr_showdisk, cl_screengroup); + Cvar_Register(&scr_showdisk_x, cl_screengroup); + Cvar_Register(&scr_showdisk_y, cl_screengroup); + Cvar_Register(&scr_diskicontimeout, cl_screengroup); Cvar_Register(&scr_showobituaries, cl_screengroup); @@ -1536,57 +1542,6 @@ void SCR_SizeDown_f (void) //============================================================================ -/* -============== -SCR_DrawTurtle -============== -*/ -void SCR_DrawTurtle (void) -{ - static int count; - - if (!scr_showturtle.ival || !scr_turtle) - return; - - if (host_frametime <= 1.0/scr_turtlefps.value) - { - count = 0; - return; - } - - count++; - if (count < 3) - return; - - R2D_ScalePic (scr_vrect.x, scr_vrect.y, 64, 64, scr_turtle); -} - -void SCR_DrawDisk (void) -{ -// if (!draw_disc) - return; - -// if (!COM_HasWork()) -// return; - -// R2D_ScalePic (scr_vrect.x + vid.width-24, scr_vrect.y, 24, 24, draw_disc); -} - -/* -============== -SCR_DrawNet -============== -*/ -void SCR_DrawNet (void) -{ - if (realtime - cls.netchan.last_received < scr_neticontimeout.value) - return; - if (cls.demoplayback || !scr_net) - return; - - R2D_ScalePic (scr_vrect.x+64, scr_vrect.y, 64, 64, scr_net); -} - void SCR_StringXY(char *str, float x, float y) { char *s2; @@ -1616,6 +1571,60 @@ void SCR_StringXY(char *str, float x, float y) Font_EndString(font_default); } +/* +============== +SCR_DrawTurtle +============== +*/ +void SCR_DrawTurtle (void) +{ + static int count; + + if (!scr_showturtle.ival || !scr_turtle) + return; + + if (host_frametime <= 1.0/scr_turtlefps.value) + { + count = 0; + return; + } + + count++; + if (count < 3) + return; + + R2D_ScalePic (scr_vrect.x, scr_vrect.y, 64, 64, scr_turtle); +} + +void SCR_DrawDisk (void) +{ + extern float fs_accessed_time; + if ((float)realtime - fs_accessed_time > scr_diskicontimeout.value) + return; + if (!draw_disc || !scr_showdisk.ival) + return; + + if (!R_GetShaderSizes(draw_disc, NULL, NULL, true)) + SCR_StringXY("FS", scr_showdisk_x.value, scr_showdisk_y.value); + else + R2D_ScalePic (scr_showdisk_x.value + (scr_showdisk_x.value<0?vid.width:0), scr_showdisk_y.value + (scr_showdisk_y.value<0?vid.height:0), 24, 24, draw_disc); +} + +/* +============== +SCR_DrawNet +============== +*/ +void SCR_DrawNet (void) +{ + if (realtime - cls.netchan.last_received < scr_neticontimeout.value) + return; + if (cls.demoplayback || !scr_net) + return; + + R2D_ScalePic (scr_vrect.x+64, scr_vrect.y, 64, 64, scr_net); +} + void SCR_DrawFPS (void) { extern cvar_t show_fps; @@ -3322,6 +3331,7 @@ void SCR_DrawTwoDimensional(int uimenu, qboolean nohud) } else if (nohud) { + SCR_DrawDisk(); SCR_DrawFPS (); SCR_CheckDrawCenterString (); } diff --git a/engine/client/r_surf.c b/engine/client/r_surf.c index 5ef661743..587f5de86 100644 --- a/engine/client/r_surf.c +++ b/engine/client/r_surf.c @@ -3817,20 +3817,20 @@ void R_ObliqueNearClip(float *viewmat, mplane_t *wplane) // transform it into camera space by multiplying it // by the inverse of the projection matrix - q[0] = (sgn(vplane[0]) + r_refdef.m_projection[8]) / r_refdef.m_projection[0]; - q[1] = (sgn(vplane[1]) + fabs(r_refdef.m_projection[9])) / fabs(r_refdef.m_projection[5]); + q[0] = (sgn(vplane[0]) + r_refdef.m_projection_std[8]) / r_refdef.m_projection_std[0]; + q[1] = (sgn(vplane[1]) + fabs(r_refdef.m_projection_std[9])) / fabs(r_refdef.m_projection_std[5]); q[2] = -1.0F; - q[3] = (1.0F + r_refdef.m_projection[10]) / r_refdef.m_projection[14]; + q[3] = (1.0F + r_refdef.m_projection_std[10]) / r_refdef.m_projection_std[14]; // Calculate the scaled plane vector f = 2.0F / DotProduct4(vplane, q); Vector4Scale(vplane, f, c); // Replace the third row of the projection matrix - r_refdef.m_projection[2] = c[0]; - r_refdef.m_projection[6] = c[1]; - r_refdef.m_projection[10] = c[2] + 1.0F; - r_refdef.m_projection[14] = c[3]; + r_refdef.m_projection_std[2] = c[0]; + r_refdef.m_projection_std[6] = c[1]; + r_refdef.m_projection_std[10] = c[2] + 1.0F; + r_refdef.m_projection_std[14] = c[3]; } diff --git a/engine/client/render.h b/engine/client/render.h index 7c3330261..8ca16516e 100644 --- a/engine/client/render.h +++ b/engine/client/render.h @@ -260,6 +260,7 @@ typedef struct vec3_t eyeoffset; /*world space, for vr screenies*/ float fov_x, fov_y, afov; + float fovv_x, fovv_y; //viewmodel fovs float mindist, maxdist; //maxdist may be 0, for 'infinite', in which case mindist probably isn't valid either. qboolean drawsbar; @@ -273,7 +274,8 @@ typedef struct float time; // float waterheight; //updated by the renderer. stuff sitting at this height generate ripple effects - float m_projection[16]; + float m_projection_std[16]; //projection matrix for normal stuff + float m_projection_view[16]; //projection matrix for the viewmodel. because people are weird. float m_view[16]; qbyte *scenevis; /*this is the vis that's currently being draw*/ diff --git a/engine/client/renderer.c b/engine/client/renderer.c index 1b90e5fd4..278e6a694 100644 --- a/engine/client/renderer.c +++ b/engine/client/renderer.c @@ -224,6 +224,8 @@ cvar_t scr_conspeed = CVAR ("scr_conspeed", "2000"); // 10 - 170 cvar_t scr_fov = CVARFCD("fov", "90", CVAR_ARCHIVE, SCR_Fov_Callback, "field of vision, 1-170 degrees, standard fov is 90, nquake defaults to 108."); +cvar_t scr_fov_viewmodel = CVARFCD("r_viewmodel_fov", "", CVAR_ARCHIVE, SCR_Fov_Callback, + "field of vision, 1-170 degrees, standard fov is 90, nquake defaults to 108."); cvar_t scr_printspeed = CVAR ("scr_printspeed", "16"); cvar_t scr_showpause = CVAR ("showpause", "1"); cvar_t scr_showturtle = CVAR ("showturtle", "0"); @@ -877,6 +879,7 @@ void Renderer_Init(void) Cvar_Register(&scr_viewsize, SCREENOPTIONS); Cvar_Register(&scr_fov, SCREENOPTIONS); + Cvar_Register(&scr_fov_viewmodel, SCREENOPTIONS); // Cvar_Register(&scr_chatmodecvar, SCREENOPTIONS); Cvar_Register (&scr_sshot_type, SCREENOPTIONS); diff --git a/engine/client/screen.h b/engine/client/screen.h index ba0fb401f..251d49e10 100644 --- a/engine/client/screen.h +++ b/engine/client/screen.h @@ -30,6 +30,7 @@ extern int clearnotify; // set to 0 whenever notify text is drawn extern qboolean scr_disabled_for_loading; extern cvar_t scr_fov; +extern cvar_t scr_fov_viewmodel; extern cvar_t scr_viewsize; qboolean SCR_RSShot (void); diff --git a/engine/client/snd_dma.c b/engine/client/snd_dma.c index 5b08b83a2..2ef2b2269 100644 --- a/engine/client/snd_dma.c +++ b/engine/client/snd_dma.c @@ -2880,6 +2880,7 @@ float S_UpdateSound(int entnum, int entchannel, sfx_t *sfx, vec3_t origin, vec3_ int result = 0; int cards = 0; soundcardinfo_t *sc; + channel_t *chan; if (cls.demoseeking) return result; @@ -2896,6 +2897,14 @@ float S_UpdateSound(int entnum, int entchannel, sfx_t *sfx, vec3_t origin, vec3_ break; } } + + //start it if we couldn't find it. + if (i == sc->total_chans && sfx) + { + chan = SND_PickChannel(sc, entnum, entchannel); + if (chan) + S_UpdateSoundCard(sc, false, chan, entnum, entchannel, sfx, origin, velocity, fvol, attenuation, timeofs, pitchadj, flags); + } } S_UnlockMixer(); if (!cards) diff --git a/engine/client/view.c b/engine/client/view.c index 135bf9ee6..c2d2e1093 100644 --- a/engine/client/view.c +++ b/engine/client/view.c @@ -1199,6 +1199,44 @@ void V_ApplyAFov(playerview_t *pv) r_refdef.fov_x = CalcFov(r_refdef.fov_y, r_refdef.vrect.height, r_refdef.vrect.width*ws); } } + + if (!r_refdef.fovv_x || !r_refdef.fovv_y) + { + extern cvar_t r_stereo_separation; + float ws; + + float afov = scr_fov_viewmodel.value; + if (afov) + { + afov = bound(0.001, afov, 170); + + ws = 1; +#ifdef FTE_TARGET_WEB + if (r_refdef.stereomethod == STEREO_WEBVR) + ws = 0.5; +#endif + if (r_refdef.stereomethod == STEREO_CROSSEYED && r_stereo_separation.value) + ws = 0.5; + + //attempt to retain a classic fov + if (ws*r_refdef.vrect.width < (r_refdef.vrect.height*640)/432) + { + r_refdef.fovv_y = CalcFov(afov, (ws*r_refdef.vrect.width*r_refdef.pxrect.width)/vid.fbvwidth, (r_refdef.vrect.height*r_refdef.pxrect.height)/vid.fbvheight); + r_refdef.fovv_x = afov;//CalcFov(r_refdef.fov_y, 432, 640); + } + else + { + r_refdef.fovv_y = CalcFov(afov, 640, 432); + r_refdef.fovv_x = CalcFov(r_refdef.fovv_y, r_refdef.vrect.height, r_refdef.vrect.width*ws); + } + } + else + { + r_refdef.fovv_x = r_refdef.fov_x; + r_refdef.fovv_y = r_refdef.fov_y; + } + } + if (r_refdef.useperspective) { if (r_refdef.mindist < 1) @@ -1405,6 +1443,8 @@ void V_ClearRefdef(playerview_t *pv) r_refdef.afov = scr_fov.value; //will have a better value applied if fov is bad. this allows setting. r_refdef.fov_x = 0; r_refdef.fov_y = 0; + r_refdef.fovv_x = 0; + r_refdef.fovv_y = 0; r_refdef.drawsbar = cl.intermissionmode == IM_NONE; r_refdef.flags = 0; @@ -1579,8 +1619,6 @@ The player's clipping box goes from (-16 -16 -24) to (16 16 32) from the entity origin, so any view position inside that will be valid ================== */ -extern vrect_t scr_vrect; - qboolean r_secondaryview; #ifdef SIDEVIEWS diff --git a/engine/common/fs.c b/engine/common/fs.c index 3b93f53ee..f69beb632 100644 --- a/engine/common/fs.c +++ b/engine/common/fs.c @@ -21,6 +21,7 @@ qboolean fs_readonly; int waitingformanifest; static unsigned int fs_restarts; void *fs_thread_mutex; +float fs_accessed_time; //timestamp of read (does not include flocates, which should normally happen via a cache). cvar_t com_fs_cache = CVARF("fs_cache", IFMINIMAL("2","1"), CVAR_ARCHIVE); cvar_t fs_noreexec = CVARD("fs_noreexec", "0", "Disables automatic re-execing configs on gamedir switches.\nThis means your cvar defaults etc may be from the wrong mod, and cfg_save will leave that stuff corrupted!"); @@ -1877,6 +1878,8 @@ vfsfile_t *FS_OpenVFS(const char *filename, const char *mode, enum fs_relative r //eventually, this function will be the *ONLY* way to get at files + fs_accessed_time = realtime; + if (relativeto == FS_SYSTEM) return VFSOS_Open(filename, mode); @@ -2135,6 +2138,8 @@ qbyte *COM_LoadFile (const char *path, int usehunk, size_t *filesize) if (loc.len > 0x7fffffff) //don't malloc 5000gb sparse files or anything crazy on a 32bit system... return NULL; + fs_accessed_time = realtime; + f = loc.search->handle->OpenVFS(loc.search->handle, &loc, "rb"); if (!f) return NULL; diff --git a/engine/common/fs.h b/engine/common/fs.h index 19e01decc..1eb591316 100644 --- a/engine/common/fs.h +++ b/engine/common/fs.h @@ -26,6 +26,7 @@ extern int fs_hash_dups; //for tracking efficiency. no functional use. extern int fs_hash_files; //for tracking efficiency. no functional use. extern qboolean fs_readonly; //if true, fopen(, "w") should always fail. extern void *fs_thread_mutex; +extern float fs_accessed_time; struct searchpath_s; struct searchpathfuncs_s diff --git a/engine/common/pr_bgcmd.c b/engine/common/pr_bgcmd.c index 72a439559..50620805e 100644 --- a/engine/common/pr_bgcmd.c +++ b/engine/common/pr_bgcmd.c @@ -1894,6 +1894,7 @@ void pf_hash_purge(void) //restart command was used. revert to the state at the typedef struct { char name[256]; + vfsfile_t *file; char *data; size_t bufferlen; size_t len; @@ -1940,7 +1941,7 @@ void QCBUILTIN PF_fopen (pubprogfuncs_t *prinst, struct globalvars_s *pr_globals Con_DPrintf("qcfopen(\"%s\", %i) called\n", name, fmode); for (i = 0; i < MAX_QC_FILES; i++) - if (!pf_fopen_files[i].data) + if (!pf_fopen_files[i].prinst) break; if (i == MAX_QC_FILES) //too many already open @@ -2000,7 +2001,30 @@ void QCBUILTIN PF_fopen (pubprogfuncs_t *prinst, struct globalvars_s *pr_globals pf_fopen_files[i].prinst = prinst; } break; - case FRIK_FILE_READ: //read + case FRIK_FILE_READ: + case FRIK_FILE_READ_DELAY: + { + pf_fopen_files[i].accessmode = FRIK_FILE_READ_DELAY; + pf_fopen_files[i].file = FS_OpenVFS(pf_fopen_files[i].name, "rb", FS_GAME); + if (!pf_fopen_files[i].file && fallbackread) + { + Q_strncpyz(pf_fopen_files[i].name, fallbackread, sizeof(pf_fopen_files[i].name)); + pf_fopen_files[i].file = FS_OpenVFS(pf_fopen_files[i].name, "rb", FS_GAME); + } + pf_fopen_files[i].ofs = 0; + if (pf_fopen_files[i].file) + { + pf_fopen_files[i].len = VFS_GETLEN(pf_fopen_files[i].file); + + G_FLOAT(OFS_RETURN) = i + FIRST_QC_FILE_INDEX; + pf_fopen_files[i].prinst = prinst; + } + else + G_FLOAT(OFS_RETURN) = -1; + } + break; + +// case FRIK_FILE_READ: //read case FRIK_FILE_READNL: //read whole file fsize = FS_LoadFile(pf_fopen_files[i].name, (void**)&pf_fopen_files[i].data); if (!pf_fopen_files[i].data && fallbackread) @@ -2060,7 +2084,7 @@ void PF_fclose_i (int fnum) return; //out of range } - if (!pf_fopen_files[fnum].data) + if (!pf_fopen_files[fnum].prinst) { Con_Printf("PF_fclose: File is not open\n"); return; //not open @@ -2075,18 +2099,23 @@ void PF_fclose_i (int fnum) pf_fopen_files[fnum].prinst->AddressableFree(pf_fopen_files[fnum].prinst, pf_fopen_files[fnum].data); break; + case FRIK_FILE_READ_DELAY: + VFS_CLOSE(pf_fopen_files[fnum].file); + break; + case FRIK_FILE_READ: - case 4: + case FRIK_FILE_READNL: BZ_Free(pf_fopen_files[fnum].data); break; - case 1: - case 2: + case FRIK_FILE_APPEND: + case FRIK_FILE_WRITE: COM_WriteFile(pf_fopen_files[fnum].name, FS_GAMEONLY, pf_fopen_files[fnum].data, pf_fopen_files[fnum].len); BZ_Free(pf_fopen_files[fnum].data); break; - case 3: + case FRIK_FILE_INVALID: break; } + pf_fopen_files[fnum].file = NULL; pf_fopen_files[fnum].data = NULL; pf_fopen_files[fnum].prinst = NULL; } @@ -2101,6 +2130,12 @@ void QCBUILTIN PF_fclose (pubprogfuncs_t *prinst, struct globalvars_s *pr_global return; //out of range } + if (!pf_fopen_files[fnum].prinst) + { + Con_Printf("PF_fclose: File is not open\n"); + return; //not open + } + if (pf_fopen_files[fnum].prinst != prinst) { PF_Warningf(prinst, "PF_fclose: File is from wrong instance\n"); @@ -2124,7 +2159,7 @@ void QCBUILTIN PF_fgets (pubprogfuncs_t *prinst, struct globalvars_s *pr_globals return; //out of range } - if (!pf_fopen_files[fnum].data) + if (!pf_fopen_files[fnum].prinst) { PR_BIError(prinst, "PF_fgets: File is not open\n"); return; //not open @@ -2136,6 +2171,16 @@ void QCBUILTIN PF_fgets (pubprogfuncs_t *prinst, struct globalvars_s *pr_globals return; //this just isn't ours. } + if (pf_fopen_files[fnum].accessmode == FRIK_FILE_READ_DELAY) + { //on first read, convert into a regular file. + pf_fopen_files[fnum].accessmode = FRIK_FILE_READ; + pf_fopen_files[fnum].data = BZ_Malloc(pf_fopen_files[fnum].len+1); + pf_fopen_files[fnum].data[pf_fopen_files[fnum].len] = 0; + pf_fopen_files[fnum].len = pf_fopen_files[fnum].bufferlen = VFS_READ(pf_fopen_files[fnum].file, pf_fopen_files[fnum].data, pf_fopen_files[fnum].len); + VFS_CLOSE(pf_fopen_files[fnum].file); + pf_fopen_files[fnum].file = NULL; + } + if (pf_fopen_files[fnum].accessmode == FRIK_FILE_MMAP_READ || pf_fopen_files[fnum].accessmode == FRIK_FILE_MMAP_RW) { G_INT(OFS_RETURN) = PR_SetString(prinst, pf_fopen_files[fnum].data); @@ -2232,7 +2277,7 @@ static int PF_fwrite_internal (pubprogfuncs_t *prinst, int fnum, const char *msg return 0; //out of range } - if (!pf_fopen_files[fnum].data) + if (!pf_fopen_files[fnum].prinst) { PF_Warningf(prinst, "PF_fwrite: File is not open\n"); return 0; //not open @@ -2276,7 +2321,7 @@ static int PF_fread_internal (pubprogfuncs_t *prinst, int fnum, char *msg, size_ return 0; //out of range } - if (!pf_fopen_files[fnum].data) + if (!pf_fopen_files[fnum].prinst) { PF_Warningf(prinst, "PF_fread: File is not open\n"); return 0; //not open @@ -2347,7 +2392,7 @@ void QCBUILTIN PF_fseek (pubprogfuncs_t *prinst, struct globalvars_s *pr_globals PF_Warningf(prinst, "PF_fread: File out of range\n"); return; //out of range } - if (!pf_fopen_files[fnum].data) + if (!pf_fopen_files[fnum].prinst) { PF_Warningf(prinst, "PF_fread: File is not open\n"); return; //not open @@ -2373,7 +2418,7 @@ void QCBUILTIN PF_fsize (pubprogfuncs_t *prinst, struct globalvars_s *pr_globals PF_Warningf(prinst, "PF_fsize: File out of range\n"); return; //out of range } - if (!pf_fopen_files[fnum].data) + if (!pf_fopen_files[fnum].prinst) { PF_Warningf(prinst, "PF_fsize: File is not open\n"); return; //not open diff --git a/engine/common/pr_common.h b/engine/common/pr_common.h index 0eee76405..fa1233bcf 100644 --- a/engine/common/pr_common.h +++ b/engine/common/pr_common.h @@ -719,6 +719,8 @@ typedef enum #define FRIK_FILE_MMAP_READ 5 /*fgets returns a pointer. memory is not guarenteed to be released.*/ #define FRIK_FILE_MMAP_RW 6 /*fgets returns a pointer. file is written upon close. memory is not guarenteed to be released.*/ +#define FRIK_FILE_READ_DELAY (7) /*internal special mode where the file is not read until the first read. this avoids extra slowness with xonotic*/ + #define MASK_DELTA 1 #define MASK_STDVIEWMODEL 2 diff --git a/engine/d3d/d3d11_backend.c b/engine/d3d/d3d11_backend.c index 0fd441ed5..a253a06fb 100644 --- a/engine/d3d/d3d11_backend.c +++ b/engine/d3d/d3d11_backend.c @@ -2778,10 +2778,10 @@ void D3D11BE_SetupViewCBuffer(void) //d3d uses 0 to 1 depth. //so we scale the projection matrix by a bias #if 1 - Matrix4_Multiply(projgltod3d, r_refdef.m_projection, cbv->m_projection); + Matrix4_Multiply(projgltod3d, r_refdef.m_projection_std, cbv->m_projection); #else - memcpy(cbv->m_projection, r_refdef.m_projection, sizeof(cbv->m_projection)); - cbv->m_projection[10] = r_refdef.m_projection[10] * 0.5; + memcpy(cbv->m_projection, r_refdef.m_projection_std, sizeof(cbv->m_projection)); + cbv->m_projection[10] = r_refdef.m_projection_std[10] * 0.5; #endif memcpy(cbv->m_view, r_refdef.m_view, sizeof(cbv->m_view)); VectorCopy(r_origin, cbv->v_eyepos); @@ -3403,7 +3403,7 @@ static void R_DrawPortal(batch_t *batch, batch_t **blist) - R_SetFrustum (r_refdef.m_projection, r_refdef.m_view); + R_SetFrustum (r_refdef.m_projection_std, r_refdef.m_view); /*FIXME: we need to borrow pretty much everything about portal positioning from the gl renderer. make it common code or something, because this is horrendous. if (r_refdef.frustum_numplanes < MAXFRUSTUMPLANES) { @@ -3439,7 +3439,7 @@ static void R_DrawPortal(batch_t *batch, batch_t **blist) AngleVectors (r_refdef.viewangles, vpn, vright, vup); VectorCopy (r_refdef.vieworg, r_origin); - R_SetFrustum (r_refdef.m_projection, r_refdef.m_view); + R_SetFrustum (r_refdef.m_projection_std, r_refdef.m_view); shaderstate.curentity = NULL; D3D11BE_SetupViewCBuffer(); diff --git a/engine/d3d/d3d8_backend.c b/engine/d3d/d3d8_backend.c index 7f602b6ac..9a1cb0be2 100644 --- a/engine/d3d/d3d8_backend.c +++ b/engine/d3d/d3d8_backend.c @@ -3121,7 +3121,7 @@ static void R_RenderScene(void) { IDirect3DDevice8_SetTransform(pD3DDev8, D3DTS_PROJECTION, (D3DMATRIX*)d3d_trueprojection); IDirect3DDevice8_SetTransform(pD3DDev8, D3DTS_VIEW, (D3DMATRIX*)r_refdef.m_view); - R_SetFrustum (r_refdef.m_projection, r_refdef.m_view); + R_SetFrustum (r_refdef.m_projection_std, r_refdef.m_view); Surf_DrawWorld(); } @@ -3237,7 +3237,7 @@ static void R_DrawPortal(batch_t *batch, batch_t **blist) IDirect3DDevice8_SetTransform(pD3DDev8, D3DTS_PROJECTION, (D3DMATRIX*)d3d_trueprojection); IDirect3DDevice8_SetTransform(pD3DDev8, D3DTS_VIEW, (D3DMATRIX*)r_refdef.m_view); - R_SetFrustum (r_refdef.m_projection, r_refdef.m_view); + R_SetFrustum (r_refdef.m_projection_std, r_refdef.m_view); } static void BE_SubmitMeshesPortals(batch_t **worldlist, batch_t *dynamiclist) diff --git a/engine/d3d/d3d_backend.c b/engine/d3d/d3d_backend.c index 733fe5666..a075f96d4 100644 --- a/engine/d3d/d3d_backend.c +++ b/engine/d3d/d3d_backend.c @@ -3381,7 +3381,7 @@ static void R_RenderScene(void) { IDirect3DDevice9_SetTransform(pD3DDev9, D3DTS_PROJECTION, (D3DMATRIX*)d3d_trueprojection); IDirect3DDevice9_SetTransform(pD3DDev9, D3DTS_VIEW, (D3DMATRIX*)r_refdef.m_view); - R_SetFrustum (r_refdef.m_projection, r_refdef.m_view); + R_SetFrustum (r_refdef.m_projection_std, r_refdef.m_view); Surf_DrawWorld(); } @@ -3493,7 +3493,7 @@ static void R_DrawPortal(batch_t *batch, batch_t **blist) IDirect3DDevice9_SetTransform(pD3DDev9, D3DTS_PROJECTION, (D3DMATRIX*)d3d_trueprojection); IDirect3DDevice9_SetTransform(pD3DDev9, D3DTS_VIEW, (D3DMATRIX*)r_refdef.m_view); - R_SetFrustum (r_refdef.m_projection, r_refdef.m_view); + R_SetFrustum (r_refdef.m_projection_std, r_refdef.m_view); } static void BE_SubmitMeshesPortals(batch_t **worldlist, batch_t *dynamiclist) diff --git a/engine/d3d/vid_d3d.c b/engine/d3d/vid_d3d.c index 3bcde8cac..3ab178f58 100644 --- a/engine/d3d/vid_d3d.c +++ b/engine/d3d/vid_d3d.c @@ -1249,14 +1249,14 @@ static void D3D9_SetupViewPortProjection(void) /*d3d projection matricies scale depth to 0 to 1*/ Matrix4x4_CM_Projection_Far(d3d_trueprojection, fov_x, fov_y, r_refdef.mindist/2, r_refdef.maxdist); /*ogl projection matricies scale depth to -1 to 1, and I would rather my code used consistant culling*/ - Matrix4x4_CM_Projection_Far(r_refdef.m_projection, fov_x, fov_y, r_refdef.mindist, r_refdef.maxdist); + Matrix4x4_CM_Projection_Far(r_refdef.m_projection_std, fov_x, fov_y, r_refdef.mindist, r_refdef.maxdist); } else { /*d3d projection matricies scale depth to 0 to 1*/ Matrix4x4_CM_Projection_Inf(d3d_trueprojection, fov_x, fov_y, r_refdef.mindist/2); /*ogl projection matricies scale depth to -1 to 1, and I would rather my code used consistant culling*/ - Matrix4x4_CM_Projection_Inf(r_refdef.m_projection, fov_x, fov_y, r_refdef.mindist); + Matrix4x4_CM_Projection_Inf(r_refdef.m_projection_std, fov_x, fov_y, r_refdef.mindist); } d3d9error(IDirect3DDevice9_SetTransform(pD3DDev9, D3DTS_PROJECTION, (D3DMATRIX*)d3d_trueprojection)); @@ -1299,7 +1299,7 @@ static void (D3D9_R_RenderView) (void) // else d3d9error(IDirect3DDevice9_Clear(pD3DDev9, 0, NULL, D3DCLEAR_ZBUFFER, D3DCOLOR_XRGB(0,0,0), 1, 0)); - R_SetFrustum (r_refdef.m_projection, r_refdef.m_view); + R_SetFrustum (r_refdef.m_projection_std, r_refdef.m_view); RQ_BeginFrame(); if (!(r_refdef.flags & RDF_NOWORLDMODEL)) { diff --git a/engine/d3d/vid_d3d11.c b/engine/d3d/vid_d3d11.c index d723f75ff..f9fda45d9 100644 --- a/engine/d3d/vid_d3d11.c +++ b/engine/d3d/vid_d3d11.c @@ -1187,7 +1187,7 @@ void D3D11_Set2D (void) D3D11_VIEWPORT vport; // Matrix4x4_CM_Orthographic(r_refdef.m_projection, 0 + (0.5*vid.width/vid.pixelwidth), vid.width + (0.5*vid.width/vid.pixelwidth), 0 + (0.5*vid.height/vid.pixelheight), vid.height + (0.5*vid.height/vid.pixelheight), 0, 100); - Matrix4x4_CM_Orthographic(r_refdef.m_projection, 0, vid.width, vid.height, 0, 0, 99999); + Matrix4x4_CM_Orthographic(r_refdef.m_projection_std, 0, vid.width, vid.height, 0, 0, 99999); Matrix4x4_Identity(r_refdef.m_view); vport.TopLeftX = 0; @@ -1443,9 +1443,9 @@ static void D3D11_SetupViewPort(void) /*view matrix*/ Matrix4x4_CM_ModelViewMatrixFromAxis(r_refdef.m_view, vpn, vright, vup, r_refdef.vieworg); if (r_refdef.maxdist) - Matrix4x4_CM_Projection_Far(r_refdef.m_projection, fov_x, fov_y, r_refdef.mindist, r_refdef.maxdist); + Matrix4x4_CM_Projection_Far(r_refdef.m_projection_std, fov_x, fov_y, r_refdef.mindist, r_refdef.maxdist); else - Matrix4x4_CM_Projection_Inf(r_refdef.m_projection, fov_x, fov_y, r_refdef.mindist); + Matrix4x4_CM_Projection_Inf(r_refdef.m_projection_std, fov_x, fov_y, r_refdef.mindist); } static void (D3D11_R_RenderView) (void) @@ -1499,7 +1499,7 @@ static void (D3D11_R_RenderView) (void) //fixme: waterwarp fov - R_SetFrustum (r_refdef.m_projection, r_refdef.m_view); + R_SetFrustum (r_refdef.m_projection_std, r_refdef.m_view); RQ_BeginFrame(); // if (!(r_refdef.flags & Q2RDF_NOWORLDMODEL)) // { diff --git a/engine/d3d/vid_d3d8.c b/engine/d3d/vid_d3d8.c index e9d113a71..5bad28af7 100644 --- a/engine/d3d/vid_d3d8.c +++ b/engine/d3d/vid_d3d8.c @@ -1294,14 +1294,14 @@ static void D3D8_SetupViewPortProjection(void) /*d3d projection matricies scale depth to 0 to 1*/ Matrix4x4_CM_Projection_Far(d3d_trueprojection, fov_x, fov_y, r_refdef.mindist/2, r_refdef.maxdist); /*ogl projection matricies scale depth to -1 to 1, and I would rather my code used consistant culling*/ - Matrix4x4_CM_Projection_Far(r_refdef.m_projection, fov_x, fov_y, r_refdef.mindist, r_refdef.maxdist); + Matrix4x4_CM_Projection_Far(r_refdef.m_projection_std, fov_x, fov_y, r_refdef.mindist, r_refdef.maxdist); } else { /*d3d projection matricies scale depth to 0 to 1*/ Matrix4x4_CM_Projection_Inf(d3d_trueprojection, fov_x, fov_y, r_refdef.mindist/2); /*ogl projection matricies scale depth to -1 to 1, and I would rather my code used consistant culling*/ - Matrix4x4_CM_Projection_Inf(r_refdef.m_projection, fov_x, fov_y, r_refdef.mindist); + Matrix4x4_CM_Projection_Inf(r_refdef.m_projection_std, fov_x, fov_y, r_refdef.mindist); } d3d8error(IDirect3DDevice8_SetTransform(pD3DDev8, D3DTS_PROJECTION, (D3DMATRIX*)d3d_trueprojection)); @@ -1337,7 +1337,7 @@ static void (D3D8_R_RenderView) (void) // else d3d8error(IDirect3DDevice8_Clear(pD3DDev8, 0, NULL, D3DCLEAR_ZBUFFER, D3DCOLOR_XRGB(0,0,0), 1, 0)); - R_SetFrustum (r_refdef.m_projection, r_refdef.m_view); + R_SetFrustum (r_refdef.m_projection_std, r_refdef.m_view); RQ_BeginFrame(); if (!(r_refdef.flags & RDF_NOWORLDMODEL)) { diff --git a/engine/gl/gl_backend.c b/engine/gl/gl_backend.c index 2269742b8..1a1db53fd 100644 --- a/engine/gl/gl_backend.c +++ b/engine/gl/gl_backend.c @@ -134,6 +134,7 @@ struct { float modelmatrix[16]; float modelmatrixinv[16]; float modelviewmatrix[16]; + float projectionmatrix[16]; int colourarraytype; vec4_t pendingcolourflat; @@ -919,7 +920,7 @@ void GLBE_RenderShadowBuffer(unsigned int numverts, int vbo, vecV_t *verts, unsi if (shaderstate.allblackshader.glsl.handle != shaderstate.lastuniform && shaderstate.allblack_mvp != -1) { float m16[16]; - Matrix4_Multiply(r_refdef.m_projection, shaderstate.modelviewmatrix, m16); + Matrix4_Multiply(shaderstate.projectionmatrix, shaderstate.modelviewmatrix, m16); qglUniformMatrix4fvARB(shaderstate.allblack_mvp, 1, false, m16); } shaderstate.lastuniform = shaderstate.allblackshader.glsl.handle; @@ -3213,7 +3214,7 @@ static void BE_Program_Set_Attributes(const program_t *prog, unsigned int perm, qglUniformMatrix4fvARB(ph, 1, false, r_refdef.m_view); break; case SP_M_PROJECTION: - qglUniformMatrix4fvARB(ph, 1, false, r_refdef.m_projection); + qglUniformMatrix4fvARB(ph, 1, false, shaderstate.projectionmatrix); break; case SP_M_MODELVIEW: qglUniformMatrix4fvARB(ph, 1, false, shaderstate.modelviewmatrix); @@ -3221,14 +3222,14 @@ static void BE_Program_Set_Attributes(const program_t *prog, unsigned int perm, case SP_M_MODELVIEWPROJECTION: { float m16[16]; - Matrix4_Multiply(r_refdef.m_projection, shaderstate.modelviewmatrix, m16); + Matrix4_Multiply(shaderstate.projectionmatrix, shaderstate.modelviewmatrix, m16); qglUniformMatrix4fvARB(ph, 1, false, m16); } break; case SP_M_INVMODELVIEWPROJECTION: { float m16[16], inv[16]; - Matrix4_Multiply(r_refdef.m_projection, shaderstate.modelviewmatrix, m16); + Matrix4_Multiply(shaderstate.projectionmatrix, shaderstate.modelviewmatrix, m16); Matrix4_Invert(m16, inv); qglUniformMatrix4fvARB(ph, 1, false, inv); } @@ -3247,7 +3248,7 @@ static void BE_Program_Set_Attributes(const program_t *prog, unsigned int perm, case SP_M_INVVIEWPROJECTION: { float m16[16], inv[16]; - Matrix4_Multiply(r_refdef.m_projection, r_refdef.m_view, m16); + Matrix4_Multiply(shaderstate.projectionmatrix, r_refdef.m_view, m16); Matrix4_Invert(m16, inv); qglUniformMatrix4fvARB(ph, 1, false, inv); } @@ -3436,7 +3437,7 @@ static void BE_Program_Set_Attributes(const program_t *prog, unsigned int perm, v[3] = 1; Matrix4x4_CM_Transform4(shaderstate.modelviewmatrix, v, tempv); - Matrix4x4_CM_Transform4(r_refdef.m_projection, tempv, v); + Matrix4x4_CM_Transform4(shaderstate.projectionmatrix, tempv, v); v[3] *= 2; v[0] = (v[0]/v[3]) + 0.5; @@ -3822,6 +3823,17 @@ void GLBE_SelectEntity(entity_t *ent) nd = 1; if (shaderstate.depthrange != nd) { + if (nd < 1) + memcpy(shaderstate.projectionmatrix, r_refdef.m_projection_view, sizeof(shaderstate.projectionmatrix)); + else + memcpy(shaderstate.projectionmatrix, r_refdef.m_projection_std, sizeof(shaderstate.projectionmatrix)); + if (qglLoadMatrixf) + { + qglMatrixMode(GL_PROJECTION); + qglLoadMatrixf(shaderstate.projectionmatrix); + qglMatrixMode(GL_MODELVIEW); + } + shaderstate.depthrange = nd; if (qglDepthRange) qglDepthRange (gldepthmin, gldepthmin + shaderstate.depthrange*(gldepthmax-gldepthmin)); @@ -4313,7 +4325,7 @@ static void DrawMeshes(void) if (shaderstate.allblackshader.glsl.handle != shaderstate.lastuniform && shaderstate.allblack_mvp != -1) { float m16[16]; - Matrix4_Multiply(r_refdef.m_projection, shaderstate.modelviewmatrix, m16); + Matrix4_Multiply(shaderstate.projectionmatrix, shaderstate.modelviewmatrix, m16); qglUniformMatrix4fvARB(shaderstate.allblack_mvp, 1, false, m16); } BE_SubmitMeshChain(shaderstate.allblackshader.glsl.usetesselation); diff --git a/engine/gl/gl_draw.c b/engine/gl/gl_draw.c index 51511b3bb..49a3dae17 100644 --- a/engine/gl/gl_draw.c +++ b/engine/gl/gl_draw.c @@ -186,7 +186,7 @@ void GL_Set2D (qboolean flipped) w = fabs(cos(rad)) * (vid.width) + fabs(sin(rad)) * (vid.height); h = fabs(sin(rad)) * (vid.width) + fabs(cos(rad)) * (vid.height); - Matrix4x4_CM_Orthographic(r_refdef.m_projection, w/-2.0f, w/2.0f, h/2.0f, h/-2.0f, -99999, 99999); + Matrix4x4_CM_Orthographic(r_refdef.m_projection_std, w/-2.0f, w/2.0f, h/2.0f, h/-2.0f, -99999, 99999); Matrix4x4_Identity(tmp); Matrix4_Multiply(Matrix4x4_CM_NewTranslation((vid.width/-2.0f), (vid.height/-2.0f), 0), tmp, tmp2); @@ -197,9 +197,9 @@ void GL_Set2D (qboolean flipped) w = vid.fbvwidth; h = vid.fbvheight; if (flipped) - Matrix4x4_CM_Orthographic(r_refdef.m_projection, 0, w, 0, h, -99999, 99999); + Matrix4x4_CM_Orthographic(r_refdef.m_projection_std, 0, w, 0, h, -99999, 99999); else - Matrix4x4_CM_Orthographic(r_refdef.m_projection, 0, w, h, 0, -99999, 99999); + Matrix4x4_CM_Orthographic(r_refdef.m_projection_std, 0, w, h, 0, -99999, 99999); Matrix4x4_Identity(r_refdef.m_view); } //current physical position on the current render target. @@ -215,7 +215,7 @@ void GL_Set2D (qboolean flipped) if (qglLoadMatrixf) { qglMatrixMode(GL_PROJECTION); - qglLoadMatrixf(r_refdef.m_projection); + qglLoadMatrixf(r_refdef.m_projection_std); qglMatrixMode(GL_MODELVIEW); qglLoadMatrixf(r_refdef.m_view); diff --git a/engine/gl/gl_rlight.c b/engine/gl/gl_rlight.c index 87623e72a..132aa1c9b 100644 --- a/engine/gl/gl_rlight.c +++ b/engine/gl/gl_rlight.c @@ -439,7 +439,7 @@ void R_RenderDlights (void) v[2] = l->origin[2]; v[3] = 1; - Matrix4_Multiply(r_refdef.m_projection, r_refdef.m_view, mvp); + Matrix4_Multiply(r_refdef.m_projection_std, r_refdef.m_view, mvp); Matrix4x4_CM_Transform4(mvp, v, tempv); tempv[0] /= tempv[3]; @@ -596,9 +596,20 @@ void R_GenDlightBatches(batch_t *batches[]) dlight_t *l; batch_t *b; int lmode; + unsigned modes; + extern cvar_t r_shadow_realtime_dlight; + extern cvar_t r_shadow_realtime_world; if (!r_lightprepass) return; + if (r_shadow_realtime_dlight.ival) + modes |= LFLAG_NORMALMODE; + if (r_shadow_realtime_world.ival) + modes |= LFLAG_REALTIMEMODE; + if (!modes) + return; + + if (!deferredlight_shader[0]) { const char *deferredlight_shader_code = @@ -626,6 +637,9 @@ void R_GenDlightBatches(batch_t *batches[]) if (!l->radius) continue; + if (!(modes & l->flags)) + continue; + if (R_CullSphere(l->origin, l->radius)) { RQuantAdd(RQUANT_RTLIGHT_CULL_FRUSTUM, 1); @@ -658,7 +672,7 @@ void R_GenDlightBatches(batch_t *batches[]) b->lightmap[j] = -1; b->surf_first = i; b->surf_count = lmode; - b->flags |= BEF_NOSHADOWS; + b->flags |= BEF_NOSHADOWS|BEF_NODLIGHT; //that would be weeird b->vbo = NULL; b->next = batches[sort]; batches[sort] = b; diff --git a/engine/gl/gl_rmain.c b/engine/gl/gl_rmain.c index 304855565..f0974beb6 100644 --- a/engine/gl/gl_rmain.c +++ b/engine/gl/gl_rmain.c @@ -424,6 +424,7 @@ void R_SetupGL (float stereooffset, int i) vec3_t newa; float fov_x, fov_y; + float fovv_x, fovv_y; if (!r_refdef.recurse) { @@ -524,19 +525,25 @@ void R_SetupGL (float stereooffset, int i) r_refdef.pxrect.height = h; r_refdef.pxrect.maxheight = vid.fbpheight; } - fov_x = r_refdef.fov_x;//+sin(cl.time)*5; - fov_y = r_refdef.fov_y;//-sin(cl.time+1)*5; + fov_x = r_refdef.fov_x; + fov_y = r_refdef.fov_y; + fovv_x = r_refdef.fovv_x; + fovv_y = r_refdef.fovv_y; if ((*r_refdef.rt_destcolour[0].texname || *r_refdef.rt_depth.texname) && strcmp(r_refdef.rt_destcolour[0].texname, "megascreeny")) { r_refdef.pxrect.y = r_refdef.pxrect.maxheight - (r_refdef.pxrect.height+r_refdef.pxrect.y); fov_y *= -1; + fovv_y *= -1; r_refdef.flipcull ^= SHADER_CULL_FLIP; } else if ((r_refdef.flags & RDF_UNDERWATER) && !(r_refdef.flags & RDF_WATERWARP)) { fov_x *= 1 + (((sin(cl.time * 4.7) + 1) * 0.015) * r_waterwarp.value); fov_y *= 1 + (((sin(cl.time * 3.0) + 1) * 0.015) * r_waterwarp.value); + + fovv_x *= 1 + (((sin(cl.time * 4.7) + 1) * 0.015) * r_waterwarp.value); + fovv_y *= 1 + (((sin(cl.time * 3.0) + 1) * 0.015) * r_waterwarp.value); } GL_ViewportUpdate(); @@ -545,7 +552,8 @@ void R_SetupGL (float stereooffset, int i) if (r_refdef.stereomethod == STEREO_WEBVR) { float vm[16], em[16]; - emscriptenfte_getvreyedata(i, r_refdef.m_projection, em); + emscriptenfte_getvreyedata(i, r_refdef.m_projection_std, em); + memcpy(r_refdef.m_projection_view, r_refdef.m_projection_std, sizeof(r_refdef.m_projection_view)); Matrix4x4_Identity(em); Matrix4x4_CM_ModelViewMatrixFromAxis(vm, vpn, vright, vup, r_origin); @@ -568,16 +576,19 @@ void R_SetupGL (float stereooffset, int i) // yfov = 2*atan((float)r_refdef.vrect.height/r_refdef.vrect.width)*(scr_fov.value*2)/M_PI; // MYgluPerspective (yfov, screenaspect, 4, 4096); - Matrix4x4_CM_Projection_Far(r_refdef.m_projection, fov_x, fov_y, r_refdef.mindist, r_refdef.maxdist); + Matrix4x4_CM_Projection_Far(r_refdef.m_projection_std, fov_x, fov_y, r_refdef.mindist, r_refdef.maxdist); + Matrix4x4_CM_Projection_Far(r_refdef.m_projection_view, fovv_x, fovv_y, r_refdef.mindist, r_refdef.maxdist); } else { - Matrix4x4_CM_Projection_Inf(r_refdef.m_projection, fov_x, fov_y, r_refdef.mindist); + Matrix4x4_CM_Projection_Inf(r_refdef.m_projection_std, fov_x, fov_y, r_refdef.mindist); + Matrix4x4_CM_Projection_Inf(r_refdef.m_projection_view, fovv_x, fovv_y, r_refdef.mindist); } } else { - Matrix4x4_CM_Orthographic(r_refdef.m_projection, -fov_x/2, fov_x/2, -fov_y/2, fov_y/2, r_refdef.mindist, r_refdef.maxdist?r_refdef.maxdist:9999); + Matrix4x4_CM_Orthographic(r_refdef.m_projection_std, -fov_x/2, fov_x/2, -fov_y/2, fov_y/2, r_refdef.mindist, r_refdef.maxdist?r_refdef.maxdist:9999); + memcpy(r_refdef.m_projection_view, r_refdef.m_projection_std, sizeof(r_refdef.m_projection_view)); } Matrix4x4_CM_ModelViewMatrixFromAxis(r_refdef.m_view, vpn, vright, vup, r_origin); @@ -587,7 +598,7 @@ void R_SetupGL (float stereooffset, int i) if (qglLoadMatrixf) { qglMatrixMode(GL_PROJECTION); - qglLoadMatrixf(r_refdef.m_projection); + qglLoadMatrixf(r_refdef.m_projection_std); qglMatrixMode(GL_MODELVIEW); qglLoadMatrixf(r_refdef.m_view); @@ -739,7 +750,7 @@ void R_RenderScene (void) TRACE(("dbg: calling R_SetFrustrum\n")); if (!r_refdef.recurse) - R_SetFrustum (r_refdef.m_projection, r_refdef.m_view); + R_SetFrustum (r_refdef.m_projection_std, r_refdef.m_view); RQ_BeginFrame(); @@ -1203,7 +1214,7 @@ void GLR_DrawPortal(batch_t *batch, batch_t **blist, batch_t *depthmasklist[2], qglEnable(GL_CLIP_PLANE0); } */ //fixme: we can probably scissor a smaller frusum - R_SetFrustum (r_refdef.m_projection, vmat); + R_SetFrustum (r_refdef.m_projection_std, vmat); if (r_refdef.frustum_numplanes < MAXFRUSTUMPLANES) { extern int SignbitsForPlane (mplane_t *out); @@ -1237,7 +1248,7 @@ void GLR_DrawPortal(batch_t *batch, batch_t **blist, batch_t *depthmasklist[2], if (qglLoadMatrixf) { qglMatrixMode(GL_PROJECTION); - qglLoadMatrixf(r_refdef.m_projection); + qglLoadMatrixf(r_refdef.m_projection_std); qglMatrixMode(GL_MODELVIEW); } //portals to mask are relative to the old view still. @@ -1278,7 +1289,7 @@ void GLR_DrawPortal(batch_t *batch, batch_t **blist, batch_t *depthmasklist[2], r_refdef.flipcull |= SHADER_CULL_FLIP; else r_refdef.flipcull &= ~SHADER_CULL_FLIP; - if (r_refdef.m_projection[5]<0) + if (r_refdef.m_projection_std[5]<0) r_refdef.flipcull ^= SHADER_CULL_FLIP; Surf_SetupFrame(); @@ -1310,7 +1321,7 @@ void GLR_DrawPortal(batch_t *batch, batch_t **blist, batch_t *depthmasklist[2], { /*put GL back the way it was*/ qglMatrixMode(GL_PROJECTION); - qglLoadMatrixf(r_refdef.m_projection); + qglLoadMatrixf(r_refdef.m_projection_std); qglMatrixMode(GL_MODELVIEW); } GLBE_SelectEntity(&r_worldentity); diff --git a/engine/gl/gl_shadow.c b/engine/gl/gl_shadow.c index e09d9e3b0..daac2f02c 100644 --- a/engine/gl/gl_shadow.c +++ b/engine/gl/gl_shadow.c @@ -1430,16 +1430,16 @@ static struct shadowmesh_s *SHM_BuildShadowMesh(dlight_t *dl, unsigned char *lvi if (!lvis) { int clus; -// if ((type == SMT_SHADOWLESS || dl->lightcolourscales[0]) && cl.worldmodel->funcs.ClustersInSphere) + if ((type == SMT_SHADOWLESS || dl->lightcolourscales[0]) && cl.worldmodel->funcs.ClustersInSphere) //shadowless lights don't cast shadows, so they're seen through everything - their vis must reflect that. -// lvis = cl.worldmodel->funcs.ClustersInSphere(cl.worldmodel, dl->origin, dl->radius, &lvisb, NULL); -// else + lvis = cl.worldmodel->funcs.ClustersInSphere(cl.worldmodel, dl->origin, dl->radius, &lvisb, NULL); + else { clus = cl.worldmodel->funcs.ClusterForPoint(cl.worldmodel, dl->origin); lvis = cl.worldmodel->funcs.ClusterPVS(cl.worldmodel, clus, &lvisb, PVM_FAST); -// if (cl.worldmodel->funcs.ClustersInSphere) -// lvis = cl.worldmodel->funcs.ClustersInSphere(cl.worldmodel, dl->origin, dl->radius, &lvisb2, lvis); + if (cl.worldmodel->funcs.ClustersInSphere) + lvis = cl.worldmodel->funcs.ClustersInSphere(cl.worldmodel, dl->origin, dl->radius, &lvisb2, lvis); } } @@ -1814,7 +1814,7 @@ static qboolean Sh_ScissorForBox(vec3_t mins, vec3_t maxs, srect_t *r) { vert[i][3] = 1; Matrix4x4_CM_Transform4(r_refdef.m_view, vert[i], tv); - Matrix4x4_CM_Transform4(r_refdef.m_projection, tv, v); + Matrix4x4_CM_Transform4(r_refdef.m_projection_std, tv, v); x = v[0] / v[3]; y = v[1] / v[3]; @@ -2401,12 +2401,12 @@ qboolean Sh_GenShadowMap (dlight_t *l, vec3_t axis[3], qbyte *lvis, int smsize) if (!sidevisible) return false; - memcpy(oproj, r_refdef.m_projection, sizeof(oproj)); + memcpy(oproj, r_refdef.m_projection_std, sizeof(oproj)); memcpy(oview, r_refdef.m_view, sizeof(oview)); oprect = r_refdef.pxrect; smesh = SHM_BuildShadowMesh(l, lvis, SMT_SHADOWMAP); - Matrix4x4_CM_Projection_Far(r_refdef.m_projection, l->fov?l->fov:90, l->fov?l->fov:90, r_shadow_shadowmapping_nearclip.value, l->radius); + Matrix4x4_CM_Projection_Far(r_refdef.m_projection_std, l->fov?l->fov:90, l->fov?l->fov:90, r_shadow_shadowmapping_nearclip.value, l->radius); switch(qrenderer) { @@ -2474,7 +2474,7 @@ qboolean Sh_GenShadowMap (dlight_t *l, vec3_t axis[3], qbyte *lvis, int smsize) if (!gl_config.nofixedfunc) { qglMatrixMode(GL_PROJECTION); - qglLoadMatrixf(r_refdef.m_projection); + qglLoadMatrixf(r_refdef.m_projection_std); qglMatrixMode(GL_MODELVIEW); } break; @@ -2504,18 +2504,18 @@ qboolean Sh_GenShadowMap (dlight_t *l, vec3_t axis[3], qbyte *lvis, int smsize) if (sidevisible & (1u<funcs.ClusterForPoint(cl.worldmodel, l->origin); lvis = cl.worldmodel->funcs.ClusterPVS(cl.worldmodel, clus, &lvisb, PVM_FAST); //FIXME: surely we can use the phs for this? -// if (cl.worldmodel->funcs.ClustersInSphere) -// lvis = cl.worldmodel->funcs.ClustersInSphere(cl.worldmodel, l->origin, l->radius, &lvisb2, lvis); + if (cl.worldmodel->funcs.ClustersInSphere) + lvis = cl.worldmodel->funcs.ClustersInSphere(cl.worldmodel, l->origin, l->radius, &lvisb2, lvis); if (!Sh_VisOverlaps(lvis, vvis)) //The two viewing areas do not intersect. { @@ -3544,8 +3544,16 @@ void Sh_PreGenerateLights(void) else shadowtype = SMT_STENCILVOLUME; - leaf = cl.worldmodel->funcs.ClusterForPoint(cl.worldmodel, dl->origin); - lvis = cl.worldmodel->funcs.ClusterPVS(cl.worldmodel, leaf, &lvisb, PVM_FAST); + //shadowless and lights with an ambient term pass through walls, so need to affect EVERY leaf withing the sphere. + if (shadowtype == SMT_SHADOWLESS || dl->lightcolourscales[0]) + lvis = cl.worldmodel->funcs.ClustersInSphere(cl.worldmodel, dl->origin, dl->radius, &lvisb2, NULL); + else + { //other lights only want to use the source leaf's pvs (clamped by the sphere) + leaf = cl.worldmodel->funcs.ClusterForPoint(cl.worldmodel, dl->origin); + lvis = cl.worldmodel->funcs.ClusterPVS(cl.worldmodel, leaf, &lvisb, PVM_FAST); + if (cl.worldmodel->funcs.ClustersInSphere) + lvis = cl.worldmodel->funcs.ClustersInSphere(cl.worldmodel, dl->origin, dl->radius, &lvisb2, lvis); + } SHM_BuildShadowMesh(dl, lvis, shadowtype); continue; diff --git a/engine/server/sv_user.c b/engine/server/sv_user.c index 159389b54..8d5ebf415 100644 --- a/engine/server/sv_user.c +++ b/engine/server/sv_user.c @@ -8089,7 +8089,7 @@ void SVNQ_ReadClientMove (usercmd_t *move) move->fservertime = cltime; move->servertime = move->fservertime*1000; - frame->ping_time = sv.time - cltime; + frame->ping_time = sv.time - cltime; if (frame->ping_time*1000 > sv_minping.value+1) @@ -8331,7 +8331,9 @@ void SVNQ_ExecuteClientMessage (client_t *cl) if (cl->delta_sequence == -1 && cl->pendingdeltabits) cl->pendingdeltabits[0] = UF_REMOVE; SV_AckEntityFrame(cl, cl->delta_sequence); - cl->frameunion.frames[cl->delta_sequence&UPDATE_MASK].ping_time = realtime - cl->frameunion.frames[cl->delta_sequence&UPDATE_MASK].senttime; +// if (cl->frameunion.frames[cl->delta_sequence&UPDATE_MASK].sequence == cl->delta_sequence) +// if (cl->frameunion.frames[cl->delta_sequence&UPDATE_MASK].ping_time < 0) +// cl->frameunion.frames[cl->delta_sequence&UPDATE_MASK].ping_time = realtime - cl->frameunion.frames[cl->delta_sequence&UPDATE_MASK].senttime; break; case clcdp_ackdownloaddata: SV_DarkPlacesDownloadAck(cl); diff --git a/engine/sw/sw_backend.c b/engine/sw/sw_backend.c index c613c2aeb..838c939cb 100644 --- a/engine/sw/sw_backend.c +++ b/engine/sw/sw_backend.c @@ -590,7 +590,7 @@ void SWBE_Set2D(void) w = fabs(cos(rad)) * (vid.width) + fabs(sin(rad)) * (vid.height); h = fabs(sin(rad)) * (vid.width) + fabs(cos(rad)) * (vid.height); - Matrix4x4_CM_Orthographic(r_refdef.m_projection, w/-2.0f, w/2.0f, h/2.0f, h/-2.0f, -99999, 99999); + Matrix4x4_CM_Orthographic(r_refdef.m_projection_std, w/-2.0f, w/2.0f, h/2.0f, h/-2.0f, -99999, 99999); Matrix4x4_Identity(tmp); Matrix4_Multiply(Matrix4x4_CM_NewTranslation((vid.width/-2.0f), (vid.height/-2.0f), 0), tmp, tmp2); @@ -599,13 +599,13 @@ void SWBE_Set2D(void) else { if (0) - Matrix4x4_CM_Orthographic(r_refdef.m_projection, 0, vid.width, 0, vid.height, 0, 99999); + Matrix4x4_CM_Orthographic(r_refdef.m_projection_std, 0, vid.width, 0, vid.height, 0, 99999); else - Matrix4x4_CM_Orthographic(r_refdef.m_projection, 0, vid.width, vid.height, 0, 0, 99999); + Matrix4x4_CM_Orthographic(r_refdef.m_projection_std, 0, vid.width, vid.height, 0, 0, 99999); Matrix4x4_Identity(r_refdef.m_view); } - memcpy(shaderstate.m_mvp, r_refdef.m_projection, sizeof(shaderstate.m_mvp)); + memcpy(shaderstate.m_mvp, r_refdef.m_projection_std, sizeof(shaderstate.m_mvp)); shaderstate.viewplane[0] = -r_refdef.m_view[0*4+2]; shaderstate.viewplane[1] = -r_refdef.m_view[1*4+2]; @@ -830,7 +830,7 @@ void SWBE_SelectEntity(struct entity_s *ent) shaderstate.curentity = ent; SWR_RotateForEntity(modelmatrix, modelviewmatrix, shaderstate.curentity, shaderstate.curentity->model); - Matrix4_Multiply(r_refdef.m_projection, modelviewmatrix, shaderstate.m_mvp); + Matrix4_Multiply(r_refdef.m_projection_std, modelviewmatrix, shaderstate.m_mvp); shaderstate.viewplane[0] = vpn[0];//-modelviewmatrix[0];//0*4+2]; shaderstate.viewplane[1] = vpn[1];//-modelviewmatrix[1];//1*4+2]; shaderstate.viewplane[2] = vpn[2];//-modelviewmatrix[2];//2*4+2]; diff --git a/engine/sw/sw_rast.c b/engine/sw/sw_rast.c index 4c02c2b16..d0ccb0c48 100644 --- a/engine/sw/sw_rast.c +++ b/engine/sw/sw_rast.c @@ -930,16 +930,16 @@ void SW_R_RenderView(void) AngleVectors (r_refdef.viewangles, vpn, vright, vup); VectorCopy (r_refdef.vieworg, r_origin); if (r_refdef.useperspective) - Matrix4x4_CM_Projection_Inf(r_refdef.m_projection, r_refdef.fov_x, r_refdef.fov_y, r_refdef.mindist); + Matrix4x4_CM_Projection_Inf(r_refdef.m_projection_std, r_refdef.fov_x, r_refdef.fov_y, r_refdef.mindist); else - Matrix4x4_CM_Orthographic(r_refdef.m_projection, -r_refdef.fov_x/2, r_refdef.fov_x/2, -r_refdef.fov_y/2, r_refdef.fov_y/2, r_refdef.mindist, r_refdef.maxdist>=1?r_refdef.maxdist:9999); + Matrix4x4_CM_Orthographic(r_refdef.m_projection_std, -r_refdef.fov_x/2, r_refdef.fov_x/2, -r_refdef.fov_y/2, r_refdef.fov_y/2, r_refdef.mindist, r_refdef.maxdist>=1?r_refdef.maxdist:9999); VectorCopy(r_refdef.viewangles, newa); newa[0] = r_refdef.viewangles[0]; newa[1] = r_refdef.viewangles[1]; newa[2] = r_refdef.viewangles[2] + gl_screenangle.value; Matrix4x4_CM_ModelViewMatrix(r_refdef.m_view, newa, r_refdef.vieworg); - R_SetFrustum (r_refdef.m_projection, r_refdef.m_view); + R_SetFrustum (r_refdef.m_projection_std, r_refdef.m_view); RQ_BeginFrame(); diff --git a/engine/vk/vk_backend.c b/engine/vk/vk_backend.c index 581aa44ba..3354d1c12 100644 --- a/engine/vk/vk_backend.c +++ b/engine/vk/vk_backend.c @@ -4223,6 +4223,7 @@ static void BE_RotateForEntity (const entity_t *e, const model_t *mod) float ndr; float modelmatrix[16]; float *m = modelmatrix; + float *proj; vkcbuf_entity_t *cbe = VKBE_AllocateBufferSpace(DB_UBO, (sizeof(*cbe) + 0x0ff) & ~0xff, &shaderstate.ubo_entity.buffer, &shaderstate.ubo_entity.offset); shaderstate.ubo_entity.range = sizeof(*cbe); @@ -4234,6 +4235,8 @@ static void BE_RotateForEntity (const entity_t *e, const model_t *mod) float em[16]; float vm[16]; + proj = r_refdef.m_projection_view; + if (e->flags & RF_WEAPONMODELNOBOB) { vm[0] = vpn[0]; @@ -4303,6 +4306,8 @@ static void BE_RotateForEntity (const entity_t *e, const model_t *mod) } else { + proj = r_refdef.m_projection_std; + m[0] = e->axis[0][0]; m[1] = e->axis[0][1]; m[2] = e->axis[0][2]; @@ -4387,7 +4392,7 @@ static void BE_RotateForEntity (const entity_t *e, const model_t *mod) { float modelview[16]; Matrix4_Multiply(r_refdef.m_view, m, modelview); - Matrix4_Multiply(r_refdef.m_projection, modelview, cbe->m_modelviewproj); + Matrix4_Multiply(proj, modelview, cbe->m_modelviewproj); } memcpy(cbe->m_model, m, sizeof(cbe->m_model)); Matrix4_Invert(modelmatrix, cbe->m_modelinv); @@ -5548,7 +5553,7 @@ static void R_DrawPortal(batch_t *batch, batch_t **blist, batch_t *depthmasklist qglEnable(GL_CLIP_PLANE0); } */ //fixme: we can probably scissor a smaller frusum - R_SetFrustum (r_refdef.m_projection, vmat); + R_SetFrustum (r_refdef.m_projection_std, vmat); if (r_refdef.frustum_numplanes < MAXFRUSTUMPLANES) { extern int SignbitsForPlane (mplane_t *out); @@ -5621,7 +5626,7 @@ static void R_DrawPortal(batch_t *batch, batch_t **blist, batch_t *depthmasklist r_refdef.flipcull |= SHADER_CULL_FLIP; else r_refdef.flipcull &= ~SHADER_CULL_FLIP; - if (r_refdef.m_projection[5]<0) + if (r_refdef.m_projection_std[5]<0) r_refdef.flipcull ^= SHADER_CULL_FLIP; VKBE_SelectEntity(&r_worldentity); diff --git a/engine/vk/vk_init.c b/engine/vk/vk_init.c index 3ce67c815..a2f29b851 100644 --- a/engine/vk/vk_init.c +++ b/engine/vk/vk_init.c @@ -1557,9 +1557,9 @@ void VK_SetupViewPortProjection(qboolean flipy) r_refdef.flipcull = 0; } if (r_refdef.maxdist) - Matrix4x4_CM_Projection_Far(r_refdef.m_projection, fov_x, fov_y, r_refdef.mindist, r_refdef.maxdist); + Matrix4x4_CM_Projection_Far(r_refdef.m_projection_std, fov_x, fov_y, r_refdef.mindist, r_refdef.maxdist); else - Matrix4x4_CM_Projection_Inf(r_refdef.m_projection, fov_x, fov_y, r_refdef.mindist); + Matrix4x4_CM_Projection_Inf(r_refdef.m_projection_std, fov_x, fov_y, r_refdef.mindist); } void VK_Set2D(void) @@ -1628,9 +1628,9 @@ void VK_Set2D(void) VKBE_Set2D(true); if (0) - Matrix4x4_CM_Orthographic(r_refdef.m_projection, 0, vid.fbvwidth, 0, vid.fbvheight, -99999, 99999); + Matrix4x4_CM_Orthographic(r_refdef.m_projection_std, 0, vid.fbvwidth, 0, vid.fbvheight, -99999, 99999); else - Matrix4x4_CM_Orthographic(r_refdef.m_projection, 0, vid.fbvwidth, vid.fbvheight, 0, -99999, 99999); + Matrix4x4_CM_Orthographic(r_refdef.m_projection_std, 0, vid.fbvwidth, vid.fbvheight, 0, -99999, 99999); Matrix4x4_Identity(r_refdef.m_view); BE_SelectEntity(&r_worldentity); @@ -1984,7 +1984,7 @@ static qboolean VK_R_RenderScene_Cubemap(struct vk_rendertarg *fb) VKBE_SelectEntity(&r_worldentity); - R_SetFrustum (r_refdef.m_projection, r_refdef.m_view); + R_SetFrustum (r_refdef.m_projection_std, r_refdef.m_view); RQ_BeginFrame(); if (!(r_refdef.flags & RDF_NOWORLDMODEL)) { @@ -2206,7 +2206,7 @@ void VK_R_RenderView (void) VKBE_SelectEntity(&r_worldentity); - R_SetFrustum (r_refdef.m_projection, r_refdef.m_view); + R_SetFrustum (r_refdef.m_projection_std, r_refdef.m_view); RQ_BeginFrame(); if (!(r_refdef.flags & RDF_NOWORLDMODEL)) {