From 35774d4f13f6ed095ee3f3d082a06ce8c5b029e7 Mon Sep 17 00:00:00 2001 From: TehRealSalt Date: Mon, 4 Jun 2018 16:30:16 -0400 Subject: [PATCH] Revert "Merge branch 'master' into sonicitems" This reverts commit 4c0f64ff4fce179bd0315acb9d52e3b9ab52b986, reversing changes made to eaaf708381c15753f655982edaa485f6e6c64d6c. --- src/console.c | 7 +- src/d_clisrv.c | 43 +- src/d_main.c | 19 +- src/d_netcmd.c | 28 +- src/d_netfil.c | 38 +- src/dehacked.c | 11 + src/f_finale.c | 18 +- src/g_game.c | 23 +- src/g_input.c | 40 +- src/g_input.h | 1 - src/hardware/hw_defs.h | 9 +- src/hardware/hw_draw.c | 290 ++------- src/hardware/hw_drv.h | 2 - src/hardware/hw_glob.h | 2 +- src/hardware/hw_main.c | 974 +++++++++++++++---------------- src/hardware/r_opengl/r_opengl.c | 256 +++----- src/lua_script.c | 31 +- src/m_menu.c | 66 +-- src/m_misc.c | 26 +- src/p_setup.c | 13 +- src/r_things.h | 2 +- src/sdl/hwsym_sdl.c | 1 - src/sdl/i_system.c | 28 +- src/sdl/i_video.c | 1 - src/sdl/ogl_sdl.c | 7 +- src/sdl/sdl_sound.c | 9 + src/sdl12/hwsym_sdl.c | 1 - src/sdl12/i_video.c | 1 - src/v_video.c | 8 + src/win32/win_dll.c | 2 - 30 files changed, 714 insertions(+), 1243 deletions(-) diff --git a/src/console.c b/src/console.c index c0f12055..5a7605d0 100644 --- a/src/console.c +++ b/src/console.c @@ -836,9 +836,8 @@ boolean CON_Responder(event_t *ev) return true; } - // ...why shouldn't it eat the key? if it doesn't, it just means you - // can control Sonic from the console, which is silly - return true; //return false; + // don't eat the key + return false; } // command completion forward (tab) and backward (shift-tab) @@ -1037,7 +1036,7 @@ boolean CON_Responder(event_t *ev) // enter a char into the command prompt if (key < 32 || key > 127) - return true; // even if key can't be printed, eat it anyway + return false; // add key to cmd line here if (key >= 'A' && key <= 'Z' && !shiftdown) //this is only really necessary for dedicated servers diff --git a/src/d_clisrv.c b/src/d_clisrv.c index 9190853e..9485e910 100644 --- a/src/d_clisrv.c +++ b/src/d_clisrv.c @@ -1214,37 +1214,22 @@ static inline void CL_DrawConnectionStatus(void) if (lastfilenum != -1) { INT32 dldlength; - static char tempname[28]; - fileneeded_t *file = &fileneeded[lastfilenum]; - char *filename = file->filename; + static char tempname[32]; Net_GetNetStat(); - dldlength = (INT32)((file->currentsize/(double)file->totalsize) * 256); + dldlength = (INT32)((fileneeded[lastfilenum].currentsize/(double)fileneeded[lastfilenum].totalsize) * 256); if (dldlength > 256) dldlength = 256; V_DrawFill(BASEVIDWIDTH/2-128, BASEVIDHEIGHT-24, 256, 8, 175); V_DrawFill(BASEVIDWIDTH/2-128, BASEVIDHEIGHT-24, dldlength, 8, 160); memset(tempname, 0, sizeof(tempname)); - // offset filename to just the name only part - filename += strlen(filename) - nameonlylength(filename); - - if (strlen(filename) > sizeof(tempname)-1) // too long to display fully - { - size_t endhalfpos = strlen(filename)-10; - // display as first 14 chars + ... + last 10 chars - // which should add up to 27 if our math(s) is correct - snprintf(tempname, sizeof(tempname), "%.14s...%.10s", filename, filename+endhalfpos); - } - else // we can copy the whole thing in safely - { - strncpy(tempname, filename, sizeof(tempname)-1); - } + nameonly(strncpy(tempname, fileneeded[lastfilenum].filename, 31)); V_DrawCenteredString(BASEVIDWIDTH/2, BASEVIDHEIGHT-24-32, V_YELLOWMAP, va(M_GetText("Downloading \"%s\""), tempname)); V_DrawString(BASEVIDWIDTH/2-128, BASEVIDHEIGHT-24, V_20TRANS|V_MONOSPACE, - va(" %4uK/%4uK",fileneeded[lastfilenum].currentsize>>10,file->totalsize>>10)); + va(" %4uK/%4uK",fileneeded[lastfilenum].currentsize>>10,fileneeded[lastfilenum].totalsize>>10)); V_DrawRightAlignedString(BASEVIDWIDTH/2+128, BASEVIDHEIGHT-24, V_20TRANS|V_MONOSPACE, va("%3.1fK/s ", ((double)getbps)/1024)); } @@ -2309,7 +2294,7 @@ static void Command_connect(void) // Assume we connect directly. boolean viams = false; - if (COM_Argc() < 2 || *COM_Argv(1) == 0) + if (COM_Argc() < 2) { CONS_Printf(M_GetText( "Connect (port): connect to a server\n" @@ -4163,8 +4148,7 @@ FILESTAMP INT32 k = *txtpak++; // playernum const size_t txtsize = txtpak[0]+1; - if (i >= gametic) // Don't copy old net commands - M_Memcpy(D_GetTextcmd(i, k), txtpak, txtsize); + M_Memcpy(D_GetTextcmd(i, k), txtpak, txtsize); txtpak += txtsize; } } @@ -4666,7 +4650,6 @@ static void Local_Maketic(INT32 realtics) void SV_SpawnPlayer(INT32 playernum, INT32 x, INT32 y, angle_t angle) { tic_t tic; - UINT8 numadjust = 0; (void)x; (void)y; @@ -4676,21 +4659,7 @@ void SV_SpawnPlayer(INT32 playernum, INT32 x, INT32 y, angle_t angle) // spawning, but will be applied afterwards. for (tic = server ? maketic : (neededtic - 1); tic >= gametic; tic--) - { - if (numadjust++ == BACKUPTICS) - { - DEBFILE(va("SV_SpawnPlayer: All netcmds for player %d adjusted!\n", playernum)); - // We already adjusted them all, waste of time doing the same thing over and over - // This shouldn't happen normally though, either gametic was 0 (which is handled now anyway) - // or maketic >= gametic + BACKUPTICS - // -- Monster Iestyn 16/01/18 - break; - } netcmds[tic%BACKUPTICS][playernum].angleturn = (INT16)((angle>>16) | TICCMD_RECEIVED); - - if (!tic) // failsafe for gametic == 0 -- Monster Iestyn 16/01/18 - break; - } } // create missed tic diff --git a/src/d_main.c b/src/d_main.c index c0de6133..8548ac49 100644 --- a/src/d_main.c +++ b/src/d_main.c @@ -1168,7 +1168,7 @@ void D_SRB2Main(void) // add any files specified on the command line with -file wadfile // to the wad list - if (!(M_CheckParm("-connect") && !M_CheckParm("-server"))) + if (!(M_CheckParm("-connect"))) { if (M_CheckParm("-file")) { @@ -1325,16 +1325,8 @@ void D_SRB2Main(void) CONS_Printf("R_Init(): Init SRB2 refresh daemon.\n"); R_Init(); - // setting up sound - if (dedicated) - { - nosound = true; - nomidimusic = nodigimusic = true; - } - else - { - CONS_Printf("S_Init(): Setting up sound.\n"); - } + // setting up sound + CONS_Printf("S_Init(): Setting up sound.\n"); if (M_CheckParm("-nosound")) nosound = true; if (M_CheckParm("-nomusic")) // combines -nomidimusic and -nodigmusic @@ -1433,7 +1425,7 @@ void D_SRB2Main(void) ultimatemode = true; }*/ - if (autostart || netgame) + if (autostart || netgame || M_CheckParm("+connect") || M_CheckParm("-connect")) { gameaction = ga_nothing; @@ -1471,7 +1463,8 @@ void D_SRB2Main(void) } } - if (server && !M_CheckParm("+map")) + if (server && !M_CheckParm("+map") && !M_CheckParm("+connect") + && !M_CheckParm("-connect")) { // Prevent warping to nonexistent levels if (W_CheckNumForName(G_BuildMapName(pstartmap)) == LUMPERROR) diff --git a/src/d_netcmd.c b/src/d_netcmd.c index 05b5ee4f..d3ed20c9 100644 --- a/src/d_netcmd.c +++ b/src/d_netcmd.c @@ -252,17 +252,17 @@ consvar_t cv_allowseenames = {"allowseenames", "Yes", CV_NETVAR, CV_YesNo, NULL, consvar_t cv_playername = {"name", "Sonic", CV_SAVE|CV_CALL|CV_NOINIT, NULL, Name_OnChange, 0, NULL, NULL, 0, 0, NULL}; consvar_t cv_playername2 = {"name2", "Tails", CV_SAVE|CV_CALL|CV_NOINIT, NULL, Name2_OnChange, 0, NULL, NULL, 0, 0, NULL}; consvar_t cv_playername3 = {"name3", "Knuckles", CV_SAVE|CV_CALL|CV_NOINIT, NULL, Name3_OnChange, 0, NULL, NULL, 0, 0, NULL}; -consvar_t cv_playername4 = {"name4", "Dr. Eggman", CV_SAVE|CV_CALL|CV_NOINIT, NULL, Name4_OnChange, 0, NULL, NULL, 0, 0, NULL}; +consvar_t cv_playername4 = { "name4", "Metal Sonic", CV_SAVE|CV_CALL|CV_NOINIT, NULL, Name4_OnChange, 0, NULL, NULL, 0, 0, NULL}; // player colors -consvar_t cv_playercolor = {"color", "Blue", CV_SAVE|CV_CALL|CV_NOINIT, Color_cons_t, Color_OnChange, 0, NULL, NULL, 0, 0, NULL}; -consvar_t cv_playercolor2 = {"color2", "Orange", CV_SAVE|CV_CALL|CV_NOINIT, Color_cons_t, Color2_OnChange, 0, NULL, NULL, 0, 0, NULL}; -consvar_t cv_playercolor3 = {"color3", "Red", CV_SAVE|CV_CALL|CV_NOINIT, Color_cons_t, Color3_OnChange, 0, NULL, NULL, 0, 0, NULL}; -consvar_t cv_playercolor4 = {"color4", "Red", CV_SAVE|CV_CALL|CV_NOINIT, Color_cons_t, Color4_OnChange, 0, NULL, NULL, 0, 0, NULL}; +consvar_t cv_playercolor = {"color", "Blue", CV_CALL|CV_NOINIT, Color_cons_t, Color_OnChange, 0, NULL, NULL, 0, 0, NULL}; +consvar_t cv_playercolor2 = {"color2", "Orange", CV_CALL|CV_NOINIT, Color_cons_t, Color2_OnChange, 0, NULL, NULL, 0, 0, NULL}; +consvar_t cv_playercolor3 = {"color3", "Red", CV_CALL|CV_NOINIT, Color_cons_t, Color3_OnChange, 0, NULL, NULL, 0, 0, NULL}; +consvar_t cv_playercolor4 = {"color4", "Blue", CV_CALL|CV_NOINIT, Color_cons_t, Color4_OnChange, 0, NULL, NULL, 0, 0, NULL}; // player's skin, saved for commodity, when using a favorite skins wad.. -consvar_t cv_skin = {"skin", DEFAULTSKIN, CV_SAVE|CV_CALL|CV_NOINIT, NULL, Skin_OnChange, 0, NULL, NULL, 0, 0, NULL}; -consvar_t cv_skin2 = {"skin2", DEFAULTSKIN2, CV_SAVE|CV_CALL|CV_NOINIT, NULL, Skin2_OnChange, 0, NULL, NULL, 0, 0, NULL}; -consvar_t cv_skin3 = {"skin3", DEFAULTSKIN3, CV_SAVE|CV_CALL|CV_NOINIT, NULL, Skin3_OnChange, 0, NULL, NULL, 0, 0, NULL}; -consvar_t cv_skin4 = {"skin4", DEFAULTSKIN4, CV_SAVE|CV_CALL|CV_NOINIT, NULL, Skin4_OnChange, 0, NULL, NULL, 0, 0, NULL}; +consvar_t cv_skin = {"skin", DEFAULTSKIN, CV_CALL|CV_NOINIT, NULL, Skin_OnChange, 0, NULL, NULL, 0, 0, NULL}; +consvar_t cv_skin2 = {"skin2", DEFAULTSKIN2, CV_CALL|CV_NOINIT, NULL, Skin2_OnChange, 0, NULL, NULL, 0, 0, NULL}; +consvar_t cv_skin3 = {"skin3", DEFAULTSKIN3, CV_CALL|CV_NOINIT, NULL, Skin3_OnChange, 0, NULL, NULL, 0, 0, NULL}; +consvar_t cv_skin4 = {"skin4", DEFAULTSKIN4, CV_CALL|CV_NOINIT, NULL, Skin4_OnChange, 0, NULL, NULL, 0, 0, NULL}; consvar_t cv_skipmapcheck = {"skipmapcheck", "Off", CV_SAVE, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL}; @@ -682,6 +682,7 @@ void D_RegisterServerCommands(void) */ void D_RegisterClientCommands(void) { + const char *username; INT32 i; for (i = 0; i < MAXSKINCOLORS; i++) @@ -742,6 +743,8 @@ void D_RegisterClientCommands(void) #endif // register these so it is saved to config + if ((username = I_GetUserName())) + cv_playername.defaultvalue = username; CV_RegisterVar(&cv_playername); CV_RegisterVar(&cv_playercolor); CV_RegisterVar(&cv_skin); // r_things.c (skin NAME) @@ -1802,12 +1805,7 @@ static void Command_Playdemo_f(void) CONS_Printf(M_GetText("Playing back demo '%s'.\n"), name); - // Internal if no extension, external if one exists - // If external, convert the file name to a path in SRB2's home directory - if (FIL_CheckExtension(name)) - G_DoPlayDemo(va("%s"PATHSEP"%s", srb2home, name)); - else - G_DoPlayDemo(name); + G_DoPlayDemo(name); } static void Command_Timedemo_f(void) diff --git a/src/d_netfil.c b/src/d_netfil.c index 6742cfe2..172624ad 100644 --- a/src/d_netfil.c +++ b/src/d_netfil.c @@ -990,41 +990,19 @@ filestatus_t checkfilemd5(char *filename, const UINT8 *wantedmd5sum) return FS_FOUND; // will never happen, but makes the compiler shut up } -// Rewritten by Monster Iestyn to be less stupid -// Note: if completepath is true, "filename" is modified, but only if FS_FOUND is going to be returned -// (Don't worry about WinCE's version of filesearch, nobody cares about that OS anymore) filestatus_t findfile(char *filename, const UINT8 *wantedmd5sum, boolean completepath) { - filestatus_t homecheck; // store result of last file search - boolean badmd5 = false; // store whether md5 was bad from either of the first two searches (if nothing was found in the third) + filestatus_t homecheck = filesearch(filename, srb2home, wantedmd5sum, false, 10); + if (homecheck == FS_FOUND) + return filesearch(filename, srb2home, wantedmd5sum, completepath, 10); - // first, check SRB2's "home" directory - homecheck = filesearch(filename, srb2home, wantedmd5sum, completepath, 10); + homecheck = filesearch(filename, srb2path, wantedmd5sum, false, 10); + if (homecheck == FS_FOUND) + return filesearch(filename, srb2path, wantedmd5sum, completepath, 10); - if (homecheck == FS_FOUND) // we found the file, so return that we have :) - return FS_FOUND; - else if (homecheck == FS_MD5SUMBAD) // file has a bad md5; move on and look for a file with the right md5 - badmd5 = true; - // if not found at all, just move on without doing anything - - // next, check SRB2's "path" directory - homecheck = filesearch(filename, srb2path, wantedmd5sum, completepath, 10); - - if (homecheck == FS_FOUND) // we found the file, so return that we have :) - return FS_FOUND; - else if (homecheck == FS_MD5SUMBAD) // file has a bad md5; move on and look for a file with the right md5 - badmd5 = true; - // if not found at all, just move on without doing anything - - // finally check "." directory #ifdef _arch_dreamcast - homecheck = filesearch(filename, "/cd", wantedmd5sum, completepath, 10); + return filesearch(filename, "/cd", wantedmd5sum, completepath, 10); #else - homecheck = filesearch(filename, ".", wantedmd5sum, completepath, 10); + return filesearch(filename, ".", wantedmd5sum, completepath, 10); #endif - - if (homecheck != FS_NOTFOUND) // if not found this time, fall back on the below return statement - return homecheck; // otherwise return the result we got - - return (badmd5 ? FS_MD5SUMBAD : FS_NOTFOUND); // md5 sum bad or file not found } diff --git a/src/dehacked.c b/src/dehacked.c index 09a892cd..f2caf154 100644 --- a/src/dehacked.c +++ b/src/dehacked.c @@ -1883,6 +1883,7 @@ static void readframe(MYFILE *f, INT32 num) char *word1; char *word2 = NULL; char *tmp; + INT32 j; do { @@ -1897,6 +1898,16 @@ static void readframe(MYFILE *f, INT32 num) if (s == tmp) continue; // Skip comment lines, but don't break. + for (j = 0; s[j] != '\n'; j++) + { + if (s[j] == '=') + { + j += 2; + j = atoi(&s[j]); + break; + } + } + word1 = strtok(s, " "); if (word1) strupr(word1); diff --git a/src/f_finale.c b/src/f_finale.c index 913d7625..e6cd6d0e 100644 --- a/src/f_finale.c +++ b/src/f_finale.c @@ -222,19 +222,11 @@ static void F_SkyScroll(INT32 scrollspeed) #ifdef HWRENDER else if (rendermode != render_none) { // if only software rendering could be this simple and retarded - INT32 dupz = (vid.dupx < vid.dupy ? vid.dupx : vid.dupy); - INT32 y, pw = SHORT(pat->width) * dupz, ph = SHORT(pat->height) * dupz; - scrolled = animtimer * dupz; - for (x = 0; x < vid.width; x += pw) - { - for (y = 0; y < vid.height; y += ph) - { - if (scrolled > 0) - V_DrawScaledPatch(scrolled - pw, y, V_NOSCALESTART, pat); - - V_DrawScaledPatch(x + scrolled, y, V_NOSCALESTART, pat); - } - } + scrolled = animtimer; + if (scrolled > 0) + V_DrawScaledPatch(scrolled - SHORT(pat->width), 0, 0, pat); + for (x = 0; x < fakedwidth; x += SHORT(pat->width)) + V_DrawScaledPatch(x + scrolled, 0, 0, pat); } #endif diff --git a/src/g_game.c b/src/g_game.c index 4d04052a..0263b2a7 100644 --- a/src/g_game.c +++ b/src/g_game.c @@ -1159,14 +1159,13 @@ void G_BuildTiccmd(ticcmd_t *cmd, INT32 realtics, UINT8 ssplayer) INT32 laim, th, tspeed, forward, side, axis; //i const INT32 speed = 1; // these ones used for multiple conditions - boolean turnleft, turnright, invertmouse, mouseaiming, lookaxis, analog, analogjoystickmove, gamepadjoystickmove, kbl, rd; + boolean turnleft, turnright, invertmouse, mouseaiming, lookaxis, analog, analogjoystickmove, gamepadjoystickmove, kbl; player_t *player; camera_t *thiscam; angle_t lang; static INT32 turnheld, turnheld2, turnheld3, turnheld4; // for accelerative turning static boolean keyboard_look, keyboard_look2, keyboard_look3, keyboard_look4; // true if lookup/down using keyboard - static boolean resetdown, resetdown2, resetdown3, resetdown4; // don't cam reset every frame switch (ssplayer) { @@ -1177,7 +1176,6 @@ void G_BuildTiccmd(ticcmd_t *cmd, INT32 realtics, UINT8 ssplayer) laim = localaiming2; th = turnheld2; kbl = keyboard_look2; - rd = resetdown2; G_CopyTiccmd(cmd, I_BaseTiccmd2(), 1); break; case 3: @@ -1187,7 +1185,6 @@ void G_BuildTiccmd(ticcmd_t *cmd, INT32 realtics, UINT8 ssplayer) laim = localaiming3; th = turnheld3; kbl = keyboard_look3; - rd = resetdown3; G_CopyTiccmd(cmd, I_BaseTiccmd3(), 1); break; case 4: @@ -1197,7 +1194,6 @@ void G_BuildTiccmd(ticcmd_t *cmd, INT32 realtics, UINT8 ssplayer) laim = localaiming4; th = turnheld4; kbl = keyboard_look4; - rd = resetdown4; G_CopyTiccmd(cmd, I_BaseTiccmd4(), 1); break; case 1: @@ -1208,7 +1204,6 @@ void G_BuildTiccmd(ticcmd_t *cmd, INT32 realtics, UINT8 ssplayer) laim = localaiming; th = turnheld; kbl = keyboard_look; - rd = resetdown; G_CopyTiccmd(cmd, I_BaseTiccmd(), 1); // empty, or external driver break; } @@ -1405,15 +1400,6 @@ void G_BuildTiccmd(ticcmd_t *cmd, INT32 realtics, UINT8 ssplayer) if (InputDown(gc_custom3, ssplayer)) cmd->buttons |= BT_CUSTOM3; - if (InputDown(gc_camreset, ssplayer)) - { - if (thiscam->chase && !rd) - P_ResetCamera(player, thiscam); - rd = true; - } - else - rd = false; - // player aiming shit, ahhhh... { INT32 player_invert = invertmouse ? -1 : 1; @@ -1569,7 +1555,6 @@ void G_BuildTiccmd(ticcmd_t *cmd, INT32 realtics, UINT8 ssplayer) localaiming2 = laim; keyboard_look2 = kbl; turnheld2 = th; - resetdown2 = rd; camspin2 = InputDown(gc_lookback, ssplayer); break; case 3: @@ -1577,7 +1562,6 @@ void G_BuildTiccmd(ticcmd_t *cmd, INT32 realtics, UINT8 ssplayer) localaiming3 = laim; keyboard_look3 = kbl; turnheld3 = th; - resetdown3 = rd; camspin3 = InputDown(gc_lookback, ssplayer); break; case 4: @@ -1585,7 +1569,6 @@ void G_BuildTiccmd(ticcmd_t *cmd, INT32 realtics, UINT8 ssplayer) localaiming4 = laim; keyboard_look4 = kbl; turnheld4 = th; - resetdown4 = rd; camspin4 = InputDown(gc_lookback, ssplayer); break; case 1: @@ -1594,7 +1577,6 @@ void G_BuildTiccmd(ticcmd_t *cmd, INT32 realtics, UINT8 ssplayer) localaiming = laim; keyboard_look = kbl; turnheld = th; - resetdown = rd; camspin = InputDown(gc_lookback, ssplayer); break; } @@ -4086,8 +4068,7 @@ void G_InitNew(UINT8 pultmode, const char *mapname, boolean resetplayer, boolean unlocktriggers = 0; // clear itemfinder, just in case - if (!dedicated) // except in dedicated servers, where it is not registered and can actually I_Error debug builds - CV_StealthSetValue(&cv_itemfinder, 0); + CV_StealthSetValue(&cv_itemfinder, 0); } // internal game map diff --git a/src/g_input.c b/src/g_input.c index df0ee776..485263cb 100644 --- a/src/g_input.c +++ b/src/g_input.c @@ -1293,6 +1293,7 @@ void G_Controldefault(void) gamecontrol[gc_lookback ][1] = KEY_JOY1+5; // RB // Extra controls + gamecontrol[gc_camtoggle ][0] = KEY_BACKSPACE; gamecontrol[gc_pause ][0] = KEY_PAUSE; gamecontrol[gc_console ][0] = KEY_CONSOLE; gamecontrol[gc_talkkey ][0] = 't'; @@ -1303,47 +1304,10 @@ void G_Controldefault(void) gamecontrol[gc_scores ][1] = KEY_JOY1+6; // Back gamecontrol[gc_spectate ][1] = KEY_JOY1+7; // Start (This is sort of like MP's pause...?) + // Spectator controls gamecontrol[gc_lookup ][0] = KEY_PGUP; gamecontrol[gc_lookdown ][0] = KEY_PGDN; gamecontrol[gc_centerview ][0] = KEY_END; - gamecontrol[gc_camreset ][0] = KEY_HOME; - gamecontrol[gc_camtoggle ][0] = KEY_BACKSPACE; - - // Player 2 controls - gamecontrolbis[gc_aimforward ][0] = KEY_2HAT1+0; - gamecontrolbis[gc_aimbackward][0] = KEY_2HAT1+1; - gamecontrolbis[gc_turnleft ][0] = KEY_2HAT1+2; - gamecontrolbis[gc_turnright ][0] = KEY_2HAT1+3; - gamecontrolbis[gc_accelerate ][0] = KEY_2JOY1+0; // A - gamecontrolbis[gc_drift ][0] = KEY_2JOY1+1; // X - gamecontrolbis[gc_brake ][0] = KEY_2JOY1+2; // B - gamecontrolbis[gc_fire ][0] = KEY_2JOY1+4; // LB - gamecontrolbis[gc_lookback ][0] = KEY_2JOY1+5; // RB - gamecontrolbis[gc_spectate ][0] = KEY_2JOY1+7; // Start - - // Player 3 controls - gamecontrol3[gc_aimforward ][0] = KEY_3HAT1+0; - gamecontrol3[gc_aimbackward][0] = KEY_3HAT1+1; - gamecontrol3[gc_turnleft ][0] = KEY_3HAT1+2; - gamecontrol3[gc_turnright ][0] = KEY_3HAT1+3; - gamecontrol3[gc_accelerate ][0] = KEY_3JOY1+0; // A - gamecontrol3[gc_drift ][0] = KEY_3JOY1+1; // X - gamecontrol3[gc_brake ][0] = KEY_3JOY1+2; // B - gamecontrol3[gc_fire ][0] = KEY_3JOY1+4; // LB - gamecontrol3[gc_lookback ][0] = KEY_3JOY1+5; // RB - gamecontrol3[gc_spectate ][0] = KEY_3JOY1+7; // Start - - // Player 4 controls - gamecontrol4[gc_aimforward ][0] = KEY_4HAT1+0; - gamecontrol4[gc_aimbackward][0] = KEY_4HAT1+1; - gamecontrol4[gc_turnleft ][0] = KEY_4HAT1+2; - gamecontrol4[gc_turnright ][0] = KEY_4HAT1+3; - gamecontrol4[gc_accelerate ][0] = KEY_4JOY1+0; // A - gamecontrol4[gc_drift ][0] = KEY_4JOY1+1; // X - gamecontrol4[gc_brake ][0] = KEY_4JOY1+2; // B - gamecontrol4[gc_fire ][0] = KEY_4JOY1+4; // LB - gamecontrol4[gc_lookback ][0] = KEY_4JOY1+5; // RB - gamecontrol4[gc_spectate ][0] = KEY_4JOY1+7; // Start } //#endif diff --git a/src/g_input.h b/src/g_input.h index 7e49fff3..6f2c6516 100644 --- a/src/g_input.h +++ b/src/g_input.h @@ -103,7 +103,6 @@ typedef enum gc_brake, gc_fire, gc_lookback, - gc_camreset, gc_camtoggle, gc_spectate, gc_lookup, diff --git a/src/hardware/hw_defs.h b/src/hardware/hw_defs.h index 9a490a96..48029138 100644 --- a/src/hardware/hw_defs.h +++ b/src/hardware/hw_defs.h @@ -20,8 +20,8 @@ #define _HWR_DEFS_ #include "../doomtype.h" -#define ZCLIP_PLANE 4.0f // Used for the actual game drawing -#define NZCLIP_PLANE 0.9f // Seems to be only used for the HUD and screen textures +#define ZCLIP_PLANE 4.0f +#define NZCLIP_PLANE 0.9f // ========================================================================== // SIMPLE TYPES @@ -134,13 +134,12 @@ enum EPolyFlags PF_Masked = 0x00000001, // Poly is alpha scaled and 0 alpha pels are discarded (holes in texture) PF_Translucent = 0x00000002, // Poly is transparent, alpha = level of transparency - PF_Additive = 0x00000004, // Poly is added to the frame buffer + PF_Additive = 0x00000024, // Poly is added to the frame buffer PF_Environment = 0x00000008, // Poly should be drawn environment mapped. // Hurdler: used for text drawing PF_Substractive = 0x00000010, // for splat PF_NoAlphaTest = 0x00000020, // hiden param - PF_Fog = 0x00000040, // Fog blocks - PF_Blending = (PF_Environment|PF_Additive|PF_Translucent|PF_Masked|PF_Substractive|PF_Fog)&~PF_NoAlphaTest, + PF_Blending = (PF_Environment|PF_Additive|PF_Translucent|PF_Masked|PF_Substractive)&~PF_NoAlphaTest, // other flag bits diff --git a/src/hardware/hw_draw.c b/src/hardware/hw_draw.c index c142e74c..108482a5 100644 --- a/src/hardware/hw_draw.c +++ b/src/hardware/hw_draw.c @@ -147,7 +147,10 @@ void HWR_DrawFixedPatch(GLPatch_t *gpatch, fixed_t x, fixed_t y, fixed_t pscale, // | /| // |/ | // 0--1 - float dupx, dupy, fscale, fwidth, fheight; + float sdupx = FIXED_TO_FLOAT(vid.fdupx)*2.0f; + float sdupy = FIXED_TO_FLOAT(vid.fdupy)*2.0f; + float pdupx = FIXED_TO_FLOAT(vid.fdupx)*2.0f*FIXED_TO_FLOAT(pscale); + float pdupy = FIXED_TO_FLOAT(vid.fdupy)*2.0f*FIXED_TO_FLOAT(pscale); if (alphalevel >= 10 && alphalevel < 13) return; @@ -158,40 +161,23 @@ void HWR_DrawFixedPatch(GLPatch_t *gpatch, fixed_t x, fixed_t y, fixed_t pscale, else HWR_GetMappedPatch(gpatch, colormap); - dupx = (float)vid.dupx; - dupy = (float)vid.dupy; - switch (option & V_SCALEPATCHMASK) { case V_NOSCALEPATCH: - dupx = dupy = 1.0f; + pdupx = pdupy = 2.0f; break; case V_SMALLSCALEPATCH: - dupx = (float)vid.smalldupx; - dupy = (float)vid.smalldupy; + pdupx = 2.0f * FIXED_TO_FLOAT(vid.fsmalldupx); + pdupy = 2.0f * FIXED_TO_FLOAT(vid.fsmalldupy); break; case V_MEDSCALEPATCH: - dupx = (float)vid.meddupx; - dupy = (float)vid.meddupy; + pdupx = 2.0f * FIXED_TO_FLOAT(vid.fmeddupx); + pdupy = 2.0f * FIXED_TO_FLOAT(vid.fmeddupy); break; } - dupx = dupy = (dupx < dupy ? dupx : dupy); - fscale = FIXED_TO_FLOAT(pscale); - - if (option & V_OFFSET) - { - cx -= (float)gpatch->leftoffset * dupx * fscale; - cy -= (float)gpatch->topoffset * dupy * fscale; - } - else - { - cy -= (float)gpatch->topoffset * fscale; - if (option & V_FLIP) - cx -= ((float)gpatch->width - (float)gpatch->leftoffset) * fscale; - else - cx -= (float)gpatch->leftoffset * fscale; - } + if (option & V_NOSCALESTART) + sdupx = sdupy = 2.0f; if (option & V_SPLITSCREEN) cy += FIXED_TO_FLOAT((BASEVIDHEIGHT/2)<= -0.1f && cx <= 0.1f && SHORT(gpatch->width) == BASEVIDWIDTH && cy >= -0.1f && cy <= 0.1f && SHORT(gpatch->height) == BASEVIDHEIGHT) - { - // Need to temporarily cache the real patch to get the colour of the top left pixel - patch_t *realpatch = W_CacheLumpNumPwad(gpatch->wadnum, gpatch->lumpnum, PU_STATIC); - const column_t *column = (const column_t *)((const UINT8 *)(realpatch) + LONG((realpatch)->columnofs[0])); - const UINT8 *source = (const UINT8 *)(column) + 3; - HWR_DrawFill(0, 0, BASEVIDWIDTH, BASEVIDHEIGHT, (column->topdelta == 0xff ? 31 : source[0])); - Z_Free(realpatch); - } - // centre screen - if (vid.width != BASEVIDWIDTH * vid.dupx) - { - if (option & V_SNAPTORIGHT) - cx += ((float)vid.width - ((float)BASEVIDWIDTH * dupx)); - else if (!(option & V_SNAPTOLEFT)) - cx += ((float)vid.width - ((float)BASEVIDWIDTH * dupx))/2; - } - if (vid.height != BASEVIDHEIGHT * vid.dupy) - { - if ((option & (V_SPLITSCREEN|V_SNAPTOBOTTOM)) == (V_SPLITSCREEN|V_SNAPTOBOTTOM)) - cy += ((float)vid.height/2 - ((float)BASEVIDHEIGHT/2 * dupy)); - else if (option & V_SNAPTOBOTTOM) - cy += ((float)vid.height - ((float)BASEVIDHEIGHT * dupy)); - else if (!(option & V_SNAPTOTOP)) - cy += ((float)vid.height - ((float)BASEVIDHEIGHT * dupy))/2; - } - } - } - - if (pscale != FRACUNIT) - { - fwidth = (float)gpatch->width * fscale * dupx; - fheight = (float)gpatch->height * fscale * dupy; + v[0].x = v[3].x = (cx*sdupx-(gpatch->width-gpatch->leftoffset)*pdupx)/vid.width - 1; + v[2].x = v[1].x = (cx*sdupx+gpatch->leftoffset*pdupx)/vid.width - 1; } else { - fwidth = (float)gpatch->width * dupx; - fheight = (float)gpatch->height * dupy; + v[0].x = v[3].x = (cx*sdupx-gpatch->leftoffset*pdupx)/vid.width - 1; + v[2].x = v[1].x = (cx*sdupx+(gpatch->width-gpatch->leftoffset)*pdupx)/vid.width - 1; } - // positions of the cx, cy, are between 0 and vid.width/vid.height now, we need them to be between -1 and 1 - cx = -1 + (cx / (vid.width/2)); - cy = 1 - (cy / (vid.height/2)); - - // fwidth and fheight are similar - fwidth /= vid.width / 2; - fheight /= vid.height / 2; - - // set the polygon vertices to the right positions - v[0].x = v[3].x = cx; - v[2].x = v[1].x = cx + fwidth; - - v[0].y = v[1].y = cy; - v[2].y = v[3].y = cy - fheight; + v[0].y = v[1].y = 1-(cy*sdupy-gpatch->topoffset*pdupy)/vid.height; + v[2].y = v[3].y = 1-(cy*sdupy+(gpatch->height-gpatch->topoffset)*pdupy)/vid.height; v[0].z = v[1].z = v[2].z = v[3].z = 1.0f; @@ -315,7 +250,10 @@ void HWR_DrawCroppedPatch(GLPatch_t *gpatch, fixed_t x, fixed_t y, fixed_t pscal // | /| // |/ | // 0--1 - float dupx, dupy, fscale, fwidth, fheight; + float sdupx = FIXED_TO_FLOAT(vid.fdupx)*2.0f; + float sdupy = FIXED_TO_FLOAT(vid.fdupy)*2.0f; + float pdupx = FIXED_TO_FLOAT(vid.fdupx)*2.0f*FIXED_TO_FLOAT(pscale); + float pdupy = FIXED_TO_FLOAT(vid.fdupy)*2.0f*FIXED_TO_FLOAT(pscale); if (alphalevel >= 10 && alphalevel < 13) return; @@ -323,109 +261,28 @@ void HWR_DrawCroppedPatch(GLPatch_t *gpatch, fixed_t x, fixed_t y, fixed_t pscal // make patch ready in hardware cache HWR_GetPatch(gpatch); - dupx = (float)vid.dupx; - dupy = (float)vid.dupy; - switch (option & V_SCALEPATCHMASK) { case V_NOSCALEPATCH: - dupx = dupy = 1.0f; + pdupx = pdupy = 2.0f; break; case V_SMALLSCALEPATCH: - dupx = (float)vid.smalldupx; - dupy = (float)vid.smalldupy; + pdupx = 2.0f * FIXED_TO_FLOAT(vid.fsmalldupx); + pdupy = 2.0f * FIXED_TO_FLOAT(vid.fsmalldupy); break; case V_MEDSCALEPATCH: - dupx = (float)vid.meddupx; - dupy = (float)vid.meddupy; + pdupx = 2.0f * FIXED_TO_FLOAT(vid.fmeddupx); + pdupy = 2.0f * FIXED_TO_FLOAT(vid.fmeddupy); break; } - dupx = dupy = (dupx < dupy ? dupx : dupy); - fscale = FIXED_TO_FLOAT(pscale); + if (option & V_NOSCALESTART) + sdupx = sdupy = 2.0f; - cy -= (float)gpatch->topoffset * fscale; - cx -= (float)gpatch->leftoffset * fscale; - - if (!(option & V_NOSCALESTART)) - { - cx = cx * dupx; - cy = cy * dupy; - - if (!(option & V_SCALEPATCHMASK)) - { - // if it's meant to cover the whole screen, black out the rest - // cx and cy are possibly *slightly* off from float maths - // This is done before here compared to software because we directly alter cx and cy to centre - if (cx >= -0.1f && cx <= 0.1f && SHORT(gpatch->width) == BASEVIDWIDTH && cy >= -0.1f && cy <= 0.1f && SHORT(gpatch->height) == BASEVIDHEIGHT) - { - // Need to temporarily cache the real patch to get the colour of the top left pixel - patch_t *realpatch = W_CacheLumpNumPwad(gpatch->wadnum, gpatch->lumpnum, PU_STATIC); - const column_t *column = (const column_t *)((const UINT8 *)(realpatch) + LONG((realpatch)->columnofs[0])); - const UINT8 *source = (const UINT8 *)(column) + 3; - HWR_DrawFill(0, 0, BASEVIDWIDTH, BASEVIDHEIGHT, (column->topdelta == 0xff ? 31 : source[0])); - Z_Free(realpatch); - } - // centre screen - if (vid.width != BASEVIDWIDTH * vid.dupx) - { - if (option & V_SNAPTORIGHT) - cx += ((float)vid.width - ((float)BASEVIDWIDTH * dupx)); - else if (!(option & V_SNAPTOLEFT)) - cx += ((float)vid.width - ((float)BASEVIDWIDTH * dupx))/2; - } - if (vid.height != BASEVIDHEIGHT * vid.dupy) - { - if ((option & (V_SPLITSCREEN|V_SNAPTOBOTTOM)) == (V_SPLITSCREEN|V_SNAPTOBOTTOM)) - cy += ((float)vid.height/2 - ((float)BASEVIDHEIGHT/2 * dupy)); - else if (option & V_SNAPTOBOTTOM) - cy += ((float)vid.height - ((float)BASEVIDHEIGHT * dupy)); - else if (!(option & V_SNAPTOTOP)) - cy += ((float)vid.height - ((float)BASEVIDHEIGHT * dupy))/2; - } - } - } - - fwidth = w; - fheight = h; - - if (fwidth > w - sx) - fwidth = w - sx; - - if (fheight > h - sy) - fheight = h - sy; - - if (fwidth > gpatch->width) - fwidth = gpatch->width; - - if (fheight > gpatch->height) - fheight = gpatch->height; - - if (pscale != FRACUNIT) - { - fwidth *= fscale * dupx; - fheight *= fscale * dupy; - } - else - { - fwidth *= dupx; - fheight *= dupy; - } - - // positions of the cx, cy, are between 0 and vid.width/vid.height now, we need them to be between -1 and 1 - cx = -1 + (cx / (vid.width/2)); - cy = 1 - (cy / (vid.height/2)); - - // fwidth and fheight are similar - fwidth /= vid.width / 2; - fheight /= vid.height / 2; - - // set the polygon vertices to the right positions - v[0].x = v[3].x = cx; - v[2].x = v[1].x = cx + fwidth; - - v[0].y = v[1].y = cy; - v[2].y = v[3].y = cy - fheight; + v[0].x = v[3].x = (cx*sdupx - gpatch->leftoffset * pdupx) / vid.width - 1; + v[2].x = v[1].x = (cx*sdupx + ((w-sx) - gpatch->leftoffset) * pdupx) / vid.width - 1; + v[0].y = v[1].y = 1 - (cy*sdupy - gpatch->topoffset * pdupy) / vid.height; + v[2].y = v[3].y = 1 - (cy*sdupy + ((h-sy) - gpatch->topoffset) * pdupy) / vid.height; v[0].z = v[1].z = v[2].z = v[3].z = 1.0f; @@ -802,7 +659,7 @@ void HWR_DrawFill(INT32 x, INT32 y, INT32 w, INT32 h, INT32 color) { FOutVector v[4]; FSurfaceInfo Surf; - float fx, fy, fw, fh; + float sdupx, sdupy; if (w < 0 || h < 0) return; // consistency w/ software @@ -811,79 +668,16 @@ void HWR_DrawFill(INT32 x, INT32 y, INT32 w, INT32 h, INT32 color) // | /| // |/ | // 0--1 + sdupx = FIXED_TO_FLOAT(vid.fdupx)*2.0f; + sdupy = FIXED_TO_FLOAT(vid.fdupy)*2.0f; - fx = (float)x; - fy = (float)y; - fw = (float)w; - fh = (float)h; + if (color & V_NOSCALESTART) + sdupx = sdupy = 2.0f; - if (!(color & V_NOSCALESTART)) - { - float dupx = (float)vid.dupx, dupy = (float)vid.dupy; - - if (x == 0 && y == 0 && w == BASEVIDWIDTH && h == BASEVIDHEIGHT) - { - RGBA_t rgbaColour = V_GetColor(color); - FRGBAFloat clearColour; - clearColour.red = (float)rgbaColour.s.red / 255; - clearColour.green = (float)rgbaColour.s.green / 255; - clearColour.blue = (float)rgbaColour.s.blue / 255; - clearColour.alpha = 1; - HWD.pfnClearBuffer(true, false, &clearColour); - return; - } - - fx *= dupx; - fy *= dupy; - fw *= dupx; - fh *= dupy; - - if (vid.width != BASEVIDWIDTH * vid.dupx) - { - if (color & V_SNAPTORIGHT) - fx += ((float)vid.width - ((float)BASEVIDWIDTH * dupx)); - else if (!(color & V_SNAPTOLEFT)) - fx += ((float)vid.width - ((float)BASEVIDWIDTH * dupx)) / 2; - } - if (vid.height != BASEVIDHEIGHT * dupy) - { - // same thing here - if (color & V_SNAPTOBOTTOM) - fy += ((float)vid.height - ((float)BASEVIDHEIGHT * dupy)); - else if (!(color & V_SNAPTOTOP)) - fy += ((float)vid.height - ((float)BASEVIDHEIGHT * dupy)) / 2; - } - } - - if (fx >= vid.width || fy >= vid.height) - return; - if (fx < 0) - { - fw += fx; - fx = 0; - } - if (fy < 0) - { - fh += fy; - fy = 0; - } - - if (fw <= 0 || fh <= 0) - return; - if (fx + fw > vid.width) - fw = (float)vid.width - fx; - if (fy + fh > vid.height) - fh = (float)vid.height - fy; - - fx = -1 + fx / (vid.width / 2); - fy = 1 - fy / (vid.height / 2); - fw = fw / (vid.width / 2); - fh = fh / (vid.height / 2); - - v[0].x = v[3].x = fx; - v[2].x = v[1].x = fx + fw; - v[0].y = v[1].y = fy; - v[2].y = v[3].y = fy - fh; + v[0].x = v[3].x = (x*sdupx)/vid.width - 1; + v[2].x = v[1].x = (x*sdupx + w*sdupx)/vid.width - 1; + v[0].y = v[1].y = 1-(y*sdupy)/vid.height; + v[2].y = v[3].y = 1-(y*sdupy + h*sdupy)/vid.height; //Hurdler: do we still use this argb color? if not, we should remove it v[0].argb = v[1].argb = v[2].argb = v[3].argb = 0xff00ff00; //; diff --git a/src/hardware/hw_drv.h b/src/hardware/hw_drv.h index a5ac8200..7672f47c 100644 --- a/src/hardware/hw_drv.h +++ b/src/hardware/hw_drv.h @@ -79,7 +79,6 @@ EXPORT char *HWRAPI(GetRenderer) (void); #define SCREENVERTS 10 EXPORT void HWRAPI(PostImgRedraw) (float points[SCREENVERTS][SCREENVERTS][2]); #endif -EXPORT void HWRAPI(FlushScreenTextures) (void); EXPORT void HWRAPI(StartScreenWipe) (void); EXPORT void HWRAPI(EndScreenWipe) (void); EXPORT void HWRAPI(DoScreenWipe) (float alpha); @@ -125,7 +124,6 @@ struct hwdriver_s #ifdef SHUFFLE PostImgRedraw pfnPostImgRedraw; #endif - FlushScreenTextures pfnFlushScreenTextures; StartScreenWipe pfnStartScreenWipe; EndScreenWipe pfnEndScreenWipe; DoScreenWipe pfnDoScreenWipe; diff --git a/src/hardware/hw_glob.h b/src/hardware/hw_glob.h index fea06caf..5d1a81d4 100644 --- a/src/hardware/hw_glob.h +++ b/src/hardware/hw_glob.h @@ -68,7 +68,6 @@ typedef struct gr_vissprite_s struct gr_vissprite_s *prev; struct gr_vissprite_s *next; float x1, x2; - float z1, z2; float tz, ty; lumpnum_t patchlumpnum; boolean flip; @@ -79,6 +78,7 @@ typedef struct gr_vissprite_s //Hurdler: 25/04/2000: now support colormap in hardware mode UINT8 *colormap; INT32 dispoffset; // copy of info->dispoffset, affects ordering but not drawing + float z1, z2; } gr_vissprite_t; // -------- diff --git a/src/hardware/hw_main.c b/src/hardware/hw_main.c index b7797e54..d990f59a 100644 --- a/src/hardware/hw_main.c +++ b/src/hardware/hw_main.c @@ -117,7 +117,7 @@ consvar_t cv_grfiltermode = {"gr_filtermode", "Nearest", CV_CALL, grfiltermode_c consvar_t cv_granisotropicmode = {"gr_anisotropicmode", "1", CV_CALL, granisotropicmode_cons_t, CV_anisotropic_ONChange, 0, NULL, NULL, 0, 0, NULL}; //static consvar_t cv_grzbuffer = {"gr_zbuffer", "On", 0, CV_OnOff}; -consvar_t cv_grcorrecttricks = {"gr_correcttricks", "Off", 0, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL}; +consvar_t cv_grcorrecttricks = {"gr_correcttricks", "On", 0, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL}; consvar_t cv_grsolvetjoin = {"gr_solvetjoin", "On", 0, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL}; static void CV_FogDensity_ONChange(void) @@ -493,10 +493,10 @@ UINT32 HWR_Lighting(INT32 light, UINT32 color, UINT32 fadecolor, boolean fogbloc } -static UINT8 HWR_FogBlockAlpha(INT32 light, UINT32 color) // Let's see if this can work +static UINT8 HWR_FogBlockAlpha(INT32 light, UINT32 color, UINT32 fadecolor) // Let's see if this can work { - RGBA_t realcolor, surfcolor; - INT32 alpha; + RGBA_t realcolor, fogcolor, surfcolor; + INT32 alpha, fogalpha; // Don't go out of bounds if (light < 0) @@ -505,11 +505,13 @@ static UINT8 HWR_FogBlockAlpha(INT32 light, UINT32 color) // Let's see if this c light = 255; realcolor.rgba = color; + fogcolor.rgba = fadecolor; alpha = (realcolor.s.alpha*255)/25; + fogalpha = (fogcolor.s.alpha*255)/25; - // at 255 brightness, alpha is between 0 and 127, at 0 brightness alpha will always be 255 - surfcolor.s.alpha = (alpha*light)/(2*256)+255-light; + // Fog blocks seem to get slightly more opaque with more opaque colourmap opacity, and much more opaque with darker brightness + surfcolor.s.alpha = (UINT8)(CALCLIGHT(light, ((0xFF-light)+alpha)/2)+CALCLIGHT(0xFF-light, ((light)+fogalpha)/2)); return surfcolor.s.alpha; } @@ -775,10 +777,10 @@ static void HWR_RenderPlane(sector_t *sector, extrasubsector_t *xsub, boolean is Surf.FlatColor.rgba = HWR_Lighting(lightlevel, NORMALFOG, FADEFOG, false, true); } - if (PolyFlags & (PF_Translucent|PF_Fog)) + if (PolyFlags & PF_Translucent) { Surf.FlatColor.s.alpha = (UINT8)alpha; - PolyFlags |= PF_Modulated|PF_Clip; + PolyFlags |= PF_Modulated|PF_Occlude|PF_Clip; } else PolyFlags |= PF_Masked|PF_Modulated|PF_Clip; @@ -1069,11 +1071,12 @@ static float HWR_ClipViewSegment(INT32 x, polyvertex_t *v1, polyvertex_t *v2) // // HWR_SplitWall // -static void HWR_SplitWall(sector_t *sector, wallVert3D *wallVerts, INT32 texnum, FSurfaceInfo* Surf, UINT32 cutflag, ffloor_t *pfloor) +static void HWR_SplitWall(sector_t *sector, wallVert3D *wallVerts, INT32 texnum, FSurfaceInfo* Surf, UINT32 cutflag) { /* SoM: split up and light walls according to the lightlist. This may also include leaving out parts of the wall that can't be seen */ + GLTexture_t * glTex; float realtop, realbot, top, bot; float pegt, pegb, pegmul; @@ -1096,8 +1099,8 @@ static void HWR_SplitWall(sector_t *sector, wallVert3D *wallVerts, INT32 texnum, INT32 solid, i; lightlist_t * list = sector->lightlist; const UINT8 alpha = Surf->FlatColor.s.alpha; - FUINT lightnum = sector->lightlevel; - extracolormap_t *colormap = NULL; + FUINT lightnum; + extracolormap_t *colormap; realtop = top = wallVerts[3].y; realbot = bot = wallVerts[0].y; @@ -1113,7 +1116,7 @@ static void HWR_SplitWall(sector_t *sector, wallVert3D *wallVerts, INT32 texnum, endpegmul = (endpegb - endpegt) / (endtop - endbot); #endif - for (i = 0; i < sector->numlights; i++) + for (i = 1; i < sector->numlights; i++) { #ifdef ESLOPE if (endtop < endrealbot) @@ -1121,38 +1124,35 @@ static void HWR_SplitWall(sector_t *sector, wallVert3D *wallVerts, INT32 texnum, if (top < realbot) return; - // There's a compiler warning here if this comment isn't here because of indentation - if (!(list[i].flags & FF_NOSHADE)) - { - if (pfloor && (pfloor->flags & FF_FOG)) - { - lightnum = pfloor->master->frontsector->lightlevel; - colormap = pfloor->master->frontsector->extra_colormap; - } - else - { - lightnum = *list[i].lightlevel; - colormap = list[i].extra_colormap; - } - } + //Hurdler: fix a crashing bug, but is it correct? +// if (!list[i].caster) +// continue; solid = false; - if ((sector->lightlist[i].flags & FF_CUTSOLIDS) && !(cutflag & FF_EXTRA)) - solid = true; - else if ((sector->lightlist[i].flags & FF_CUTEXTRA) && (cutflag & FF_EXTRA)) + if (list[i].caster) { - if (sector->lightlist[i].flags & FF_EXTRA) + if (sector->lightlist[i].caster->flags & FF_CUTSOLIDS && !(cutflag & FF_EXTRA)) + solid = true; + else if (sector->lightlist[i].caster->flags & FF_CUTEXTRA && cutflag & FF_EXTRA) { - if ((sector->lightlist[i].flags & (FF_FOG|FF_SWIMMABLE)) == (cutflag & (FF_FOG|FF_SWIMMABLE))) // Only merge with your own types + if (sector->lightlist[i].caster->flags & FF_EXTRA) + { + if (sector->lightlist[i].caster->flags == cutflag) // Only merge with your own types + solid = true; + } + else solid = true; } else - solid = true; + solid = false; } else solid = false; + if (cutflag == FF_CUTSOLIDS) // These are regular walls sent in from StoreWallRange, they shouldn't be cut from this + solid = false; + #ifdef ESLOPE if (list[i].slope) { @@ -1192,55 +1192,34 @@ static void HWR_SplitWall(sector_t *sector, wallVert3D *wallVerts, INT32 texnum, if (solid && endtop > endbheight) endtop = endbheight; #endif - } - -#ifdef ESLOPE - if (i + 1 < sector->numlights) - { - if (list[i+1].slope) - { - temp = P_GetZAt(list[i+1].slope, v1x, v1y); - bheight = FIXED_TO_FLOAT(temp); - temp = P_GetZAt(list[i+1].slope, v2x, v2y); - endbheight = FIXED_TO_FLOAT(temp); - } - else - bheight = endbheight = FIXED_TO_FLOAT(list[i+1].height); - } - else - { - bheight = realbot; - endbheight = endrealbot; - } -#else - if (i + 1 < sector->numlights) - { - bheight = FIXED_TO_FLOAT(list[i+1].height); - } - else - { - bheight = realbot; - } -#endif - -#ifdef ESLOPE - if (endbheight >= endtop) -#endif - if (bheight >= top) continue; + } //Found a break; - bot = bheight; + bot = height; if (bot < realbot) bot = realbot; #ifdef ESLOPE - endbot = endbheight; + endbot = endheight; if (endbot < endrealbot) endbot = endrealbot; #endif + + // colormap test + if (list[i-1].caster) + { + lightnum = *list[i-1].lightlevel; + colormap = list[i-1].extra_colormap; + } + else + { + lightnum = sector->lightlevel; + colormap = sector->extra_colormap; + } + Surf->FlatColor.s.alpha = alpha; #ifdef ESLOPE @@ -1263,16 +1242,23 @@ static void HWR_SplitWall(sector_t *sector, wallVert3D *wallVerts, INT32 texnum, wallVerts[0].y = wallVerts[1].y = bot; #endif - if (cutflag & FF_FOG) - HWR_AddTransparentWall(wallVerts, Surf, texnum, PF_Fog|PF_NoTexture, true, lightnum, colormap); - else if (cutflag & FF_TRANSLUCENT) + glTex = HWR_GetTexture(texnum); + if (cutflag & FF_TRANSLUCENT) HWR_AddTransparentWall(wallVerts, Surf, texnum, PF_Translucent, false, lightnum, colormap); + else if (glTex->mipmap.flags & TF_TRANSPARENT) + HWR_AddTransparentWall(wallVerts, Surf, texnum, PF_Environment, false, lightnum, colormap); else HWR_ProjectWall(wallVerts, Surf, PF_Masked, lightnum, colormap); - top = bot; + if (solid) + top = bheight; + else + top = height; #ifdef ESLOPE - endtop = endbot; + if (solid) + endtop = endbheight; + else + endtop = endheight; #endif } @@ -1284,7 +1270,17 @@ static void HWR_SplitWall(sector_t *sector, wallVert3D *wallVerts, INT32 texnum, if (top <= realbot) return; - Surf->FlatColor.s.alpha = alpha; + if (list[i-1].caster) + { + lightnum = *list[i-1].lightlevel; + colormap = list[i-1].extra_colormap; + } + else + { + lightnum = sector->lightlevel; + colormap = sector->extra_colormap; + } + Surf->FlatColor.s.alpha = alpha; #ifdef ESLOPE wallVerts[3].t = pegt + ((realtop - top) * pegmul); @@ -1306,14 +1302,119 @@ static void HWR_SplitWall(sector_t *sector, wallVert3D *wallVerts, INT32 texnum, wallVerts[0].y = wallVerts[1].y = bot; #endif - if (cutflag & FF_FOG) - HWR_AddTransparentWall(wallVerts, Surf, texnum, PF_Fog|PF_NoTexture, true, lightnum, colormap); - else if (cutflag & FF_TRANSLUCENT) + glTex = HWR_GetTexture(texnum); + if (cutflag & FF_TRANSLUCENT) HWR_AddTransparentWall(wallVerts, Surf, texnum, PF_Translucent, false, lightnum, colormap); + else if (glTex->mipmap.flags & TF_TRANSPARENT) + HWR_AddTransparentWall(wallVerts, Surf, texnum, PF_Environment, false, lightnum, colormap); else HWR_ProjectWall(wallVerts, Surf, PF_Masked, lightnum, colormap); } +// +// HWR_SplitFog +// Exclusively for fog +// +static void HWR_SplitFog(sector_t *sector, wallVert3D *wallVerts, FSurfaceInfo* Surf, UINT32 cutflag, FUINT lightnum, extracolormap_t *colormap) +{ + /* SoM: split up and light walls according to the + lightlist. This may also include leaving out parts + of the wall that can't be seen */ + float realtop, realbot, top, bot; + float pegt, pegb, pegmul; + float height = 0.0f, bheight = 0.0f; + INT32 solid, i; + lightlist_t * list = sector->lightlist; + const UINT8 alpha = Surf->FlatColor.s.alpha; + + realtop = top = wallVerts[2].y; + realbot = bot = wallVerts[0].y; + pegt = wallVerts[2].t; + pegb = wallVerts[0].t; + pegmul = (pegb - pegt) / (top - bot); + + for (i = 1; i < sector->numlights; i++) + { + if (top < realbot) + return; + + //Hurdler: fix a crashing bug, but is it correct? +// if (!list[i].caster) +// continue; + + solid = false; + + if (list[i].caster) + { + if (sector->lightlist[i].caster->flags & FF_FOG && cutflag & FF_FOG) // Only fog cuts fog + { + if (sector->lightlist[i].caster->flags & FF_EXTRA) + { + if (sector->lightlist[i].caster->flags == cutflag) // only cut by the same + solid = true; + } + else + solid = true; + } + } + + height = FIXED_TO_FLOAT(list[i].height); + + if (solid) + bheight = FIXED_TO_FLOAT(*list[i].caster->bottomheight); + + if (height >= top) + { + if (solid && top > bheight) + top = bheight; + continue; + } + + //Found a break; + bot = height; + + if (bot < realbot) + bot = realbot; + + { + + + + Surf->FlatColor.s.alpha = alpha; + } + + wallVerts[3].t = wallVerts[2].t = pegt + ((realtop - top) * pegmul); + wallVerts[0].t = wallVerts[1].t = pegt + ((realtop - bot) * pegmul); + + // set top/bottom coords + wallVerts[2].y = wallVerts[3].y = top; + wallVerts[0].y = wallVerts[1].y = bot; + + if (!solid) // Don't draw it if there's more fog behind it + HWR_AddTransparentWall(wallVerts, Surf, 0, PF_Translucent|PF_NoTexture, true, lightnum, colormap); + + top = height; + } + + bot = realbot; + if (top <= realbot) + return; + + { + + Surf->FlatColor.s.alpha = alpha; + } + + wallVerts[3].t = wallVerts[2].t = pegt + ((realtop - top) * pegmul); + wallVerts[0].t = wallVerts[1].t = pegt + ((realtop - bot) * pegmul); + + // set top/bottom coords + wallVerts[2].y = wallVerts[3].y = top; + wallVerts[0].y = wallVerts[1].y = bot; + + HWR_AddTransparentWall(wallVerts, Surf, 0, PF_Translucent|PF_NoTexture, true, lightnum, colormap); +} + // HWR_DrawSkyWalls // Draw walls into the depth buffer so that anything behind is culled properly static void HWR_DrawSkyWall(wallVert3D *wallVerts, FSurfaceInfo *Surf, fixed_t bottom, fixed_t top) @@ -1590,7 +1691,7 @@ static void HWR_StoreWallRange(double startfrac, double endfrac) #endif if (gr_frontsector->numlights) - HWR_SplitWall(gr_frontsector, wallVerts, gr_toptexture, &Surf, FF_CUTLEVEL, NULL); + HWR_SplitWall(gr_frontsector, wallVerts, gr_toptexture, &Surf, FF_CUTSOLIDS); else if (grTex->mipmap.flags & TF_TRANSPARENT) HWR_AddTransparentWall(wallVerts, &Surf, gr_toptexture, PF_Environment, false, lightnum, colormap); else @@ -1673,7 +1774,7 @@ static void HWR_StoreWallRange(double startfrac, double endfrac) #endif if (gr_frontsector->numlights) - HWR_SplitWall(gr_frontsector, wallVerts, gr_bottomtexture, &Surf, FF_CUTLEVEL, NULL); + HWR_SplitWall(gr_frontsector, wallVerts, gr_bottomtexture, &Surf, FF_CUTSOLIDS); else if (grTex->mipmap.flags & TF_TRANSPARENT) HWR_AddTransparentWall(wallVerts, &Surf, gr_bottomtexture, PF_Environment, false, lightnum, colormap); else @@ -1936,14 +2037,15 @@ static void HWR_StoreWallRange(double startfrac, double endfrac) } #endif + if (grTex->mipmap.flags & TF_TRANSPARENT) + blendmode = PF_Translucent; + if (gr_frontsector->numlights) { if (!(blendmode & PF_Masked)) - HWR_SplitWall(gr_frontsector, wallVerts, gr_midtexture, &Surf, FF_TRANSLUCENT, NULL); + HWR_SplitWall(gr_frontsector, wallVerts, gr_midtexture, &Surf, FF_TRANSLUCENT); else - { - HWR_SplitWall(gr_frontsector, wallVerts, gr_midtexture, &Surf, FF_CUTLEVEL, NULL); - } + HWR_SplitWall(gr_frontsector, wallVerts, gr_midtexture, &Surf, FF_CUTSOLIDS); } else if (!(blendmode & PF_Masked)) HWR_AddTransparentWall(wallVerts, &Surf, gr_midtexture, blendmode, false, lightnum, colormap); @@ -2094,7 +2196,7 @@ static void HWR_StoreWallRange(double startfrac, double endfrac) #endif // I don't think that solid walls can use translucent linedef types... if (gr_frontsector->numlights) - HWR_SplitWall(gr_frontsector, wallVerts, gr_midtexture, &Surf, FF_CUTLEVEL, NULL); + HWR_SplitWall(gr_frontsector, wallVerts, gr_midtexture, &Surf, FF_CUTSOLIDS); else { if (grTex->mipmap.flags & TF_TRANSPARENT) @@ -2216,7 +2318,7 @@ static void HWR_StoreWallRange(double startfrac, double endfrac) { FBITFIELD blendmode; - blendmode = PF_Fog|PF_NoTexture; + blendmode = PF_Translucent|PF_NoTexture; lightnum = rover->master->frontsector->lightlevel; colormap = rover->master->frontsector->extra_colormap; @@ -2224,15 +2326,15 @@ static void HWR_StoreWallRange(double startfrac, double endfrac) if (rover->master->frontsector->extra_colormap) { - Surf.FlatColor.s.alpha = HWR_FogBlockAlpha(rover->master->frontsector->lightlevel,rover->master->frontsector->extra_colormap->rgba); + Surf.FlatColor.s.alpha = HWR_FogBlockAlpha(rover->master->frontsector->lightlevel,rover->master->frontsector->extra_colormap->rgba,rover->master->frontsector->extra_colormap->fadergba); } else { - Surf.FlatColor.s.alpha = HWR_FogBlockAlpha(rover->master->frontsector->lightlevel,NORMALFOG); + Surf.FlatColor.s.alpha = HWR_FogBlockAlpha(rover->master->frontsector->lightlevel,NORMALFOG,FADEFOG); } if (gr_frontsector->numlights) - HWR_SplitWall(gr_frontsector, wallVerts, 0, &Surf, rover->flags, rover); + HWR_SplitFog(gr_frontsector, wallVerts, &Surf, rover->flags, lightnum, colormap); else HWR_AddTransparentWall(wallVerts, &Surf, 0, blendmode, true, lightnum, colormap); } @@ -2240,14 +2342,18 @@ static void HWR_StoreWallRange(double startfrac, double endfrac) { FBITFIELD blendmode = PF_Masked; - if (rover->flags & FF_TRANSLUCENT && rover->alpha < 256) + if (rover->flags & FF_TRANSLUCENT) { blendmode = PF_Translucent; Surf.FlatColor.s.alpha = (UINT8)rover->alpha-1 > 255 ? 255 : rover->alpha-1; } + else if (grTex->mipmap.flags & TF_TRANSPARENT) + { + blendmode = PF_Environment; + } if (gr_frontsector->numlights) - HWR_SplitWall(gr_frontsector, wallVerts, texnum, &Surf, rover->flags, rover); + HWR_SplitWall(gr_frontsector, wallVerts, texnum, &Surf, rover->flags); else { if (blendmode != PF_Masked) @@ -2336,22 +2442,22 @@ static void HWR_StoreWallRange(double startfrac, double endfrac) { FBITFIELD blendmode; - blendmode = PF_Fog|PF_NoTexture; + blendmode = PF_Translucent|PF_NoTexture; lightnum = rover->master->frontsector->lightlevel; colormap = rover->master->frontsector->extra_colormap; if (rover->master->frontsector->extra_colormap) { - Surf.FlatColor.s.alpha = HWR_FogBlockAlpha(rover->master->frontsector->lightlevel,rover->master->frontsector->extra_colormap->rgba); + Surf.FlatColor.s.alpha = HWR_FogBlockAlpha(rover->master->frontsector->lightlevel,rover->master->frontsector->extra_colormap->rgba,rover->master->frontsector->extra_colormap->fadergba); } else { - Surf.FlatColor.s.alpha = HWR_FogBlockAlpha(rover->master->frontsector->lightlevel,NORMALFOG); + Surf.FlatColor.s.alpha = HWR_FogBlockAlpha(rover->master->frontsector->lightlevel,NORMALFOG,FADEFOG); } if (gr_backsector->numlights) - HWR_SplitWall(gr_backsector, wallVerts, 0, &Surf, rover->flags, rover); + HWR_SplitFog(gr_backsector, wallVerts, &Surf, rover->flags, lightnum, colormap); else HWR_AddTransparentWall(wallVerts, &Surf, 0, blendmode, true, lightnum, colormap); } @@ -2359,14 +2465,18 @@ static void HWR_StoreWallRange(double startfrac, double endfrac) { FBITFIELD blendmode = PF_Masked; - if (rover->flags & FF_TRANSLUCENT && rover->alpha < 256) + if (rover->flags & FF_TRANSLUCENT) { blendmode = PF_Translucent; Surf.FlatColor.s.alpha = (UINT8)rover->alpha-1 > 255 ? 255 : rover->alpha-1; } + else if (grTex->mipmap.flags & TF_TRANSPARENT) + { + blendmode = PF_Environment; + } if (gr_backsector->numlights) - HWR_SplitWall(gr_backsector, wallVerts, texnum, &Surf, rover->flags, rover); + HWR_SplitWall(gr_backsector, wallVerts, texnum, &Surf, rover->flags); else { if (blendmode != PF_Masked) @@ -2680,7 +2790,7 @@ static void HWR_AddLine(seg_t * line) angle_t span, tspan; // SoM: Backsector needs to be run through R_FakeFlat - static sector_t tempsec; + sector_t tempsec; if (line->polyseg && !(line->polyseg->flags & POF_RENDERSIDES)) return; @@ -3239,7 +3349,7 @@ static void HWR_Subsector(size_t num) INT16 count; seg_t *line; subsector_t *sub; - static sector_t tempsec; //SoM: 4/7/2000 + sector_t tempsec; //SoM: 4/7/2000 INT32 floorlightlevel; INT32 ceilinglightlevel; INT32 locFloorHeight, locCeilingHeight; @@ -3422,6 +3532,8 @@ static void HWR_Subsector(size_t num) { /// \todo fix light, xoffs, yoffs, extracolormap ? ffloor_t * rover; + + R_Prep3DFloors(gr_frontsector); for (rover = gr_frontsector->ffloors; rover; rover = rover->next) { @@ -3455,19 +3567,19 @@ static void HWR_Subsector(size_t num) light = R_GetPlaneLight(gr_frontsector, centerHeight, dup_viewz < cullHeight ? true : false); if (rover->master->frontsector->extra_colormap) - alpha = HWR_FogBlockAlpha(*gr_frontsector->lightlist[light].lightlevel, rover->master->frontsector->extra_colormap->rgba); + alpha = HWR_FogBlockAlpha(*gr_frontsector->lightlist[light].lightlevel, rover->master->frontsector->extra_colormap->rgba, rover->master->frontsector->extra_colormap->fadergba); else - alpha = HWR_FogBlockAlpha(*gr_frontsector->lightlist[light].lightlevel, NORMALFOG); + alpha = HWR_FogBlockAlpha(*gr_frontsector->lightlist[light].lightlevel, NORMALFOG, FADEFOG); HWR_AddTransparentFloor(0, &extrasubsectors[num], false, *rover->bottomheight, *gr_frontsector->lightlist[light].lightlevel, - alpha, rover->master->frontsector, PF_Fog|PF_NoTexture, + alpha, rover->master->frontsector, PF_Translucent|PF_NoTexture, true, rover->master->frontsector->extra_colormap); } - else if (rover->flags & FF_TRANSLUCENT && rover->alpha < 256) // SoM: Flags are more efficient + else if (rover->flags & FF_TRANSLUCENT) // SoM: Flags are more efficient { light = R_GetPlaneLight(gr_frontsector, centerHeight, dup_viewz < cullHeight ? true : false); #ifndef SORTING @@ -3518,19 +3630,19 @@ static void HWR_Subsector(size_t num) light = R_GetPlaneLight(gr_frontsector, centerHeight, dup_viewz < cullHeight ? true : false); if (rover->master->frontsector->extra_colormap) - alpha = HWR_FogBlockAlpha(*gr_frontsector->lightlist[light].lightlevel, rover->master->frontsector->extra_colormap->rgba); + alpha = HWR_FogBlockAlpha(*gr_frontsector->lightlist[light].lightlevel, rover->master->frontsector->extra_colormap->rgba, rover->master->frontsector->extra_colormap->fadergba); else - alpha = HWR_FogBlockAlpha(*gr_frontsector->lightlist[light].lightlevel, NORMALFOG); + alpha = HWR_FogBlockAlpha(*gr_frontsector->lightlist[light].lightlevel, NORMALFOG, FADEFOG); HWR_AddTransparentFloor(0, &extrasubsectors[num], true, *rover->topheight, *gr_frontsector->lightlist[light].lightlevel, - alpha, rover->master->frontsector, PF_Fog|PF_NoTexture, + alpha, rover->master->frontsector, PF_Translucent|PF_NoTexture, true, rover->master->frontsector->extra_colormap); } - else if (rover->flags & FF_TRANSLUCENT && rover->alpha < 256) + else if (rover->flags & FF_TRANSLUCENT) { light = R_GetPlaneLight(gr_frontsector, centerHeight, dup_viewz < cullHeight ? true : false); #ifndef SORTING @@ -3932,10 +4044,12 @@ static boolean HWR_DoCulling(line_t *cullheight, line_t *viewcullheight, float v static void HWR_DrawSpriteShadow(gr_vissprite_t *spr, GLPatch_t *gpatch, float this_scale) { + UINT8 i; + float tr_x, tr_y; + FOutVector *wv; FOutVector swallVerts[4]; FSurfaceInfo sSurf; fixed_t floorheight, mobjfloor; - float offset = 0; mobjfloor = HWR_OpaqueFloorAtPos( spr->mobj->x, spr->mobj->y, @@ -3978,8 +4092,6 @@ static void HWR_DrawSpriteShadow(gr_vissprite_t *spr, GLPatch_t *gpatch, float t } floorheight = FixedInt(spr->mobj->z - floorheight); - - offset = floorheight; } else floorheight = FixedInt(spr->mobj->z - mobjfloor); @@ -3992,42 +4104,47 @@ static void HWR_DrawSpriteShadow(gr_vissprite_t *spr, GLPatch_t *gpatch, float t // 0--1 // x1/x2 were already scaled in HWR_ProjectSprite - // First match the normal sprite swallVerts[0].x = swallVerts[3].x = spr->x1; swallVerts[2].x = swallVerts[1].x = spr->x2; - swallVerts[0].z = swallVerts[3].z = spr->z1; - swallVerts[2].z = swallVerts[1].z = spr->z2; if (spr->mobj && this_scale != 1.0f) { // Always a pixel above the floor, perfectly flat. swallVerts[0].y = swallVerts[1].y = swallVerts[2].y = swallVerts[3].y = spr->ty - gpatch->topoffset * this_scale - (floorheight+3); - // Now transform the TOP vertices along the floor in the direction of the camera - swallVerts[3].x = spr->x1 + ((gpatch->height * this_scale) + offset) * gr_viewcos; - swallVerts[2].x = spr->x2 + ((gpatch->height * this_scale) + offset) * gr_viewcos; - swallVerts[3].z = spr->z1 + ((gpatch->height * this_scale) + offset) * gr_viewsin; - swallVerts[2].z = spr->z2 + ((gpatch->height * this_scale) + offset) * gr_viewsin; + swallVerts[0].z = swallVerts[1].z = spr->tz - (gpatch->height-gpatch->topoffset) * this_scale; + swallVerts[2].z = swallVerts[3].z = spr->tz + gpatch->topoffset * this_scale; } else { // Always a pixel above the floor, perfectly flat. swallVerts[0].y = swallVerts[1].y = swallVerts[2].y = swallVerts[3].y = spr->ty - gpatch->topoffset - (floorheight+3); - // Now transform the TOP vertices along the floor in the direction of the camera - swallVerts[3].x = spr->x1 + (gpatch->height + offset) * gr_viewcos; - swallVerts[2].x = spr->x2 + (gpatch->height + offset) * gr_viewcos; - swallVerts[3].z = spr->z1 + (gpatch->height + offset) * gr_viewsin; - swallVerts[2].z = spr->z2 + (gpatch->height + offset) * gr_viewsin; + // Spread out top away from the camera. (Fixme: Make it always move out in the same direction!... somehow.) + swallVerts[0].z = swallVerts[1].z = spr->tz - (gpatch->height-gpatch->topoffset); + swallVerts[2].z = swallVerts[3].z = spr->tz + gpatch->topoffset; } - // We also need to move the bottom ones away when shadowoffs is on - if (cv_shadowoffs.value) + // transform + wv = swallVerts; + + for (i = 0; i < 4; i++,wv++) { - swallVerts[0].x = spr->x1 + offset * gr_viewcos; - swallVerts[1].x = spr->x2 + offset * gr_viewcos; - swallVerts[0].z = spr->z1 + offset * gr_viewsin; - swallVerts[1].z = spr->z2 + offset * gr_viewsin; + // Offset away from the camera based on height from floor. + if (cv_shadowoffs.value) + wv->z += floorheight; + wv->z += 3; + + //look up/down ----TOTAL SUCKS!!!--- do the 2 in one!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + tr_x = wv->z; + tr_y = wv->y; + wv->y = (tr_x * gr_viewludcos) + (tr_y * gr_viewludsin); + wv->z = (tr_x * gr_viewludsin) - (tr_y * gr_viewludcos); + // ---------------------- mega lame test ---------------------------------- + + //scale y before frustum so that frustum can be scaled to screen height + wv->y *= ORIGINAL_ASPECT * gr_fovlud; + wv->x *= gr_fovlud; } if (spr->flip) @@ -4107,285 +4224,6 @@ static void HWR_DrawSpriteShadow(gr_vissprite_t *spr, GLPatch_t *gpatch, float t } } -static void HWR_SplitSprite(gr_vissprite_t *spr) -{ - float this_scale = 1.0f; - FOutVector wallVerts[4]; - GLPatch_t *gpatch; - FSurfaceInfo Surf; - const boolean hires = (spr->mobj && spr->mobj->skin && ((skin_t *)spr->mobj->skin)->flags & SF_HIRES); - extracolormap_t *colormap; - FUINT lightlevel; - FBITFIELD blend = 0; - UINT8 alpha; - - INT32 i; - float realtop, realbot, top, bot; - float towtop, towbot, towmult; - float bheight; - const sector_t *sector = spr->mobj->subsector->sector; - const lightlist_t *list = sector->lightlist; -#ifdef ESLOPE - float endrealtop, endrealbot, endtop, endbot; - float endbheight; - fixed_t temp; - fixed_t v1x, v1y, v2x, v2y; -#endif - - this_scale = FIXED_TO_FLOAT(spr->mobj->scale); - - if (hires) - this_scale = this_scale * FIXED_TO_FLOAT(((skin_t *)spr->mobj->skin)->highresscale); - - gpatch = W_CachePatchNum(spr->patchlumpnum, PU_CACHE); - - // cache the patch in the graphics card memory - //12/12/99: Hurdler: same comment as above (for md2) - //Hurdler: 25/04/2000: now support colormap in hardware mode - HWR_GetMappedPatch(gpatch, spr->colormap); - - // Draw shadow BEFORE sprite - if (cv_shadow.value // Shadows enabled - && (spr->mobj->flags & (MF_SCENERY|MF_SPAWNCEILING|MF_NOGRAVITY)) != (MF_SCENERY|MF_SPAWNCEILING|MF_NOGRAVITY) // Ceiling scenery have no shadow. - && !(spr->mobj->flags2 & MF2_DEBRIS) // Debris have no corona or shadow. -#ifdef ALAM_LIGHTING - && !(t_lspr[spr->mobj->sprite]->type // Things with dynamic lights have no shadow. - && (!spr->mobj->player || spr->mobj->player->powers[pw_super])) // Except for non-super players. -#endif - && (spr->mobj->z >= spr->mobj->floorz)) // Without this, your shadow shows on the floor, even after you die and fall through the ground. - { - //////////////////// - // SHADOW SPRITE! // - //////////////////// - HWR_DrawSpriteShadow(spr, gpatch, this_scale); - } - - wallVerts[0].x = wallVerts[3].x = spr->x1; - wallVerts[2].x = wallVerts[1].x = spr->x2; - wallVerts[0].z = wallVerts[3].z = spr->z1; - wallVerts[1].z = wallVerts[2].z = spr->z2; - - wallVerts[2].y = wallVerts[3].y = spr->ty; - if (spr->mobj && this_scale != 1.0f) - wallVerts[0].y = wallVerts[1].y = spr->ty - gpatch->height * this_scale; - else - wallVerts[0].y = wallVerts[1].y = spr->ty - gpatch->height; - - v1x = FLOAT_TO_FIXED(spr->x1); - v1y = FLOAT_TO_FIXED(spr->z1); - v2x = FLOAT_TO_FIXED(spr->x2); - v2y = FLOAT_TO_FIXED(spr->z2); - - if (spr->flip) - { - wallVerts[0].sow = wallVerts[3].sow = gpatch->max_s; - wallVerts[2].sow = wallVerts[1].sow = 0; - }else{ - wallVerts[0].sow = wallVerts[3].sow = 0; - wallVerts[2].sow = wallVerts[1].sow = gpatch->max_s; - } - - // flip the texture coords (look familiar?) - if (spr->vflip) - { - wallVerts[3].tow = wallVerts[2].tow = gpatch->max_t; - wallVerts[0].tow = wallVerts[1].tow = 0; - }else{ - wallVerts[3].tow = wallVerts[2].tow = 0; - wallVerts[0].tow = wallVerts[1].tow = gpatch->max_t; - } - - realtop = top = wallVerts[3].y; - realbot = bot = wallVerts[0].y; - towtop = wallVerts[3].tow; - towbot = wallVerts[0].tow; - towmult = (towbot - towtop) / (top - bot); - -#ifdef ESLOPE - endrealtop = endtop = wallVerts[2].y; - endrealbot = endbot = wallVerts[1].y; -#endif - - if (!cv_translucency.value) // translucency disabled - { - Surf.FlatColor.s.alpha = 0xFF; - blend = PF_Translucent|PF_Occlude; - } - else if (spr->mobj->flags2 & MF2_SHADOW) - { - Surf.FlatColor.s.alpha = 0x40; - blend = PF_Translucent; - } - else if (spr->mobj->frame & FF_TRANSMASK) - blend = HWR_TranstableToAlpha((spr->mobj->frame & FF_TRANSMASK)>>FF_TRANSSHIFT, &Surf); - else - { - // BP: i agree that is little better in environement but it don't - // work properly under glide nor with fogcolor to ffffff :( - // Hurdler: PF_Environement would be cool, but we need to fix - // the issue with the fog before - Surf.FlatColor.s.alpha = 0xFF; - blend = PF_Translucent|PF_Occlude; - } - - alpha = Surf.FlatColor.s.alpha; - - // Start with the lightlevel and colormap from the top of the sprite - lightlevel = *list[sector->numlights - 1].lightlevel; - colormap = list[sector->numlights - 1].extra_colormap; - i = 0; - temp = FLOAT_TO_FIXED(realtop); - -#ifdef ESLOPE - for (i = 1; i < sector->numlights; i++) - { - fixed_t h = sector->lightlist[i].slope ? P_GetZAt(sector->lightlist[i].slope, spr->mobj->x, spr->mobj->y) - : sector->lightlist[i].height; - if (h <= temp) - { - lightlevel = *list[i-1].lightlevel; - colormap = list[i-1].extra_colormap; - break; - } - } -#else - i = R_GetPlaneLight(sector, temp, false); - lightlevel = *list[i].lightlevel; - colormap = list[i].extra_colormap; -#endif - - for (i = 0; i < sector->numlights; i++) - { -#ifdef ESLOPE - if (endtop < endrealbot) -#endif - if (top < realbot) - return; - - // even if we aren't changing colormap or lightlevel, we still need to continue drawing down the sprite - if (!(list[i].flags & FF_NOSHADE) && (list[i].flags & FF_CUTSPRITES)) - { - lightlevel = *list[i].lightlevel; - colormap = list[i].extra_colormap; - } - -#ifdef ESLOPE - if (i + 1 < sector->numlights) - { - if (list[i+1].slope) - { - temp = P_GetZAt(list[i+1].slope, v1x, v1y); - bheight = FIXED_TO_FLOAT(temp); - temp = P_GetZAt(list[i+1].slope, v2x, v2y); - endbheight = FIXED_TO_FLOAT(temp); - } - else - bheight = endbheight = FIXED_TO_FLOAT(list[i+1].height); - } - else - { - bheight = realbot; - endbheight = endrealbot; - } -#else - if (i + 1 < sector->numlights) - { - bheight = FIXED_TO_FLOAT(list[i+1].height); - } - else - { - bheight = realbot; - } -#endif - -#ifdef ESLOPE - if (endbheight >= endtop) -#endif - if (bheight >= top) - continue; - - bot = bheight; - - if (bot < realbot) - bot = realbot; - -#ifdef ESLOPE - endbot = endbheight; - - if (endbot < endrealbot) - endbot = endrealbot; -#endif - -#ifdef ESLOPE - wallVerts[3].tow = towtop + ((realtop - top) * towmult); - wallVerts[2].tow = towtop + ((endrealtop - endtop) * towmult); - wallVerts[0].tow = towtop + ((realtop - bot) * towmult); - wallVerts[1].tow = towtop + ((endrealtop - endbot) * towmult); - - wallVerts[3].y = top; - wallVerts[2].y = endtop; - wallVerts[0].y = bot; - wallVerts[1].y = endbot; -#else - wallVerts[3].tow = wallVerts[2].tow = towtop + ((realtop - top) * towmult); - wallVerts[0].tow = wallVerts[1].tow = towtop + ((realtop - bot) * towmult); - - wallVerts[2].y = wallVerts[3].y = top; - wallVerts[0].y = wallVerts[1].y = bot; -#endif - - if (colormap) - Surf.FlatColor.rgba = HWR_Lighting(lightlevel, colormap->rgba, colormap->fadergba, false, false); - else - Surf.FlatColor.rgba = HWR_Lighting(lightlevel, NORMALFOG, FADEFOG, false, false); - - Surf.FlatColor.s.alpha = alpha; - - HWD.pfnDrawPolygon(&Surf, wallVerts, 4, blend|PF_Modulated|PF_Clip); - - top = bot; -#ifdef ESLOPE - endtop = endbot; -#endif - } - - bot = realbot; -#ifdef ESLOPE - endbot = endrealbot; - if (endtop <= endrealbot) -#endif - if (top <= realbot) - return; - - // If we're ever down here, somehow the above loop hasn't draw all the light levels of sprite -#ifdef ESLOPE - wallVerts[3].tow = towtop + ((realtop - top) * towmult); - wallVerts[2].tow = towtop + ((endrealtop - endtop) * towmult); - wallVerts[0].tow = towtop + ((realtop - bot) * towmult); - wallVerts[1].tow = towtop + ((endrealtop - endbot) * towmult); - - wallVerts[3].y = top; - wallVerts[2].y = endtop; - wallVerts[0].y = bot; - wallVerts[1].y = endbot; -#else - wallVerts[3].tow = wallVerts[2].tow = towtop + ((realtop - top) * towmult); - wallVerts[0].tow = wallVerts[1].tow = towtop + ((realtop - bot) * towmult); - - wallVerts[2].y = wallVerts[3].y = top; - wallVerts[0].y = wallVerts[1].y = bot; -#endif - - if (colormap) - Surf.FlatColor.rgba = HWR_Lighting(lightlevel, colormap->rgba, colormap->fadergba, false, false); - else - Surf.FlatColor.rgba = HWR_Lighting(lightlevel, NORMALFOG, FADEFOG, false, false); - - Surf.FlatColor.s.alpha = alpha; - - HWD.pfnDrawPolygon(&Surf, wallVerts, 4, blend|PF_Modulated|PF_Clip); -} - // -----------------+ // HWR_DrawSprite : Draw flat sprites // : (monsters, bonuses, weapons, lights, ...) @@ -4393,8 +4231,10 @@ static void HWR_SplitSprite(gr_vissprite_t *spr) // -----------------+ static void HWR_DrawSprite(gr_vissprite_t *spr) { - float this_scale = 1.0f; + UINT8 i; + float tr_x, tr_y, this_scale = 1.0f; FOutVector wallVerts[4]; + FOutVector *wv; GLPatch_t *gpatch; // sprite patch converted to hardware FSurfaceInfo Surf; const boolean hires = (spr->mobj && spr->mobj->skin && ((skin_t *)spr->mobj->skin)->flags & SF_HIRES); @@ -4410,12 +4250,6 @@ static void HWR_DrawSprite(gr_vissprite_t *spr) if (!spr->mobj->subsector) return; - if (spr->mobj->subsector->sector->numlights) - { - HWR_SplitSprite(spr); - return; - } - // cache sprite graphics //12/12/99: Hurdler: // OK, I don't change anything for MD2 support because I want to be @@ -4449,7 +4283,24 @@ static void HWR_DrawSprite(gr_vissprite_t *spr) // make a wall polygon (with 2 triangles), using the floor/ceiling heights, // and the 2d map coords of start/end vertices wallVerts[0].z = wallVerts[3].z = spr->z1; - wallVerts[1].z = wallVerts[2].z = spr->z2; + wallVerts[2].z = wallVerts[1].z = spr->z2; + + // transform + wv = wallVerts; + + for (i = 0; i < 4; i++,wv++) + { + //look up/down ----TOTAL SUCKS!!!--- do the 2 in one!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + tr_x = wv->z; + tr_y = wv->y; + wv->y = (tr_x * gr_viewludcos) + (tr_y * gr_viewludsin); + wv->z = (tr_x * gr_viewludsin) - (tr_y * gr_viewludcos); + // ---------------------- mega lame test ---------------------------------- + + //scale y before frustum so that frustum can be scaled to screen height + wv->y *= ORIGINAL_ASPECT * gr_fovlud; + wv->x *= gr_fovlud; + } if (spr->flip) { @@ -4501,8 +4352,26 @@ static void HWR_DrawSprite(gr_vissprite_t *spr) UINT8 lightlevel = 255; extracolormap_t *colormap = sector->extra_colormap; - if (!(spr->mobj->frame & FF_FULLBRIGHT)) - lightlevel = sector->lightlevel; + if (sector->numlights) + { + INT32 light; + + light = R_GetPlaneLight(sector, spr->mobj->z + spr->mobj->height, false); // Always use the light at the top instead of whatever I was doing before + + if (!(spr->mobj->frame & FF_FULLBRIGHT)) + lightlevel = *sector->lightlist[light].lightlevel; + + if (sector->lightlist[light].extra_colormap) + colormap = sector->lightlist[light].extra_colormap; + } + else + { + if (!(spr->mobj->frame & FF_FULLBRIGHT)) + lightlevel = sector->lightlevel; + + if (sector->extra_colormap) + colormap = sector->extra_colormap; + } if (colormap) Surf.FlatColor.rgba = HWR_Lighting(lightlevel, colormap->rgba, colormap->fadergba, false, false); @@ -4542,8 +4411,11 @@ static void HWR_DrawSprite(gr_vissprite_t *spr) // Sprite drawer for precipitation static inline void HWR_DrawPrecipitationSprite(gr_vissprite_t *spr) { + UINT8 i; FBITFIELD blend = 0; + float tr_x, tr_y; FOutVector wallVerts[4]; + FOutVector *wv; GLPatch_t *gpatch; // sprite patch converted to hardware FSurfaceInfo Surf; @@ -4569,8 +4441,24 @@ static inline void HWR_DrawPrecipitationSprite(gr_vissprite_t *spr) // make a wall polygon (with 2 triangles), using the floor/ceiling heights, // and the 2d map coords of start/end vertices - wallVerts[0].z = wallVerts[3].z = spr->z1; - wallVerts[1].z = wallVerts[2].z = spr->z2; + wallVerts[0].z = wallVerts[1].z = wallVerts[2].z = wallVerts[3].z = spr->tz; + + // transform + wv = wallVerts; + + for (i = 0; i < 4; i++, wv++) + { + //look up/down ----TOTAL SUCKS!!!--- do the 2 in one!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + tr_x = wv->z; + tr_y = wv->y; + wv->y = (tr_x * gr_viewludcos) + (tr_y * gr_viewludsin); + wv->z = (tr_x * gr_viewludsin) - (tr_y * gr_viewludcos); + // ---------------------- mega lame test ---------------------------------- + + //scale y before frustum so that frustum can be scaled to screen height + wv->y *= ORIGINAL_ASPECT * gr_fovlud; + wv->x *= gr_fovlud; + } wallVerts[0].sow = wallVerts[3].sow = 0; wallVerts[2].sow = wallVerts[1].sow = gpatch->max_s; @@ -4703,33 +4591,6 @@ static void HWR_SortVisSprites(void) gr_vsprsortedhead.prev->next = best; gr_vsprsortedhead.prev = best; } - - // Sryder: Oh boy, while it's nice having ALL the sprites sorted properly, it fails when we bring MD2's into the - // mix and they want to be translucent. So let's place all the translucent sprites and MD2's AFTER - // everything else, but still ordered of course, the depth buffer can handle the opaque ones plenty fine. - // We just need to move all translucent ones to the end in order - // TODO: Fully sort all sprites and MD2s with walls and floors, this part will be unnecessary after that - best = gr_vsprsortedhead.next; - for (i = 0; i < gr_visspritecount; i++) - { - if ((best->mobj->flags2 & MF2_SHADOW) || (best->mobj->frame & FF_TRANSMASK)) - { - if (best == gr_vsprsortedhead.next) - { - gr_vsprsortedhead.next = best->next; - } - best->prev->next = best->next; - best->next->prev = best->prev; - best->prev = gr_vsprsortedhead.prev; - gr_vsprsortedhead.prev->next = best; - gr_vsprsortedhead.prev = best; - ds = best; - best = best->next; - ds->next = &gr_vsprsortedhead; - } - else - best = best->next; - } } // A drawnode is something that points to a 3D floor, 3D side, or masked @@ -5063,7 +4924,6 @@ static void HWR_CreateDrawNodes(void) // Draw all vissprites // -------------------------------------------------------------------------- #ifdef SORTING -// added the stransform so they can be switched as drawing happenes so MD2s and sprites are sorted correctly with each other static void HWR_DrawSprites(void) { if (gr_visspritecount > 0) @@ -5084,20 +4944,44 @@ static void HWR_DrawSprites(void) { if (!cv_grmd2.value || md2_playermodels[(skin_t*)spr->mobj->skin-skins].notfound || md2_playermodels[(skin_t*)spr->mobj->skin-skins].scale < 0.0f) HWR_DrawSprite(spr); - else - HWR_DrawMD2(spr); - } - else - { - if (!cv_grmd2.value || md2_models[spr->mobj->sprite].notfound || md2_models[spr->mobj->sprite].scale < 0.0f) - HWR_DrawSprite(spr); - else - HWR_DrawMD2(spr); } + else if (!cv_grmd2.value || md2_models[spr->mobj->sprite].notfound || md2_models[spr->mobj->sprite].scale < 0.0f) + HWR_DrawSprite(spr); } } } #endif +// -------------------------------------------------------------------------- +// Draw all MD2 +// -------------------------------------------------------------------------- +static void HWR_DrawMD2S(void) +{ + if (gr_visspritecount > 0) + { + gr_vissprite_t *spr; + + // draw all MD2 back to front + for (spr = gr_vsprsortedhead.next; + spr != &gr_vsprsortedhead; + spr = spr->next) + { +#ifdef HWPRECIP + if (!spr->precip) + { +#endif + if (spr->mobj && spr->mobj->skin && spr->mobj->sprite == SPR_PLAY) + { + if (md2_playermodels[(skin_t*)spr->mobj->skin-skins].notfound == false && md2_playermodels[(skin_t*)spr->mobj->skin-skins].scale > 0.0f) + HWR_DrawMD2(spr); + } + else if (md2_models[spr->mobj->sprite].notfound == false && md2_models[spr->mobj->sprite].scale > 0.0f) + HWR_DrawMD2(spr); +#ifdef HWPRECIP + } +#endif + } + } +} // -------------------------------------------------------------------------- // HWR_AddSprites @@ -5182,10 +5066,8 @@ static void HWR_ProjectSprite(mobj_t *thing) { gr_vissprite_t *vis; float tr_x, tr_y; - float tz; + float tx, tz; float x1, x2; - float z1, z2; - float rightsin, rightcos; float this_scale; float gz, gzt; spritedef_t *sprdef; @@ -5196,7 +5078,9 @@ static void HWR_ProjectSprite(mobj_t *thing) angle_t ang; INT32 heightsec, phs; const boolean papersprite = (thing->frame & FF_PAPERSPRITE); + float offset; float ang_scale = 1.0f, ang_scalez = 0.0f; + float z1, z2; if (!thing) return; @@ -5214,9 +5098,7 @@ static void HWR_ProjectSprite(mobj_t *thing) if (tz < ZCLIP_PLANE && !papersprite && (!cv_grmd2.value || md2_models[thing->sprite].notfound == true)) //Yellow: Only MD2's dont disappear return; - // The above can stay as it works for cutting sprites that are too close - tr_x = FIXED_TO_FLOAT(thing->x); - tr_y = FIXED_TO_FLOAT(thing->y); + tx = (tr_x * gr_viewsin) - (tr_y * gr_viewcos); // decide which patch to use for sprite relative to player #ifdef RANGECHECK @@ -5302,27 +5184,33 @@ static void HWR_ProjectSprite(mobj_t *thing) if (thing->skin && ((skin_t *)thing->skin)->flags & SF_HIRES) this_scale = this_scale * FIXED_TO_FLOAT(((skin_t *)thing->skin)->highresscale); - rightsin = FIXED_TO_FLOAT(FINESINE((viewangle + ANGLE_90)>>ANGLETOFINESHIFT)); - rightcos = FIXED_TO_FLOAT(FINECOSINE((viewangle + ANGLE_90)>>ANGLETOFINESHIFT)); + // calculate edges of the shape if (flip) - { - x1 = (FIXED_TO_FLOAT(spritecachedinfo[lumpoff].width - spritecachedinfo[lumpoff].offset) * this_scale); - x2 = (FIXED_TO_FLOAT(spritecachedinfo[lumpoff].offset) * this_scale); - } + offset = FIXED_TO_FLOAT(spritecachedinfo[lumpoff].width - spritecachedinfo[lumpoff].offset) * this_scale; else - { - x1 = (FIXED_TO_FLOAT(spritecachedinfo[lumpoff].offset) * this_scale); - x2 = (FIXED_TO_FLOAT(spritecachedinfo[lumpoff].width - spritecachedinfo[lumpoff].offset) * this_scale); - } + offset = FIXED_TO_FLOAT(spritecachedinfo[lumpoff].offset) * this_scale; - z1 = tr_y + x1 * rightsin; - z2 = tr_y - x2 * rightsin; + z1 = tz - (offset * ang_scalez); + tx -= offset * ang_scale; + + // project x + x1 = gr_windowcenterx + (tx * gr_centerx / tz); + + //faB : tr_x doesnt matter + // hurdler: it's used in cliptosolidsegs + tr_x = x1; + + x1 = tx; + + offset = FIXED_TO_FLOAT(spritecachedinfo[lumpoff].width) * this_scale; + + z2 = z1 + (offset * ang_scalez); + tx += offset * ang_scale; if (papersprite && max(z1, z2) < ZCLIP_PLANE) return; - x1 = tr_x + x1 * rightcos; - x2 = tr_x - x2 * rightcos; + x2 = gr_windowcenterx + (tx * gr_centerx / tz); if (thing->eflags & MFE_VERTICALFLIP) { @@ -5359,10 +5247,13 @@ static void HWR_ProjectSprite(mobj_t *thing) // store information in a vissprite vis = HWR_NewVisSprite(); vis->x1 = x1; +#if 0 vis->x2 = x2; - vis->z1 = z1; - vis->z2 = z2; - vis->tz = tz; // Keep tz for the simple sprite sorting that happens +#else + (void)x2; +#endif + vis->x2 = tx; + vis->tz = tz; vis->dispoffset = thing->info->dispoffset; // Monster Iestyn: 23/11/15: HARDWARE SUPPORT AT LAST vis->patchlumpnum = sprframe->lumppat[rot]; vis->flip = flip; @@ -5405,7 +5296,7 @@ static void HWR_ProjectSprite(mobj_t *thing) vis->colormap = colormaps; // set top/bottom coords - vis->ty = gzt; + vis->ty = gzt - gr_viewz; //CONS_Debug(DBG_RENDER, "------------------\nH: sprite : %d\nH: frame : %x\nH: type : %d\nH: sname : %s\n\n", // thing->sprite, thing->frame, thing->type, sprnames[thing->sprite]); @@ -5424,10 +5315,8 @@ static void HWR_ProjectPrecipitationSprite(precipmobj_t *thing) { gr_vissprite_t *vis; float tr_x, tr_y; - float tz; + float tx, tz; float x1, x2; - float z1, z2; - float rightsin, rightcos; spritedef_t *sprdef; spriteframe_t *sprframe; size_t lumpoff; @@ -5445,8 +5334,7 @@ static void HWR_ProjectPrecipitationSprite(precipmobj_t *thing) if (tz < ZCLIP_PLANE) return; - tr_x = FIXED_TO_FLOAT(thing->x); - tr_y = FIXED_TO_FLOAT(thing->y); + tx = (tr_x * gr_viewsin) - (tr_y * gr_viewcos); // decide which patch to use for sprite relative to player if ((unsigned)thing->sprite >= numsprites) @@ -5473,32 +5361,32 @@ static void HWR_ProjectPrecipitationSprite(precipmobj_t *thing) lumpoff = sprframe->lumpid[0]; flip = sprframe->flip; // Will only be 0x00 or 0xFF - rightsin = FIXED_TO_FLOAT(FINESINE((viewangle + ANGLE_90)>>ANGLETOFINESHIFT)); - rightcos = FIXED_TO_FLOAT(FINECOSINE((viewangle + ANGLE_90)>>ANGLETOFINESHIFT)); - if (flip) - { - x1 = FIXED_TO_FLOAT(spritecachedinfo[lumpoff].width - spritecachedinfo[lumpoff].offset); - x2 = FIXED_TO_FLOAT(spritecachedinfo[lumpoff].offset); - } - else - { - x1 = FIXED_TO_FLOAT(spritecachedinfo[lumpoff].offset); - x2 = FIXED_TO_FLOAT(spritecachedinfo[lumpoff].width - spritecachedinfo[lumpoff].offset); - } + // calculate edges of the shape + tx -= FIXED_TO_FLOAT(spritecachedinfo[lumpoff].offset); - z1 = tr_y + x1 * rightsin; - z2 = tr_y - x2 * rightsin; - x1 = tr_x + x1 * rightcos; - x2 = tr_x - x2 * rightcos; + // project x + x1 = gr_windowcenterx + (tx * gr_centerx / tz); + + //faB : tr_x doesnt matter + // hurdler: it's used in cliptosolidsegs + tr_x = x1; + + x1 = tx; + + tx += FIXED_TO_FLOAT(spritecachedinfo[lumpoff].width); + x2 = gr_windowcenterx + (tx * gr_centerx / tz); // // store information in a vissprite // vis = HWR_NewVisSprite(); vis->x1 = x1; +#if 0 vis->x2 = x2; - vis->z1 = z1; - vis->z2 = z2; +#else + (void)x2; +#endif + vis->x2 = tx; vis->tz = tz; vis->dispoffset = 0; // Monster Iestyn: 23/11/15: HARDWARE SUPPORT AT LAST vis->patchlumpnum = sprframe->lumppat[rot]; @@ -5508,7 +5396,7 @@ static void HWR_ProjectPrecipitationSprite(precipmobj_t *thing) vis->colormap = colormaps; // set top/bottom coords - vis->ty = FIXED_TO_FLOAT(thing->z + spritecachedinfo[lumpoff].topoffset); + vis->ty = FIXED_TO_FLOAT(thing->z + spritecachedinfo[lumpoff].topoffset) - gr_viewz; vis->precip = true; } @@ -5536,13 +5424,12 @@ static void HWR_DrawSkyBackground(player_t *player) //Hurdler: the sky is the only texture who need 4.0f instead of 1.0 // because it's called just after clearing the screen // and thus, the near clipping plane is set to 3.99 - // Sryder: Just use the near clipping plane value then - v[0].x = v[3].x = -ZCLIP_PLANE-1; - v[1].x = v[2].x = ZCLIP_PLANE+1; - v[0].y = v[1].y = -ZCLIP_PLANE-1; - v[2].y = v[3].y = ZCLIP_PLANE+1; + v[0].x = v[3].x = -4.0f; + v[1].x = v[2].x = 4.0f; + v[0].y = v[1].y = -4.0f; + v[2].y = v[3].y = 4.0f; - v[0].z = v[1].z = v[2].z = v[3].z = ZCLIP_PLANE+1; + v[0].z = v[1].z = v[2].z = v[3].z = 4.0f; // X @@ -5615,7 +5502,7 @@ static inline void HWR_ClearView(void) (INT32)gr_viewwindowy, (INT32)(gr_viewwindowx + gr_viewwidth), (INT32)(gr_viewwindowy + gr_viewheight), - ZCLIP_PLANE); + 3.99f); HWD.pfnClearBuffer(false, true, 0); //disable clip window - set to full size @@ -5650,8 +5537,6 @@ void HWR_SetViewSize(void) gr_pspritexscale = ((vid.width*gr_pspriteyscale*BASEVIDHEIGHT)/BASEVIDWIDTH)/vid.height; gr_pspriteyscale = ((vid.height*gr_pspritexscale*BASEVIDWIDTH)/BASEVIDHEIGHT)/vid.width; - - HWD.pfnFlushScreenTextures(); } // ========================================================================== @@ -5660,6 +5545,7 @@ void HWR_SetViewSize(void) void HWR_RenderSkyboxView(INT32 viewnumber, player_t *player) { const float fpov = FIXED_TO_FLOAT(cv_grfov.value+player->fovadd); + FTransform stransform; postimg_t *type; if (splitscreen && player == &players[secondarydisplayplayer]) @@ -5742,12 +5628,36 @@ void HWR_RenderSkyboxView(INT32 viewnumber, player_t *player) atransform.y = gr_viewy; // FIXED_TO_FLOAT(viewy) atransform.z = gr_viewz; // FIXED_TO_FLOAT(viewz) atransform.scalex = 1; - atransform.scaley = (float)vid.width/vid.height; + atransform.scaley = ORIGINAL_ASPECT; atransform.scalez = 1; atransform.fovxangle = fpov; // Tails atransform.fovyangle = fpov; // Tails atransform.splitscreen = splitscreen; + // Transform for sprites + stransform.anglex = 0.0f; + stransform.angley = -270.0f; + + if (*type == postimg_flip) + stransform.flip = true; + else + stransform.flip = false; + + if (*type == postimg_mirror) + stransform.mirror = true; + else + stransform.mirror = false; + + stransform.x = 0.0f; + stransform.y = 0.0f; + stransform.z = 0.0f; + stransform.scalex = 1; + stransform.scaley = 1; + stransform.scalez = 1; + stransform.fovxangle = 90.0f; + stransform.fovyangle = 90.0f; + stransform.splitscreen = splitscreen; + gr_fovlud = (float)(1.0l/tan((double)(fpov*M_PIl/360l))); //------------------------------------------------------------------------ @@ -5830,7 +5740,10 @@ if (0) #ifdef SORTING HWR_SortVisSprites(); #endif + HWR_DrawMD2S(); + // Draw the sprites with trivial transform + HWD.pfnSetTransform(&stransform); #ifdef SORTING HWR_DrawSprites(); #endif @@ -5875,6 +5788,7 @@ if (0) void HWR_RenderPlayerView(INT32 viewnumber, player_t *player) { const float fpov = FIXED_TO_FLOAT(cv_grfov.value+player->fovadd); + FTransform stransform; postimg_t *type; const boolean skybox = (skyboxmo[0] && cv_skybox.value); // True if there's a skybox object and skyboxes are on @@ -5972,12 +5886,36 @@ void HWR_RenderPlayerView(INT32 viewnumber, player_t *player) atransform.y = gr_viewy; // FIXED_TO_FLOAT(viewy) atransform.z = gr_viewz; // FIXED_TO_FLOAT(viewz) atransform.scalex = 1; - atransform.scaley = (float)vid.width/vid.height; + atransform.scaley = ORIGINAL_ASPECT; atransform.scalez = 1; atransform.fovxangle = fpov; // Tails atransform.fovyangle = fpov; // Tails atransform.splitscreen = splitscreen; + // Transform for sprites + stransform.anglex = 0.0f; + stransform.angley = -270.0f; + + if (*type == postimg_flip) + stransform.flip = true; + else + stransform.flip = false; + + if (*type == postimg_mirror) + stransform.mirror = true; + else + stransform.mirror = false; + + stransform.x = 0.0f; + stransform.y = 0.0f; + stransform.z = 0.0f; + stransform.scalex = 1; + stransform.scaley = 1; + stransform.scalez = 1; + stransform.fovxangle = 90.0f; + stransform.fovyangle = 90.0f; + stransform.splitscreen = splitscreen; + gr_fovlud = (float)(1.0l/tan((double)(fpov*M_PIl/360l))); //------------------------------------------------------------------------ @@ -6060,7 +5998,10 @@ if (0) #ifdef SORTING HWR_SortVisSprites(); #endif + HWR_DrawMD2S(); + // Draw the sprites with trivial transform + HWD.pfnSetTransform(&stransform); #ifdef SORTING HWR_DrawSprites(); #endif @@ -6251,7 +6192,6 @@ void HWR_Shutdown(void) HWR_FreeExtraSubsectors(); HWR_FreePolyPool(); HWR_FreeTextureCache(); - HWD.pfnFlushScreenTextures(); } void transform(float *cx, float *cy, float *cz) diff --git a/src/hardware/r_opengl/r_opengl.c b/src/hardware/r_opengl/r_opengl.c index 8316397c..7bab2dbc 100644 --- a/src/hardware/r_opengl/r_opengl.c +++ b/src/hardware/r_opengl/r_opengl.c @@ -59,7 +59,7 @@ typedef struct GLRGBAFloat GLRGBAFloat; #define N_PI_DEMI (M_PIl/2.0f) //(1.5707963268f) #define ASPECT_RATIO (1.0f) //(320.0f/200.0f) -#define FAR_CLIPPING_PLANE 32768.0f // Draw further! Tails 01-21-2001 +#define FAR_CLIPPING_PLANE 150000.0f // Draw further! Tails 01-21-2001 static float NEAR_CLIPPING_PLANE = NZCLIP_PLANE; // ************************************************************************** @@ -107,19 +107,10 @@ static GLint viewport[4]; #endif // Yay for arbitrary numbers! NextTexAvail is buggy for some reason. -// Sryder: NextTexAvail is broken for these because palette changes or changes to the texture filter or antialiasing -// flush all of the stored textures, leaving them unavailable at times such as between levels -// These need to start at 0 and be set to their number, and be reset to 0 when deleted so that intel GPUs -// can know when the textures aren't there, as textures are always considered resident in their virtual memory -// TODO: Store them in a more normal way -#define SCRTEX_SCREENTEXTURE 65535 -#define SCRTEX_STARTSCREENWIPE 65534 -#define SCRTEX_ENDSCREENWIPE 65533 -#define SCRTEX_FINALSCREENTEXTURE 65532 -static GLuint screentexture = 0; -static GLuint startScreenWipe = 0; -static GLuint endScreenWipe = 0; -static GLuint finalScreenTexture = 0; +static GLuint screentexture = 60000; +static GLuint startScreenWipe = 60001; +static GLuint endScreenWipe = 60002; +static GLuint finalScreenTexture = 60003; #if 0 GLuint screentexture = FIRST_TEX_AVAIL; #endif @@ -272,7 +263,6 @@ FUNCPRINTF void DBG_Printf(const char *lpFmt, ...) /* texture mapping */ //GL_EXT_copy_texture #ifndef KOS_GL_COMPATIBILITY #define pglCopyTexImage2D glCopyTexImage2D -#define pglCopyTexSubImage2D glCopyTexSubImage2D #endif #else //!STATIC_OPENGL @@ -397,8 +387,6 @@ static PFNglBindTexture pglBindTexture; /* texture mapping */ //GL_EXT_copy_texture typedef void (APIENTRY * PFNglCopyTexImage2D) (GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border); static PFNglCopyTexImage2D pglCopyTexImage2D; -typedef void (APIENTRY * PFNglCopyTexSubImage2D) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height); -static PFNglCopyTexSubImage2D pglCopyTexSubImage2D; #endif /* GLU functions */ typedef GLint (APIENTRY * PFNgluBuild2DMipmaps) (GLenum target, GLint internalFormat, GLsizei width, GLsizei height, GLenum format, GLenum type, const void *data); @@ -515,7 +503,6 @@ boolean SetupGLfunc(void) GETOPENGLFUNC(pglBindTexture , glBindTexture) GETOPENGLFUNC(pglCopyTexImage2D , glCopyTexImage2D) - GETOPENGLFUNC(pglCopyTexSubImage2D , glCopyTexSubImage2D) #undef GETOPENGLFUNC @@ -667,10 +654,6 @@ void SetModelView(GLint w, GLint h) { // DBG_Printf("SetModelView(): %dx%d\n", (int)w, (int)h); - // The screen textures need to be flushed if the width or height change so that they be remade for the correct size - if (screen_width != w || screen_height != h) - FlushScreenTextures(); - screen_width = w; screen_height = h; @@ -818,7 +801,6 @@ void Flush(void) screentexture = FIRST_TEX_AVAIL; } #endif - tex_downloaded = 0; } @@ -1074,56 +1056,30 @@ EXPORT void HWRAPI(SetBlend) (FBITFIELD PolyFlags) switch (PolyFlags & PF_Blending) { case PF_Translucent & PF_Blending: pglBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); // alpha = level of transparency -#ifndef KOS_GL_COMPATIBILITY - pglAlphaFunc(GL_NOTEQUAL, 0.0f); -#endif break; case PF_Masked & PF_Blending: // Hurdler: does that mean lighting is only made by alpha src? // it sounds ok, but not for polygonsmooth pglBlendFunc(GL_SRC_ALPHA, GL_ZERO); // 0 alpha = holes in texture -#ifndef KOS_GL_COMPATIBILITY - pglAlphaFunc(GL_GREATER, 0.5f); -#endif break; case PF_Additive & PF_Blending: #ifdef ATI_RAGE_PRO_COMPATIBILITY pglBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); // alpha = level of transparency #else pglBlendFunc(GL_SRC_ALPHA, GL_ONE); // src * alpha + dest -#endif -#ifndef KOS_GL_COMPATIBILITY - pglAlphaFunc(GL_NOTEQUAL, 0.0f); #endif break; case PF_Environment & PF_Blending: pglBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA); -#ifndef KOS_GL_COMPATIBILITY - pglAlphaFunc(GL_NOTEQUAL, 0.0f); -#endif break; case PF_Substractive & PF_Blending: // good for shadow // not realy but what else ? pglBlendFunc(GL_ZERO, GL_ONE_MINUS_SRC_COLOR); -#ifndef KOS_GL_COMPATIBILITY - pglAlphaFunc(GL_NOTEQUAL, 0.0f); -#endif - break; - case PF_Fog & PF_Fog: - // Sryder: Fog - // multiplies input colour by input alpha, and destination colour by input colour, then adds them - pglBlendFunc(GL_SRC_ALPHA, GL_SRC_COLOR); -#ifndef KOS_GL_COMPATIBILITY - pglAlphaFunc(GL_NOTEQUAL, 0.0f); -#endif break; default : // must be 0, otherwise it's an error // No blending pglBlendFunc(GL_ONE, GL_ZERO); // the same as no blending -#ifndef KOS_GL_COMPATIBILITY - pglAlphaFunc(GL_GREATER, 0.5f); -#endif break; } } @@ -1383,7 +1339,6 @@ EXPORT void HWRAPI(SetTexture) (FTextureInfo *pTexInfo) tex[w*j+i].s.green = 0; tex[w*j+i].s.blue = 0; tex[w*j+i].s.alpha = 0; - pTexInfo->flags |= TF_TRANSPARENT; // there is a hole in it } else { @@ -1454,22 +1409,8 @@ EXPORT void HWRAPI(SetTexture) (FTextureInfo *pTexInfo) tex_downloaded = pTexInfo->downloaded; pglBindTexture(GL_TEXTURE_2D, pTexInfo->downloaded); - // disable texture filtering on any texture that has holes so there's no dumb borders or blending issues - if (pTexInfo->flags & TF_TRANSPARENT) - { -#ifdef KOS_GL_COMPATIBILITY - pglTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NONE); - pglTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NONE); -#else - pglTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); - pglTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); -#endif - } - else - { - pglTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, mag_filter); - pglTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, min_filter); - } + pglTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, mag_filter); + pglTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, min_filter); #ifdef KOS_GL_COMPATIBILITY pglTexImage2D(GL_TEXTURE_2D, 0, GL_ARGB4444, w, h, 0, GL_ARGB4444, GL_UNSIGNED_BYTE, ptex); @@ -1923,6 +1864,12 @@ static void DrawMD2Ex(INT32 *gl_cmd_buffer, md2_frame_t *frame, INT32 duration, ambient[1] = 0.75f; if (ambient[2] > 0.75f) ambient[2] = 0.75f; + + if (color[3] < 255) + { + pglBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); + pglDepthMask(GL_FALSE); + } } pglEnable(GL_CULL_FACE); @@ -1951,12 +1898,10 @@ static void DrawMD2Ex(INT32 *gl_cmd_buffer, md2_frame_t *frame, INT32 duration, pglMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT, ambient); pglMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, diffuse); #endif - if (color[3] < 255) - SetBlend(PF_Translucent|PF_Modulated|PF_Clip); - else - SetBlend(PF_Masked|PF_Modulated|PF_Occlude|PF_Clip); } + DrawPolygon(NULL, NULL, 0, PF_Masked|PF_Modulated|PF_Occlude|PF_Clip); + pglPushMatrix(); // should be the same as glLoadIdentity //Hurdler: now it seems to work pglTranslatef(pos->x, pos->z, pos->y); @@ -1964,6 +1909,14 @@ static void DrawMD2Ex(INT32 *gl_cmd_buffer, md2_frame_t *frame, INT32 duration, scaley = -scaley; pglRotatef(pos->angley, 0.0f, -1.0f, 0.0f); pglRotatef(pos->anglex, -1.0f, 0.0f, 0.0f); + //pglBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); // alpha = level of transparency + + // Remove depth mask when the model is transparent so it doesn't cut thorugh sprites // SRB2CBTODO: For all stuff too?! + if (color && color[3] < 255) + { + pglBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); // alpha = level of transparency + pglDepthMask(GL_FALSE); + } val = *gl_cmd_buffer++; @@ -2031,6 +1984,7 @@ static void DrawMD2Ex(INT32 *gl_cmd_buffer, md2_frame_t *frame, INT32 duration, if (color) pglDisable(GL_LIGHTING); pglShadeModel(GL_FLAT); + pglDepthMask(GL_TRUE); pglDisable(GL_CULL_FACE); } @@ -2185,25 +2139,10 @@ EXPORT void HWRAPI(PostImgRedraw) (float points[SCREENVERTS][SCREENVERTS][2]) } #endif //SHUFFLE -// Sryder: This needs to be called whenever the screen changes resolution in order to reset the screen textures to use -// a new size -EXPORT void HWRAPI(FlushScreenTextures) (void) -{ - pglDeleteTextures(1, &screentexture); - pglDeleteTextures(1, &startScreenWipe); - pglDeleteTextures(1, &endScreenWipe); - pglDeleteTextures(1, &finalScreenTexture); - screentexture = 0; - startScreenWipe = 0; - endScreenWipe = 0; - finalScreenTexture = 0; -} - // Create Screen to fade from EXPORT void HWRAPI(StartScreenWipe) (void) { INT32 texsize = 2048; - boolean firstTime = (startScreenWipe == 0); // Use a power of two texture, dammit if(screen_width <= 512) @@ -2212,38 +2151,27 @@ EXPORT void HWRAPI(StartScreenWipe) (void) texsize = 1024; // Create screen texture - if (firstTime) - startScreenWipe = SCRTEX_STARTSCREENWIPE; pglBindTexture(GL_TEXTURE_2D, startScreenWipe); - - if (firstTime) - { #ifdef KOS_GL_COMPATIBILITY - pglTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_FILTER_NONE); - pglTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_FILTER_NONE); + pglTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_FILTER_NONE); + pglTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_FILTER_NONE); #else - pglTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); - pglTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); + pglTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); + pglTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); #endif - Clamp2D(GL_TEXTURE_WRAP_S); - Clamp2D(GL_TEXTURE_WRAP_T); + Clamp2D(GL_TEXTURE_WRAP_S); + Clamp2D(GL_TEXTURE_WRAP_T); #ifndef KOS_GL_COMPATIBILITY - pglCopyTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, 0, 0, texsize, texsize, 0); -#endif - } - else -#ifndef KOS_GL_COMPATIBILITY - pglCopyTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 0, 0, texsize, texsize); + pglCopyTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, 0, 0, texsize, texsize, 0); #endif - tex_downloaded = startScreenWipe; + tex_downloaded = 0; // 0 so it knows it doesn't have any of the cached patches downloaded right now } // Create Screen to fade to EXPORT void HWRAPI(EndScreenWipe)(void) { INT32 texsize = 2048; - boolean firstTime = (endScreenWipe == 0); // Use a power of two texture, dammit if(screen_width <= 512) @@ -2252,32 +2180,21 @@ EXPORT void HWRAPI(EndScreenWipe)(void) texsize = 1024; // Create screen texture - if (firstTime) - endScreenWipe = SCRTEX_ENDSCREENWIPE; pglBindTexture(GL_TEXTURE_2D, endScreenWipe); - - if (firstTime) - { #ifdef KOS_GL_COMPATIBILITY - pglTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_FILTER_NONE); - pglTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_FILTER_NONE); + pglTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_FILTER_NONE); + pglTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_FILTER_NONE); #else - pglTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); - pglTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); + pglTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); + pglTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); #endif - Clamp2D(GL_TEXTURE_WRAP_S); - Clamp2D(GL_TEXTURE_WRAP_T); + Clamp2D(GL_TEXTURE_WRAP_S); + Clamp2D(GL_TEXTURE_WRAP_T); #ifndef KOS_GL_COMPATIBILITY - pglCopyTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, 0, 0, texsize, texsize, 0); -#endif - } - else -#ifndef KOS_GL_COMPATIBILITY - pglCopyTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 0, 0, texsize, texsize); + pglCopyTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, 0, 0, texsize, texsize, 0); #endif - - tex_downloaded = endScreenWipe; + tex_downloaded = 0; // 0 so it knows it doesn't have any of the cached patches downloaded right now } @@ -2319,7 +2236,7 @@ EXPORT void HWRAPI(DrawIntermissionBG)(void) pglEnd(); - tex_downloaded = screentexture; + tex_downloaded = 0; // 0 so it knows it doesn't have any of the cached patches downloaded right now } // Do screen fades! @@ -2410,7 +2327,6 @@ EXPORT void HWRAPI(DoScreenWipe)(float alpha) pglDisable(GL_TEXTURE_2D); // disable the texture in the 2nd texture unit pglActiveTexture(GL_TEXTURE0); - tex_downloaded = endScreenWipe; } else { @@ -2436,10 +2352,11 @@ EXPORT void HWRAPI(DoScreenWipe)(float alpha) pglTexCoord2f(xfix, 0.0f); pglVertex3f(1.0f, -1.0f, 1.0f); pglEnd(); - tex_downloaded = endScreenWipe; #ifndef MINI_GL_COMPATIBILITY } #endif + + tex_downloaded = 0; // 0 so it knows it doesn't have any of the cached patches downloaded right now } @@ -2447,7 +2364,6 @@ EXPORT void HWRAPI(DoScreenWipe)(float alpha) EXPORT void HWRAPI(MakeScreenTexture) (void) { INT32 texsize = 2048; - boolean firstTime = (screentexture == 0); // Use a power of two texture, dammit if(screen_width <= 512) @@ -2456,37 +2372,26 @@ EXPORT void HWRAPI(MakeScreenTexture) (void) texsize = 1024; // Create screen texture - if (firstTime) - screentexture = SCRTEX_SCREENTEXTURE; pglBindTexture(GL_TEXTURE_2D, screentexture); - - if (firstTime) - { #ifdef KOS_GL_COMPATIBILITY - pglTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_FILTER_NONE); - pglTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_FILTER_NONE); + pglTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_FILTER_NONE); + pglTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_FILTER_NONE); #else - pglTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); - pglTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); + pglTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); + pglTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); #endif - Clamp2D(GL_TEXTURE_WRAP_S); - Clamp2D(GL_TEXTURE_WRAP_T); + Clamp2D(GL_TEXTURE_WRAP_S); + Clamp2D(GL_TEXTURE_WRAP_T); #ifndef KOS_GL_COMPATIBILITY - pglCopyTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, 0, 0, texsize, texsize, 0); -#endif - } - else -#ifndef KOS_GL_COMPATIBILITY - pglCopyTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 0, 0, texsize, texsize); + pglCopyTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, 0, 0, texsize, texsize, 0); #endif - tex_downloaded = screentexture; + tex_downloaded = 0; // 0 so it knows it doesn't have any of the cached patches downloaded right now } EXPORT void HWRAPI(MakeScreenFinalTexture) (void) { INT32 texsize = 2048; - boolean firstTime = (finalScreenTexture == 0); // Use a power of two texture, dammit if(screen_width <= 512) @@ -2495,40 +2400,27 @@ EXPORT void HWRAPI(MakeScreenFinalTexture) (void) texsize = 1024; // Create screen texture - if (firstTime) - finalScreenTexture = SCRTEX_FINALSCREENTEXTURE; pglBindTexture(GL_TEXTURE_2D, finalScreenTexture); - - if (firstTime) - { #ifdef KOS_GL_COMPATIBILITY - pglTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_FILTER_NONE); - pglTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_FILTER_NONE); + pglTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_FILTER_NONE); + pglTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_FILTER_NONE); #else - pglTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); - pglTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); + pglTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); + pglTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); #endif - Clamp2D(GL_TEXTURE_WRAP_S); - Clamp2D(GL_TEXTURE_WRAP_T); + Clamp2D(GL_TEXTURE_WRAP_S); + Clamp2D(GL_TEXTURE_WRAP_T); #ifndef KOS_GL_COMPATIBILITY - pglCopyTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, 0, 0, texsize, texsize, 0); -#endif - } - else -#ifndef KOS_GL_COMPATIBILITY - pglCopyTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 0, 0, texsize, texsize); + pglCopyTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, 0, 0, texsize, texsize, 0); #endif - tex_downloaded = finalScreenTexture; + tex_downloaded = 0; // 0 so it knows it doesn't have any of the cached patches downloaded right now } EXPORT void HWRAPI(DrawScreenFinalTexture)(int width, int height) { float xfix, yfix; - float origaspect, newaspect; - float xoff = 1, yoff = 1; // xoffset and yoffset for the polygon to have black bars around the screen - FRGBAFloat clearColour; INT32 texsize = 2048; if(screen_width <= 1024) @@ -2539,47 +2431,35 @@ EXPORT void HWRAPI(DrawScreenFinalTexture)(int width, int height) xfix = 1/((float)(texsize)/((float)((screen_width)))); yfix = 1/((float)(texsize)/((float)((screen_height)))); - origaspect = (float)screen_width / screen_height; - newaspect = (float)width / height; - if (origaspect < newaspect) - { - xoff = origaspect / newaspect; - yoff = 1; - } - else if (origaspect > newaspect) - { - xoff = 1; - yoff = newaspect / origaspect; - } - + //pglClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT); pglViewport(0, 0, width, height); - clearColour.red = clearColour.green = clearColour.blue = 0; - clearColour.alpha = 1; - ClearBuffer(true, false, &clearColour); pglBindTexture(GL_TEXTURE_2D, finalScreenTexture); pglBegin(GL_QUADS); pglColor4f(1.0f, 1.0f, 1.0f, 1.0f); // Bottom left pglTexCoord2f(0.0f, 0.0f); - pglVertex3f(-xoff, -yoff, 1.0f); + pglVertex3f(-1, -1, 1.0f); // Top left pglTexCoord2f(0.0f, yfix); - pglVertex3f(-xoff, yoff, 1.0f); + pglVertex3f(-1, 1, 1.0f); // Top right pglTexCoord2f(xfix, yfix); - pglVertex3f(xoff, yoff, 1.0f); + pglVertex3f(1, 1, 1.0f); // Bottom right pglTexCoord2f(xfix, 0.0f); - pglVertex3f(xoff, -yoff, 1.0f); + pglVertex3f(1, -1, 1.0f); pglEnd(); - tex_downloaded = finalScreenTexture; + SetModelView(screen_width, screen_height); + SetStates(); + + tex_downloaded = 0; // 0 so it knows it doesn't have any of the cached patches downloaded right now } #endif //HWRENDER diff --git a/src/lua_script.c b/src/lua_script.c index 7ed30367..b9c61ff9 100644 --- a/src/lua_script.c +++ b/src/lua_script.c @@ -479,10 +479,10 @@ static const struct { {NULL, ARCH_NULL} }; -static UINT8 GetUserdataArchType(int index) +static UINT8 GetUserdataArchType(void) { UINT8 i; - lua_getmetatable(gL, index); + lua_getmetatable(gL, -1); for (i = 0; meta2arch[i].meta; i++) { @@ -561,7 +561,7 @@ static UINT8 ArchiveValue(int TABLESINDEX, int myindex) break; } case LUA_TUSERDATA: - switch (GetUserdataArchType(myindex)) + switch (GetUserdataArchType()) { case ARCH_MOBJINFO: { @@ -768,25 +768,16 @@ static void ArchiveTables(void) lua_pushnil(gL); while (lua_next(gL, -2)) { - // Write key - e = ArchiveValue(TABLESINDEX, -2); // key should be either a number or a string, ArchiveValue can handle this. - if (e == 2) // invalid key type (function, thread, lightuserdata, or anything we don't recognise) - { - lua_pushvalue(gL, -2); - CONS_Alert(CONS_ERROR, "Index '%s' (%s) of table %d could not be archived!\n", lua_tostring(gL, -1), luaL_typename(gL, -1), i); - lua_pop(gL, 1); - } - // Write value + ArchiveValue(TABLESINDEX, -2); // key should be either a number or a string, ArchiveValue can handle this. e = ArchiveValue(TABLESINDEX, -1); if (e == 1) n++; // the table contained a new table we'll have to archive. :( - else if (e == 2) // invalid value type + else if (e == 2) { lua_pushvalue(gL, -2); CONS_Alert(CONS_ERROR, "Type of value for table %d entry '%s' (%s) could not be archived!\n", i, lua_tostring(gL, -1), luaL_typename(gL, -1)); lua_pop(gL, 1); } - lua_pop(gL, 1); } lua_pop(gL, 1); @@ -922,17 +913,11 @@ static void UnArchiveTables(void) lua_rawgeti(gL, TABLESINDEX, i); while (true) { - if (UnArchiveValue(TABLESINDEX) == 1) // read key + if (UnArchiveValue(TABLESINDEX) == 1) break; - if (UnArchiveValue(TABLESINDEX) == 2) // read value + if (UnArchiveValue(TABLESINDEX) == 2) n++; - if (lua_isnil(gL, -2)) // if key is nil (if a function etc was accidentally saved) - { - CONS_Alert(CONS_ERROR, "A nil key in table %d was found! (Invalid key type or corrupted save?)\n", i); - lua_pop(gL, 2); // pop key and value instead of setting them in the table, to prevent Lua panic errors - } - else - lua_rawset(gL, -3); + lua_rawset(gL, -3); } lua_pop(gL, 1); } diff --git a/src/m_menu.c b/src/m_menu.c index e7375a8d..007ea1d9 100644 --- a/src/m_menu.c +++ b/src/m_menu.c @@ -1129,6 +1129,7 @@ static menuitem_t OP_MoveControlsMenu[] = {IT_CALL | IT_STRING2, NULL, "Use/Throw Item", M_ChangeControl, gc_fire }, {IT_CALL | IT_STRING2, NULL, "Look Backward", M_ChangeControl, gc_lookback }, + {IT_CALL | IT_STRING2, NULL, "Toggle Chasecam", M_ChangeControl, gc_camtoggle }, {IT_CALL | IT_STRING2, NULL, "Talk key", M_ChangeControl, gc_talkkey }, {IT_CALL | IT_STRING2, NULL, "Team-Talk key", M_ChangeControl, gc_teamkey }, {IT_CALL | IT_STRING2, NULL, "Rankings/Scores", M_ChangeControl, gc_scores }, @@ -1136,8 +1137,8 @@ static menuitem_t OP_MoveControlsMenu[] = {IT_CALL | IT_STRING2, NULL, "Pause", M_ChangeControl, gc_pause }, {IT_CALL | IT_STRING2, NULL, "Console", M_ChangeControl, gc_console }, - {IT_SUBMENU | IT_STRING, NULL, "Spectator Controls...", &OP_SpectateControlsDef, 112}, - {IT_SUBMENU | IT_STRING, NULL, "Custom Lua Actions...", &OP_CustomControlsDef, 120}, + {IT_SUBMENU | IT_STRING, NULL, "Spectator Controls...",&OP_SpectateControlsDef,120}, + {IT_SUBMENU | IT_STRING, NULL, "Custom Actions...", &OP_CustomControlsDef, 128}, }; static menuitem_t OP_SpectateControlsMenu[] = @@ -1146,8 +1147,6 @@ static menuitem_t OP_SpectateControlsMenu[] = {IT_CALL | IT_STRING2, NULL, "Look Up", M_ChangeControl, gc_lookup }, {IT_CALL | IT_STRING2, NULL, "Look Down", M_ChangeControl, gc_lookdown }, {IT_CALL | IT_STRING2, NULL, "Center View", M_ChangeControl, gc_centerview}, - {IT_CALL | IT_STRING2, NULL, "Reset Camera", M_ChangeControl, gc_camreset }, - {IT_CALL | IT_STRING2, NULL, "Toggle Chasecam", M_ChangeControl, gc_camtoggle }, }; static menuitem_t OP_CustomControlsMenu[] = @@ -6711,13 +6710,6 @@ static void M_DrawConnectIPMenu(void) static void M_ConnectIP(INT32 choice) { (void)choice; - - if (*setupm_ip == 0) - { - M_StartMessage("You must specify an IP address.\n", NULL, MM_NOTHING); - return; - } - COM_BufAddText(va("connect \"%s\"\n", setupm_ip)); // A little "please wait" message. @@ -7382,12 +7374,13 @@ static void M_Setup1PControlsMenu(INT32 choice) setupcontrols = gamecontrol; // was called from main Options (for console player, then) currentMenu->lastOn = itemOn; - // Unhide P1-only controls - OP_MoveControlsMenu[9].status = IT_CALL|IT_STRING2; // Talk - OP_MoveControlsMenu[10].status = IT_CALL|IT_STRING2; // Team talk - OP_MoveControlsMenu[11].status = IT_CALL|IT_STRING2; // Rankings - OP_MoveControlsMenu[12].status = IT_CALL|IT_STRING2; // Pause - OP_MoveControlsMenu[13].status = IT_CALL|IT_STRING2; // Console + // Unhide the three non-P2 controls + OP_MoveControlsMenu[12].status = IT_CALL|IT_STRING2; + OP_MoveControlsMenu[13].status = IT_CALL|IT_STRING2; + OP_MoveControlsMenu[14].status = IT_CALL|IT_STRING2; + // Unide the pause/console controls too + OP_MoveControlsMenu[10].status = IT_CALL|IT_STRING2; + OP_MoveControlsMenu[11].status = IT_CALL|IT_STRING2; OP_MoveControlsDef.prevMenu = &OP_P1ControlsDef; M_SetupNextMenu(&OP_MoveControlsDef); @@ -7402,12 +7395,13 @@ static void M_Setup2PControlsMenu(INT32 choice) setupcontrols = gamecontrolbis; currentMenu->lastOn = itemOn; - // Hide P1-only controls - OP_MoveControlsMenu[9].status = IT_GRAYEDOUT2; // Talk - OP_MoveControlsMenu[10].status = IT_GRAYEDOUT2; // Team talk - OP_MoveControlsMenu[11].status = IT_GRAYEDOUT2; // Rankings - OP_MoveControlsMenu[12].status = IT_GRAYEDOUT2; // Pause - OP_MoveControlsMenu[13].status = IT_GRAYEDOUT2; // Console + // Hide the three non-P2 controls + OP_MoveControlsMenu[12].status = IT_GRAYEDOUT2; + OP_MoveControlsMenu[13].status = IT_GRAYEDOUT2; + OP_MoveControlsMenu[14].status = IT_GRAYEDOUT2; + // Hide the pause/console controls too + OP_MoveControlsMenu[10].status = IT_GRAYEDOUT2; + OP_MoveControlsMenu[11].status = IT_GRAYEDOUT2; OP_MoveControlsDef.prevMenu = &OP_P2ControlsDef; M_SetupNextMenu(&OP_MoveControlsDef); @@ -7423,12 +7417,13 @@ static void M_Setup3PControlsMenu(INT32 choice) setupcontrols = gamecontrol3; currentMenu->lastOn = itemOn; - // Hide P1-only controls - OP_MoveControlsMenu[9].status = IT_GRAYEDOUT2; // Talk - OP_MoveControlsMenu[10].status = IT_GRAYEDOUT2; // Team talk - OP_MoveControlsMenu[11].status = IT_GRAYEDOUT2; // Rankings - OP_MoveControlsMenu[12].status = IT_GRAYEDOUT2; // Pause - OP_MoveControlsMenu[13].status = IT_GRAYEDOUT2; // Console + // Hide the three non-P3 controls + OP_MoveControlsMenu[12].status = IT_GRAYEDOUT2; + OP_MoveControlsMenu[13].status = IT_GRAYEDOUT2; + OP_MoveControlsMenu[14].status = IT_GRAYEDOUT2; + // Hide the pause/console controls too + OP_MoveControlsMenu[10].status = IT_GRAYEDOUT2; + OP_MoveControlsMenu[11].status = IT_GRAYEDOUT2; OP_MoveControlsDef.prevMenu = &OP_P3ControlsDef; M_SetupNextMenu(&OP_MoveControlsDef); @@ -7443,12 +7438,13 @@ static void M_Setup4PControlsMenu(INT32 choice) setupcontrols = gamecontrol4; currentMenu->lastOn = itemOn; - // Hide P1-only controls - OP_MoveControlsMenu[9].status = IT_GRAYEDOUT2; // Talk - OP_MoveControlsMenu[10].status = IT_GRAYEDOUT2; // Team talk - OP_MoveControlsMenu[11].status = IT_GRAYEDOUT2; // Rankings - OP_MoveControlsMenu[12].status = IT_GRAYEDOUT2; // Pause - OP_MoveControlsMenu[13].status = IT_GRAYEDOUT2; // Console + // Hide the three non-P4 controls + OP_MoveControlsMenu[12].status = IT_GRAYEDOUT2; + OP_MoveControlsMenu[13].status = IT_GRAYEDOUT2; + OP_MoveControlsMenu[14].status = IT_GRAYEDOUT2; + // Hide the pause/console controls too + OP_MoveControlsMenu[10].status = IT_GRAYEDOUT2; + OP_MoveControlsMenu[11].status = IT_GRAYEDOUT2; OP_MoveControlsDef.prevMenu = &OP_P4ControlsDef; M_SetupNextMenu(&OP_MoveControlsDef); diff --git a/src/m_misc.c b/src/m_misc.c index 573354f0..0d0be0f6 100644 --- a/src/m_misc.c +++ b/src/m_misc.c @@ -644,12 +644,13 @@ static void M_PNGhdr(png_structp png_ptr, png_infop png_info_ptr, PNG_CONST png_ static void M_PNGText(png_structp png_ptr, png_infop png_info_ptr, PNG_CONST png_byte movie) { #ifdef PNG_TEXT_SUPPORTED -#define SRB2PNGTXT 10 //PNG_KEYWORD_MAX_LENGTH(79) is the max +#define SRB2PNGTXT 11 //PNG_KEYWORD_MAX_LENGTH(79) is the max png_text png_infotext[SRB2PNGTXT]; char keytxt[SRB2PNGTXT][12] = { - "Title", "Description", "Playername", "Mapnum", "Mapname", + "Title", "Author", "Description", "Playername", "Mapnum", "Mapname", "Location", "Interface", "Revision", "Build Date", "Build Time"}; char titletxt[] = "SRB2Kart " VERSIONSTRING; + png_charp authortxt = I_GetUserName(); png_charp playertxt = cv_playername.zstring; char desctxt[] = "SRB2Kart Screenshot"; char Movietxt[] = "SRB2Kart Movie"; @@ -700,18 +701,19 @@ static void M_PNGText(png_structp png_ptr, png_infop png_info_ptr, PNG_CONST png png_infotext[i].key = keytxt[i]; png_infotext[0].text = titletxt; + png_infotext[1].text = authortxt; if (movie) - png_infotext[1].text = Movietxt; + png_infotext[2].text = Movietxt; else - png_infotext[1].text = desctxt; - png_infotext[2].text = playertxt; - png_infotext[3].text = maptext; - png_infotext[4].text = lvlttltext; - png_infotext[5].text = locationtxt; - png_infotext[6].text = interfacetxt; - png_infotext[7].text = strncpy(ctrevision, comprevision, sizeof(ctrevision)-1); - png_infotext[8].text = strncpy(ctdate, compdate, sizeof(ctdate)-1); - png_infotext[9].text = strncpy(cttime, comptime, sizeof(cttime)-1); + png_infotext[2].text = desctxt; + png_infotext[3].text = playertxt; + png_infotext[4].text = maptext; + png_infotext[5].text = lvlttltext; + png_infotext[6].text = locationtxt; + png_infotext[7].text = interfacetxt; + png_infotext[8].text = strncpy(ctrevision, comprevision, sizeof(ctrevision)-1); + png_infotext[9].text = strncpy(ctdate, compdate, sizeof(ctdate)-1); + png_infotext[10].text = strncpy(cttime, comptime, sizeof(cttime)-1); png_set_text(png_ptr, png_info_ptr, png_infotext, SRB2PNGTXT); #undef SRB2PNGTXT diff --git a/src/p_setup.c b/src/p_setup.c index 3071b224..1986380d 100644 --- a/src/p_setup.c +++ b/src/p_setup.c @@ -2629,7 +2629,6 @@ boolean P_SetupLevel(boolean skipprecip) { tic_t starttime = I_GetTime(); tic_t endtime = starttime + (3*TICRATE)/2; - tic_t nowtime; S_StartSound(NULL, sfx_s3kaf); @@ -2639,17 +2638,9 @@ boolean P_SetupLevel(boolean skipprecip) F_WipeEndScreen(); F_RunWipe(wipedefs[wipe_speclevel_towhite], false); - nowtime = lastwipetic; // Hold on white for extra effect. - while (nowtime < endtime) - { - // wait loop - while (!((nowtime = I_GetTime()) - lastwipetic)) - I_Sleep(); - lastwipetic = nowtime; - if (moviemode) // make sure we save frames for the white hold too - M_SaveFrame(); - } + while (I_GetTime() < endtime) + I_Sleep(); ranspecialwipe = 1; } diff --git a/src/r_things.h b/src/r_things.h index 347f204f..7a9729a3 100644 --- a/src/r_things.h +++ b/src/r_things.h @@ -69,7 +69,7 @@ void R_DrawMasked(void); #define DEFAULTSKIN "sonic" #define DEFAULTSKIN2 "tails" // secondary player #define DEFAULTSKIN3 "knuckles" // third player -#define DEFAULTSKIN4 "eggman" // fourth player +#define DEFAULTSKIN4 "metalsonic" // fourth player typedef struct { diff --git a/src/sdl/hwsym_sdl.c b/src/sdl/hwsym_sdl.c index 05ac6450..f4686d2b 100644 --- a/src/sdl/hwsym_sdl.c +++ b/src/sdl/hwsym_sdl.c @@ -94,7 +94,6 @@ void *hwSym(const char *funcName,void *handle) #ifdef SHUFFLE GETFUNC(PostImgRedraw); #endif //SHUFFLE - GETFUNC(FlushScreenTextures); GETFUNC(StartScreenWipe); GETFUNC(EndScreenWipe); GETFUNC(DoScreenWipe); diff --git a/src/sdl/i_system.c b/src/sdl/i_system.c index 3575afa8..9ee17cc3 100644 --- a/src/sdl/i_system.c +++ b/src/sdl/i_system.c @@ -3371,7 +3371,7 @@ const char *I_LocateWad(void) return waddir; } -#ifdef __linux__ +#if defined(LINUX) || defined(LINUX64) #define MEMINFO_FILE "/proc/meminfo" #define MEMTOTAL "MemTotal:" #define MEMFREE "MemFree:" @@ -3391,23 +3391,20 @@ UINT32 I_GetFreeMem(UINT32 *total) }; if ((kd = kvm_open(NULL, NULL, NULL, O_RDONLY, "kvm_open")) == NULL) { - if (total) - *total = 0L; + *total = 0L; return 0; } if (kvm_nlist(kd, namelist) != 0) { kvm_close (kd); - if (total) - *total = 0L; + *total = 0L; return 0; } if (kvm_read(kd, namelist[X_SUM].n_value, &sum, sizeof (sum)) != sizeof (sum)) { kvm_close(kd); - if (total) - *total = 0L; + *total = 0L; return 0; } kvm_close(kd); @@ -3438,7 +3435,7 @@ UINT32 I_GetFreeMem(UINT32 *total) (PVOID) &pr_arena, sizeof (UINT32)); return pr_arena; -#elif defined (__linux__) +#elif defined (LINUX) || defined (LINUX64) /* Linux */ char buf[1024]; char *memTag; @@ -3454,28 +3451,25 @@ UINT32 I_GetFreeMem(UINT32 *total) if (n < 0) { // Error - if (total) - *total = 0L; + *total = 0L; return 0; } buf[n] = '\0'; - if ((memTag = strstr(buf, MEMTOTAL)) == NULL) + if (NULL == (memTag = strstr(buf, MEMTOTAL))) { // Error - if (total) - *total = 0L; + *total = 0L; return 0; } memTag += sizeof (MEMTOTAL); totalKBytes = atoi(memTag); - if ((memTag = strstr(buf, MEMFREE)) == NULL) + if (NULL == (memTag = strstr(buf, MEMFREE))) { // Error - if (total) - *total = 0L; + *total = 0L; return 0; } @@ -3490,7 +3484,7 @@ UINT32 I_GetFreeMem(UINT32 *total) if (total) *total = 48<<20; return 48<<20; -#endif +#endif /* LINUX */ } const CPUInfoFlags *I_CPUInfo(void) diff --git a/src/sdl/i_video.c b/src/sdl/i_video.c index df8af61b..12103349 100644 --- a/src/sdl/i_video.c +++ b/src/sdl/i_video.c @@ -1506,7 +1506,6 @@ void I_StartupGraphics(void) #ifdef SHUFFLE HWD.pfnPostImgRedraw = hwSym("PostImgRedraw",NULL); #endif - HWD.pfnFlushScreenTextures=hwSym("FlushScreenTextures",NULL); HWD.pfnStartScreenWipe = hwSym("StartScreenWipe",NULL); HWD.pfnEndScreenWipe = hwSym("EndScreenWipe",NULL); HWD.pfnDoScreenWipe = hwSym("DoScreenWipe",NULL); diff --git a/src/sdl/ogl_sdl.c b/src/sdl/ogl_sdl.c index 4347b35b..cd7ced7c 100644 --- a/src/sdl/ogl_sdl.c +++ b/src/sdl/ogl_sdl.c @@ -214,11 +214,8 @@ void OglSdlFinishUpdate(boolean waitvbl) HWR_DrawScreenFinalTexture(sdlw, sdlh); SDL_GL_SwapWindow(window); - GClipRect(0, 0, realwidth, realheight, NZCLIP_PLANE); - - // Sryder: We need to draw the final screen texture again into the other buffer in the original position so that - // effects that want to take the old screen can do so after this - HWR_DrawScreenFinalTexture(realwidth, realheight); + SetModelView(realwidth, realheight); + SetStates(); } EXPORT void HWRAPI( OglSdlSetPalette) (RGBA_t *palette, RGBA_t *pgamma) diff --git a/src/sdl/sdl_sound.c b/src/sdl/sdl_sound.c index bc98ee2f..3e837267 100644 --- a/src/sdl/sdl_sound.c +++ b/src/sdl/sdl_sound.c @@ -1180,6 +1180,12 @@ void I_StartupSound(void) audio.callback = I_UpdateStream; audio.userdata = &localdata; + if (dedicated) + { + nosound = nomidimusic = nodigimusic = true; + return; + } + // Configure sound device CONS_Printf("I_StartupSound:\n"); @@ -1475,6 +1481,9 @@ void I_InitMusic(void) I_AddExitFunc(I_ShutdownGMEMusic); #endif + if ((nomidimusic && nodigimusic) || dedicated) + return; + #ifdef HAVE_MIXER MIX_VERSION(&MIXcompiled) MIXlinked = Mix_Linked_Version(); diff --git a/src/sdl12/hwsym_sdl.c b/src/sdl12/hwsym_sdl.c index 49340138..54f5da3a 100644 --- a/src/sdl12/hwsym_sdl.c +++ b/src/sdl12/hwsym_sdl.c @@ -100,7 +100,6 @@ void *hwSym(const char *funcName,void *handle) #ifdef SHUFFLE GETFUNC(PostImgRedraw); #endif //SHUFFLE - GETFUNC(FlushScreenTextures); GETFUNC(StartScreenWipe); GETFUNC(EndScreenWipe); GETFUNC(DoScreenWipe); diff --git a/src/sdl12/i_video.c b/src/sdl12/i_video.c index f44b60c8..8754587a 100644 --- a/src/sdl12/i_video.c +++ b/src/sdl12/i_video.c @@ -1972,7 +1972,6 @@ void I_StartupGraphics(void) #ifdef SHUFFLE HWD.pfnPostImgRedraw = hwSym("PostImgRedraw",NULL); #endif - HWD.pfnFlushScreenTextures=hwSym("FlushScreenTextures",NULL); HWD.pfnStartScreenWipe = hwSym("StartScreenWipe",NULL); HWD.pfnEndScreenWipe = hwSym("EndScreenWipe",NULL); HWD.pfnDoScreenWipe = hwSym("DoScreenWipe",NULL); diff --git a/src/v_video.c b/src/v_video.c index 801a577f..68998139 100644 --- a/src/v_video.c +++ b/src/v_video.c @@ -943,6 +943,14 @@ void V_DrawPatchFill(patch_t *pat) INT32 dupz = (vid.dupx < vid.dupy ? vid.dupx : vid.dupy); INT32 x, y, pw = SHORT(pat->width) * dupz, ph = SHORT(pat->height) * dupz; +#ifdef HWRENDER + if (rendermode == render_opengl) + { + pw = FixedMul(SHORT(pat->width)*FRACUNIT, vid.fdupx)>>FRACBITS; + ph = FixedMul(SHORT(pat->height)*FRACUNIT, vid.fdupy)>>FRACBITS; + } +#endif + for (x = 0; x < vid.width; x += pw) { for (y = 0; y < vid.height; y += ph) diff --git a/src/win32/win_dll.c b/src/win32/win_dll.c index c9b3fba4..8fa4d17f 100644 --- a/src/win32/win_dll.c +++ b/src/win32/win_dll.c @@ -117,7 +117,6 @@ static loadfunc_t hwdFuncTable[] = { #ifdef SHUFFLE {"PostImgRedraw@4", &hwdriver.pfnPostImgRedraw}, #endif - {"FlushScreenTextures@0",&hwdriver.pfnFlushScreenTextures}, {"StartScreenWipe@0", &hwdriver.pfnStartScreenWipe}, {"EndScreenWipe@0", &hwdriver.pfnEndScreenWipe}, {"DoScreenWipe@4", &hwdriver.pfnDoScreenWipe}, @@ -148,7 +147,6 @@ static loadfunc_t hwdFuncTable[] = { #ifdef SHUFFLE {"PostImgRedraw", &hwdriver.pfnPostImgRedraw}, #endif - {"FlushScreenTextures"},&hwdriver.pfnFlushScreenTextures}, {"StartScreenWipe", &hwdriver.pfnStartScreenWipe}, {"EndScreenWipe", &hwdriver.pfnEndScreenWipe}, {"DoScreenWipe", &hwdriver.pfnDoScreenWipe},