From bed0e6554807c347119c6b3408129c60d81abac1 Mon Sep 17 00:00:00 2001 From: Alug Date: Mon, 16 Dec 2024 18:27:53 +0100 Subject: [PATCH 01/53] potential fix for clients locking up due to never receiving acks back apparently, if the client doesent receive an ack back which may happen due to duplicate packets/bad net conditions, it may spam resend the packet until its netxcmd buffer is full and locks up --- src/d_net.c | 23 ++++++++++++++++------- 1 file changed, 16 insertions(+), 7 deletions(-) diff --git a/src/d_net.c b/src/d_net.c index 2725fca14..c9f80c9ee 100644 --- a/src/d_net.c +++ b/src/d_net.c @@ -325,10 +325,10 @@ static void RemoveAck(INT32 i) } // We have got a packet, proceed the ack request and ack return -static boolean Processackpak(void) +static int Processackpak(void) { INT32 i; - boolean goodpacket = true; + int goodpacket = 0; node_t *node = &nodes[doomcom->remotenode]; // Received an ack return, so remove the ack in the list @@ -353,7 +353,7 @@ static boolean Processackpak(void) { DEBFILE(va("Discard(1) ack %d (duplicated)\n", ack)); duppacket++; - goodpacket = false; // Discard packet (duplicate) + goodpacket = 1; // Discard packet (duplicate) } else { @@ -363,10 +363,10 @@ static boolean Processackpak(void) { DEBFILE(va("Discard(2) ack %d (duplicated)\n", ack)); duppacket++; - goodpacket = false; // Discard packet (duplicate) + goodpacket = 1; // Discard packet (duplicate) break; } - if (goodpacket) + if (goodpacket == 0) { // Is a good packet so increment the acknowledge number, // Then search for a "hole" in the queue @@ -427,12 +427,13 @@ static boolean Processackpak(void) else // Buffer full discard packet, sender will resend it { // We can admit the packet but we will not detect the duplication after :( DEBFILE("no more freeackret\n"); - goodpacket = false; + goodpacket = 2; } } } } } + // return values: 0 = ok, 1 = duplicate, 2 = out of order return goodpacket; } #endif @@ -1158,6 +1159,7 @@ boolean HGetPacket(void) while(true) { //nodejustjoined = I_NetGet(); + int goodpacket; I_NetGet(); if (doomcom->remotenode == -1) // No packet received @@ -1202,8 +1204,15 @@ boolean HGetPacket(void) }*/ // Proceed the ack and ackreturn field - if (!Processackpak()) + goodpacket = Processackpak(); + if (goodpacket != 0) + { + // resend the ACK in case the previous ACK didn't reach the client. + // prevents the client's netbuffer from locking up. + if (goodpacket == 1) + Net_SendAcks(doomcom->remotenode); continue; // discarded (duplicated) + } // A packet with just ackreturn if (netbuffer->packettype == PT_NOTHING) -- 2.54.0 From 0acb8e6a63226f7d7a3c14d4589a280ef7f2ca21 Mon Sep 17 00:00:00 2001 From: Alug Date: Sun, 22 Dec 2024 18:38:09 +0100 Subject: [PATCH 02/53] fix compile --- src/p_mobj.c | 36 +++++++++++++++++++----------------- 1 file changed, 19 insertions(+), 17 deletions(-) diff --git a/src/p_mobj.c b/src/p_mobj.c index e68288f2b..03e7e9f99 100644 --- a/src/p_mobj.c +++ b/src/p_mobj.c @@ -3234,7 +3234,6 @@ void P_DestroyRobots(void) // the below is chasecam only, if you're curious. check out P_CalcPostImg in p_user.c for first person static void P_CalcChasePostImg(player_t *player, camera_t *thiscam) { - boolean itsatwodlevel = false; const boolean flipcam = (player->pflags & PF_FLIPCAM && !(player->pflags & PF_NIGHTSMODE) && player->mo->eflags & MFE_VERTICALFLIP); UINT16 postimgflags = 0; UINT8 i; @@ -3244,21 +3243,6 @@ static void P_CalcChasePostImg(player_t *player, camera_t *thiscam) if (flipcam) postimgflags |= POSTIMG_FLIP; - if (twodlevel) - itsatwodlevel = true; - else - { - for (i = 0; i <= splitscreen; i++) - { - if (thiscam == &camera[i] && players[displayplayers[i]].mo - && (players[displayplayers[i]].mo->flags2 & MF2_TWOD)) - { - itsatwodlevel = true; - break; - } - } - } - if (player->awayviewtics && player->awayviewmobj && !P_MobjWasRemoved(player->awayviewmobj)) // Camera must obviously exist { camera_t dummycam; @@ -3300,12 +3284,30 @@ static void P_CalcChasePostImg(player_t *player, camera_t *thiscam) // Process the mobj-ish required functions of the camera boolean P_CameraThinker(player_t *player, camera_t *thiscam, boolean resetcalled) { + boolean itsatwodlevel = false; + UINT8 i; + // This can happen when joining if (thiscam->subsector == NULL || thiscam->subsector->sector == NULL) return true; P_CalcChasePostImg(player, thiscam); + if (twodlevel) + itsatwodlevel = true; + else + { + for (i = 0; i <= splitscreen; i++) + { + if (thiscam == &camera[i] && players[displayplayers[i]].mo + && (players[displayplayers[i]].mo->flags2 & MF2_TWOD)) + { + itsatwodlevel = true; + break; + } + } + } + if (thiscam->momx || thiscam->momy) { if (!P_TryCameraMove(thiscam->x + thiscam->momx, thiscam->y + thiscam->momy, thiscam)) // Never fails for 2D mode. @@ -3333,7 +3335,7 @@ boolean P_CameraThinker(player_t *player, camera_t *thiscam, boolean resetcalled } if (!itsatwodlevel) - P_CheckCameraPosition(thiscam->x, thiscam->y, thiscam); + P_CheckCameraPosition(thiscam->x, thiscam->y, thiscam); thiscam->subsector = R_PointInSubsectorFast(thiscam->x, thiscam->y); thiscam->floorz = tmfloorz; -- 2.54.0 From 55dfdc723fe534f8c908676d839bb1198d89da7c Mon Sep 17 00:00:00 2001 From: Alug Date: Sun, 29 Dec 2024 17:14:47 +0100 Subject: [PATCH 03/53] fix demo playback --- src/g_game.c | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/g_game.c b/src/g_game.c index e48c53577..10367a293 100644 --- a/src/g_game.c +++ b/src/g_game.c @@ -6832,9 +6832,6 @@ void G_DoPlayDemo(char *defdemoname) boolean spectator; UINT8 slots[MAXPLAYERS], kartspeed[MAXPLAYERS], kartweight[MAXPLAYERS], numslots = 0; - if (demobuf.buffer == NULL) - return; - G_InitDemoRewind(); skin[16] = '\0'; -- 2.54.0 From cbc3f8e917cafa63949520ca587bacc9dd74dd70 Mon Sep 17 00:00:00 2001 From: Alug Date: Sun, 29 Dec 2024 17:38:36 +0100 Subject: [PATCH 04/53] add warning for non allocated demobuffer --- src/g_game.c | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/src/g_game.c b/src/g_game.c index 10367a293..dd5a48a3d 100644 --- a/src/g_game.c +++ b/src/g_game.c @@ -6058,8 +6058,16 @@ void G_BeginRecording(void) if (!cv_recordmultiplayerdemos.value) return; - if (demobuf.p || demobuf.buffer == NULL) + if (demobuf.buffer == NULL) + { + CONS_Alert(CONS_ERROR, "Failed to allocate demo buffer\n"); return; + } + + if (demobuf.p) + { + return; + } memset(name,0,sizeof(name)); @@ -6215,7 +6223,13 @@ void G_BeginMetal(void) { mobj_t *mo = players[consoleplayer].mo; - if (demobuf.p || demobuf.buffer == NULL) + if (demobuf.buffer == NULL) + { + CONS_Alert(CONS_ERROR, "Failed to allocate demo buffer\n"); + return; + } + + if (demobuf.p) return; demobuf.p = demobuf.buffer; -- 2.54.0 From 70e64d947145cdf21ccb896097102447738c5762 Mon Sep 17 00:00:00 2001 From: Alug Date: Sun, 29 Dec 2024 17:43:09 +0100 Subject: [PATCH 05/53] reset demo recording in those places --- src/g_game.c | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/src/g_game.c b/src/g_game.c index dd5a48a3d..8f6103551 100644 --- a/src/g_game.c +++ b/src/g_game.c @@ -6056,16 +6056,21 @@ void G_BeginRecording(void) UINT8 *m; if (!cv_recordmultiplayerdemos.value) + { + G_ResetDemoRecording(); return; + } if (demobuf.buffer == NULL) { CONS_Alert(CONS_ERROR, "Failed to allocate demo buffer\n"); + G_ResetDemoRecording(); return; } if (demobuf.p) { + G_ResetDemoRecording(); return; } @@ -6225,12 +6230,18 @@ void G_BeginMetal(void) if (demobuf.buffer == NULL) { - CONS_Alert(CONS_ERROR, "Failed to allocate demo buffer\n"); + CONS_Alert(CONS_ERROR, "Failed to allocate metal demo buffer\n"); + metalrecording = false; return; } if (demobuf.p) + { + Z_Free(demobuf.buffer); + demobuf.buffer = NULL; + metalrecording = false; return; + } demobuf.p = demobuf.buffer; -- 2.54.0 From b3323b7c2d19d7b2e73fe99f9fd926f3ba06b3f3 Mon Sep 17 00:00:00 2001 From: Alug Date: Sun, 29 Dec 2024 17:45:20 +0100 Subject: [PATCH 06/53] change error msg --- src/g_game.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/g_game.c b/src/g_game.c index 8f6103551..67e808476 100644 --- a/src/g_game.c +++ b/src/g_game.c @@ -6063,7 +6063,7 @@ void G_BeginRecording(void) if (demobuf.buffer == NULL) { - CONS_Alert(CONS_ERROR, "Failed to allocate demo buffer\n"); + CONS_Alert(CONS_ERROR, "No demo buffer allocated\n"); G_ResetDemoRecording(); return; } @@ -6230,7 +6230,7 @@ void G_BeginMetal(void) if (demobuf.buffer == NULL) { - CONS_Alert(CONS_ERROR, "Failed to allocate metal demo buffer\n"); + CONS_Alert(CONS_ERROR, "No metal demo buffer allocated\n"); metalrecording = false; return; } -- 2.54.0 From aa222b68617b75fc00db2303be1468f99f31456a Mon Sep 17 00:00:00 2001 From: Alug Date: Mon, 30 Dec 2024 11:10:41 +0100 Subject: [PATCH 07/53] slight cleanup director --- src/d_netcmd.c | 1 + src/g_game.c | 8 +++----- src/g_game.h | 2 -- src/k_director.c | 47 ++++++++++++++++++++++++----------------------- src/k_director.h | 1 + src/st_stuff.c | 9 +++------ src/st_stuff.h | 2 -- 7 files changed, 32 insertions(+), 38 deletions(-) diff --git a/src/d_netcmd.c b/src/d_netcmd.c index 076bb10e0..4f8a2b684 100644 --- a/src/d_netcmd.c +++ b/src/d_netcmd.c @@ -573,6 +573,7 @@ static CV_PossibleValue_t ps_descriptor_cons_t[] = { consvar_t cv_ps_descriptor = {"ps_descriptor", "Average", 0, ps_descriptor_cons_t, NULL, 0, NULL, NULL, 0, 0, NULL}; consvar_t cv_director = {"director", "Off", CV_SAVE, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL}; + consvar_t cv_kartdebugdirector = {"debugdirector", "Off", 0, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL}; consvar_t cv_showdirectorhud = {"showdirectorhud", "On", CV_SAVE, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL}; diff --git a/src/g_game.c b/src/g_game.c index 67e808476..e7dc9d92d 100644 --- a/src/g_game.c +++ b/src/g_game.c @@ -883,6 +883,7 @@ void G_BuildTiccmd(ticcmd_t *cmd, INT32 realtics, UINT8 ssplayer) thiscam = (player->bot == 2 ? &camera[0] : &camera[forplayer]); else thiscam = &camera[forplayer]; + lang = localangle[forplayer]; laim = localaiming[forplayer]; th = turnheld[forplayer]; @@ -1208,9 +1209,6 @@ void G_BuildTiccmd(ticcmd_t *cmd, INT32 realtics, UINT8 ssplayer) { displayplayers[0] = consoleplayer; G_FixCamera(1); - // i dont like this lmao - if (cv_director.value) - CV_SetValue(&cv_director, 0); } } @@ -1546,8 +1544,8 @@ boolean G_Responder(event_t *ev) COM_ImmedExecute("changeteam4 spectator"); } } - if (ev->data1 == gamecontrol[gc_director][0] - || ev->data1 == gamecontrol[gc_director][1]) + + if (ev->data1 == gamecontrol[gc_director][0] || ev->data1 == gamecontrol[gc_director][1]) { K_ToggleDirector(); } diff --git a/src/g_game.h b/src/g_game.h index 7c81ab79e..3a957d00a 100644 --- a/src/g_game.h +++ b/src/g_game.h @@ -438,8 +438,6 @@ FUNCMATH INT32 G_TicsToSeconds(tic_t tics); FUNCMATH INT32 G_TicsToCentiseconds(tic_t tics); FUNCMATH INT32 G_TicsToMilliseconds(tic_t tics); -boolean K_DirectorIsPlayerAlone(void); // idk where else to put this lol - // Don't split up TOL handling INT16 G_TOLFlag(INT32 pgametype); diff --git a/src/k_director.c b/src/k_director.c index dafea6072..611c64701 100644 --- a/src/k_director.c +++ b/src/k_director.c @@ -12,6 +12,7 @@ //#include "k_kart.h" #include "doomdef.h" +#include "doomstat.h" #include "g_game.h" #include "v_video.h" #include "k_director.h" @@ -28,6 +29,7 @@ struct directorinfo { + player_t* viewplayer; tic_t cooldown; // how long has it been since we last switched? tic_t freeze; // when nonzero, fixed switch pending, freeze logic! INT32 attacker; // who to switch to when freeze delay elapses @@ -38,7 +40,7 @@ struct directorinfo INT32 boredom[MAXPLAYERS]; // how long has a given position had no credible attackers? } directorinfo; -boolean K_DirectorIsPlayerAlone(void) +static boolean K_DirectorIsPlayerAlone(void) { UINT8 pingame = 0; @@ -67,9 +69,16 @@ static fixed_t ScaleFromMap(fixed_t n, fixed_t scale) return FixedMul(n, FixedDiv(scale, mapobjectscale)); } +boolean K_DirectorIsAvailable(void) +{ + if ((demo.playback && demo.title) || modeattacking) + return false; + return ((gamestate == GS_LEVEL) && (demo.playback || (players[consoleplayer].spectator && !K_DirectorIsPlayerAlone()))); +} + static boolean K_DirectorIsEnabled(void) { - return cv_director.value && !splitscreen && (gamestate == GS_LEVEL && (((!playeringame[consoleplayer] || players[consoleplayer].spectator)) || (demo.playback && !demo.freecam && (!demo.title || !modeattacking))) && !K_DirectorIsPlayerAlone()); + return (cv_director.value && K_DirectorIsAvailable()); } void K_InitDirector(void) @@ -80,6 +89,7 @@ void K_InitDirector(void) directorinfo.freeze = 0; directorinfo.attacker = 0; directorinfo.maxdist = 0; + directorinfo.viewplayer = NULL; for (playernum = 0; playernum < MAXPLAYERS; playernum++) { @@ -104,8 +114,8 @@ static fixed_t K_GetDistanceToFinish(player_t player) continue; dist = P_AproxDistance(P_AproxDistance(mo->x - player.mo->x, - mo->y - player.mo->y), - mo->z - player.mo->z) / FRACUNIT; + mo->y - player.mo->y), + mo->z - player.mo->z) / FRACUNIT; break; } @@ -124,7 +134,7 @@ static fixed_t K_GetDistanceToFinish(player_t player) dist = P_AproxDistance(P_AproxDistance(mo->x - player.mo->x, mo->y - player.mo->y), - mo->z - player.mo->z) / FRACUNIT; + mo->z - player.mo->z) / FRACUNIT; break; } @@ -213,11 +223,6 @@ static void K_DirectorSwitch(INT32 player, boolean force) return; } - if (P_IsDisplayPlayer(&players[player])) - { - return; - } - if (players[player].exiting) { return; @@ -250,7 +255,7 @@ void K_DirectorFollowAttack(player_t *player, mobj_t *inflictor, mobj_t *source) return; } - if (!P_IsDisplayPlayer(player)) + if (directorinfo.viewplayer != player) { return; } @@ -319,8 +324,8 @@ void K_DrawDirectorDebugger(void) void K_UpdateDirector(void) { - INT32 *displayplayerp = &displayplayers[0]; INT32 targetposition; + directorinfo.viewplayer = &players[displayplayers[0]]; if (!K_DirectorIsEnabled()) { @@ -391,25 +396,19 @@ void K_UpdateDirector(void) target = directorinfo.sortedplayers[targetposition]; // stop here since we're already viewing this player - if (*displayplayerp == target) + if (displayplayers[0] == target) { break; } - // if this is a splitscreen player, try next pair - if (P_IsDisplayPlayer(&players[target])) - { - continue; - } - // if we're certain the back half of the pair is actually in this position, try to switch if (!players[target].kartstuff[k_positiondelay]) { K_DirectorSwitch(target, false); } - // even if we're not certain, if we're certain we're watching the WRONG player, try to switch - if (players[*displayplayerp].kartstuff[k_position] != targetposition+1 && !players[*displayplayerp].kartstuff[k_positiondelay]) + // even if we're not certain, if we're cetain we're watching the WRONG player, try to switch + if (directorinfo.viewplayer->kartstuff[k_position] != targetposition+1 && !directorinfo.viewplayer->kartstuff[k_positiondelay]) { K_DirectorSwitch(target, false); } @@ -420,9 +419,11 @@ void K_UpdateDirector(void) void K_ToggleDirector(void) { - if (!directortextactive) + if (!K_DirectorIsAvailable()) return; + G_AdjustView(1, 1, true); + if (!K_DirectorIsEnabled()) { directorinfo.cooldown = 0; // switch immediately @@ -430,5 +431,5 @@ void K_ToggleDirector(void) directortoggletimer = 0; - COM_ImmedExecute("add director 1"); + CV_SetValue(&cv_director, (cv_director.value ^ 1)); } diff --git a/src/k_director.h b/src/k_director.h index 3be71b675..30b44d9cf 100644 --- a/src/k_director.h +++ b/src/k_director.h @@ -10,6 +10,7 @@ /// \file k_director.h /// \brief SRB2kart automatic spectator camera. +boolean K_DirectorIsAvailable(void); void K_InitDirector(void); void K_UpdateDirector(void); void K_DrawDirectorDebugger(void); diff --git a/src/st_stuff.c b/src/st_stuff.c index 30b8b5cf7..aaa926515 100644 --- a/src/st_stuff.c +++ b/src/st_stuff.c @@ -16,6 +16,7 @@ #include "doomdef.h" #include "g_game.h" #include "g_input.h" +#include "k_director.h" #include "r_local.h" #include "p_local.h" #include "f_finale.h" @@ -156,8 +157,6 @@ static patch_t *envelope; player_t *stplyr; UINT8 stplyrnum; -boolean directortextactive = false; - // SRB2kart hudinfo_t hudinfo[NUMHUDITEMS] = @@ -665,14 +664,13 @@ static void ST_overlayDrawer(void) if (!hu_showscores) // hide the following if TAB is held { - if (cv_showdirectorhud.value && !splitscreen && ((demo.playback && !demo.freecam && (!demo.title || !modeattacking)) || !P_IsLocalPlayer(stplyr)) && !K_DirectorIsPlayerAlone()) + // TODO: splitscreen support! + if (cv_showdirectorhud.value && !splitscreen && !P_IsLocalPlayer(stplyr) && K_DirectorIsAvailable()) { char directortext[20] = {0}; snprintf(directortext, 20, "Director: %s", cv_director.value ? "On" : "Off"); - directortextactive = true; - if ((!demo.playback && directortoggletimer < 13*TICRATE) || (demo.playback && directortoggletimer < 4*TICRATE)) { if (renderisnewtic) @@ -687,7 +685,6 @@ static void ST_overlayDrawer(void) else { directortoggletimer = 0; - directortextactive = false; } if (cv_showviewpointtext.value) diff --git a/src/st_stuff.h b/src/st_stuff.h index 308dae2a0..250db1e7f 100644 --- a/src/st_stuff.h +++ b/src/st_stuff.h @@ -146,6 +146,4 @@ extern UINT16 objectsdrawn; extern consvar_t cv_lessflicker; extern consvar_t cv_stagetitle; -extern boolean directortextactive; - #endif -- 2.54.0 From 588dac343ea6270ab1831a28d95c86b878c3881c Mon Sep 17 00:00:00 2001 From: Alug Date: Mon, 30 Dec 2024 11:24:14 +0100 Subject: [PATCH 08/53] dont disable this.... if its disabled kek --- src/m_menu.c | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/m_menu.c b/src/m_menu.c index a4121d448..8cfe16a97 100644 --- a/src/m_menu.c +++ b/src/m_menu.c @@ -3396,12 +3396,10 @@ void PDistort_menu_Onchange(void) { if (!cv_sloperoll.value) { - OP_PlayerDistortMenu[sloperotate].status = IT_GRAYEDOUT; OP_PlayerDistortMenu[sliptide].status = IT_GRAYEDOUT; } else { - OP_PlayerDistortMenu[sloperotate].status = IT_STRING | IT_CVAR; OP_PlayerDistortMenu[sliptide].status = IT_STRING | IT_CVAR; } -- 2.54.0 From aca48d45b32f5ec09c960a999f5e5abb1273731f Mon Sep 17 00:00:00 2001 From: Alug Date: Mon, 30 Dec 2024 17:29:27 +0100 Subject: [PATCH 09/53] fix potential crash with perfstats https://git.do.srb2.org/STJr/SRB2/-/merge_requests/2576 --- src/m_perfstats.c | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/m_perfstats.c b/src/m_perfstats.c index 3c5526678..14980b162 100644 --- a/src/m_perfstats.c +++ b/src/m_perfstats.c @@ -452,7 +452,7 @@ static int PS_DrawPerfRows(int x, int y, int color, perfstatrow_t *rows) return draw_y; } -static void PS_UpdateMetricHistory(ps_metric_t *metric, boolean time_metric, boolean frame_metric, boolean set_user) +static void PS_UpdateMetricHistory(ps_metric_t *metric, boolean time_metric, boolean frame_metric) { int index = frame_metric ? ps_frame_index : ps_tick_index; @@ -460,7 +460,7 @@ static void PS_UpdateMetricHistory(ps_metric_t *metric, boolean time_metric, boo { // allocate history table int value_size = time_metric ? sizeof(precise_t) : sizeof(INT32); - void** memory_user = set_user ? &metric->history : NULL; + void** memory_user = &metric->history; metric->history = Z_Calloc(value_size * cv_ps_samplesize.value, PU_PERFSTATS, memory_user); @@ -490,7 +490,7 @@ static void PS_UpdateRowHistories(perfstatrow_t *rows, boolean frame_metric) for (row = rows; row->lores_label; row++) { if (PS_IsRowValid(row)) - PS_UpdateMetricHistory(row->metric, !!(row->flags & PS_TIME), frame_metric, true); + PS_UpdateMetricHistory(row->metric, !!(row->flags & PS_TIME), frame_metric); } } @@ -670,17 +670,17 @@ void PS_UpdateTickStats(void) if (cv_perfstats.value == 3) { for (i = 0; i < thinkframe_hooks_length; i++) - PS_UpdateMetricHistory(&thinkframe_hooks[i].time_taken, true, false, false); + PS_UpdateMetricHistory(&thinkframe_hooks[i].time_taken, true, false); } else if (cv_perfstats.value == 4) { for (i = 0; i < prethinkframe_hooks_length; i++) - PS_UpdateMetricHistory(&prethinkframe_hooks[i].time_taken, true, false, false); + PS_UpdateMetricHistory(&prethinkframe_hooks[i].time_taken, true, false); } else if (cv_perfstats.value == 5) { for (i = 0; i < postthinkframe_hooks_length; i++) - PS_UpdateMetricHistory(&postthinkframe_hooks[i].time_taken, true, false, false); + PS_UpdateMetricHistory(&postthinkframe_hooks[i].time_taken, true, false); } } if (cv_perfstats.value) -- 2.54.0 From 182500c2d2880fb6e2a7263702b5b2ec3bd11177 Mon Sep 17 00:00:00 2001 From: Alug Date: Mon, 30 Dec 2024 17:34:13 +0100 Subject: [PATCH 10/53] fix potential Fix segfault when aborting HTTP download --- src/d_netfil.c | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/d_netfil.c b/src/d_netfil.c index 2559cbcf1..fd0bf879c 100644 --- a/src/d_netfil.c +++ b/src/d_netfil.c @@ -111,6 +111,7 @@ static fileused_t transferFiles[UINT8_MAX + 1]; // Receiver structure INT32 fileneedednum; // Number of files needed to join the server fileneeded_t fileneeded[MAX_WADFILES]; // List of needed files +static I_mutex downloadmutex; char downloaddir[512] = "DOWNLOAD"; #ifdef CLIENT_LOADINGSCREEN @@ -1327,6 +1328,7 @@ void CURLPrepareFile(const char* url, int dfilenum) curl_starttime = time(NULL); curl_running = true; + #ifdef HAVE_THREADS I_spawn_thread("http-download", (I_thread_fn)CURLGetFile, NULL); #endif @@ -1336,10 +1338,15 @@ void CURLPrepareFile(const char* url, int dfilenum) void CURLAbortFile(void) { curl_running = false; + + // lock and unlock to wait for the download thread to exit + I_lock_mutex(&downloadmutex); + I_unlock_mutex(downloadmutex); } void CURLGetFile(void) { + I_lock_mutex(&downloadmutex); CURLMcode mc; /* return code used by curl_multi_wait() */ CURLcode easyres; /* Return from easy interface */ CURLMsg *m; /* for picking up messages with the transfer status */ @@ -1432,6 +1439,7 @@ void CURLGetFile(void) multi_handle = NULL; } curl_running = false; + I_unlock_mutex(downloadmutex); } HTTP_login * -- 2.54.0 From 82f9f2f73faf21a5902947cc236bdf24de66f499 Mon Sep 17 00:00:00 2001 From: Alug Date: Sat, 14 Dec 2024 22:49:03 +0100 Subject: [PATCH 11/53] delet all the hardware sound crap psure it doesent even properly work at this point --- src/Makefile | 73 +- src/d_main.c | 11 - src/doomdef.h | 18 +- src/hardware/hw3dsdrv.h | 85 -- src/hardware/hw3sound.c | 996 ------------- src/hardware/hw3sound.h | 106 -- src/hardware/hws_data.h | 123 -- src/hardware/s_ds3d/s_ds3d.c | 1237 ----------------- src/hardware/s_ds3d/s_ds3d.dev | 59 - src/hardware/s_ds3d/s_ds3d.dsp | 99 -- src/hardware/s_fmod/s_fmod.c | 1201 ---------------- src/hardware/s_fmod/s_fmod.dev | 59 - src/hardware/s_fmod/s_fmod.dsp | 97 -- src/hardware/s_openal/s_openal.c | 998 ------------- src/hardware/s_openal/s_openal.dev | 59 - src/hardware/s_openal/s_openal.dsp | 98 -- src/locale/en.po | 30 - src/locale/srb2.pot | 30 - src/p_enemy.c | 4 - src/p_spec.c | 4 - src/p_user.c | 4 - src/s_sound.c | 88 +- src/s_sound.h | 2 - src/sdl/Makefile.cfg | 16 - src/sdl/Srb2SDL.dsp | 29 +- src/sdl/Srb2SDL.dsw | 12 - src/sdl/Srb2SDL.props | 6 +- src/sdl/hwsym_sdl.c | 31 +- src/sdl/macosx/Srb2mac.pbproj/project.pbxproj | 80 +- .../macosx/Srb2mac.xcodeproj/project.pbxproj | 22 - src/sdl/sdl_sound.c | 210 +-- 31 files changed, 37 insertions(+), 5850 deletions(-) delete mode 100644 src/hardware/hw3dsdrv.h delete mode 100644 src/hardware/hw3sound.c delete mode 100644 src/hardware/hw3sound.h delete mode 100644 src/hardware/hws_data.h delete mode 100644 src/hardware/s_ds3d/s_ds3d.c delete mode 100644 src/hardware/s_ds3d/s_ds3d.dev delete mode 100644 src/hardware/s_ds3d/s_ds3d.dsp delete mode 100644 src/hardware/s_fmod/s_fmod.c delete mode 100644 src/hardware/s_fmod/s_fmod.dev delete mode 100644 src/hardware/s_fmod/s_fmod.dsp delete mode 100644 src/hardware/s_openal/s_openal.c delete mode 100644 src/hardware/s_openal/s_openal.dev delete mode 100644 src/hardware/s_openal/s_openal.dsp diff --git a/src/Makefile b/src/Makefile index 111e586b4..3b090873f 100644 --- a/src/Makefile +++ b/src/Makefile @@ -31,18 +31,6 @@ # compile all HW render and 3D sound DLLs for the set # opengl_dll # Pure Mingw only, compile OpenGL HW render DLL -# minigl_dll -# Pure Mingw only, compile MiniGL HW render DLL -# ds3d_dll -# Pure Mingw only, compile DirectX DirectSound HW sound DLL -# fmod_dll -# Pure Mingw only, compile FMOD HW sound DLL -# openal_dll -# Pure Mingw only, compile OpenAL HW sound DLL -# fmod_so -# Non-Mingw, compile FMOD HW sound SO -# openal_so -# Non-Mingw, compile OpenAL HW sound SO # # # Addon: @@ -69,10 +57,7 @@ # Compile without SDL_Mixer, add 'NOMIXER=1' # Compile without BSD API, add 'NONET=1' # Compile without IPX/SPX, add 'NOIPX=1' -# Compile Mingw/SDL with S_DS3S, add 'DS3D=1' # Compile without libopenmpt, add 'NOOPENMPT=1' -# Compile with S_FMOD3D, add 'FMOD=1' (WIP) -# Compile with S_OPENAL, add 'OPENAL=1' (WIP) # To link with the whole SDL_Image lib to load Icons, add 'SDL_IMAGE=1' but it isn't not realy needed # To link with SDLMain to hide console or make on a console-less binary, add 'SDLMAIN=1' # @@ -691,7 +676,7 @@ else dll : opengl_dll endif ifdef MINGW -all_dll: opengl_dll ds3d_dll fmod_dll openal_dll +all_dll: opengl_dll opengl_dll: $(BIN)/r_opengl.dll $(BIN)/r_opengl.dll: $(OBJDIR)/ogl_win.o $(OBJDIR)/r_opengl.o @@ -701,37 +686,6 @@ $(BIN)/r_opengl.dll: $(OBJDIR)/ogl_win.o $(OBJDIR)/r_opengl.o ifndef NOUPX -$(UPX) $(UPX_OPTS) $@ endif - -ds3d_dll: $(BIN)/s_ds3d.dll -$(BIN)/s_ds3d.dll: $(OBJDIR)/s_ds3d.o - @echo Linking S_DS3d.dll... - $(CC) --shared $^ -o $@ -g -Wl,--add-stdcall-alias -ldsound -luuid - -fmod_dll: $(BIN)/s_fmod.dll -$(BIN)/s_fmod.dll: $(OBJDIR)/s_fmod.o - -$(MKDIR) $(BIN) - @echo Linking S_FMOD.dll... - $(CC) --shared $^ -o $@ -g -Wl,--add-stdcall-alias -lfmod - -openal_dll: $(BIN)/s_openal.dll -$(BIN)/s_openal.dll: $(OBJDIR)/s_openal.o - -$(MKDIR) $(BIN) - @echo Linking S_OpenAL.dll... - $(CC) --shared $^ -o $@ -g -Wl,--add-stdcall-alias -lopenal32 -else -all_dll: fmod_so openal_so - -fmod_so: $(BIN)/s_fmod.so -$(BIN)/s_fmod.so: $(OBJDIR)/s_fmod.o - -$(MKDIR) $(BIN) - @echo Linking S_FMOD.so... - $(CC) --shared $^ -o $@ -g --nostartfiles -lm -lfmod - -openal_so: $(BIN)/s_openal.so -$(BIN)/s_openal.so: $(OBJDIR)/s_openal.o - -$(MKDIR) $(BIN) - @echo Linking S_OpenAL.so... - $(CC) --shared $^ -o $@ -g --nostartfiles -lm -lopenal endif else @@ -823,31 +777,6 @@ $(OBJDIR)/win_dbg.o: win32/win_dbg.c $(CC) $(CFLAGS) $(WFLAGS) -c $< -o $@ endif -ifdef STATICHS -$(OBJDIR)/s_openal.o: hardware/s_openal/s_openal.c hardware/hw3dsdrv.h \ - hardware/hw_dll.h - $(CC) $(CFLAGS) $(WFLAGS) -c $< -o $@ - -$(OBJDIR)/s_fmod.o: hardware/s_fmod/s_fmod.c hardware/hw3dsdrv.h \ - hardware/hw_dll.h - $(CC) $(CFLAGS) $(WFLAGS) -c $< -o $@ - -ifdef MINGW -$(OBJDIR)/s_ds3d.o: hardware/s_ds3d/s_ds3d.c hardware/hw3dsdrv.h \ - hardware/hw_dll.h - $(CC) $(CFLAGS) $(WFLAGS) -c $< -o $@ -endif -else - -$(OBJDIR)/s_fmod.o: hardware/s_fmod/s_fmod.c hardware/hw3dsdrv.h \ - hardware/hw_dll.h - $(CC) $(ARCHOPTS) -Os -o $(OBJDIR)/s_fmod.o -DHW3SOUND -DUNIXCOMMON -shared -nostartfiles -c hardware/s_fmod/s_fmod.c - -$(OBJDIR)/s_openal.o: hardware/s_openal/s_openal.c hardware/hw3dsdrv.h \ - hardware/hw_dll.h - $(CC) $(ARCHOPTS) -Os -o $(OBJDIR)/s_openal.o -DHW3SOUND -DUNIXCOMMON -shared -nostartfiles -c hardware/s_openal/s_openal.c -endif - ifdef FILTERS $(OBJDIR)/%.o: $(INTERFACE)/filter/%.c @echo $< needs deps diff --git a/src/d_main.c b/src/d_main.c index 642870a86..a44c12ad6 100644 --- a/src/d_main.c +++ b/src/d_main.c @@ -85,10 +85,6 @@ #include "hardware/hw_main.h" // 3D View Rendering #endif -#ifdef HW3SOUND -#include "hardware/hw3sound.h" -#endif - #ifdef HAVE_DISCORDRPC #include "discord.h" #endif @@ -737,10 +733,6 @@ void D_SRB2Loop(void) interp = R_UsingFrameInterpolation() && !dedicated; doDisplay = false; -#ifdef HW3SOUND - HW3S_BeginFrameUpdate(); -#endif - renderisnewtic = (realtics > 0 || singletics); if (renderisnewtic) @@ -848,9 +840,6 @@ void D_SRB2Loop(void) // consoleplayer -> displayplayers (hear sounds from viewpoint) S_UpdateSounds(); // move positional sounds -#ifdef HW3SOUND - HW3S_EndFrameUpdate(); -#endif LUA_Step(); diff --git a/src/doomdef.h b/src/doomdef.h index c8d2a28f7..8751b6a86 100644 --- a/src/doomdef.h +++ b/src/doomdef.h @@ -21,7 +21,6 @@ #define SOUND_DUMMY 0 #define SOUND_SDL 1 #define SOUND_MIXER 2 -#define SOUND_FMOD 3 #ifndef SOUND #ifdef HAVE_SDL @@ -29,9 +28,6 @@ // Use Mixer interface? #ifdef HAVE_MIXER #define SOUND SOUND_MIXER - #ifdef HW3SOUND - #undef HW3SOUND - #endif #endif // Use generic SDL interface. @@ -40,18 +36,8 @@ #endif #else // No SDL. - -// Use FMOD? -#ifdef HAVE_FMOD - #define SOUND SOUND_FMOD - #ifdef HW3SOUND - #undef HW3SOUND - #endif -#else - // No more interfaces. :( - #define SOUND SOUND_DUMMY -#endif - +// No more interfaces. :( +#define SOUND SOUND_DUMMY #endif #endif diff --git a/src/hardware/hw3dsdrv.h b/src/hardware/hw3dsdrv.h deleted file mode 100644 index 8811d4546..000000000 --- a/src/hardware/hw3dsdrv.h +++ /dev/null @@ -1,85 +0,0 @@ -// Emacs style mode select -*- C++ -*- -//----------------------------------------------------------------------------- -// -// Copyright (C) 2001 by DooM Legacy Team. -// -// This program is free software; you can redistribute it and/or -// modify it under the terms of the GNU General Public License -// as published by the Free Software Foundation; either version 2 -// of the License, or (at your option) any later version. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -//----------------------------------------------------------------------------- -/// \file -/// \brief 3D sound import/export prototypes for low-level hardware interface - -#ifndef __HW_3DS_DRV_H__ -#define __HW_3DS_DRV_H__ - -// Use standart hardware API -#include "hw_dll.h" -#include "hws_data.h" - -#if defined (HAVE_SDL) || !defined (HWD) -EXPORT void HWRAPI(Shutdown) (void); -#endif - -// Use standart Init and Shutdown functions - -EXPORT INT32 HWRAPI (Startup) (I_Error_t FatalErrorFunction, snddev_t *snd_dev); -EXPORT u_int HWRAPI (AddSfx) (sfx_data_t *sfx); -EXPORT INT32 HWRAPI (AddSource) (source3D_data_t *src, u_int sfxhandle); -EXPORT INT32 HWRAPI (StartSource) (INT32 handle); -EXPORT void HWRAPI (StopSource) (INT32 handle); -EXPORT INT32 HWRAPI (GetHW3DSVersion) (void); -EXPORT void HWRAPI (BeginFrameUpdate) (void); -EXPORT void HWRAPI (EndFrameUpdate) (void); -EXPORT INT32 HWRAPI (IsPlaying) (INT32 handle); -EXPORT void HWRAPI (UpdateListener) (listener_data_t *data, INT32 num); -EXPORT void HWRAPI (UpdateSourceParms) (INT32 handle, INT32 vol, INT32 sep); -EXPORT void HWRAPI (SetGlobalSfxVolume) (INT32 volume); -EXPORT INT32 HWRAPI (SetCone) (INT32 handle, cone_def_t *cone_def); -EXPORT void HWRAPI (Update3DSource) (INT32 handle, source3D_pos_t *data); -EXPORT INT32 HWRAPI (ReloadSource) (INT32 handle, u_int sfxhandle); -EXPORT void HWRAPI (KillSource) (INT32 handle); -EXPORT void HWRAPI (KillSfx) (u_int sfxhandle); -EXPORT void HWRAPI (GetHW3DSTitle) (char *buf, size_t size); - - -#if !defined (_CREATE_DLL_) - -struct hardware3ds_s -{ - Startup pfnStartup; - AddSfx pfnAddSfx; - AddSource pfnAddSource; - StartSource pfnStartSource; - StopSource pfnStopSource; - GetHW3DSVersion pfnGetHW3DSVersion; - BeginFrameUpdate pfnBeginFrameUpdate; - EndFrameUpdate pfnEndFrameUpdate; - IsPlaying pfnIsPlaying; - UpdateListener pfnUpdateListener; - UpdateSourceParms pfnUpdateSourceParms; - SetGlobalSfxVolume pfnSetGlobalSfxVolume; - SetCone pfnSetCone; - Update3DSource pfnUpdate3DSource; - ReloadSource pfnReloadSource; - KillSource pfnKillSource; - KillSfx pfnKillSfx; - Shutdown pfnShutdown; - GetHW3DSTitle pfnGetHW3DSTitle; -}; - -extern struct hardware3ds_s hw3ds_driver; - -#define HW3DS hw3ds_driver - - -#endif // _CREATE_DLL_ - -#endif // __HW_3DS_DRV_H__ diff --git a/src/hardware/hw3sound.c b/src/hardware/hw3sound.c deleted file mode 100644 index 2594a5df9..000000000 --- a/src/hardware/hw3sound.c +++ /dev/null @@ -1,996 +0,0 @@ -// Emacs style mode select -*- C++ -*- -//----------------------------------------------------------------------------- -// -// Copyright (C) 2001 by DooM Legacy Team. -// -// This program is free software; you can redistribute it and/or -// modify it under the terms of the GNU General Public License -// as published by the Free Software Foundation; either version 2 -// of the License, or (at your option) any later version. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -//----------------------------------------------------------------------------- -/// \file -/// \brief Hardware 3D sound general code - -#include "../doomdef.h" - -#ifdef HW3SOUND - -#include "../i_sound.h" -#include "../s_sound.h" -#include "../w_wad.h" -#include "../z_zone.h" -#include "../g_game.h" -#include "../tables.h" -#include "../sounds.h" -#include "../r_main.h" -#include "../r_things.h" -#include "../m_random.h" -#include "../p_local.h" -#include "hw3dsdrv.h" -#include "hw3sound.h" - -#define ANGLE2DEG(x) (((double)(x)) / ((double)ANGLE_45/45)) -#define NORM_PITCH 128 -#define NORM_PRIORITY 64 -#define NORM_SEP 128 -#if 1 -#define TPS(x) (x) -#else //Alam_GBC: MPS, not MPF! -#define TPS(x) ((float)(x)/(float)TICRATE) -#endif - -struct hardware3ds_s hw3ds_driver; - - -typedef struct source_s -{ - sfxinfo_t *sfxinfo; - const void *origin; - INT32 handle; // Internal source handle - channel_type_t type; // Sound type (attack, scream, etc) -} source_t; - - -typedef struct ambient_sdata_s -{ - source3D_data_t left; - source3D_data_t right; -} ambient_sdata_t; - - -typedef struct ambient_source_s -{ - source_t left; - source_t right; -} ambient_source_t; - -// Static sources -// This sources always creates -static source_t p_attack_source; // Player attack source -static source_t p_attack_source2; // Player2 attack source -static source_t p_scream_source; // Player scream source -static source_t p_scream_source2; // Player2 scream source - - -static ambient_source_t ambient_source; // Ambinet sound sources - -// abuse??? -//static source3D_data_t p_attack_sdata; // ?? Now just holds precalculated player attack source data -//static source3D_data_t p_default_sdata;// ?? ---- // ---- // ---- // ---- player scream source data - -static ambient_sdata_t ambient_sdata; // Precalculated datas of an ambient sound sources - -// Stack of dynamic sources -static source_t *sources = NULL; // Much like original channels -static INT32 num_sources = 0; - -// Current mode of 3D sound system -// Default is original (stereo) mode -INT32 hws_mode = HWS_DEFAULT_MODE; - -//============================================================================= -void HW3S_SetSourcesNum(void) -{ - INT32 i; - - // Allocating the internal channels for mixing - // (the maximum number of sounds rendered - // simultaneously) within zone memory. - if (sources) - HW3S_StopSounds(); - Z_Free(sources); - - if (cv_numChannels.value <= STATIC_SOURCES_NUM) - I_Error("HW3S_SetSourcesNum: Number of sound sources cannot be less than %d\n", STATIC_SOURCES_NUM + 1); - - num_sources = cv_numChannels.value - STATIC_SOURCES_NUM; - - sources = (source_t *) Z_Malloc(num_sources * sizeof (*sources), PU_STATIC, 0); - - // Free all channels for use - for (i = 0; i < num_sources; i++) - { - sources[i].sfxinfo = NULL; - sources[i].type = CT_NORMAL; - sources[i].handle = -1; - } -} - - -//============================================================================= -static void HW3S_KillSource(INT32 snum) -{ - source_t * s = &sources[snum]; - - if (s->sfxinfo) - { - HW3DS.pfnStopSource(s->handle); - HW3DS.pfnKillSource(s->handle); - s->handle = -1; - s->sfxinfo->usefulness--; - s->origin = NULL; - s->sfxinfo = NULL; - } -} - - -//============================================================================= -/* -static void HW3S_StopSource(INT32 snum) -{ - source_t * s = &sources[snum]; - - if (s->sfxinfo) - { - // stop the sound playing - HW3DS.pfnStopSource(s->handle); - } -} -*/ - - -//============================================================================= -void HW3S_StopSound(void *origin) -{ - INT32 snum; - - for (snum = 0; snum < num_sources; snum++) - { - if (sources[snum].sfxinfo && sources[snum].origin == origin) - { - HW3S_KillSource(snum); - break; - } - } -} - -void HW3S_StopSoundByID(void *origin, sfxenum_t sfx_id) -{ - INT32 snum; - - for (snum = 0; snum < num_sources; snum++) - { - if (sources[snum].sfxinfo == &S_sfx[sfx_id] && sources[snum].origin == origin) - { - HW3S_KillSource(snum); - break; - } - } -} - -void HW3S_StopSoundByNum(sfxenum_t sfxnum) -{ - INT32 snum; - - for (snum = 0; snum < num_sources; snum++) - { - if (sources[snum].sfxinfo == &S_sfx[sfxnum]) - { - HW3S_KillSource(snum); - break; - } - } -} - -//============================================================================= -void HW3S_StopSounds(void) -{ - INT32 snum; - - // kill all playing sounds at start of level - // (trust me - a good idea) - for (snum = 0; snum < num_sources; snum++) - if (sources[snum].sfxinfo) - HW3S_KillSource(snum); - - // Also stop all static sources - HW3DS.pfnStopSource(p_attack_source.handle); - HW3DS.pfnStopSource(p_attack_source2.handle); - HW3DS.pfnStopSource(p_scream_source.handle); - HW3DS.pfnStopSource(p_scream_source2.handle); - HW3DS.pfnStopSource(ambient_source.left.handle); - HW3DS.pfnStopSource(ambient_source.right.handle); -} - - -//============================================================================= -static INT32 HW3S_GetSource(const void *origin, sfxinfo_t *sfxinfo, boolean splitsound) -{ - // - // If none available, return -1. Otherwise source #. - // source number to use - - INT32 snum; - source_t * src; - INT32 sep = NORM_SEP, pitch = NORM_PITCH, volume = 255; - - (void)splitsound; - - // Find an open source - for (snum = 0, src = sources; snum < num_sources; src++, snum++) - { - if (!src->sfxinfo) - break; - -#if 0 - if (origin && src->origin == origin) - { - HW3S_KillSource(snum); - break; - } -#endif - } - -#if 0 - // Check to see if it is audible - if (origin && origin != listenmobj) - { - INT32 rc; - rc = S_AdjustSoundParams(listenmobj, origin, &volume, &sep, &pitch, sfxinfo); - if (!rc) - return -1; - } -#else - (void)origin; - (void)pitch; - (void)volume; - (void)sep; -#endif - - // None available - if (snum == num_sources) - { - // Look for lower priority - for (snum = 0, src = sources; snum < num_sources; src++, snum++) - if (src->sfxinfo->priority <= sfxinfo->priority) - break; - - if (snum == num_sources) - { - // No lower priority. Sorry, Charlie. - return -1; - } - else - { - // Otherwise, kick out lower priority - HW3S_KillSource(snum); - } - } - return snum; -} - - -//============================================================================= -static void HW3S_FillSourceParameters - (const mobj_t *origin, - source3D_data_t *data, - channel_type_t c_type) -{ - fixed_t x = 0, y = 0, z = 0; - - data->max_distance = MAX_DISTANCE; - data->min_distance = MIN_DISTANCE; - - if (origin && origin != players[displayplayers[0]].mo) - { - data->head_relative = false; - - data->pos.momx = TPS(FIXED_TO_FLOAT(origin->momx)); - data->pos.momy = TPS(FIXED_TO_FLOAT(origin->momy)); - data->pos.momz = TPS(FIXED_TO_FLOAT(origin->momz)); - - x = origin->x; - y = origin->y; - z = origin->z; - - if (c_type == CT_ATTACK) - { - const angle_t an = origin->angle >> ANGLETOFINESHIFT; - x += FixedMul(16*FRACUNIT, FINECOSINE(an)); - y += FixedMul(16*FRACUNIT, FINESINE(an)); - z += origin->height >> 1; - } - - else if (c_type == CT_SCREAM) - z += origin->height - (5 * FRACUNIT); - } - else - { - data->head_relative = true; - - data->pos.momx = 0.0f; - data->pos.momy = 0.0f; - data->pos.momz = 0.0f; - } - data->pos.x = FIXED_TO_FLOAT(x); - data->pos.y = FIXED_TO_FLOAT(y); - data->pos.z = FIXED_TO_FLOAT(z); -} - -#define HEADER_SIZE 8 -//============================================================== -/* -static void make_outphase_sfx(void *dest, void *src, INT32 size) -{ - SINT8 *s = (SINT8 *)src + HEADER_SIZE, *d = (SINT8 *)dest + HEADER_SIZE; - - M_Memcpy(dest, src, HEADER_SIZE); - size -= HEADER_SIZE; - - while (size--) - *d++ = -(*s++); -} -*/ - -//INT32 HW3S_Start3DSound(const void *origin, source3D_data_t *source_parm, cone_def_t *cone_parm, channel_type_t channel, INT32 sfx_id, INT32 vol, INT32 pitch); -//============================================================================= -INT32 HW3S_I_StartSound(const void *origin_p, source3D_data_t *source_parm, channel_type_t c_type, sfxenum_t sfx_id, INT32 volume, INT32 pitch, INT32 sep) -{ - sfxinfo_t *sfx; - const mobj_t *origin = (const mobj_t *)origin_p; - source3D_data_t source3d_data; - INT32 s_num = 0; - source_t *source = NULL; - mobj_t *listenmobj = players[displayplayers[0]].mo; // TODO: Kart 4P does not support sounds properly here - mobj_t *listenmobj2 = NULL; - - if (splitscreen) listenmobj2 = players[displayplayers[1]].mo; - - if (sound_disabled) - return -1; - - sfx = &S_sfx[sfx_id]; - - if (sfx->skinsound!=-1 && origin && origin->skin) - { - // it redirect player sound to the sound in the skin table - sfx_id = ((skin_t *)origin->skin)->soundsid[sfx->skinsound]; - sfx = &S_sfx[sfx_id]; - } - - if (!sfx->data) - sfx->data = HW3S_GetSfx(sfx); - - // judgecutor 08-16-2002 - // Sound pitching for both Doom and Heretic -#if 0 - if (cv_rndsoundpitch.value) - { - /*if (gamemode != heretic) - { - if (sfx_id >= sfx_sawup && sfx_id <= sfx_sawhit) - pitch += 8 - (M_RandomByte()&15); - else if (sfx_id != sfx_itemup && sfx_id != sfx_tink) - pitch += 16 - (M_RandomByte()&31); - } - else*/ - pitch = 128 + (M_RandomByte() & 7) - (M_RandomByte() & 7); - } -#endif - - if (pitch < 0) - pitch = NORMAL_PITCH; - - if (pitch > 255) - pitch = 255; - - if (sep < 0) - sep = 128; - - if (splitscreen && listenmobj2) // Copy the sound for the split player - { - if (c_type != CT_NORMAL && origin && (origin == listenmobj2)) - { - if (c_type == CT_ATTACK) - { - if (origin == listenmobj2) - source = &p_attack_source; - else - source = &p_attack_source2; - } - else - { - if (origin == listenmobj2) - source = &p_scream_source; - else - source = &p_scream_source2; - } - - if (source->sfxinfo != sfx) - { - HW3DS.pfnStopSource(source->handle); - source->handle = HW3DS.pfnReloadSource(source->handle, sfx->volume); - //I_OutputMsg("PlayerSound data reloaded\n"); - } - } - else if (c_type == CT_AMBIENT) - { - // sfx_data_t outphased_sfx; - - if (ambient_source.left.sfxinfo != sfx) - { - HW3DS.pfnStopSource(ambient_source.left.handle); - HW3DS.pfnStopSource(ambient_source.right.handle); - - // judgecutor: - // Outphased sfx's temporarily not used!!! - /* - outphased_sfx.data = Z_Malloc(sfx_data.length, PU_STATIC, 0); - make_outphase_sfx(outphased_sfx.data, sfx_data.data, sfx_data.length); - outphased_sfx.length = sfx_data.length; - outphased_sfx.id = sfx_data.id; - */ - ambient_source.left.handle = HW3DS.pfnReloadSource(ambient_source.left.handle, (u_int)sfx->length); - //ambient_source.right.handle = HW3DS.pfnReloadSource(ambient_source.right.handle, &outphased_sfx); - ambient_source.right.handle = HW3DS.pfnReloadSource(ambient_source.right.handle, (u_int)sfx->length); - ambient_source.left.sfxinfo = ambient_source.right.sfxinfo = sfx; - //Z_Free(outphased_sfx.data); - } - - HW3DS.pfnUpdateSourceParms(ambient_source.left.handle, volume, -1); - HW3DS.pfnUpdateSourceParms(ambient_source.right.handle, volume, -1); - - if (sfx->usefulness++ < 0) - sfx->usefulness = -1; - - // Ambient sound is special case - HW3DS.pfnStartSource(ambient_source.left.handle); - HW3DS.pfnStartSource(ambient_source.right.handle); - } - else - { - s_num = HW3S_GetSource(origin, sfx, true); - - if (s_num < 0) - { - //I_OutputMsg("No free source, aborting\n"); - return -1; - } - - source = &sources[s_num]; - - if (origin && c_type == CT_NORMAL) - { - if (!source_parm) - { - source_parm = &source3d_data; - source3d_data.permanent = 0; - HW3S_FillSourceParameters(origin, source_parm, c_type); - } - - source->handle = HW3DS.pfnAddSource(source_parm, (u_int)sfx->length); - } - else - source->handle = HW3DS.pfnAddSource(NULL, (u_int)sfx->length); - } - - // increase the usefulness - if (sfx->usefulness++ < 0) - sfx->usefulness = -1; - - source->sfxinfo = sfx; - source->origin = origin; - HW3DS.pfnStartSource(source->handle); - } - - if (c_type != CT_NORMAL && origin && (origin == listenmobj)) - { - if (c_type == CT_ATTACK) - { - if (origin == listenmobj) - source = &p_attack_source; - else - source = &p_attack_source2; - } - else - { - if (origin == listenmobj) - source = &p_scream_source; - else - source = &p_scream_source2; - } - - if (source->sfxinfo != sfx) - { - HW3DS.pfnStopSource(source->handle); - source->handle = HW3DS.pfnReloadSource(source->handle, sfx->volume); - //I_OutputMsg("PlayerSound data reloaded\n"); - } - } - else if (c_type == CT_AMBIENT) - { -// sfx_data_t outphased_sfx; - - if (ambient_source.left.sfxinfo != sfx) - { - HW3DS.pfnStopSource(ambient_source.left.handle); - HW3DS.pfnStopSource(ambient_source.right.handle); - - // judgecutor: - // Outphased sfx's temporarily not used!!! -/* - outphased_sfx.data = Z_Malloc(sfx_data.length, PU_STATIC, 0); - make_outphase_sfx(outphased_sfx.data, sfx_data.data, sfx_data.length); - outphased_sfx.length = sfx_data.length; - outphased_sfx.id = sfx_data.id; -*/ - ambient_source.left.handle = HW3DS.pfnReloadSource(ambient_source.left.handle, (u_int)sfx->length); - //ambient_source.right.handle = HW3DS.pfnReloadSource(ambient_source.right.handle, &outphased_sfx); - ambient_source.right.handle = HW3DS.pfnReloadSource(ambient_source.right.handle, (u_int)sfx->length); - ambient_source.left.sfxinfo = ambient_source.right.sfxinfo = sfx; - //Z_Free(outphased_sfx.data); - } - - HW3DS.pfnUpdateSourceParms(ambient_source.left.handle, volume, -1); - HW3DS.pfnUpdateSourceParms(ambient_source.right.handle, volume, -1); - - if (sfx->usefulness++ < 0) - sfx->usefulness = -1; - - // Ambient sound is special case - HW3DS.pfnStartSource(ambient_source.left.handle); - HW3DS.pfnStartSource(ambient_source.right.handle); - return -1; - } - else - { - s_num = HW3S_GetSource(origin, sfx, false); - - if (s_num < 0) - { - //I_OutputMsg("No free source, aborting\n"); - return -1; - } - - source = &sources[s_num]; - - if (origin && c_type == CT_NORMAL) - { - if (!source_parm) - { - source_parm = &source3d_data; - source3d_data.permanent = 0; - HW3S_FillSourceParameters(origin, source_parm, c_type); - } - - source->handle = HW3DS.pfnAddSource(source_parm, (u_int)sfx->length); - } - else - source->handle = HW3DS.pfnAddSource(NULL, (u_int)sfx->length); - - } - - // increase the usefulness - if (sfx->usefulness++ < 0) - sfx->usefulness = -1; - - source->sfxinfo = sfx; - source->origin = origin; - HW3DS.pfnStartSource(source->handle); - return s_num; - -} - - -// Start normal sound -//============================================================================= -void HW3S_StartSound(const void *origin, sfxenum_t sfx_id) -{ - HW3S_I_StartSound(origin, NULL, CT_NORMAL, sfx_id, 255, NORMAL_PITCH, NORMAL_SEP); -} - - -//============================================================================= -void S_StartAttackSound(const void *origin, sfxenum_t sfx_id) -{ - if (hws_mode != HWS_DEFAULT_MODE) - HW3S_I_StartSound(origin, NULL, CT_ATTACK, sfx_id, 255, NORMAL_PITCH, NORMAL_SEP); - else - S_StartSound(origin, sfx_id); -} - -void S_StartScreamSound(const void *origin, sfxenum_t sfx_id) -{ - if (hws_mode != HWS_DEFAULT_MODE) - HW3S_I_StartSound(origin, NULL, CT_SCREAM, sfx_id, 255, NORMAL_PITCH, NORMAL_SEP); - else - S_StartSound(origin, sfx_id); -} - -#if 0 /// NOTE: not used -void S_StartAmbientSound(sfxenum_t sfx_id, INT32 volume) -{ - if (hws_mode != HWS_DEFAULT_MODE) - { - volume += 30; - if (volume > 255) - volume = 255; - - HW3S_I_StartSound(NULL, NULL, CT_AMBIENT, sfx_id, volume, NORMAL_PITCH, NORMAL_SEP); - } - else - S_StartSoundAtVolume(NULL, sfx_id, volume); -} -#endif - -FUNCMATH static inline float AmbientPos(angle_t an) -{ - const fixed_t fm = FixedMul(FLOAT_TO_FIXED(MIN_DISTANCE), FINESINE(an>>ANGLETOFINESHIFT)); - return FIXED_TO_FLOAT(fm); -} - - -//============================================================================= -INT32 HW3S_Init(I_Error_t FatalErrorFunction, snddev_t *snd_dev) -{ - INT32 succ; - source3D_data_t source_data; - - if (HW3DS.pfnStartup(FatalErrorFunction, snd_dev)) - { - // Attack source - source_data.head_relative = 1; - source_data.pos.x = 0.0f; - source_data.pos.y = 16.0f; - source_data.pos.z = -FIXED_TO_FLOAT(mobjinfo[MT_PLAYER].height >> 1); - source_data.pos.momx = 0.0f; - source_data.pos.momy = 0.0f; - source_data.pos.momz = 0.0f; - source_data.min_distance = MIN_DISTANCE; - source_data.max_distance = MAX_DISTANCE; - source_data.permanent = 1; - - p_attack_source.sfxinfo = NULL; - - M_Memcpy(&p_attack_source2, &p_attack_source, sizeof (source_t)); - - p_attack_source.handle = HW3DS.pfnAddSource(&source_data, sfx_None); - p_attack_source2.handle = HW3DS.pfnAddSource(&source_data, sfx_None); - - // Scream source - source_data.pos.y = 0; - source_data.pos.z = 0; - - p_scream_source.sfxinfo = NULL; - - M_Memcpy(&p_scream_source2, &p_scream_source, sizeof (source_t)); - - p_scream_source.handle = HW3DS.pfnAddSource(&source_data, sfx_None); - p_scream_source2.handle = HW3DS.pfnAddSource(&source_data, sfx_None); - - //FIXED_TO_FLOAT(mobjinfo[MT_PLAYER].height - (5 * FRACUNIT)); - - // Ambient sources (left and right) at 210 and 330 degree - // relative to listener - memset(&ambient_sdata, 0, sizeof (ambient_sdata)); - - ambient_sdata.left.head_relative = 1; - ambient_sdata.left.pos.x = ambient_sdata.left.pos.y = AmbientPos(ANG210); - ambient_sdata.left.max_distance = MAX_DISTANCE; - ambient_sdata.left.min_distance = MIN_DISTANCE; - - ambient_sdata.left.permanent = 1; - - M_Memcpy(&ambient_sdata.right, &ambient_sdata.left, sizeof (source3D_data_t)); - - ambient_sdata.right.pos.x = -ambient_sdata.left.pos.x; - ambient_source.left.handle = HW3DS.pfnAddSource(&ambient_sdata.left, sfx_None); - ambient_source.right.handle = HW3DS.pfnAddSource(&ambient_sdata.right, sfx_None); - - succ = p_attack_source.handle > -1 && p_scream_source.handle > -1 && - p_attack_source2.handle > -1 && p_scream_source2.handle > -1 && - ambient_source.left.handle > -1 && ambient_source.right.handle > -1; - - //I_OutputMsg("Player handles: attack %d, default %d\n", p_attack_source.handle, p_scream_source.handle); - return succ; - } - return 0; -} - - - - -//============================================================================= -INT32 HW3S_GetVersion(void) -{ - return HW3DS.pfnGetHW3DSVersion(); -} - - -//============================================================================= -void HW3S_BeginFrameUpdate(void) -{ - if (hws_mode != HWS_DEFAULT_MODE) - HW3DS.pfnBeginFrameUpdate(); -} - - -//============================================================================= -void HW3S_EndFrameUpdate(void) -{ - if (hws_mode != HWS_DEFAULT_MODE) - HW3DS.pfnEndFrameUpdate(); -} - - - -//============================================================================= -INT32 HW3S_SoundIsPlaying(INT32 handle) -{ - return HW3DS.pfnIsPlaying(handle); -} - -INT32 HW3S_OriginPlaying(void *origin) -{ - INT32 snum; - - if (!origin) - return 0; - for (snum = 0; snum < num_sources; snum++) - if (sources[snum].origin == origin) - return 1; - return 0; -} - -INT32 HW3S_IdPlaying(sfxenum_t id) -{ - INT32 snum; - for (snum = 0; snum < num_sources; snum++) - if ((size_t)(sources[snum].sfxinfo - S_sfx) == (size_t)id) - return 1; - return 0; -} - -INT32 HW3S_SoundPlaying(void *origin, sfxenum_t id) -{ - INT32 snum; - - if (!origin) - return 0; - - for (snum = 0; snum < num_sources; snum++) - { - if (sources[snum].origin == origin - && (size_t)(sources[snum].sfxinfo - S_sfx) == (size_t)id) - return 1; - } - return 0; -} - -//============================================================================= -static void HW3S_UpdateListener(mobj_t *listener) -{ - listener_data_t data; - - if (!listener || !listener->player) - return; - - if (camera.chase) - { - data.x = FIXED_TO_FLOAT(camera.x); - data.y = FIXED_TO_FLOAT(camera.y); - data.z = FIXED_TO_FLOAT(camera.z + camera.height - (5 * FRACUNIT)); - - data.f_angle = ANGLE2DEG(camera.angle); - data.h_angle = ANGLE2DEG(camera.aiming); - - data.momx = TPS(FIXED_TO_FLOAT(camera.momx)); - data.momy = TPS(FIXED_TO_FLOAT(camera.momy)); - data.momz = TPS(FIXED_TO_FLOAT(camera.momz)); - } - else - { - data.x = FIXED_TO_FLOAT(listener->x); - data.y = FIXED_TO_FLOAT(listener->y); - data.z = FIXED_TO_FLOAT(listener->z + listener->height - (5 * FRACUNIT)); - - data.f_angle = ANGLE2DEG(listener->angle); - data.h_angle = ANGLE2DEG(listener->player->aiming); - - data.momx = TPS(FIXED_TO_FLOAT(listener->momx)); - data.momy = TPS(FIXED_TO_FLOAT(listener->momy)); - data.momz = TPS(FIXED_TO_FLOAT(listener->momz)); - } - HW3DS.pfnUpdateListener(&data, 1); -} - -static void HW3S_UpdateListener2(mobj_t *listener) -{ - listener_data_t data; - - if (!listener || !listener->player) - { - HW3DS.pfnUpdateListener(NULL, 2); - return; - } - - if (camera2.chase) - { - data.x = FIXED_TO_FLOAT(camera2.x); - data.y = FIXED_TO_FLOAT(camera2.y); - data.z = FIXED_TO_FLOAT(camera2.z + camera2.height - (5 * FRACUNIT)); - - data.f_angle = ANGLE2DEG(camera2.angle); - data.h_angle = ANGLE2DEG(camera2.aiming); - - data.momx = TPS(FIXED_TO_FLOAT(camera2.momx)); - data.momy = TPS(FIXED_TO_FLOAT(camera2.momy)); - data.momz = TPS(FIXED_TO_FLOAT(camera2.momz)); - } - else - { - data.x = FIXED_TO_FLOAT(listener->x); - data.y = FIXED_TO_FLOAT(listener->y); - data.z = FIXED_TO_FLOAT(listener->z + listener->height - (5 * FRACUNIT)); - - data.f_angle = ANGLE2DEG(listener->angle); - data.h_angle = ANGLE2DEG(listener->player->aiming); - - data.momx = TPS(FIXED_TO_FLOAT(listener->momx)); - data.momy = TPS(FIXED_TO_FLOAT(listener->momy)); - data.momz = TPS(FIXED_TO_FLOAT(listener->momz)); - } - - HW3DS.pfnUpdateListener(&data, 2); -} - -void HW3S_SetSfxVolume(INT32 volume) -{ - HW3DS.pfnSetGlobalSfxVolume(volume); -} - - -static void HW3S_Update3DSource(source_t *src) -{ - source3D_data_t data; - data.permanent = 0; - HW3S_FillSourceParameters(src->origin, &data, src->type); - HW3DS.pfnUpdate3DSource(src->handle, &data.pos); - -} - -void HW3S_UpdateSources(void) -{ - mobj_t *listener = players[displayplayers[0]].mo; - mobj_t *listener2 = NULL; - source_t *src; - INT32 audible, snum, volume, sep, pitch; - - if (splitscreen) listener2 = players[displayplayers[1]].mo; - - HW3S_UpdateListener2(listener2); - HW3S_UpdateListener(listener); - - for (snum = 0, src = sources; snum < num_sources; src++, snum++) - { - if (src->sfxinfo) - { -#if 0 - if (HW3DS.pfnIsPlaying(src->handle)) - { - if (src->origin) - { - // initialize parameters - volume = 255; // 8 bits internal volume precision - pitch = NORM_PITCH; - sep = NORM_SEP; - - // check non-local sounds for distance clipping - // or modify their params - if (src->origin && listener != src->origin && !(listener2 && src->origin == listener2)) - { - INT32 audible2; - INT32 volume2 = volume, sep2 = sep, pitch2 = pitch; - audible = S_AdjustSoundParams(listener, src->origin, &volume, &sep, &pitch, - src->sfxinfo); - - if (listener2) - { - audible2 = S_AdjustSoundParams(listener2, - src->origin, &volume2, &sep2, &pitch2, src->sfxinfo); - if (audible2 && (!audible || (audible && volume2 > volume))) - { - audible = true; - volume = volume2; - sep = sep2; - pitch = pitch2; - } - } - - if (audible) - HW3S_Update3DSource(src); // Update positional sources - else - HW3S_KillSource(snum); //Kill it! - } - } - } - else - { - // Source allocated but stopped. Kill. - HW3S_KillSource(snum); - } -#else - if (src->origin && listener != src->origin && !(listener2 && src->origin == listener2)) - HW3S_Update3DSource(src); // Update positional sources - (void)pitch; - (void)sep; - (void)volume; - (void)audible; -#endif - } - } -} - -void HW3S_Shutdown(void) -{ - HW3DS.pfnShutdown(); -} - -void *HW3S_GetSfx(sfxinfo_t *sfx) -{ - sfx_data_t sfx_data; - - if (sfx->lumpnum == LUMPERROR) - sfx->lumpnum = S_GetSfxLumpNum (sfx); - - sfx_data.length = W_LumpLength(sfx->lumpnum); - sfx_data.data = Z_Malloc(sfx_data.length, PU_SOUND, &sfx->data); - W_ReadLump(sfx->lumpnum, sfx_data.data); - sfx_data.priority = sfx->priority; - - sfx->length = HW3DS.pfnAddSfx(&sfx_data); - - Z_ChangeTag(sfx->data, PU_CACHE); - - return sfx_data.data; -} - -void HW3S_FreeSfx(sfxinfo_t *sfx) -{ - INT32 snum; - - for (snum = 0; snum < num_sources; snum++) - { - if (sources[snum].sfxinfo == sfx) - { - HW3S_KillSource(snum); - break; - } - } - - if (sfx->length > 0) - HW3DS.pfnKillSfx((u_int)sfx->length); - sfx->length = 0; - - sfx->lumpnum = LUMPERROR; - - Z_Free(sfx->data); - sfx->data = NULL; -} - -#endif diff --git a/src/hardware/hw3sound.h b/src/hardware/hw3sound.h deleted file mode 100644 index a8a475b69..000000000 --- a/src/hardware/hw3sound.h +++ /dev/null @@ -1,106 +0,0 @@ -// Emacs style mode select -*- C++ -*- -//----------------------------------------------------------------------------- -// -// Copyright (C) 2001 by DooM Legacy Team. -// -// This program is free software; you can redistribute it and/or -// modify it under the terms of the GNU General Public License -// as published by the Free Software Foundation; either version 2 -// of the License, or (at your option) any later version. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -//----------------------------------------------------------------------------- -/// \file -/// \brief High-level functions of hardware 3D sound - -#ifndef __HW3_SOUND_H__ -#define __HW3_SOUND_H__ - -#ifdef HW3SOUND -#include "hws_data.h" -//#include "../s_sound.h" -//#include "../p_mobj.h" - -// Default sound mode (original stereo mode) -enum -{ - HWS_DEFAULT_MODE = 0, - HWS_DS3D, - HWS_OTHER, - HWS_FMOD3D, - HWS_OPENAL, -}; - -typedef enum -{ - CT_NORMAL = 0, - CT_ATTACK, - CT_SCREAM, - CT_AMBIENT, -} channel_type_t; - -extern INT32 hws_mode; // Current sound mode - -#if defined (HW3DS) || defined (DOXYGEN) -INT32 HW3S_Init(I_Error_t FatalErrorFunction, snddev_t *snd_dev); -#endif -void HW3S_Shutdown(void); -INT32 HW3S_GetVersion(void); - -// Common case - start 3D or 2D source -void HW3S_StartSound(const void *origin, sfxenum_t sfx_id); - -// Special cases of 3D sources -void S_StartAmbientSound(sfxenum_t sfx_id, INT32 volume); -void S_StartAttackSound(const void *origin, sfxenum_t sfx_id); -void S_StartScreamSound(const void *origin, sfxenum_t sfx_id); - -// Starts 3D sound with specified parameters -// origin - for object movement tracking. NULL are possible value (no movement tracking) -// source_parm - 3D source parameters (position etc.) -// cone_parm - 3D source cone parameters. NULL are possible value (default cone will be used) -// channel - -// sfx_id - sfx id -// vol - sound volume -// pitch - sound pitching value -// Returns: - sound id -INT32 HW3S_I_StartSound(const void *origin, source3D_data_t *source_parm, channel_type_t channel, sfxenum_t sfx_id, INT32 vol, INT32 pitch, INT32 sep); -void HW3S_StopSoundByID(void *origin, sfxenum_t sfx_id); -void HW3S_StopSoundByNum(sfxenum_t sfxnum); -void HW3S_StopSound(void *origin); -void HW3S_StopSounds(void); - -void HW3S_BeginFrameUpdate(void); -void HW3S_EndFrameUpdate(void); - -void HW3S_UpdateSources(void); - -void HW3S_SetSfxVolume(INT32 volume); - -// Utility functions -INT32 HW3S_SoundIsPlaying(INT32 handle); -void HW3S_SetSourcesNum(void); - -INT32 HW3S_OriginPlaying(void *origin); -INT32 HW3S_IdPlaying(sfxenum_t id); -INT32 HW3S_SoundPlaying(void *origin, sfxenum_t id); - -void *HW3S_GetSfx(sfxinfo_t *sfx); -void HW3S_FreeSfx(sfxinfo_t *sfx); - -#else // HW3SOUND - -//#define S_StartAmbientSound(i,v) S_StartSoundAtVolume(NULL, i, v) -#define S_StartAttackSound S_StartSound -#define S_StartScreamSound S_StartSound - -#endif // HW3SOUND - -INT32 S_AdjustSoundParams(const mobj_t *listener, const mobj_t *source, - INT32 *vol, INT32 *sep, INT32 *pitch, sfxinfo_t *sfxinfo); - -#endif // __HW3_SOUND_H__ diff --git a/src/hardware/hws_data.h b/src/hardware/hws_data.h deleted file mode 100644 index b890d976b..000000000 --- a/src/hardware/hws_data.h +++ /dev/null @@ -1,123 +0,0 @@ -// Emacs style mode select -*- C++ -*- -//----------------------------------------------------------------------------- -// -// Copyright (C) 2005 by SRB2 Jr. Team. -// -// This program is free software; you can redistribute it and/or -// modify it under the terms of the GNU General Public License -// as published by the Free Software Foundation; either version 2 -// of the License, or (at your option) any later version. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -//----------------------------------------------------------------------------- -/// \file -/// \brief 3D sound definitions - -#ifndef __HWS_DATA_H__ -#define __HWS_DATA_H__ - -#define NORMAL_SEP 128 - -// abuse? -#define STATIC_SOURCES_NUM 6 // Total number of static sources - -#define MIN_DISTANCE 160.0f -#define MAX_DISTANCE 1200.0f - -typedef struct source_pos_s -{ - double x; - double y; - double z; -} source_pos_t; - -typedef struct source3D_pos_s -{ - float x; - float y; - float z; - //float angle; - float momx; - float momy; - float momz; - -} source3D_pos_t; - - -enum {NORMAL_PITCH = 128}; - -/*typedef struct source2D_data_s -{ - INT32 volume; - INT32 sep; - -} source2D_data_t;*/ - - -// General 3D sound source description -typedef struct source3D_data_s -{ - float min_distance; // - float max_distance; // - INT32 head_relative; // - INT32 permanent; // - source3D_pos_t pos; // source position in 3D - -} source3D_data_t; - - -// Sound data -typedef struct sfx_data_s -{ - size_t length; - void *data; - INT32 priority; - INT32 sep; // Only when source is 2D sound -} sfx_data_t; - - -// Sound cone (for 3D sources) -typedef struct cone_def_s -{ - float inner; - float outer; - INT32 outer_gain; - /*float f_angle; - float h_angle;*/ -} cone_def_t; - - -typedef struct listener_data_s -{ - // Listener position - double x; - double y; - double z; - - // Listener front and head orientation (degrees) - double f_angle; - double h_angle; - - // Listener momentums - double momx; - double momy; - double momz; -} listener_data_t; - -typedef struct snddev_s -{ - INT32 sample_rate; - INT32 bps; - size_t numsfxs; - -// Windows specific data -#ifdef _WIN32 - UINT32 cooplevel; - HWND hWnd; -#endif -} snddev_t; - -#endif //__HWS_DATA_H__ diff --git a/src/hardware/s_ds3d/s_ds3d.c b/src/hardware/s_ds3d/s_ds3d.c deleted file mode 100644 index 5299c1795..000000000 --- a/src/hardware/s_ds3d/s_ds3d.c +++ /dev/null @@ -1,1237 +0,0 @@ -// Emacs style mode select -*- C++ -*- -//----------------------------------------------------------------------------- -// -// Copyright (C) 2001 by DooM Legacy Team. -// -// This program is free software; you can redistribute it and/or -// modify it under the terms of the GNU General Public License -// as published by the Free Software Foundation; either version 2 -// of the License, or (at your option) any later version. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -//----------------------------------------------------------------------------- -/// \file -/// \brief General driver for 3D sound system -/// -/// Implementend via DirectSound3D API - -#define INITGUID -//#define WIN32_LEAN_AND_MEAN -#define RPC_NO_WINDOWS_H -#include -#include -#define DIRECTSOUND_VERSION 0x0700 /* version 7.0 */ - -#ifdef __MINGW32__ -#define NONAMELESSUNION -#endif -#include - -#if (defined (DIRECTSOUND_VERSION) && (DIRECTSOUND_VERSION >= 0x0700)) -#define DX7 //Enable DX7 or up only code -#undef DUMMYUNIONNAMEN -#endif - -#ifdef __MINGW32__ -//#undef DX7 -#endif - -#define _CREATE_DLL_ -#include "../hw3dsdrv.h" -#include "../../m_fixed.h" -#include "../../doomdef.h" -//#define VERSIONSTRING "v1.08" - -#undef DEBUG_TO_FILE -#define DEBUG_TO_FILE - -#if defined ( HAVE_SDL ) && !defined ( LOGMESSAGES ) -#undef DEBUG_TO_FILE -#endif - - -// Internal sound stack -typedef struct stack_snd_s -{ - // Sound data - LPDIRECTSOUNDBUFFER dsbuffer; - - // 3D data of 3D source - LPDIRECTSOUND3DBUFFER dsbuffer3D; // 3D data - - // Current parameters of 3D source - // Valid only when source is 3D source - // (dsbuffer3D is not NULL) - DS3DBUFFER parameters; - - // Currently unused - INT32 sfx_id; - - // Currently unused - INT32 LRU; - - // Flag of static source - // Driver does not manage intrenally such sources - INT32 permanent; - -} stack_t; - -// Just for now... -#define SOUND_ALLOCATE_DELTA 16 // Amount of sources per stack incrementation -#define MAX_LRU 16 // Maximum iterations to keep source in stack - -static stack_t *_stack; // Sound stack -static INT32 allocated_sounds; // Size of stack - -static INT32 srate; // Default sample rate - - -// output all debugging messages to this file -#if defined (DEBUG_TO_FILE) -#include -FILE *logstream = NULL; -#endif - -static LPDIRECTSOUND DSnd = NULL; // Main DirectSound object -static LPDIRECTSOUNDBUFFER PrimaryBuffer = NULL; // -static LPDIRECTSOUND3DLISTENER Listener = NULL; // - -static DS3DLISTENER listener_parms; // Listener papameters - -#ifdef DX7 -static BOOL virtualization; // TRUE if HRTF virtualization enabled -#endif - -static DWORD update_mode; // Current update mode of listener -//static DWORD max_3d_buffers; - -static I_Error_t I_ErrorDS3D = NULL; - -//static stack_snd_t sound_stack[MAX_SOUNDS]; - -// Safe buffer release -#define RELEASE_BUFFER(buf) {if (buf) { IDirectSoundBuffer_Release(buf); (buf) = NULL; }} -#define RELEASE_3DBUFFER(buf) {if (buf) { IDirectSound3DBuffer_Release(buf); (buf) = NULL; }} - -// Default flags for buffers -#define _2DSOURCE_FLAGS (DSBCAPS_CTRLPAN | DSBCAPS_CTRLVOLUME | DSBCAPS_STICKYFOCUS | DSBCAPS_STATIC | DSBCAPS_CTRLFREQUENCY) -#define _3DSOURCE_FLAGS (DSBCAPS_CTRL3D | DSBCAPS_STATIC | DSBCAPS_MUTE3DATMAXDISTANCE | DSBCAPS_CTRLVOLUME | DSBCAPS_CTRLFREQUENCY) - - -enum {IS_2DSOURCE = 0, IS_3DSOURCE = 1}; - -#define NEW_HANDLE -1 - -#ifdef _WINDOWS -BOOL WINAPI DllMain(HINSTANCE hinstDLL, // handle to DLL module - DWORD fdwReason, // reason for calling function - LPVOID lpvReserved) // reserved -{ - // Perform actions based on the reason for calling - UNREFERENCED_PARAMETER(lpvReserved); - switch ( fdwReason ) - { - case DLL_PROCESS_ATTACH: - // Initialize once for each new process. - // Return FALSE to fail DLL load. -#ifdef DEBUG_TO_FILE - logstream = fopen("s_ds3d.log", "wt"); - if (logstream == NULL) - return FALSE; -#endif - DisableThreadLibraryCalls(hinstDLL); - break; - - case DLL_THREAD_ATTACH: - // Do thread-specific initialization. - break; - - case DLL_THREAD_DETACH: - // Do thread-specific cleanup. - break; - - case DLL_PROCESS_DETACH: - // Perform any necessary cleanup. -#ifdef DEBUG_TO_FILE - if (logstream) - { - fclose(logstream); - logstream = NULL; - } -#endif - break; - } - return TRUE; // Successful DLL_PROCESS_ATTACH. -} -#endif - -// ************************************************************************** -// FUNCTIONS -// ************************************************************************** - -/*************************************************************** - * - * DBG_Printf - * Output error messages to debug log if DEBUG_TO_FILE is defined, - * else do nothing - * - *************************************************************** - */ -// -----------------+ -// DBG_Printf : Output error messages to debug log if DEBUG_TO_FILE is defined, -// : else do nothing -// Returns : -// -----------------+ -void DBG_Printf(const char *lpFmt, ... ) -{ -#ifdef DEBUG_TO_FILE - char str[4096] = ""; - va_list arglist; - - va_start(arglist, lpFmt); - vsnprintf(str, 4096, lpFmt, arglist); - va_end(arglist); - - if (logstream) - fwrite(str, strlen(str), 1, logstream); -#endif -} - - -/*************************************************************** - * - * Grow intrenal sound stack by SOUND_ALLOCATE_DELTA amount - * - *************************************************************** - */ -static BOOL reallocate_stack(void) -{ - stack_t *new_stack; - - if (_stack) - new_stack = realloc(_stack, sizeof (stack_t) * (allocated_sounds + SOUND_ALLOCATE_DELTA)); - else - new_stack = malloc(sizeof (stack_t) * (allocated_sounds + SOUND_ALLOCATE_DELTA)); - if (new_stack) - { - _stack = new_stack; - ZeroMemory(&_stack[allocated_sounds], SOUND_ALLOCATE_DELTA * sizeof (stack_t)); - allocated_sounds += SOUND_ALLOCATE_DELTA; - } - return (new_stack != NULL); -} - - -/*************************************************************** - * - * Destroys source in stack - * - *************************************************************** - */ -static void kill_sound(stack_t *snd) -{ - //stack_t *snd = _stack + handle; - - if (snd->dsbuffer3D) - RELEASE_3DBUFFER(snd->dsbuffer3D); - - if (snd->dsbuffer) - RELEASE_BUFFER(snd->dsbuffer); - - ZeroMemory(snd, sizeof (stack_t)); -} - - -/*************************************************************** - * - * Returns TRUE if source currently playing - * - *************************************************************** - */ -static BOOL is_playing(stack_t *snd) -{ - DWORD status; - LPDIRECTSOUNDBUFFER dsbuffer = snd->dsbuffer; - - if (dsbuffer == NULL) - return 0; - - IDirectSoundBuffer_GetStatus(dsbuffer, &status); - - return (status & (DSBSTATUS_PLAYING | DSBSTATUS_LOOPING)); -} - - -/*************************************************************** - * - * Creates DirectSound buffer and fills with sound data - * NULL sound data pointer are valid (empty buffer - * will be created) - * - *************************************************************** - */ -static LPDIRECTSOUNDBUFFER create_buffer (void *data, INT32 length, BOOL as3d) -{ - LPDIRECTSOUNDBUFFER dsbuffer; - HRESULT hr; - WAVEFORMATEX wfm; - DSBUFFERDESC dsbdesc; - LPVOID lpvAudio1; // receives address of lock start - DWORD dwBytes1; // receives number of bytes locked - LPVOID lpvAudio2; // receives address of lock start - DWORD dwBytes2; // receives number of bytes locked - - ZeroMemory(&wfm, sizeof (WAVEFORMATEX)); - wfm.wFormatTag = WAVE_FORMAT_PCM; - wfm.nChannels = 1; - wfm.nSamplesPerSec = data?*((UINT16 *)data+1):srate; //mostly 11025, but some at 22050. - wfm.wBitsPerSample = 8; - wfm.nBlockAlign = (WORD)(wfm.wBitsPerSample / 8 * wfm.nChannels); - wfm.nAvgBytesPerSec = wfm.nSamplesPerSec * wfm.nBlockAlign; - - // Set up DSBUFFERDESC structure. - ZeroMemory (&dsbdesc, sizeof (DSBUFFERDESC) ); - dsbdesc.dwSize = sizeof (DSBUFFERDESC); - dsbdesc.dwFlags = as3d?_3DSOURCE_FLAGS:_2DSOURCE_FLAGS; - dsbdesc.dwBufferBytes = length; - dsbdesc.lpwfxFormat = &wfm; - - // DirectX 7.0 and above! - // Try to enable full HRTF virtualization algorithm for - // two-speakers or headphones -#ifdef DX7 - if (as3d) - dsbdesc.guid3DAlgorithm = (virtualization?DS3DALG_HRTF_FULL:DS3DALG_DEFAULT); -#endif - - hr = IDirectSound_CreateSoundBuffer (DSnd, &dsbdesc, &dsbuffer, NULL); - - // CreateSoundBuffer might return DS_NO_VIRTUALIZATION so uses FAILED - // macro rather than check explictly for DS_OK value - if (FAILED(hr)) - { - DBG_Printf("CreateSoundBuffer FAILED. Code %d\n", hr); - return NULL; - } - - if (data) - { - hr = IDirectSoundBuffer_Lock(dsbuffer, 0, length, &lpvAudio1, &dwBytes1, &lpvAudio2, &dwBytes2, 0); - - // If DSERR_BUFFERLOST is returned, restore and retry lock. - if (hr == DSERR_BUFFERLOST) - { - hr = IDirectSoundBuffer_Restore(dsbuffer); - if (FAILED(hr)) - I_ErrorDS3D("Restore fail on %x, code %d\n",dsbuffer, hr); - hr = IDirectSoundBuffer_Lock(dsbuffer, 0, length, &lpvAudio1, &dwBytes1, &lpvAudio2, &dwBytes2, 0); - if (FAILED(hr)) - I_ErrorDS3D("Lock fail(2) on %x, code %d\n",dsbuffer, hr); - } - else - if (FAILED(hr)) - I_ErrorDS3D("Lock fail(1) on %x, code %d\n",dsbuffer, hr); - - // copy wave data into the buffer (note: dwBytes1 should equal to dsbdesc->dwBufferBytes ...) - CopyMemory (lpvAudio1, (LPBYTE)data+8, dwBytes1); - - if ( dwBytes2 && lpvAudio2) - CopyMemory(lpvAudio2, ((LPBYTE)data + 8) + dwBytes1, dwBytes2); - - - // finally, unlock the buffer - hr = IDirectSoundBuffer_Unlock(dsbuffer, lpvAudio1, dwBytes1, lpvAudio2, dwBytes2); - - if (FAILED(hr)) - I_ErrorDS3D("Unlock fail on %x, code %d\n",dsbuffer, hr); - } - - return dsbuffer; -} - - -/*************************************************************** - * - * Creates 3D source data buffer - * - *************************************************************** - */ -static LPDIRECTSOUND3DBUFFER create_3dbuffer(LPDIRECTSOUNDBUFFER dsbuffer, LPDIRECTSOUND3DBUFFER source3d) -{ - HRESULT hr; - - hr = IDirectSoundBuffer_QueryInterface(dsbuffer, - &IID_IDirectSound3DBuffer, (void **)&source3d); - - if (FAILED(hr)) - { - DBG_Printf("Couldn't obtain 3D Buffer interface. Code %d\n", hr); - return NULL; - } -#ifdef DX7 - if (hr == DS_NO_VIRTUALIZATION) - { - DBG_Printf("The 3D virtualization is not supported under this OS.\n"); - virtualization = FALSE; - } -#endif - return source3d; -} - - -/*************************************************************** - * - * Returns free (unused) source stack slot - * If none available sound stack will be increased - * - *************************************************************** - */ -static INT32 find_handle(INT32 new_sfx_id, INT32 new_is3d) -{ - INT32 free_sfx; - stack_t *snd; - - // At first do look for sound with same sfx ID and reuse it - new_sfx_id = new_is3d = 0; - for (free_sfx = 0, snd = _stack; free_sfx < allocated_sounds; snd++, free_sfx++) - { - - if (snd->permanent) - continue; -/* - if (!is_playing(snd)) - { - if (same_sfx == 0 && snd->sfx_id == new_sfx_id && snd->dsbuffer) - { - same_sfx = i; - continue; - } - - if (snd->sfx_id && ++snd->LRU >= MAX_LRU) - kill_sound(snd); - } -*/ - if (snd->dsbuffer == 0) - break; - //free_sfx = i; - } - - // No suitable resource found so increase sound stack - if (free_sfx == allocated_sounds) - { - DBG_Printf("No free or same sfx found so increase stack (currently %d srcs)\n", allocated_sounds); - free_sfx = reallocate_stack() ? free_sfx : -1; - } - - return free_sfx; -} - - -/*************************************************************** - * - * Recalculates volume from Doom scale to DirectSound scale - * - *************************************************************** - */ -static INT32 recalc_volume(INT32 base_vol, INT32 steps) -{ - return (base_vol * ((DSBVOLUME_MAX-DSBVOLUME_MIN)/4)) / steps - + (DSBVOLUME_MAX - ((DSBVOLUME_MAX-DSBVOLUME_MIN)/4)); -} - - -/*************************************************************** - * - * Updates sound volume of the DirectSound buffer - * - *************************************************************** - */ -static void UpdateSoundVolume (LPDIRECTSOUNDBUFFER lpSnd, INT32 volume) -{ - /*volume = (volume * ((DSBVOLUME_MAX-DSBVOLUME_MIN)/4)) / 256 + - (DSBVOLUME_MAX - ((DSBVOLUME_MAX-DSBVOLUME_MIN)/4)); - - IDirectSoundBuffer_SetVolume (lpSnd, volume);*/ - IDirectSoundBuffer_SetVolume (lpSnd, recalc_volume(volume, 256)); -} - - -// -------------------------------------------------------------------------- -// Update the panning for a secondary buffer, make sure it was created with -// DSBCAPS_CTRLPAN -// -------------------------------------------------------------------------- -#define DSBPAN_RANGE (DSBPAN_RIGHT-(DSBPAN_LEFT)) - -//Doom sounds pan range 0-255 (128 is centre) -#define SEP_RANGE 256 -static void Update2DSoundPanning (LPDIRECTSOUNDBUFFER lpSnd, INT32 sep) -{ - HRESULT hr; - hr = IDirectSoundBuffer_SetPan (lpSnd, (sep * DSBPAN_RANGE)/SEP_RANGE - DSBPAN_RIGHT); - //if (FAILED(hr)) - // DEBFILE(va("SetPan FAILED for sep %d pan %d\n", sep, (sep * DSBPAN_RANGE)/SEP_RANGE - DSBPAN_RIGHT)); -} - - - -/****************************************************************************** - * - * Initialise driver and listener - * - *****************************************************************************/ -EXPORT BOOL HWRAPI( Startup ) (I_Error_t FatalErrorFunction, snddev_t *snd_dev) -{ - HRESULT hr; - DSBUFFERDESC desc; - WAVEFORMATEX wfm; - DSCAPS dscaps; - DWORD speakers; - DWORD speaker_config; - DWORD speaker_geometry; - - I_ErrorDS3D = FatalErrorFunction; - DBG_Printf ("S_DS3D Init(): DirectSound3D driver for SRB2 v1.09"); // Tails - - DBG_Printf("Initialising DirectSound3D...\n"); - hr = DirectSoundCreate( NULL, &DSnd, NULL); - if (FAILED(hr)) - { - DBG_Printf("Failed to obtain DirectSound\n"); - return FALSE; - } - - hr = IDirectSound_SetCooperativeLevel(DSnd, snd_dev->hWnd, snd_dev->cooplevel); - if (FAILED(hr)) - { - DBG_Printf("Couldn't set coopertive level\n"); - return FALSE; - } - - dscaps.dwSize = sizeof (DSCAPS); - - IDirectSound_GetCaps(DSnd, &dscaps); - IDirectSound_GetSpeakerConfig(DSnd, &speakers); - - DBG_Printf("Sound hardware capabilities:\n"); - DBG_Printf(" Driver is %scertified.\n", (dscaps.dwFlags & DSCAPS_CERTIFIED) == DSCAPS_CERTIFIED?"":"not "); - DBG_Printf(" Maximum hardware mixing buffers %d\n", dscaps.dwMaxHwMixingAllBuffers); - DBG_Printf(" Maximum hardware 3D buffers %d\n", dscaps.dwFreeHw3DAllBuffers); - - speaker_config = DSSPEAKER_CONFIG(speakers); - speaker_geometry = DSSPEAKER_GEOMETRY(speakers); - - DBG_Printf("Current speaker configuration: "); - - switch (speaker_config) - { -#ifdef DX7 - case DSSPEAKER_5POINT1: - DBG_Printf("5.1 (5 speakers with subwoofer).\n"); - break; -#endif - case DSSPEAKER_HEADPHONE: - DBG_Printf("headphone.\n"); - break; - - case DSSPEAKER_MONO: - DBG_Printf("single speaker (mono).\n"); - break; - - case DSSPEAKER_QUAD: - DBG_Printf("quadrophonic\n"); - break; - - case DSSPEAKER_SURROUND: - DBG_Printf("surround.\n"); - break; - - case DSSPEAKER_STEREO: - DBG_Printf("stereo with %s geometry ", - speaker_geometry == DSSPEAKER_GEOMETRY_WIDE - ? "wide (arc of 20 deg.)" - : speaker_geometry == DSSPEAKER_GEOMETRY_NARROW - ? "narrow (arc of 10 deg.)" - : speaker_geometry == DSSPEAKER_GEOMETRY_MIN - ? "min (arc of 5 deg.)" - : speaker_geometry == DSSPEAKER_GEOMETRY_MAX - ? "max (arc of 180 deg.)" - : "unknown"); - break; - default: - DBG_Printf("undetectable.\n"); - - } - - update_mode = DS3D_IMMEDIATE; - - // Create primary sound buffer - ZeroMemory(&desc, sizeof (DSBUFFERDESC)); - desc.dwSize = sizeof (DSBUFFERDESC); - desc.dwFlags = DSBCAPS_CTRL3D | DSBCAPS_PRIMARYBUFFER | DSBCAPS_CTRLVOLUME; - desc.dwBufferBytes = 0; - desc.lpwfxFormat = NULL; - - hr = IDirectSound_CreateSoundBuffer(DSnd, &desc, &PrimaryBuffer, NULL); - if (FAILED(hr)) - { - DBG_Printf("CreateSoundBuffer FAILED (ErrNo %d)\n", hr); - return FALSE; - } - - // Query for 3D Listener object - hr = IDirectSoundBuffer_QueryInterface(PrimaryBuffer, - &IID_IDirectSound3DListener, (void **)&Listener); - - if (FAILED(hr)) - { - DBG_Printf("Couldn't obtain 3D Listener interface (ErrNo %d)\n", hr); - return FALSE; - } - - // Set up initial listsner parameters - IDirectSound3DListener_SetDistanceFactor(Listener, 1.0f/72.0f, DS3D_IMMEDIATE); - IDirectSound3DListener_SetRolloffFactor(Listener, 1.6f, DS3D_IMMEDIATE); - //IDirectSound3DListener_SetRolloffFactor(Listener, DS3D_MAXROLLOFFFACTOR, DS3D_IMMEDIATE); - listener_parms.dwSize = sizeof (DS3DLISTENER); - IDirectSound3DListener_GetAllParameters(Listener, &listener_parms); - - ZeroMemory (&wfm, sizeof (WAVEFORMATEX)); - wfm.wFormatTag = WAVE_FORMAT_PCM; - wfm.nChannels = 2; - wfm.nSamplesPerSec = srate = snd_dev->sample_rate; - wfm.wBitsPerSample = (WORD)snd_dev->bps; - wfm.nBlockAlign = (WORD)(wfm.wBitsPerSample / 8 * wfm.nChannels); - wfm.nAvgBytesPerSec = wfm.nSamplesPerSec * wfm.nBlockAlign; - - if (snd_dev->cooplevel >= DSSCL_PRIORITY) - { - hr = IDirectSoundBuffer_SetFormat(PrimaryBuffer, &wfm); - if (FAILED(hr)) - DBG_Printf("Couldn't set primary buffer format.\n"); - - DBG_Printf(" Compacting onboard sound-memory..."); - hr = IDirectSound_Compact(DSnd); - DBG_Printf(" %s\n", SUCCEEDED(hr) ? M_GetText("Done\n") : M_GetText("Failed\n")); - } - -#ifdef DX7 - // Initially enables HRTF virtualization (may be changed later) - virtualization = TRUE; -#endif - - _stack = NULL; - allocated_sounds = 0; - IDirectSoundBuffer_Play(PrimaryBuffer, 0, 0, DSBPLAY_LOOPING); - return reallocate_stack(); -} - - - -/*************************************************************** - * - * Shutdown driver - * - *************************************************************** - */ -EXPORT void HWRAPI( Shutdown ) (void) -{ - INT32 i; - - DBG_Printf ("S_DS3D Shutdown()\n"); - - for (i = 0; i < allocated_sounds; i++) - { - StopSource(i); - kill_sound(_stack + i); - } - - if (_stack) - free(_stack); - - if (Listener) - { - IDirectSound3DListener_Release(Listener); - Listener = NULL; - } - - if (PrimaryBuffer) - RELEASE_BUFFER(PrimaryBuffer); - - if (DSnd) - { - IDirectSound_Release(DSnd); - DSnd = NULL; - } - -} - - - -EXPORT INT32 HWRAPI (IsPlaying) (INT32 handle) -{ - if (handle < 0 || handle >= allocated_sounds) - return FALSE; - - return is_playing(_stack + handle); -} - - -// Calculate sound pitching -static float recalc_pitch(INT32 doom_pitch) -{ - return doom_pitch < NORMAL_PITCH ? - (float)(doom_pitch + NORMAL_PITCH) / (NORMAL_PITCH * 2) - :(float)doom_pitch / (float)NORMAL_PITCH; -} - - -static stack_t *setup_source(INT32 handle, sfx_data_t *sfx, BOOL is_3dsource) -{ - stack_t *snd; - //INT32 handle; - INT32 data_length; - LPDIRECTSOUNDBUFFER dsbuffer = NULL; - LPDIRECTSOUND3DBUFFER ds3dbuffer = NULL; - - if (handle == NEW_HANDLE) - handle = find_handle(sfx?sfx->id:0, is_3dsource); - - snd = _stack + handle; - - // Check for reused source - if (snd->dsbuffer) - return snd; - - data_length = sfx?sfx->length - 8:DSBSIZE_MIN; - - dsbuffer = create_buffer(sfx ? sfx->data : NULL, data_length, is_3dsource); - if (dsbuffer) - { - - if (is_3dsource) - { - ds3dbuffer = create_3dbuffer(dsbuffer, ds3dbuffer); - if (!ds3dbuffer) - { - RELEASE_BUFFER(dsbuffer); - return NULL; - } - snd->parameters.dwSize = sizeof (DS3DBUFFER); - IDirectSound3DBuffer_GetAllParameters(ds3dbuffer, &snd->parameters); - } - - // judgecutor: sound pitching - if (sfx) - { - DWORD freq; - - freq = (DWORD)((float)(*((UINT16 *)sfx->data+1)) * recalc_pitch(sfx->pitch)); - IDirectSoundBuffer_SetFrequency(dsbuffer, freq); - } - - snd->dsbuffer = dsbuffer; - snd->dsbuffer3D = ds3dbuffer; - snd->LRU = 0; - snd->sfx_id = sfx ? sfx->id : 0; - if (!is_3dsource) - snd->permanent = 0; - return snd; - } - return NULL; - -} - -/****************************************************************************** - * - * Creates 2D (stereo) source - * - ******************************************************************************/ -EXPORT INT32 HWRAPI ( Add2DSource ) (sfx_data_t *sfx) -{ - stack_t *snd; - - if (!sfx) - return -1; - - snd = setup_source(NEW_HANDLE, sfx, IS_2DSOURCE); - if (snd) - { - UpdateSoundVolume(snd->dsbuffer, sfx->volume); - Update2DSoundPanning(snd->dsbuffer, sfx->sep); - } - return snd - _stack; -} - -/****************************************************************************** - * - * Creates 3D source - * - ******************************************************************************/ - -EXPORT INT32 HWRAPI ( Add3DSource ) (source3D_data_t *src, sfx_data_t *sfx) -{ - stack_t *snd; - - snd = setup_source(NEW_HANDLE, sfx, IS_3DSOURCE); - - if (snd) - { - - /*x = src->pos.x; - y = src->pos.z; - z = src->pos.y; - - IDirectSound3DBuffer_SetPosition(source, x, y, z, update_mode); - IDirectSound3DBuffer_SetVelocity(source, src->pos.momx, src->pos.momz, src->pos.momy, update_mode); - IDirectSound3DBuffer_SetMode(source, src->head_relative?DS3DMODE_HEADRELATIVE:DS3DMODE_NORMAL, update_mode);*/ - -#ifdef DUMMYUNIONNAMEN - snd->parameters.vPosition.DUMMYUNIONNAMEN(9).x = src->pos.x; - snd->parameters.vPosition.DUMMYUNIONNAMEN(10).y = src->pos.z; - snd->parameters.vPosition.DUMMYUNIONNAMEN(11).z = src->pos.y; - - snd->parameters.vVelocity.DUMMYUNIONNAMEN(9).x = src->pos.momx; - snd->parameters.vVelocity.DUMMYUNIONNAMEN(10).y = src->pos.momz; - snd->parameters.vVelocity.DUMMYUNIONNAMEN(11).z = src->pos.momy; -#else - snd->parameters.vPosition.x = src->pos.x; - snd->parameters.vPosition.y = src->pos.z; - snd->parameters.vPosition.z = src->pos.y; - - snd->parameters.vVelocity.x = src->pos.momx; - snd->parameters.vVelocity.y = src->pos.momz; - snd->parameters.vVelocity.z = src->pos.momy; -#endif - snd->parameters.dwMode = src->head_relative ? DS3DMODE_HEADRELATIVE : DS3DMODE_NORMAL; - - snd->parameters.flMinDistance = src->min_distance; - snd->parameters.flMaxDistance = src->max_distance; - //snd->parameters.flMaxDistance = DS3D_DEFAULTMAXDISTANCE; - - snd->permanent = src->permanent; - - UpdateSoundVolume(snd->dsbuffer, sfx?sfx->volume:255); - IDirectSound3DBuffer_SetAllParameters(snd->dsbuffer3D, &snd->parameters, DS3D_IMMEDIATE); - IDirectSoundBuffer_SetCurrentPosition(snd->dsbuffer, 0); - } - - return (snd - _stack); -} - -/****************************************************************************** - * - * Destroy source and remove it from stack if it is a 2D source. - * Otherwise put source into cache - * - *****************************************************************************/ -EXPORT void HWRAPI (KillSource) (INT32 handle) -{ - - if (handle < 0 || handle >= allocated_sounds) - return; -/* - if (_stack[handle].dsbuffer3D) - { - // It's a 3D source so let him chance to be reused :-) - _stack[handle].LRU = 1; - } - else - { */ - // No, it is a 2D source so kill him - kill_sound(_stack + handle); - //} -} - - -/****************************************************************************** - * - * Update volume and separation (panning) of 2D source - * - *****************************************************************************/ -EXPORT void HWRAPI (Update2DSoundParms) (INT32 handle, INT32 vol, INT32 sep) -{ - LPDIRECTSOUNDBUFFER dsbuffer; - - if (handle < 0 || handle >= allocated_sounds) - return; - - if ((_stack+handle)->dsbuffer3D) - return; - dsbuffer = (_stack + handle)->dsbuffer; - - UpdateSoundVolume(dsbuffer, vol); - Update2DSoundPanning(dsbuffer, sep); -} - - - -// -------------------------------------------------------------------------- -// Set the global volume for sound effects -// -------------------------------------------------------------------------- -EXPORT void HWRAPI (SetGlobalSfxVolume) (INT32 volume) -{ - INT32 vol; - HRESULT hr; - - // use the last quarter of volume range - if (volume) - vol = recalc_volume(volume, 31); - else - vol = DSBVOLUME_MIN; - - hr = IDirectSoundBuffer_SetVolume (PrimaryBuffer, vol); -} - -EXPORT void HWRAPI ( StopSource) (INT32 handle) -{ - LPDIRECTSOUNDBUFFER dsbuffer; - - if (handle < 0 || handle >= allocated_sounds) - return; - - dsbuffer = (_stack + handle)->dsbuffer; - - if (dsbuffer) - { - IDirectSoundBuffer_Stop(dsbuffer); - IDirectSoundBuffer_SetCurrentPosition(dsbuffer, 0); - } -} - - -EXPORT INT32 HWRAPI ( GetHW3DSVersion) (void) -{ - return VERSION; -} - - -EXPORT void HWRAPI (BeginFrameUpdate) (void) -{ - update_mode = DS3D_DEFERRED; -} - - -EXPORT void HWRAPI (EndFrameUpdate) (void) -{ - if (update_mode == DS3D_DEFERRED) - IDirectSound3DListener_CommitDeferredSettings(Listener); - - update_mode = DS3D_IMMEDIATE; -} - - -/****************************************************************************** - * UpdateListener - * - * Set up main listener properties: - * - position - * - orientation - * - velocity - *****************************************************************************/ -EXPORT void HWRAPI (UpdateListener) (listener_data_t *data) -{ - D3DVECTOR pos; - D3DVECTOR face; - D3DVECTOR head; - D3DVECTOR velocity; - double f_angle; - //double h_angle, t_angle; - //double f_cos, f_sin, t_sin; - -#ifdef DUMMYUNIONNAMEN - pos.DUMMYUNIONNAMEN(9).x = (D3DVALUE)data->x; - pos.DUMMYUNIONNAMEN(10).y = (D3DVALUE)data->z; - pos.DUMMYUNIONNAMEN(11).z = (D3DVALUE)data->y; - - velocity.DUMMYUNIONNAMEN(9).x = (D3DVALUE)data->momx; - velocity.DUMMYUNIONNAMEN(10).y = (D3DVALUE)data->momz; - velocity.DUMMYUNIONNAMEN(11).z = (D3DVALUE)data->momy; -#else - pos.x = (D3DVALUE)data->x; - pos.y = (D3DVALUE)data->z; - pos.z = (D3DVALUE)data->y; - - velocity.x = (D3DVALUE)data->momx; - velocity.y = (D3DVALUE)data->momz; - velocity.z = (D3DVALUE)data->momy; -#endif - f_angle = (data->f_angle) / 180 * M_PI; - //h_angle = data->h_angle / 180 * M_PI; - //h_angle = 90 / 180 * M_PI; - - // Treat listener orientation angles as spherical coordinates. - // x = sin h * cos f - // y = sin h * sin f - // z = cos h - - // Front vector - //t_angle = (M_PI/2 - h_angle); - //t_angle = M_PI/2; - - //face.x = (t_sin = sin(t_angle)) * (f_cos = cos(f_angle)); - //face.z = t_sin * (f_sin = sin(f_angle)); - //face.y = cos(t_angle); -#ifdef DUMMYUNIONNAMEN - face.DUMMYUNIONNAMEN(9).x = (D3DVALUE)cos(f_angle); - face.DUMMYUNIONNAMEN(11).z = (D3DVALUE)sin(f_angle); - face.DUMMYUNIONNAMEN(10).y = 0.0f; - - head.DUMMYUNIONNAMEN(9).x = 0.0f; - head.DUMMYUNIONNAMEN(10).y = 1.0f; - head.DUMMYUNIONNAMEN(11).z = 0.0f; -#else - face.x = (D3DVALUE)cos(f_angle); - face.z = (D3DVALUE)sin(f_angle); - face.y = 0.0f; - - head.x = 0.0f; - head.y = 1.0f; - head.z = 0.0f; -#endif - // Top vector - //h_angle = (-data->h_angle) / 180 * M_PI; - -/* - t_angle = -h_angle; - - head.z = (t_sin = sin(t_angle)) * f_cos; - head.x = t_sin * f_sin; - head.y = cos(t_angle); -*/ - - // Update at once - CopyMemory(&listener_parms.vPosition, &pos, sizeof (D3DVECTOR)); - CopyMemory(&listener_parms.vOrientFront, &face, sizeof (D3DVECTOR)); - CopyMemory(&listener_parms.vOrientTop, &head, sizeof (D3DVECTOR)); - CopyMemory(&listener_parms.vVelocity, &velocity, sizeof (D3DVECTOR)); - //IDirectSound3DListener_SetAllParameters(Listener, &listener_parms, DS3D_IMMEDIATE); - IDirectSound3DListener_SetAllParameters(Listener, &listener_parms, update_mode); -} - -EXPORT void HWRAPI (UpdateListener2) (listener_data_t *data) -{ - D3DVECTOR pos; - D3DVECTOR face; - D3DVECTOR head; - D3DVECTOR velocity; - double f_angle; - //double h_angle, t_angle; - //double f_cos, f_sin, t_sin; - - if (!data) return; - -#ifdef DUMMYUNIONNAMEN - pos.DUMMYUNIONNAMEN(9).x = (D3DVALUE)data->x; - pos.DUMMYUNIONNAMEN(10).y = (D3DVALUE)data->z; - pos.DUMMYUNIONNAMEN(11).z = (D3DVALUE)data->y; - - velocity.DUMMYUNIONNAMEN(9).x = (D3DVALUE)data->momx; - velocity.DUMMYUNIONNAMEN(10).y = (D3DVALUE)data->momz; - velocity.DUMMYUNIONNAMEN(11).z = (D3DVALUE)data->momy; -#else - pos.x = (D3DVALUE)data->x; - pos.y = (D3DVALUE)data->z; - pos.z = (D3DVALUE)data->y; - - velocity.x = (D3DVALUE)data->momx; - velocity.y = (D3DVALUE)data->momz; - velocity.z = (D3DVALUE)data->momy; -#endif - f_angle = (data->f_angle) / 180 * M_PI; - //h_angle = data->h_angle / 180 * M_PI; - //h_angle = 90 / 180 * M_PI; - - // Treat listener orientation angles as spherical coordinates. - // x = sin h * cos f - // y = sin h * sin f - // z = cos h - - // Front vector - //t_angle = (M_PI/2 - h_angle); - //t_angle = M_PI/2; - - //face.x = (t_sin = sin(t_angle)) * (f_cos = cos(f_angle)); - //face.z = t_sin * (f_sin = sin(f_angle)); - //face.y = cos(t_angle); -#ifdef DUMMYUNIONNAMEN - face.DUMMYUNIONNAMEN(9).x = cos(f_angle); - face.DUMMYUNIONNAMEN(11).z = sin(f_angle); - face.DUMMYUNIONNAMEN(10).y = 0.0f; - - head.DUMMYUNIONNAMEN(9).x = 0.0f; - head.DUMMYUNIONNAMEN(10).y = 1.0f; - head.DUMMYUNIONNAMEN(11).z = 0.0f; -#else - face.x = (D3DVALUE)cos(f_angle); - face.z = (D3DVALUE)sin(f_angle); - face.y = 0.0f; - - head.x = 0.0f; - head.y = 1.0f; - head.z = 0.0f; -#endif - - // Top vector - //h_angle = (-data->h_angle) / 180 * M_PI; - -/* - t_angle = -h_angle; - - head.z = (t_sin = sin(t_angle)) * f_cos; - head.x = t_sin * f_sin; - head.y = cos(t_angle); -*/ - - // Update at once - CopyMemory(&listener_parms.vPosition, &pos, sizeof (D3DVECTOR)); - CopyMemory(&listener_parms.vOrientFront, &face, sizeof (D3DVECTOR)); - CopyMemory(&listener_parms.vOrientTop, &head, sizeof (D3DVECTOR)); - CopyMemory(&listener_parms.vVelocity, &velocity, sizeof (D3DVECTOR)); - //IDirectSound3DListener_SetAllParameters(Listener, &listener_parms, DS3D_IMMEDIATE); - //Alam_GBC: 2 Listeners? - //IDirectSound3DListener_SetAllParameters(Listener, &listener_parms, update_mode); -} - -EXPORT INT32 HWRAPI (SetCone) (INT32 handle, cone_def_t *cone_def) -{ - stack_t *snd; - //DS3DBUFFER parms; - - if (handle < 0 || handle >= allocated_sounds) - return -1; - - snd = _stack + handle; - - if (snd->dsbuffer3D) - { - - /*f_angle = cone_def->f_angle / 180 * M_PI; - h_angle = (90 - cone_def->h_angle) / 180 * M_PI; - parms.vConeOrientation.x = sin(h_angle) * cos(f_angle); - parms.vConeOrientation.z = sin(h_angle) * sin(f_angle); - parms.vConeOrientation.y = cos(h_angle);*/ - - snd->parameters.dwInsideConeAngle = (DWORD)cone_def->inner; - snd->parameters.dwOutsideConeAngle = (DWORD)cone_def->outer; - snd->parameters.lConeOutsideVolume = recalc_volume(cone_def->outer_gain, 256); - - return IDirectSound3DBuffer_SetAllParameters(snd->dsbuffer3D, &snd->parameters, update_mode); - } - - return -1; -} - -EXPORT void HWRAPI (Update3DSource) (INT32 handle, source3D_pos_t *data) -{ - stack_t *snd; - - if (handle < 0 || handle >= allocated_sounds) - return; - - snd = _stack + handle; - if (snd->dsbuffer3D) - { - - /*parms.dwSize = sizeof (DS3DBUFFER); - IDirectSound3DBuffer_GetAllParameters(snd, &parms);*/ - - //angle = data->angle * 180 / M_PI; - -#ifdef DUMMYUNIONNAMEN - snd->parameters.vPosition.DUMMYUNIONNAMEN(9).x = data->x; - snd->parameters.vPosition.DUMMYUNIONNAMEN(10).y = data->z; - snd->parameters.vPosition.DUMMYUNIONNAMEN(11).z = data->y; -#else - snd->parameters.vPosition.x = data->x; - snd->parameters.vPosition.y = data->z; - snd->parameters.vPosition.z = data->y; -#endif - - /*parms.vConeOrientation.x = cos(angle); - parms.vConeOrientation.z = sin(angle); - parms.vConeOrientation.y = 0;*/ - -#ifdef DUMMYUNIONNAMEN - snd->parameters.vVelocity.x = data->momx; - snd->parameters.vVelocity.y = data->momz; - snd->parameters.vVelocity.z = data->momy; -#else - snd->parameters.vVelocity.x = data->momx; - snd->parameters.vVelocity.y = data->momz; - snd->parameters.vVelocity.z = data->momy; -#endif - - //snd->parameters.flMinDistance = data->min_distance; - //snd->parameters.flMaxDistance = data->max_distance; - //snd->parameters.dwMode = pos->head_realtive?DS3DMODE_HEADREALTIVE:DS3DMODE_NORMAL; - - IDirectSound3DBuffer_SetAllParameters(snd->dsbuffer3D, &snd->parameters, update_mode); - } -} - - -EXPORT INT32 HWRAPI (StartSource) (INT32 handle) -{ - LPDIRECTSOUNDBUFFER snd; - - if (handle < 0 || handle >= allocated_sounds) - return -1; - - snd = (_stack + handle)->dsbuffer; - IDirectSoundBuffer_SetCurrentPosition(snd, 0); - return IDirectSoundBuffer_Play(snd, 0, 0, 0); - -} - -//------------------------------------------------------------- -// Load new sound data into source -//------------------------------------------------------------- -EXPORT INT32 HWRAPI (Reload3DSource) (INT32 handle, sfx_data_t *data) -{ - DS3DBUFFER temp; - stack_t *snd; - INT32 perm; - - // DirectX could not load new sound data into source - // so recreate sound buffers - if (handle < 0 || handle >= allocated_sounds) - return -1; - - snd = _stack + handle; - CopyMemory(&temp, &snd->parameters, sizeof (DS3DBUFFER)); - perm = snd->permanent; - - kill_sound(snd); - - snd = setup_source(handle, data, IS_3DSOURCE); - /*snd->dsbuffer = create_buffer(data->data, data->length, true); - if (snd->dsbuffer == NULL) - return -1; - snd->dsbuffer3D = create_3dbuffer(snd->dsbuffer, snd->dsbuffer3D); - if (snd->dsbuffer3D == NULL) - { - RELEASE_BUFFER(snd->dsbuffer); - return -1; - } - - snd->sfx_id = data->id; - snd->LRU = 0;*/ - if (snd) - { - snd->permanent = perm; - IDirectSound3DBuffer_SetAllParameters(snd->dsbuffer3D, &temp, DS3D_IMMEDIATE); - CopyMemory(&snd->parameters, &temp, sizeof (DS3DBUFFER)); - } - - return(snd - _stack); -} - -EXPORT void HWRAPI (UpdateSourceVolume) (INT32 handle, INT32 volume) -{ - if (handle < 0 || handle >= allocated_sounds) - return; - UpdateSoundVolume((_stack + handle)->dsbuffer, volume); -} diff --git a/src/hardware/s_ds3d/s_ds3d.dev b/src/hardware/s_ds3d/s_ds3d.dev deleted file mode 100644 index 1b51b1b77..000000000 --- a/src/hardware/s_ds3d/s_ds3d.dev +++ /dev/null @@ -1,59 +0,0 @@ -[Project] -FileName=s_ds3d.dev -Name=s_ds3d -Ver=1 -IsCpp=1 -Type=3 -Compiler=-D_M_IX86=500_@@_-Wall_@@_-D_WINDOWS_@@_-Os_@@_-fno-strict-aliasing_@@_-fomit-frame-pointer_@@_ -CppCompiler= -Includes= -Linker=--def ../s_mingw.def_@@_-luuid_@@_-ldsound_@@_ -Libs= -UnitCount=1 -Folders= -ObjFiles= -PrivateResource= -ResourceIncludes= -MakeIncludes= -Icon= -ExeOutput=C:\srb2demo2 -ObjectOutput=..\..\..\objs\Mingw\s_ds3d -OverrideOutput=1 -OverrideOutputName=s_ds3d.dll -HostApplication= -CommandLine= -IncludeVersionInfo=0 -SupportXPThemes=0 -CompilerSet=0 -CompilerSettings=00000000000000000111d0 -UseCustomMakefile=0 -CustomMakefile= - -[Unit1] -FileName=s_ds3d.c -Folder= -Compile=1 -CompileCpp=0 -Link=1 -Priority=1000 -OverrideBuildCmd=0 -BuildCmd= - -[VersionInfo] -Major=0 -Minor=1 -Release=1 -Build=1 -LanguageID=1033 -CharsetID=1252 -CompanyName= -FileVersion=0.1 -FileDescription=Developed using the Dev-C++ IDE -InternalName= -LegalCopyright= -LegalTrademarks= -OriginalFilename=s_ds3d.exe -ProductName=s_ds3d -ProductVersion=0.1 -AutoIncBuildNr=0 - diff --git a/src/hardware/s_ds3d/s_ds3d.dsp b/src/hardware/s_ds3d/s_ds3d.dsp deleted file mode 100644 index a82207c97..000000000 --- a/src/hardware/s_ds3d/s_ds3d.dsp +++ /dev/null @@ -1,99 +0,0 @@ -# Microsoft Developer Studio Project File - Name="s_ds3d" - Package Owner=<4> -# Microsoft Developer Studio Generated Build File, Format Version 6.00 -# ** DO NOT EDIT ** - -# TARGTYPE "Win32 (x86) Dynamic-Link Library" 0x0102 - -CFG=s_ds3d - Win32 Debug -!MESSAGE This is not a valid makefile. To build this project using NMAKE, -!MESSAGE use the Export Makefile command and run -!MESSAGE -!MESSAGE NMAKE /f "s_ds3d.mak". -!MESSAGE -!MESSAGE You can specify a configuration when running NMAKE -!MESSAGE by defining the macro CFG on the command line. For example: -!MESSAGE -!MESSAGE NMAKE /f "s_ds3d.mak" CFG="s_ds3d - Win32 Debug" -!MESSAGE -!MESSAGE Possible choices for configuration are: -!MESSAGE -!MESSAGE "s_ds3d - Win32 Release" (based on "Win32 (x86) Dynamic-Link Library") -!MESSAGE "s_ds3d - Win32 Debug" (based on "Win32 (x86) Dynamic-Link Library") -!MESSAGE - -# Begin Project -# PROP AllowPerConfigDependencies 0 -# PROP Scc_ProjName "" -# PROP Scc_LocalPath "" -CPP=cl.exe -MTL=midl.exe -RSC=rc.exe - -!IF "$(CFG)" == "s_ds3d - Win32 Release" - -# PROP BASE Use_MFC 0 -# PROP BASE Use_Debug_Libraries 0 -# PROP BASE Output_Dir "Release" -# PROP BASE Intermediate_Dir "Release" -# PROP BASE Target_Dir "" -# PROP Use_MFC 0 -# PROP Use_Debug_Libraries 0 -# PROP Output_Dir "..\..\..\bin\VC\Release\s_ds3d" -# PROP Intermediate_Dir "..\..\..\objs\VC\Release\s_ds3d" -# PROP Ignore_Export_Lib 1 -# PROP Target_Dir "" -# ADD BASE CPP /nologo /MT /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "S_DS3D_EXPORTS" /YX /FD /c -# ADD CPP /nologo /G5 /MT /W3 /GX /Zi /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "__WIN32__" /D "__MSC__" /FD /c -# SUBTRACT CPP /YX -# ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /win32 -# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win32 -# ADD BASE RSC /l 0x419 /d "NDEBUG" -# ADD RSC /l 0x40c /d "NDEBUG" -BSC32=bscmake.exe -# ADD BASE BSC32 /nologo -# ADD BSC32 /nologo -LINK32=link.exe -# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /machine:I386 -# ADD LINK32 dsound.lib /nologo /dll /pdb:"..\..\..\bin\VC\Release\s_ds3d.pdb" /machine:I386 /out:"..\..\..\bin\VC\Release\s_ds3d.dll" -# SUBTRACT LINK32 /pdb:none - -!ELSEIF "$(CFG)" == "s_ds3d - Win32 Debug" - -# PROP BASE Use_MFC 0 -# PROP BASE Use_Debug_Libraries 1 -# PROP BASE Output_Dir "Debug" -# PROP BASE Intermediate_Dir "Debug" -# PROP BASE Target_Dir "" -# PROP Use_MFC 0 -# PROP Use_Debug_Libraries 1 -# PROP Output_Dir "..\..\..\bin\VC\Debug\s_ds3d" -# PROP Intermediate_Dir "..\..\..\objs\VC\Debug\s_ds3d" -# PROP Ignore_Export_Lib 1 -# PROP Target_Dir "" -# ADD BASE CPP /nologo /MTd /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "S_DS3D_EXPORTS" /YX /FD /GZ /c -# ADD CPP /nologo /MTd /W4 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "__WIN32__" /D "__MSC__" /FD /GZ /c -# SUBTRACT CPP /YX -# ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /win32 -# ADD MTL /nologo /D "_DEBUG" /mktyplib203 /o "NUL" /win32 -# ADD BASE RSC /l 0x419 /d "_DEBUG" -# ADD RSC /l 0x40c /d "_DEBUG" -BSC32=bscmake.exe -# ADD BASE BSC32 /nologo -# ADD BSC32 /nologo -LINK32=link.exe -# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /debug /machine:I386 /pdbtype:sept -# ADD LINK32 dsound.lib /nologo /dll /pdb:"..\..\..\bin\VC\Debug\s_ds3d.pdb" /debug /machine:I386 /out:"..\..\..\bin\VC\Debug\s_ds3d.dll" /pdbtype:sept -# SUBTRACT LINK32 /pdb:none /incremental:no /nodefaultlib - -!ENDIF - -# Begin Target - -# Name "s_ds3d - Win32 Release" -# Name "s_ds3d - Win32 Debug" -# Begin Source File - -SOURCE=.\s_ds3d.c -# End Source File -# End Target -# End Project diff --git a/src/hardware/s_fmod/s_fmod.c b/src/hardware/s_fmod/s_fmod.c deleted file mode 100644 index 5d4422bb1..000000000 --- a/src/hardware/s_fmod/s_fmod.c +++ /dev/null @@ -1,1201 +0,0 @@ -// Emacs style mode select -*- C++ -*- -//----------------------------------------------------------------------------- -// -// Copyright (C) 2001 by DooM Legacy Team. -// -// This program is free software; you can redistribute it and/or -// modify it under the terms of the GNU General Public License -// as published by the Free Software Foundation; either version 2 -// of the License, or (at your option) any later version. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -//----------------------------------------------------------------------------- -/// \file -/// \brief General driver for 3D sound system -/// -/// Implementend via FMOD_SOUND API - -#ifdef _WINDOWS -//#define WIN32_LEAN_AND_MEAN -#define RPC_NO_WINDOWS_H -#include -#else -#include -#include -#include -#include -#include -#endif - -#include -FILE *logstream = NULL; - -#ifdef __MINGW32__ -#include -#else -#include -#endif - -#ifdef FSOUND_INIT_DONTLATENCYADJUST //Alam: why didn't I think about this before? :) -#define FSOUND_Sample_Load(index,data,mode,length) FSOUND_Sample_Load(index,data,mode,0,length) -#else -#define OLDFMOD //Alam: Yea! -#endif - -#ifdef __MINGW32__ -#include -#else -#include /* optional */ -#endif - -#define MAXCHANNEL 1024 - -#undef DEBUG_TO_FILE -#if defined ( HAVE_SDL ) && !defined ( LOGMESSAGES ) -#define DEBUG_TO_FILE -#endif - -#ifndef MORESTUFF -//#define MORESTUFF -#define REL2D -#endif - -#define _CREATE_DLL_ -#include "../../doomdef.h" -#include "../hw3dsdrv.h" -#define INT2CHAR(p) (char *)p + 8 - -//Doom sound sample format -#define FSOUND_UNORMAL (FSOUND_8BITS | FSOUND_MONO | FSOUND_UNSIGNED) -//Load Raw -#define FSOUND_RAWLOAD (FSOUND_LOADRAW | FSOUND_LOADMEMORY) -//Load Sample Raw from pointer -#define FSOUND_DOOMLOAD (FSOUND_UNORMAL | FSOUND_RAWLOAD) -//length of SFX -#define SFXLENGTH (sfx->length-8) - -//SRB2 treats +X as east, +Y as north, +Z as up. -//FSOUND treats +X as right, +Y as up, and +Z as forwards. -//So SRB2's XZY is FSOUND's XYZ -//And FSOUND's XZY is SRB2's XYZ - -static I_Error_t I_ErrorFMOD = NULL; - -static FSOUND_SAMPLE *blankfmsample = NULL; - -// Calculate sound pitching -static float recalc_pitch(INT32 doom_pitch) -{ -#ifdef MORESTUFF - return (float)1; -#else - return doom_pitch < NORMAL_PITCH ? - (float)(doom_pitch + NORMAL_PITCH) / (NORMAL_PITCH * 2) - :(float)doom_pitch / (float)NORMAL_PITCH; -#endif -} - -/*************************************************************** - * - * DBG_Printf - * Output error messages to debug log if DEBUG_TO_FILE is defined, - * else do nothing - * - ************************************************************** - */ -// -----------------+ -// DBG_Printf : Output error messages to debug log if DEBUG_TO_FILE is defined, -// : else do nothing -// Returns : -// -----------------+ -FUNCPRINTF void DBG_Printf(const char *lpFmt, ...) -{ -#ifdef DEBUG_TO_FILE - char str[4096] = ""; - va_list arglist; - - va_start(arglist, lpFmt); - vsnprintf(str, 4096, lpFmt, arglist); - va_end(arglist); - - if (logstream) - fwrite(str, strlen(str), 1, logstream); -#endif -} - -// Start of head_relative system for FMOD3D - -typedef struct rellistener_s -{ - float pos[3]; - INT32 active; - float vel[3]; - -} rellistener_s_t; //Easy - -static rellistener_s_t rellistener[2]; //The 2 listeners - -typedef struct relarray_s -{ - INT32 handle; // handle number - INT32 chan; // real channel - INT32 listener; // for which listener - rellistener_s_t pos; // source position in 3D -} relarray_s_t; - -static relarray_s_t relarray[STATIC_SOURCES_NUM+1]; // array of chans - - -//set listener -static void relset(INT32 which) -{ - INT32 i; - - if (which == -2 || which == -1) - { - which = -which; - - memset(&rellistener[which-1], 0, sizeof (rellistener_s_t)); //Delete me - for (i = 0; i <= STATIC_SOURCES_NUM; i++) - { - if (relarray[i].pos.active && relarray[i].listener == which) - { - FSOUND_SetPaused(relarray[i].chan,true); - relarray[i].pos.active = false; - } - } - return; - } - else if (which == 1 || which ==2) - { - float pos[3], vel[3]; // Temp bin - which -= 1; //Hello! - - //Get update - FSOUND_3D_Listener_GetAttributes(&pos[0],&vel[0],NULL,NULL,NULL,NULL,NULL,NULL); - memcpy(&rellistener[which].pos[0],&pos[0],sizeof (pos)); - memcpy(&rellistener[which].vel[0],&vel[0],sizeof (vel)); - - if (!rellistener[which].active) - for (i = 0; i <= STATIC_SOURCES_NUM; i++) - { - if (!relarray[i].pos.active && relarray[i].listener == which) - { - FSOUND_SetPaused(relarray[i].chan,false); - relarray[i].pos.active = true; - } - } - - rellistener[which].active = which; - } - else - { - memset(&rellistener[0], 0, sizeof (rellistener_s_t)); - memset(&rellistener[1], 0, sizeof (rellistener_s_t)); - } -} - -//setup system -static void relsetup() -{ - INT32 i; - - // Setup the rel array for use - for (i = 0; i <= STATIC_SOURCES_NUM; i++) - { - relarray[i].handle = FSOUND_FREE; - relarray[i].chan = FSOUND_FREE; - relarray[i].listener = (i == 1 || i == 3)?2:1; - memset(&relarray[i].pos, 0, sizeof (rellistener_s_t)); - } - - // Set up the Listener array - relset(0); -} - - -//checkup for stack -static INT32 relstack(INT32 chan) -{ - INT32 i; - - for (i = 0; i <= STATIC_SOURCES_NUM; i++) - { - if (relarray[i].pos.active && relarray[i].handle == chan) - return i; - } - return -1; -} - -//checkup for fake rel chan -static INT32 relcheckup(INT32 chan) -{ - INT32 i = relstack(chan); - - if (i == -1) - return chan; - else - return relarray[i].chan; -} - - //Update place rel chan's vol -static void relvol(INT32 chan) -{ - INT32 vol = FSOUND_GetVolume(chan); - INT32 error = FSOUND_GetError(); - - if (chan == relcheckup(chan)) - return; - - if (!vol && error) - DBG_Printf("FMOD(relvol, FSOUND_GetVolume, Channel # %i): %s\n",chan,FMOD_ErrorString(error)); - else if (!FSOUND_SetVolume(relcheckup(chan), vol)) - DBG_Printf("FMOD(relvol, FSOUND_SetVolume, Channel # %i): %s\n",chan,FMOD_ErrorString(FSOUND_GetError())); -} - -//Copy rel chan -static INT32 relcopy(INT32 handle) -{ - FSOUND_SAMPLE *fmsample = NULL; - INT32 chan = -1; - float pos[3]; - float vel[3]; - - if (!FSOUND_3D_GetAttributes(handle,&pos[0],&vel[0])) - if (FSOUND_GetError() != FMOD_ERR_NONE) DBG_Printf("FMOD(relcopy, FSOUND_3D_GetAttributes, Channel # %i): %s\n",handle,FMOD_ErrorString(FSOUND_GetError())); - - fmsample = FSOUND_GetCurrentSample(handle); - - if (fmsample) - { -#ifdef REL2D - if (!FSOUND_Sample_SetMode(fmsample, FSOUND_2D)) - DBG_Printf("FMOD(relcopy, FSOUND_Sample_SetMode, handle# %i): %s\n",handle,FMOD_ErrorString(FSOUND_GetError())); -#endif - chan = FSOUND_PlaySoundEx(FSOUND_FREE,fmsample,NULL,true); - - if (chan == -1) - { - if (FSOUND_GetError() != FMOD_ERR_NONE) DBG_Printf("FMOD(relcopy, FSOUND_PlaySoundEx, handle# %i): %s\n",handle,FMOD_ErrorString(FSOUND_GetError())); - return FSOUND_FREE; - } -#ifdef MORESTUFF - else - DBG_Printf("FMOD(relcopy, Main): Copy Handle#%i to channel#%i\n",handle,chan); -#endif - } - else - { - if (FSOUND_GetError() != FMOD_ERR_NONE) - DBG_Printf("FMOD(relcopy, FSOUND_GetCurrentSample, handle# %i): %s\n",handle,FMOD_ErrorString(FSOUND_GetError())); - chan = FSOUND_PlaySoundEx(FSOUND_FREE,blankfmsample,NULL,true); - //return FSOUND_FREE; - } - - if (FSOUND_GetCurrentSample(chan)) - { - - if (!FSOUND_SetCurrentPosition(chan, 0)) - DBG_Printf("FMOD(relcopy, FSOUND_SetCurrentPosition, handle#%i, channel# %i): %s\n",handle,chan,FMOD_ErrorString(FSOUND_GetError())); -#ifndef REL2D - if (!FSOUND_3D_SetAttributes(chan,pos,vel)) - DBG_Printf("FMOD(relcopy, FSOUND_3D_SetAttributes, handle#%i, channel#%i): %s\n",handle,chan,FMOD_ErrorString(FSOUND_GetError())); -#endif -/* - if (!FSOUND_SetReserved(chan, TURE)) - DBG_Printf("FMOD(relcopy, FSOUND_SetReserved, handle#%i, channel# %i): %s\n",handle,chan,FMOD_ErrorString(FSOUND_GetError())); -*/ - return chan; - } - - return FSOUND_FREE; -} - -//update the rel chans -static void relupdate(INT32 handle) -{ - if (handle == FSOUND_FREE) - { - INT32 stack; - - for (stack = 0; stack <= STATIC_SOURCES_NUM;stack++) - { - //if (FSOUND_GetCurrentSample(relarray[stack].handle)) - // relarray[stack].chan = relcopy(relarray[stack].handle); - - if (relarray[stack].chan != FSOUND_FREE) - { - relarray[stack].pos.active = false; - relupdate(relarray[stack].chan); - } - else - relarray[stack].pos.active = false; - } - } - else if (handle == relcheckup(handle)) - return; -#ifndef REL2D - else - { - float pos[3], vel[3]; - INT32 stack = relstack(handle); - INT32 chan = relcheckup(handle); - INT32 which = relarray[stack].listener; - - pos[0] = relarray[stack].pos.pos[0] + rellistener[which].pos[0]; - pos[1] = relarray[stack].pos.pos[1] + rellistener[which].pos[1]; - pos[2] = relarray[stack].pos.pos[2] + rellistener[which].pos[2]; - vel[0] = relarray[stack].pos.vel[0] + rellistener[which].vel[0]; - vel[1] = relarray[stack].pos.vel[1] + rellistener[which].vel[1]; - vel[2] = relarray[stack].pos.vel[2] + rellistener[which].vel[2]; - - if (!FSOUND_3D_SetAttributes(chan,pos,vel)) - DBG_Printf("FMOD(relupdate, FSOUND_3D_SetAttributes, Handle #%i,Channel #%i): %s\n",handle, chan,FMOD_ErrorString(FSOUND_GetError())); - } -#endif -} - - //Update place rel chan's pos -static void relplace(INT32 chan) -{ - float pos[3], vel[3]; // Temp bin - - if (chan == relcheckup(chan)) - return; - - if (!FSOUND_3D_GetAttributes(chan,&pos[0],&vel[0])) - { - if (FSOUND_GetError() != FMOD_ERR_NONE) DBG_Printf("FMOD(relplace, FSOUND_3D_GetAttributes, Channel # %i): %s\n",chan,FMOD_ErrorString(FSOUND_GetError())); - } - else - { - INT32 stack = relstack(chan); - - if (stack == -1) - return; - - memcpy(&relarray[stack].pos.pos,&pos,sizeof (pos)); - memcpy(&relarray[stack].pos.vel,&vel,sizeof (vel)); - relupdate(chan); - } -} - -//New rel chan -static void reladd(INT32 chan) -{ - if (chan != relcheckup(chan)) - return; - else - { - INT32 stack = STATIC_SOURCES_NUM; - { - if (relarray[0].handle == FSOUND_FREE) - stack = 0; - else if (relarray[1].handle == FSOUND_FREE) - stack = 1; - else if (relarray[2].handle == FSOUND_FREE) - stack = 2; - else if (relarray[3].handle == FSOUND_FREE) - stack = 3; - else if (relarray[4].handle == FSOUND_FREE) - stack = 4; - else if (relarray[5].handle == FSOUND_FREE) - stack = 5; - else - DBG_Printf("No more room in relarray\n"); - } - - relarray[stack].handle = chan; - relarray[stack].chan = relcopy(chan); - - if (relarray[stack].chan != FSOUND_FREE) - { - relarray[stack].pos.active = true; - relupdate(chan); - } - else - relarray[stack].pos.active = false; - } -} - -// End of head_relative system for FMOD3D - - -/****************************************************************************** - * - * Initialise driver and listener - * - *****************************************************************************/ -EXPORT INT32 HWRAPI(Startup) (I_Error_t FatalErrorFunction, snddev_t *snd_dev) -{ - boolean inited = false; - INT32 i = 0; - - I_ErrorFMOD = FatalErrorFunction; - - if (FSOUND_GetVersion() < FMOD_VERSION) - { - DBG_Printf("Error : You are using the wrong DLL version!\nYou should be using FMOD %.02f\n", FMOD_VERSION); - return inited; - } - else - DBG_Printf("S_FMOD Init(): FMOD_SOUND driver for SRB2Kart %s\n",VERSIONSTRING); - - if (!FSOUND_SetMinHardwareChannels(STATIC_SOURCES_NUM*4)) - DBG_Printf("FMOD(Startup,FSOUND_SetMinHardwareChannels,# of Channels Min: %i): %s\n",STATIC_SOURCES_NUM*4, FMOD_ErrorString(FSOUND_GetError())); - - if (!FSOUND_SetMaxHardwareChannels(0)) - DBG_Printf("FMOD(Startup,FSOUND_SetMaxHardwareChannels,# of Channels Min: %i): %s\n",0, FMOD_ErrorString(FSOUND_GetError())); - - for (i = 0; i < FSOUND_GetNumDrivers(); i++) - { - UINT32 caps = 0; - DBG_Printf("Driver Caps, if any\n"); - - if (FSOUND_GetDriverCaps(i, &caps)) - { - DBG_Printf("FMOD: Driver# %d - %s\n", i+1, FSOUND_GetDriverName(i)); // print driver names - if (caps & FSOUND_CAPS_HARDWARE) - DBG_Printf("This sound hardware supports hardware accelerated 3d sound.\n"); - - if (caps & FSOUND_CAPS_EAX2) - DBG_Printf("This sound hardware supports hardware accelerated 3d sound with EAX 2 reverb.\n"); - - if (caps & FSOUND_CAPS_EAX3) - DBG_Printf("This sound hardware supports hardware accelerated 3d sound with EAX 3 reverb.\n"); - } - else - DBG_Printf("FMOD(Startup,FSOUND_GetDriverCaps,%s): %s\n",FSOUND_GetDriverName(i), FMOD_ErrorString(FSOUND_GetError())); - } -#if defined (_WIN32) || defined (_WIN64) - if (!FSOUND_SetHWND(snd_dev->hWnd)) - { - DBG_Printf("FMOD(Startup,FSOUND_SetHWND): %s\n", FMOD_ErrorString(FSOUND_GetError())); - return inited; - } - else -#endif - { - DBG_Printf("Initialising FMOD %.02f\n",FMOD_VERSION); - inited = FSOUND_Init(snd_dev->sample_rate,MAXCHANNEL,0); - } - - if (!inited) - { - DBG_Printf("FMOD(Startup,Main): %s\n", FMOD_ErrorString(FSOUND_GetError())); - } - else - { -#ifdef OLDFMOD - DBG_Printf(" Maximum hardware mixing buffers %d\n", FSOUND_GetNumHardwareChannels()); -#else - INT32 num2DC, num3DC, numDC; - - if (FSOUND_GetNumHWChannels(&num2DC,&num3DC,&numDC)) - { - DBG_Printf(" Maximum hardware 2D buffers %d\n", num2DC); - DBG_Printf(" Maximum hardware 3D buffers %d\n", num3DC); - DBG_Printf(" Maximum hardware mixing buffers %d\n", numDC); - } - else - DBG_Printf("FMOD(Startup,FSOUND_GetNumHWChannels): %s\n", FMOD_ErrorString(FSOUND_GetError())); -#endif - - DBG_Printf("FMOD is up and running at %i KHZ\n",FSOUND_GetOutputRate()); - DBG_Printf("Sound hardware capabilities:\n"); - - if (FSOUND_GetDriverName(FSOUND_GetDriver())) - DBG_Printf(" Driver is %s\n",FSOUND_GetDriverName(FSOUND_GetDriver())); - else - DBG_Printf("FMOD(Startup,FSOUND_GetDriverName): %s\n", FMOD_ErrorString(FSOUND_GetError())); - - FSOUND_3D_SetDistanceFactor(1.0f/72.0f); - FSOUND_3D_SetRolloffFactor(0); - FSOUND_3D_SetRolloffFactor(1.6f); -#ifdef MORESTUFF - FSOUND_3D_SetDopplerFactor(0); -#endif - - switch (FSOUND_GetOutput()) - { - case FSOUND_OUTPUT_NOSOUND: - DBG_Printf("FMOD driver: NoSound driver, all calls to this succeed but do nothing.\n"); - break; - case FSOUND_OUTPUT_WINMM: - DBG_Printf("FMOD driver: Windows Multimedia driver.\n"); - break; - case FSOUND_OUTPUT_DSOUND: - DBG_Printf("FMOD driver: DirectSound driver. You need this to get EAX2 or EAX3 support, or FX api support.\n"); - break; - case FSOUND_OUTPUT_A3D: - DBG_Printf("FMOD driver: A3D driver.\n"); - break; - case FSOUND_OUTPUT_OSS: - DBG_Printf("FMOD driver: Linux/Unix OSS (Open Sound System) driver, i.e. the kernel sound drivers.\n"); - break; - case FSOUND_OUTPUT_ESD: - DBG_Printf("FMOD driver: Linux/Unix ESD (Enlightment Sound Daemon) driver.\n"); - break; - case FSOUND_OUTPUT_ALSA: - DBG_Printf("FMOD driver: Linux Alsa driver.\n"); - break; - case FSOUND_OUTPUT_MAC: - DBG_Printf("FMOD driver: Mac SoundManager driver\n"); - break; - case FSOUND_OUTPUT_NOSOUND_NONREALTIME: - DBG_Printf("FMOD driver: This is the same as nosound, but the sound generation is driven by FSOUND_Update\n"); - break; - case FSOUND_OUTPUT_ASIO: - DBG_Printf("FMOD driver: Low latency ASIO driver\n"); - break; - default: - DBG_Printf("FMOD driver: Unknown Sound Driver\n"); - break; - } - - relsetup(); - - blankfmsample = FSOUND_Sample_Alloc(FSOUND_UNMANAGED,1,FSOUND_UNORMAL,11025,127,FSOUND_STEREOPAN,127); - - if (!blankfmsample) - DBG_Printf("FMOD(Startup,FSOUND_Sample_Alloc): %s\n", FMOD_ErrorString(FSOUND_GetError())); - else if (!FSOUND_Sample_SetMaxPlaybacks(blankfmsample,STATIC_SOURCES_NUM*2)) - DBG_Printf("FMOD(Startup,FSOUND_Sample_SetMaxPlaybacks): %s\n", FMOD_ErrorString(FSOUND_GetError())); - } - return inited; -} - -EXPORT void HWRAPI(Shutdown) (void) -{ - DBG_Printf("Shuting down FMOD\n"); - FSOUND_Sample_Free(blankfmsample); - DBG_Printf("Shutdown of FMOD done\n"); - FSOUND_Close(); -} - -/****************************************************************************** - * - * Creates 3D source - * - ******************************************************************************/ - -EXPORT INT32 HWRAPI (Add3DSource) (source3D_data_t *src, sfx_data_t *sfx) -{ - FSOUND_SAMPLE *fmsample = NULL; - INT32 chan = -1; - float pos[3]; - float vel[3]; -#ifdef MORESTUFF - src->min_distance = MIN_DISTANCE; - src->max_distance = MAX_DISTANCE; -#endif - - pos[0] = src->pos.x; - pos[1] = src->pos.z; - pos[2] = src->pos.y; - vel[0] = src->pos.momx; - vel[1] = src->pos.momz; - vel[2] = src->pos.momy; - if (sfx) - fmsample = FSOUND_Sample_Load(FSOUND_FREE, INT2CHAR(sfx->data), FSOUND_DOOMLOAD, SFXLENGTH); - else - fmsample = blankfmsample; - - if (fmsample) - { - if (sfx && !FSOUND_Sample_SetDefaults(fmsample, - (INT32)((*((UINT16 *)sfx->data+1))*recalc_pitch(sfx->pitch)), - (sfx->volume == -1 ? 255 : sfx->volume), - (sfx->sep == NORMAL_SEP ? FSOUND_STEREOPAN : sfx->sep), - (sfx->priority) - ) - ) - DBG_Printf("FMOD(Add3DSource, FSOUND_Sample_SetDefaults, SFX's ID# %i): %s\n", sfx?sfx->id:0,FMOD_ErrorString(FSOUND_GetError())); -#if 0 - if (!FSOUND_Sample_SetMinMaxDistance(fmsample, src->min_distance, src->max_distance)) - DBG_Printf("FMOD(Add3DSource, FSOUND_Sample_SetMinMaxDistance, SFX's ID# %i): %s\n", sfx?sfx->id:0,FMOD_ErrorString(FSOUND_GetError())); -#endif - chan = FSOUND_PlaySoundEx(FSOUND_FREE,fmsample,NULL,true); - - if (chan == -1) - { - DBG_Printf("FMOD(Add3DSource, FSOUND_PlaySoundEx, SFX's ID# %i): %s\n",sfx?sfx->id:0,FMOD_ErrorString(FSOUND_GetError())); - return chan; - } - else - { - if (!sfx) - DBG_Printf("FMOD(Add3DSource, Main): Added blank-sound added to channel %i\n",chan); -#ifdef MORESTUFF - else DBG_Printf("FMOD(Add3DSource, Main): Added sfxid# %i added to channel %i\n",sfx->id,chan); -#endif - } - } - else - { - if (sfx) - DBG_Printf("FMOD(Add3DSource, FSOUND_Sample_Load, sfxid# %i): %s\n",sfx->id,FMOD_ErrorString(FSOUND_GetError())); - else - DBG_Printf("FMOD(Add3DSource, FSOUND_Sample_Alloc): %s\n", FMOD_ErrorString(FSOUND_GetError())); - - return chan; - } - - if (FSOUND_GetCurrentSample(chan)) - { - if (!FSOUND_SetCurrentPosition(chan, 0)) - DBG_Printf("FMOD(Add3DSource, FSOUND_SetCurrentPosition, channel %i, sfxid# %i): %s\n", chan,sfx?sfx->id:0,FMOD_ErrorString(FSOUND_GetError())); - - if (!FSOUND_3D_SetAttributes(chan,pos,vel)) - DBG_Printf("FMOD(Add3DSource, FSOUND_3D_SetAttributes, channel %i, sfxid# %i): %s\n", chan,sfx?sfx->id:0,FMOD_ErrorString(FSOUND_GetError())); - - if (!FSOUND_SetReserved(chan, (signed char)src->permanent)) - DBG_Printf("FMOD(Add3DSource, FSOUND_SetReserved, channel %i, sfxid# %i): %s\n", chan,sfx?sfx->id:0,FMOD_ErrorString(FSOUND_GetError())); - - if (src->head_relative) reladd(chan); - } - - return chan; -} - -/****************************************************************************** - * - * Creates 2D (stereo) source - * - ******************************************************************************/ -EXPORT INT32 HWRAPI (Add2DSource) (sfx_data_t *sfx) -{ - FSOUND_SAMPLE *fmsample = NULL; - INT32 chan = -1; - - if (!sfx) - return chan; - - fmsample = FSOUND_Sample_Load(FSOUND_FREE, INT2CHAR(sfx->data), FSOUND_DOOMLOAD, SFXLENGTH); - - if (fmsample) - { - if (!FSOUND_Sample_SetDefaults(fmsample, - (INT32)((float)(*((UINT16 *)sfx->data+1)) * recalc_pitch(sfx->pitch)), - sfx->volume == -1 ? 255 : sfx->volume, - sfx->sep == NORMAL_SEP ? FSOUND_STEREOPAN : sfx->sep, - sfx->priority)) - DBG_Printf("FMOD(Add2DSource, FSOUND_Sample_SetDefaults, sfxid# %i): %s\n", sfx->id,FMOD_ErrorString(FSOUND_GetError())); - - if (!FSOUND_Sample_SetMode(fmsample,FSOUND_2D)) - DBG_Printf("FMOD(Add2DSource, FSOUND_Sample_SetMode, sfxid# %i): %s\n", sfx->id,FMOD_ErrorString(FSOUND_GetError())); - - chan = FSOUND_PlaySoundEx(FSOUND_FREE,fmsample,NULL,true); - - if (chan == -1) - { - DBG_Printf("FMOD(Add2DSource, FSOUND_PlaySoundEx, sfxid# %i): %s\n", sfx->id,FMOD_ErrorString(FSOUND_GetError())); - return chan; - } -#ifdef MORESTUFF - else DBG_Printf("FMOD(Add2DSource, FSOUND_PlaySoundEx): sfxid# %i is playing on channel %i\n", sfx->id,chan); -#endif - } - else - { - DBG_Printf("FMOD(Add2DSource,FSOUND_Sample_Load, sfxid# %i): %s\n", sfx->id,FMOD_ErrorString(FSOUND_GetError())); - return chan; - } - - if (FSOUND_GetCurrentSample(chan)) - { - if (!FSOUND_SetCurrentPosition(chan, 0)) - DBG_Printf("FMOD(Add2DSource, FSOUND_SetCurrentPosition, channel %i, sfxid# %i): %s\n", chan,sfx->id,FMOD_ErrorString(FSOUND_GetError())); - } - - return chan; -} - -EXPORT INT32 HWRAPI (StartSource) (INT32 chan) -{ - FSOUND_SAMPLE *fmsample; - if (chan < 0) - return -1; - - fmsample = FSOUND_GetCurrentSample(chan); - - if (!fmsample) - return -1; - -#ifdef MORESTUFF - if (FSOUND_Sample_GetMode(fmsample) & FSOUND_2D) - { - DBG_Printf("FMOD(StartSource,Main): Starting 2D channel %i?\n",chan); - //return -1; - } - else - { - DBG_Printf("FMOD(StartSource,Main): Starting 3D Channel %i?\n",chan); - //return -1; - } -#endif - - if (FSOUND_GetPaused(relcheckup(chan))) - { - if (!FSOUND_SetPaused(relcheckup(chan), false)) - DBG_Printf("FMOD(StartSource,FSOUND_SetPaused, channel %i): %s\n", chan,FMOD_ErrorString(FSOUND_GetError())); - else if (relstack(chan) != -1) - relarray[relstack(chan)].pos.active = false; - } - else - DBG_Printf("FMOD(StartSource,FSOUND_GetPaused): Channel %i is playing already",chan); - - return chan; -} - -EXPORT void HWRAPI (StopSource) (INT32 chan) -{ - FSOUND_SAMPLE *fmsample; - - if (chan < 0) - return; - - fmsample = FSOUND_GetCurrentSample(chan); - - if (!fmsample) - return; - - if (!FSOUND_GetPaused(relcheckup(chan))) - { - if (!FSOUND_SetPaused(relcheckup(chan),true)) - { - DBG_Printf("FMOD(StopSource,FSOUND_SetPaused, channel %i): %s\n", chan,FMOD_ErrorString(FSOUND_GetError())); - } - else if (relstack(chan) != -1) - { - relarray[relstack(chan)].pos.active = false; - } - } -#ifdef MORESTUFF - else - DBG_Printf("FMOD(StopSource,FSOUND_GetPaused): Channel %i is stopped already\n",chan); -#endif -} - -EXPORT INT32 HWRAPI (GetHW3DSVersion) (void) -{ - return VERSION; -} - -EXPORT void HWRAPI (BeginFrameUpdate) (void) -{ - FSOUND_Update(); -} - -EXPORT void HWRAPI (EndFrameUpdate) (void) -{ - relupdate(FSOUND_FREE); -} - -EXPORT INT32 HWRAPI (IsPlaying) (INT32 chan) -{ - if (chan < 0) - return false; - - if (!FSOUND_GetCurrentSample(chan)) - return false; - - return FSOUND_IsPlaying(relcheckup(chan)); -} - -/****************************************************************************** - * UpdateListener - * - * Set up main listener properties: - * - position - * - orientation - * - velocity - *****************************************************************************/ -EXPORT void HWRAPI (UpdateListener) (listener_data_t *data) -{ - if (data) - { - float pos[3]; - float vel[3]; - double f_angle = 0; - if (data->f_angle) f_angle = (data->f_angle) / 180 * M_PI; - pos[0] = (float)data->x; - pos[1] = (float)data->z; - pos[2] = (float)data->y; - vel[0] = (float)data->momx; - vel[1] = (float)data->momz; - vel[2] = (float)data->momy; - - FSOUND_3D_Listener_SetAttributes(pos,vel,(float)cos(f_angle),0.0f,(float)sin(f_angle), 0.0f , 1.0f, 0.0f); - relset(1); - } - else - { - relset(-1); - DBG_Printf("Error: 1st listener data is missing\n"); - } -} - -EXPORT void HWRAPI (UpdateListener2) (listener_data_t *data) -{ - if (data) - { - float pos[3]; - float vel[3]; - double f_angle = 0; - if (data->f_angle) f_angle = (data->f_angle) / 180 * M_PI; - pos[0] = (float)data->x; - pos[1] = (float)data->z; - pos[2] = (float)data->y; - vel[0] = (float)data->momx; - vel[1] = (float)data->momz; - vel[2] = (float)data->momy; - - FSOUND_3D_Listener_SetCurrent(1,2); - FSOUND_3D_Listener_SetAttributes(pos,vel,(float)cos(f_angle),0.0f,(float)sin(f_angle), 0.0f , 1.0f, 0.0f); - relset(2); - FSOUND_3D_Listener_SetCurrent(0,2); - } - else - { - relset(-2); - FSOUND_3D_Listener_SetCurrent(0,1); - } -} - -EXPORT void HWRAPI (UpdateSourceVolume) (INT32 chan, INT32 vol) -{ - if (chan < 0) - return; - - if (!FSOUND_GetCurrentSample(chan)) - return; - - if (!FSOUND_SetVolume(chan,vol)) - DBG_Printf("FMOD(UpdateSourceVolume, FSOUND_SetVolume, channel %i to volume %i): %s\n", chan,vol,FMOD_ErrorString(FSOUND_GetError())); - else - { -#ifdef MORESTUFF - DBG_Printf("FMOD(UpdateSourceVolume, Main): channel %i is set to the volume of %i", chan,vol); -#endif - relvol(chan); - } -} - -/****************************************************************************** - * - * Update volume and separation (panning) of 2D source - * - *****************************************************************************/ -EXPORT void HWRAPI (Update2DSoundParms) (INT32 chan, INT32 vol, INT32 sep) -{ - FSOUND_SAMPLE *fmsample; - - if (chan < 0) - return; - - fmsample = FSOUND_GetCurrentSample(chan); - - if (fmsample) - { - if (!FSOUND_Sample_GetMode(fmsample) & FSOUND_2D) - { - DBG_Printf("FMOD(Update2DSoundParms,Main): 2D Vol/Pan on 3D channel %i?\n",chan); - //return; - } - } - else - return; - - if (!FSOUND_SetPaused(chan, true)) - DBG_Printf("FMOD(Update2DSoundParms, FSOUND_SetPaused, Pause, channel %i): %s\n", chan,FMOD_ErrorString(FSOUND_GetError())); - - if (!FSOUND_SetVolume(chan,vol)) - DBG_Printf("FMOD(Update2DSoundParms, , channel %i to volume %i): %s\n", chan,vol,FMOD_ErrorString(FSOUND_GetError())); - - if (!FSOUND_SetPan(chan, sep == NORMAL_SEP ? FSOUND_STEREOPAN : sep)) - DBG_Printf("FMOD(Update2DSoundParms, FSOUND_SetPan, channel %i to sep %i): %s\n", chan,sep,FMOD_ErrorString(FSOUND_GetError())); - - if (!FSOUND_SetPaused(chan, false)) - DBG_Printf("FMOD(Update2DSoundParms, FSOUND_SetPaused, Resume, channel %i): %s\n", chan,FMOD_ErrorString(FSOUND_GetError())); -} - -// -------------------------------------------------------------------------- -// Set the global volume for sound effects -// -------------------------------------------------------------------------- -EXPORT void HWRAPI (SetGlobalSfxVolume) (INT32 vol) -{ - INT32 realvol = (vol<<3)+(vol>>2); - - FSOUND_SetSFXMasterVolume(realvol); -#ifdef MORESTUFF - DBG_Printf("FMOD(SetGlobalSfxVolume, Main, the volume is set to %i): %s\n", realvol,FMOD_ErrorString(FSOUND_GetError())); -#endif -} - -//Alam_GBC: Not Used? -EXPORT INT32 HWRAPI (SetCone) (INT32 chan, cone_def_t *cone_def) -{ - FSOUND_SAMPLE *fmsample; - - if (chan < 0) - return -1; - - fmsample = FSOUND_GetCurrentSample(chan); - - if (fmsample) - { - if (FSOUND_Sample_GetMode(fmsample) & FSOUND_2D) - { - DBG_Printf("FMOD(Update3DSource,Main): 3D Cone on 2D Channel %i?\n",chan); - return -1; - } - } - - if (cone_def) - { - return -1; - } - else - { - return 1; - } - -} - -EXPORT void HWRAPI (Update3DSource) (INT32 chan, source3D_pos_t *sfx) -{ - float pos[3]; - float vel[3]; - FSOUND_SAMPLE *fmsample; - - pos[0] = sfx->x; - pos[1] = sfx->z; - pos[2] = sfx->y; - vel[0] = sfx->momx; - vel[1] = sfx->momz; - vel[2] = sfx->momy; - if (chan < 0) - return; - - fmsample = FSOUND_GetCurrentSample(chan); - - if (!fmsample) - return; - - if (fmsample) - { - if (FSOUND_Sample_GetMode(fmsample) & FSOUND_2D) - { - //DBG_Printf("FMOD(Update3DSource,Main): 3D Pos/Vel on 2D Channel %i?\n",chan); - //return; - } - } - else - { - return; - } - - if (!FSOUND_3D_SetAttributes(chan,pos,vel)) - DBG_Printf("FMOD(Update3DSource,FSOUND_3D_SetAttributes, onto channel %i): %s\n", chan,FMOD_ErrorString(FSOUND_GetError())); - else - relplace(chan); -} - -//------------------------------------------------------------- -// Load new sound data into source -//------------------------------------------------------------- -EXPORT INT32 HWRAPI (Reload3DSource) (INT32 handle, sfx_data_t *sfx) -{ - source3D_data_t src; - float pos[3], vel[3]; - INT32 chan = relcheckup(handle); - FSOUND_SAMPLE *fmsample; - - if (handle < 0 || !sfx) - return -1; - - fmsample = FSOUND_GetCurrentSample(chan); - - if (!fmsample) - return -1; - - if (FSOUND_Sample_GetMode(fmsample) & FSOUND_2D) - { - DBG_Printf("FMOD(Reload3DSource,Main): New 3D Sound on 2D Channel %i?\n",handle); - return -1; - } -#ifdef MORESTUFF - else - DBG_Printf("FMOD(Reload3DSource, Main, sending new sfx# %i to chan %i)\n",sfx->id,handle); -#endif - -#ifdef OLDFMOD - src.min_distance = MIN_DISTANCE; - src.max_distance = MAX_DISTANCE; -#else - if (!FSOUND_3D_GetMinMaxDistance(handle,&src.min_distance,&src.min_distance)) - DBG_Printf("FMOD(Reload3DSource, FSOUND_3D_GetMinMaxDistance, channel %i, for sfxid# %i): %s\n",handle, sfx->id,FMOD_ErrorString(FSOUND_GetError())); -#endif - src.head_relative = (handle != chan); - src.permanent = FSOUND_GetReserved(handle); - if (!FSOUND_3D_GetAttributes(handle,&pos[0],&vel[0])) - DBG_Printf("FMOD(Reload3DSource, FSOUND_3D_GetAttributes, channel %i, for sfxid# %i): %s\n",handle,sfx->id,FMOD_ErrorString(FSOUND_GetError())); - - //if (handle == chan) - { - if (fmsample != blankfmsample) FSOUND_Sample_Free(fmsample); - } - //else - { - // fmsample = FSOUND_GetCurrentSample(handle); - } - - fmsample = FSOUND_Sample_Load(FSOUND_FREE, INT2CHAR(sfx->data), FSOUND_DOOMLOAD, SFXLENGTH); - - if (!FSOUND_StopSound(chan)) - DBG_Printf("FMOD(Reload3DSource,FSOUND_StopSound, of channel %i for sfxid# %i): %s\n", handle,sfx->id,FMOD_ErrorString(FSOUND_GetError())); - - if (fmsample) - { - if (!FSOUND_Sample_SetDefaults(fmsample, - (INT32)((float)(*((UINT16 *)sfx->data+1)) * recalc_pitch(sfx->pitch)), - sfx->volume == -1 ? 255 : sfx->volume, - sfx->sep == NORMAL_SEP ? FSOUND_STEREOPAN : sfx->sep, - sfx->priority)) - DBG_Printf("FMOD(Reload3DSource, FSOUND_Sample_SetDefaults, for sfxid# %i): %s\n", sfx->id,FMOD_ErrorString(FSOUND_GetError())); - - if (!FSOUND_Sample_SetMinMaxDistance(fmsample, src.min_distance, src.max_distance)) - DBG_Printf("FMOD(Reload3DSource, FSOUND_Sample_SetMinMaxDistance, SFX's ID# %i): %s\n", sfx->id,FMOD_ErrorString(FSOUND_GetError())); - - chan = FSOUND_PlaySoundEx(chan,fmsample,NULL,true); - - if (chan == -1) - { - DBG_Printf("FMOD(Reload3DSource, FSOUND_PlaySoundEx, for sfxid# %i): %s\n", sfx->id,FMOD_ErrorString(FSOUND_GetError())); - return chan; - } - - if (FSOUND_GetCurrentSample(chan)) - { - if (!FSOUND_SetCurrentPosition(chan, 0)) - DBG_Printf("FMOD(Reload3DSource, FSOUND_SetCurrentPosition, channel %i, sfxid# %i): %s\n", chan,sfx?sfx->id:0,FMOD_ErrorString(FSOUND_GetError())); - - if (!FSOUND_3D_SetAttributes(chan,pos,vel)) - DBG_Printf("FMOD(Reload3DSource, FSOUND_3D_SetAttributes, channel %i, sfxid# %i): %s\n", chan,sfx?sfx->id:0,FMOD_ErrorString(FSOUND_GetError())); - - if (!FSOUND_SetReserved(chan, (signed char)src.permanent)) - DBG_Printf("FMOD(Reload3DSource, FSOUND_SetReserved, channel %i, sfxid# %i): %s\n", chan,sfx?sfx->id:0,FMOD_ErrorString(FSOUND_GetError())); - - if (src.head_relative) relupdate(handle); - } - } - else - DBG_Printf("FMOD(Reload3DSource,FSOUND_Sample_Load, for sfxid# %i): %s\n", sfx->id,FMOD_ErrorString(FSOUND_GetError())); - - return chan; -} - -/****************************************************************************** - * - * Destroy source and remove it from stack if it is a 2D source. - * Otherwise put source into cache - * - *****************************************************************************/ -EXPORT void HWRAPI (KillSource) (INT32 chan) -{ - FSOUND_SAMPLE *fmsample; - INT32 relchan; - - if (chan < 0) - return; - - relchan = relcheckup(chan); - - fmsample = FSOUND_GetCurrentSample(chan); - - if (!fmsample) - return; - -#ifdef MORESTUFF - if (FSOUND_IsPlaying(relchan)) - if (!FSOUND_SetLoopMode(relchan, FSOUND_LOOP_OFF)) - DBG_Printf("FMOD(KillSource,FSOUND_SetLoopMode, for channel %i): %s\n", chan,FMOD_ErrorString(FSOUND_GetError())); //Alam_GBC: looping off - else -#endif - if (!FSOUND_StopSound(relchan)) - { - DBG_Printf("FMOD(KillSource,FSOUND_StopSound, for channel %i): %s\n", chan,FMOD_ErrorString(FSOUND_GetError())); - } -#ifdef MORESTUFF - else DBG_Printf("FMOD(KillSource, Main, for channel %i)\n", chan); -#endif - if (fmsample != blankfmsample) FSOUND_Sample_Free(fmsample); -} - -#ifdef _WINDOWS -BOOL WINAPI DllMain(HINSTANCE hinstDLL, // handle to DLL module - DWORD fdwReason, // reason for calling function - LPVOID lpvReserved) // reserved -{ - // Perform actions based on the reason for calling. - UNREFERENCED_PARAMETER(lpvReserved); - switch (fdwReason) - { - case DLL_PROCESS_ATTACH: - // Initialize once for each new process. - // Return FALSE to fail DLL load. -#ifdef DEBUG_TO_FILE - logstream = fopen("s_fmod.log", "wt"); - if (logstream == NULL) - return FALSE; -#endif - DisableThreadLibraryCalls(hinstDLL); - break; - - case DLL_THREAD_ATTACH: - // Do thread-specific initialization. - break; - - case DLL_THREAD_DETACH: - // Do thread-specific cleanup. - break; - - case DLL_PROCESS_DETACH: - // Perform any necessary cleanup. -#ifdef DEBUG_TO_FILE - if (logstream) - { - fclose(logstream); - logstream = NULL; - } -#endif - break; - } - return TRUE; // Successful DLL_PROCESS_ATTACH. -} -#elif !defined (HAVE_SDL) - -// ************************************************************************** -// FUNCTIONS -// ************************************************************************** - -EXPORT void _init() -{ -#ifdef DEBUG_TO_FILE - logstream = fopen("s_fmod.log","wt"); -#endif -} - -EXPORT void _fini() -{ -#ifdef DEBUG_TO_FILE - if (logstream) - fclose(logstream); -#endif -} -#endif diff --git a/src/hardware/s_fmod/s_fmod.dev b/src/hardware/s_fmod/s_fmod.dev deleted file mode 100644 index 01e21e2b7..000000000 --- a/src/hardware/s_fmod/s_fmod.dev +++ /dev/null @@ -1,59 +0,0 @@ -[Project] -FileName=s_fmod.dev -Name=s_fmod -Ver=1 -IsCpp=1 -Type=3 -Compiler=-D_M_IX86=500_@@_-Wall_@@_-D_WINDOWS_@@_-Os_@@_-fomit-frame-pointer_@@_ -CppCompiler= -Includes=..\..\win32\FMOD -Linker=--def ../s_mingw.def_@@_-lfmod_@@_ -Libs=..\..\win32\FMOD -UnitCount=1 -Folders= -ObjFiles= -PrivateResource= -ResourceIncludes= -MakeIncludes= -Icon= -ExeOutput=C:\srb2demo2 -ObjectOutput=..\..\..\objs\Mingw\s_fmod -OverrideOutput=1 -OverrideOutputName=s_fmod.dll -HostApplication= -CommandLine= -IncludeVersionInfo=0 -SupportXPThemes=0 -CompilerSet=0 -CompilerSettings=00000000000000000111d0 -UseCustomMakefile=0 -CustomMakefile= - -[Unit1] -FileName=s_fmod.c -Folder= -Compile=1 -CompileCpp=0 -Link=1 -Priority=1000 -OverrideBuildCmd=0 -BuildCmd= - -[VersionInfo] -Major=1 -Minor=0 -Release=8 -Build=42 -LanguageID=1033 -CharsetID=1252 -CompanyName=Alam Arias -FileVersion=1.42 -FileDescription=SRB2 Sound API DLL for FMOD -InternalName=Super FMOD! -LegalCopyright= -LegalTrademarks= -OriginalFilename=s_fmod.dll -ProductName=s_fmod -ProductVersion=0.1 -AutoIncBuildNr=0 - diff --git a/src/hardware/s_fmod/s_fmod.dsp b/src/hardware/s_fmod/s_fmod.dsp deleted file mode 100644 index c9a1fb743..000000000 --- a/src/hardware/s_fmod/s_fmod.dsp +++ /dev/null @@ -1,97 +0,0 @@ -# Microsoft Developer Studio Project File - Name="s_fmod" - Package Owner=<4> -# Microsoft Developer Studio Generated Build File, Format Version 6.00 -# ** DO NOT EDIT ** - -# TARGTYPE "Win32 (x86) Dynamic-Link Library" 0x0102 - -CFG=s_fmod - Win32 Debug -!MESSAGE This is not a valid makefile. To build this project using NMAKE, -!MESSAGE use the Export Makefile command and run -!MESSAGE -!MESSAGE NMAKE /f "s_fmod.mak". -!MESSAGE -!MESSAGE You can specify a configuration when running NMAKE -!MESSAGE by defining the macro CFG on the command line. For example: -!MESSAGE -!MESSAGE NMAKE /f "s_fmod.mak" CFG="s_fmod - Win32 Debug" -!MESSAGE -!MESSAGE Possible choices for configuration are: -!MESSAGE -!MESSAGE "s_fmod - Win32 Release" (based on "Win32 (x86) Dynamic-Link Library") -!MESSAGE "s_fmod - Win32 Debug" (based on "Win32 (x86) Dynamic-Link Library") -!MESSAGE - -# Begin Project -# PROP AllowPerConfigDependencies 0 -# PROP Scc_ProjName "" -# PROP Scc_LocalPath "" -CPP=cl.exe -MTL=midl.exe -RSC=rc.exe - -!IF "$(CFG)" == "s_fmod - Win32 Release" - -# PROP BASE Use_MFC 0 -# PROP BASE Use_Debug_Libraries 0 -# PROP BASE Output_Dir "Release" -# PROP BASE Intermediate_Dir "Release" -# PROP BASE Target_Dir "" -# PROP Use_MFC 0 -# PROP Use_Debug_Libraries 0 -# PROP Output_Dir "..\..\..\bin\VC\Release\s_fmod" -# PROP Intermediate_Dir "..\..\..\objs\VC\Release\s_fmod" -# PROP Ignore_Export_Lib 1 -# PROP Target_Dir "" -# ADD BASE CPP /nologo /MT /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "S_FMOD_EXPORTS" /YX /FD /c -# ADD CPP /nologo /MT /W3 /GX /Zi /O2 /D "NDEBUG" /D "WIN32" /D "_WINDOWS" /D "__WIN32__" /D "__MSC__" /FR /FD /c -# SUBTRACT CPP /YX -# ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /win32 -# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win32 -# ADD BASE RSC /l 0x409 /d "NDEBUG" -# ADD RSC /l 0x409 /d "NDEBUG" -BSC32=bscmake.exe -# ADD BASE BSC32 /nologo -# ADD BSC32 /nologo -LINK32=link.exe -# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /machine:I386 -# ADD LINK32 fmodvc.lib /nologo /dll /pdb:"..\..\..\bin\VC\Release\s_fmod.pdb" /machine:I386 /out:"..\..\..\bin\VC\Release\s_fmod.dll" - -!ELSEIF "$(CFG)" == "s_fmod - Win32 Debug" - -# PROP BASE Use_MFC 0 -# PROP BASE Use_Debug_Libraries 1 -# PROP BASE Output_Dir "Debug" -# PROP BASE Intermediate_Dir "Debug" -# PROP BASE Target_Dir "" -# PROP Use_MFC 0 -# PROP Use_Debug_Libraries 1 -# PROP Output_Dir "..\..\..\bin\VC\Debug\s_fmod" -# PROP Intermediate_Dir "..\..\..\objs\VC\Debug\s_fmod" -# PROP Ignore_Export_Lib 1 -# PROP Target_Dir "" -# ADD BASE CPP /nologo /MTd /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "S_FMOD_EXPORTS" /YX /FD /GZ /c -# ADD CPP /nologo /MTd /W4 /Gm /GX /ZI /Od /D "_DEBUG" /D "WIN32" /D "_WINDOWS" /D "__WIN32__" /D "__MSC__" /FR /FD /GZ /c -# SUBTRACT CPP /YX -# ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /win32 -# ADD MTL /nologo /D "_DEBUG" /mktyplib203 /win32 -# ADD BASE RSC /l 0x409 /d "_DEBUG" -# ADD RSC /l 0x409 /d "_DEBUG" -BSC32=bscmake.exe -# ADD BASE BSC32 /nologo -# ADD BSC32 /nologo -LINK32=link.exe -# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /debug /machine:I386 /pdbtype:sept -# ADD LINK32 fmodvc.lib /nologo /dll /pdb:"..\..\..\bin\VC\Debug\s_fmod.pdb" /debug /machine:I386 /out:"..\..\..\bin\VC\Debug\s_fmod.dll" /pdbtype:sept - -!ENDIF - -# Begin Target - -# Name "s_fmod - Win32 Release" -# Name "s_fmod - Win32 Debug" -# Begin Source File - -SOURCE=.\s_fmod.c -# End Source File -# End Target -# End Project diff --git a/src/hardware/s_openal/s_openal.c b/src/hardware/s_openal/s_openal.c deleted file mode 100644 index 7f91ccf2c..000000000 --- a/src/hardware/s_openal/s_openal.c +++ /dev/null @@ -1,998 +0,0 @@ -// Emacs style mode select -*- C++ -*- -//----------------------------------------------------------------------------- -// -// Copyright (C) 2001 by DooM Legacy Team. -// -// This program is free software; you can redistribute it and/or -// modify it under the terms of the GNU General Public License -// as published by the Free Software Foundation; either version 2 -// of the License, or (at your option) any later version. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -//----------------------------------------------------------------------------- -/// \file -/// \brief General driver for 3D sound system -/// -/// Implementend via OpenAL API - -#ifdef _WINDOWS -//#define WIN32_LEAN_AND_MEAN -#define RPC_NO_WINDOWS_H -#include -#include -FILE* logstream = NULL; -#else -#include -#include -#include -#include -#include -#include -#ifndef HAVE_SDL // let not make a logstream here is we are inline the HW3D in the SDL binary -FILE* logstream = NULL; -#endif -#endif - -#ifdef __APPLE__ -#include //Main AL -#include //Helpers -#else -#include //Main AL -#include //Helpers -#endif - -#define _CREATE_DLL_ -#include "../../doomdef.h" -#include "../hw3dsdrv.h" - -//#undef DEBUG_TO_FILE -//#if defined ( HAVE_SDL ) && !defined ( LOGMESSAGES ) -#define DEBUG_TO_FILE -//#endif - -// Internal sound stack -typedef struct stack_snd_s -{ - ALuint ALsource;// 3D data of 3D source - - ALint sfx_id;// Currently unused - - ALint LRU;// Currently unused - - ALboolean permanent;// Flag of static source -} stack_snd_t; - -#ifndef AL_INVALID -#define AL_INVALID (-1) -#endif - -static I_Error_t I_ErrorOpenAl = NULL; -static stack_snd_t *ALstack = NULL; // Sound stack -static ALsizei allocated_sounds = 0; // Size of stack -static ALsizei allocate_delta = 16; -static ALCdevice *ALCDevice = NULL; -static ALCcontext *ALContext = NULL; -static ALenum ALo_Lasterror = AL_NO_ERROR; -static ALenum ALCo_Lasterror = ALC_NO_ERROR; - -static ALenum ALo_GetError(ALvoid) -{ - ALo_Lasterror = alGetError(); - return ALo_Lasterror; -} - -static ALenum ALCo_GetError(ALvoid) -{ - ALCo_Lasterror = alcGetError(ALCDevice); - return ALCo_Lasterror; -} - -static ALfloat ALvol(ALint vol, ALsizei step) -{ - return ((ALfloat)vol)/(ALfloat)step; -} - -/* -static ALfloat Alpitch(ALint pitch) -{ -#if 1 - pitch = NORMAL_PITCH; -#endif - return pitch < NORMAL_PITCH ? - (float)(pitch + NORMAL_PITCH) / (NORMAL_PITCH * 2) - :(float)pitch / (float)NORMAL_PITCH; -} -*/ - -static const ALchar *GetALErrorString(ALenum err) -{ - switch (err) - { - case AL_NO_ERROR: - return "There no error"; - break; - - case AL_INVALID_NAME: - return "Invalid name"; - break; - - case AL_INVALID_ENUM: - return "Invalid enum"; - break; - - case AL_INVALID_VALUE: - return "Invalid value"; - break; - - case AL_INVALID_OPERATION: - return "Invalid operation"; - break; - - case AL_OUT_OF_MEMORY: - return "Out Of Memory"; - break; - - default: - return alGetString(err); - break; - } -} - -static const ALchar *GetALCErrorString(ALenum err) -{ - switch (err) - { - case ALC_NO_ERROR: - return "There no error"; - break; - - case ALC_INVALID_DEVICE: - return "Invalid Device"; - break; - - case ALC_INVALID_CONTEXT: - return "Invalid Context"; - break; - - case ALC_INVALID_ENUM: - return "Invalid enum"; - break; - - case ALC_INVALID_VALUE: - return "Invalid value"; - break; - - case ALC_OUT_OF_MEMORY: - return "Out Of Memory"; - break; - - default: - return alcGetString(ALCDevice, err); - break; - } -} - -/*************************************************************** - * - * DBG_Printf - * Output error messages to debug log if DEBUG_TO_FILE is defined, - * else do nothing - * - ************************************************************** - */ -// -----------------+ -// DBG_Printf : Output error messages to debug log if DEBUG_TO_FILE is defined, -// : else do nothing -// Returns : -// -----------------+ -FUNCPRINTF void DBG_Printf(const char *lpFmt, ... ) -{ -#ifdef DEBUG_TO_FILE - char str[4096] = ""; - va_list arglist; - - va_start(arglist, lpFmt); - vsnprintf(str, 4096, lpFmt, arglist); - va_end(arglist); - if (logstream) - fwrite(str, strlen(str), 1 , logstream); -#else - lpFmt = NULL; -#endif -} - -/*************************************************************** - * - * Grow internal sound stack by allocate_delta amount - * - *************************************************************** - */ -static ALboolean reallocate_stack(void) -{ - stack_snd_t *new_stack; - if (ALstack) - new_stack = realloc(ALstack, sizeof (stack_snd_t) * (allocated_sounds + allocate_delta)); - else - new_stack = malloc(sizeof (stack_snd_t) * (allocate_delta)); - if (new_stack) - { - ALsizei clean_stack; - ALstack = new_stack; - memset(&ALstack[allocated_sounds], 0, allocate_delta * sizeof (stack_snd_t)); - for (clean_stack = allocated_sounds; clean_stack < allocated_sounds; clean_stack++) - ALstack[clean_stack].ALsource = (ALuint)AL_INVALID; - allocated_sounds += allocate_delta; - return AL_TRUE; - } - return AL_FALSE; -} - - -/*************************************************************** - * - * Destroys source in stack - * - *************************************************************** - */ -static ALvoid kill_sound(stack_snd_t *snd) -{ - if (alIsSource(snd->ALsource)) - alDeleteSources(1,&snd->ALsource); - if (ALo_GetError() != AL_NO_ERROR) - { - DBG_Printf("%s: alDeleteSources, %s", __FUNCTION__, GetALErrorString(ALo_Lasterror)); - } - memset(snd,0, sizeof (stack_snd_t)); - snd->ALsource = (ALuint)AL_INVALID; -} - -/*************************************************************** - * - * Returns free (unused) source stack slot - * If none available sound stack will be increased - * - *************************************************************** - */ -static ALsizei find_handle(void) -{ - ALsizei free_sfx = 0; - stack_snd_t *snd; - - for (snd = ALstack; free_sfx < allocated_sounds; snd++, free_sfx++) - { - if (snd->permanent) - continue; - if (snd->ALsource==(ALuint)AL_INVALID) - break; - if (!alIsSource(snd->ALsource)) - break; - ALo_GetError(); - if (snd->sfx_id == 0) - break; - } - - // No suitable resource found so increase sound stack - //DBG_Printf("sfx chan %d\n", free_sfx); - if (free_sfx == allocated_sounds) - { - DBG_Printf("No free or same sfx found so increase stack (currently %d srcs)\n", allocated_sounds); - free_sfx = reallocate_stack() ? free_sfx : (ALsizei)AL_INVALID; - } - return free_sfx; -} - -static ALvoid ALSetPan(ALuint sid, INT32 sep) -{ - ALfloat facing[3] ={0.0f, 0.0f, 0.0f}; //Alam: bad? - const ALfloat fsep = (ALfloat)sep; - const ALfloat nsep = (ALfloat)NORMAL_SEP; - if (sep) - { - facing[0] = (ALfloat)(fsep/nsep); - facing[2] = 1.0f; - } - alSourcefv(sid, AL_POSITION, facing); - if (ALo_GetError() != AL_NO_ERROR) - { - DBG_Printf("%s: alSourcefv, %s", __FUNCTION__, GetALErrorString(ALo_Lasterror)); - } -} - - -/****************************************************************************** - * - * Initialise driver and listener - * - *****************************************************************************/ -EXPORT INT32 HWRAPI( Startup ) (I_Error_t FatalErrorFunction, snddev_t *snd_dev) -{ - ALenum model = AL_INVERSE_DISTANCE_CLAMPED; - ALCboolean inited = ALC_FALSE; - ALCint AlSetup[8] = {ALC_FREQUENCY,22050,ALC_REFRESH,35,ALC_SYNC,AL_FALSE,ALC_INVALID,ALC_INVALID}; -#if (defined (_WIN32) || defined (_WIN64)) && 0 - const ALCubyte *ALCdriver = alcGetString(NULL,ALC_DEFAULT_DEVICE_SPECIFIER); - const ALCubyte *DSdriver = "DirectSound"; - - if (!strcmp((const ALCbyte *)ALCdriver,"DirectSound3D")) //Alam: OpenAL's DS3D is buggy - ALCDevice = alcOpenDevice(DSdriver); //Open DirectSound - else //Alam: The OpenAl device - ALCDevice = alcOpenDevice(ALCdriver); //Open Default -#else - ALCDevice = alcOpenDevice(alcGetString(NULL,ALC_DEFAULT_DEVICE_SPECIFIER)); -#endif - if (ALCo_GetError() != ALC_NO_ERROR || !ALCDevice) - { - DBG_Printf("S_OpenAl: Error %s when opening device!\n", GetALCErrorString(ALCo_Lasterror)); - return inited; - } - else - { - DBG_Printf("Driver Name : %s\n", alcGetString(ALCDevice,ALC_DEVICE_SPECIFIER)); - DBG_Printf("Extensions : %s\n", alcGetString(ALCDevice,ALC_EXTENSIONS)); - DBG_Printf("S_OpenAl: OpenAl Device %s opened\n",alcGetString(ALCDevice, ALC_DEVICE_SPECIFIER)); - } - - I_ErrorOpenAl = FatalErrorFunction; - - AlSetup[1] = snd_dev->sample_rate; //ALC_FREQUENCY - AlSetup[1] = 44100; - AlSetup[3] = 35; //ALC_REFRESH - - //Alam: The Environment? - ALContext = alcCreateContext(ALCDevice,AlSetup); - if (ALCo_GetError() != ALC_NO_ERROR || !ALContext) - { - DBG_Printf("S_OpenAl: Error %s when making the environment!\n",GetALCErrorString(ALCo_Lasterror)); - return inited; - } - else - { - DBG_Printf("S_OpenAl: OpenAl environment made\n"); - } - - alcMakeContextCurrent(ALContext); - if (ALCo_GetError() != ALC_NO_ERROR) - { - DBG_Printf("S_OpenAl: Error %s when setting the environment!\n",GetALCErrorString(ALCo_Lasterror)); - return inited; - } - else - { - DBG_Printf("S_OpenAl: OpenAl environment setted up\n"); - } - - DBG_Printf("Vendor : %s\n", alGetString(AL_VENDOR)); - DBG_Printf("Renderer : %s\n", alGetString(AL_RENDERER)); - DBG_Printf("Version : %s\n", alGetString(AL_VERSION)); - DBG_Printf("Extensions : %s\n", alGetString(AL_EXTENSIONS)); - - alDopplerFactor(0.0f); - if (ALo_GetError() != AL_NO_ERROR) - { - DBG_Printf("S_OpenAl: Error %s when setting Doppler Factor!\n",GetALErrorString(ALo_Lasterror)); - return inited; - } - else - { - DBG_Printf("S_OpenAl: Doppler Factor of %f setted\n", alGetDouble(AL_DOPPLER_FACTOR)); - } - - alSpeedOfSound(600.0f); - if (ALo_GetError() != AL_NO_ERROR) - { - DBG_Printf("S_OpenAl: Error %s when setting Speed of Sound!\n",GetALErrorString(ALo_Lasterror)); - return inited; - } - else - { - DBG_Printf("S_OpenAl: Speed of Sound set to %f\n", alGetDouble(AL_SPEED_OF_SOUND)); - } - - alDistanceModel(model); - if (ALo_GetError() != AL_NO_ERROR) - { - DBG_Printf("S_OpenAl: Error %s when setting Distance Model!\n",GetALErrorString(ALo_Lasterror)); - return inited; - } - else - { - //DBG_Printf("S_OpenAl: %s mode setted\n",alGetString(model)); - } - - inited = reallocate_stack(); - - return inited; -} - -/****************************************************************************** - * - * Shutdown 3D Sound - * - ******************************************************************************/ -EXPORT void HWRAPI( Shutdown ) ( void ) -{ - ALsizei i; - - DBG_Printf ("S_OpenAL Shutdown()\n"); - - for (i = 0; i < allocated_sounds; i++) - { - StopSource(i); - kill_sound(ALstack + i); - } - -#if defined(linux) || defined(__linux) || defined(__linux__) - alcMakeContextCurrent(NULL); - //TODO:check? -#endif - - if (ALContext) - { - alcDestroyContext(ALContext); - ALContext = NULL; - } - - if (ALstack) - { - free(ALstack); - ALstack = NULL; - } - - //TODO:check? - if (ALCDevice) - { - alcCloseDevice(ALCDevice); - ALCDevice = NULL; - } - //TODO:check? -} - -#ifdef _MSC_VER -#pragma warning(disable : 4200) -#pragma pack(1) -#endif - -typedef struct -{ - ALushort header; // 3? - ALushort samplerate; // 11025+ - ALushort samples; // number of samples - ALushort dummy; // 0 - ALubyte data[0]; // data; -} ATTRPACK dssfx_t; - -#ifdef _MSC_VER -#pragma pack() -#pragma warning(default : 4200) -#endif - -static ALsizei getfreq(ALvoid *sfxdata, size_t len) -{ - dssfx_t *dsfx = sfxdata; - const ALsizei freq = SHORT(dsfx->samplerate); - - if (len <= 8) - return 0; - else - return freq; -} - -static ALsizei makechan(ALuint sfxhandle, ALboolean perm) -{ - ALsizei chan = find_handle(); - - if (chan == (ALsizei)AL_INVALID) return chan; - - alGenSources(1, &ALstack[chan].ALsource); - if (ALo_GetError() != AL_NO_ERROR || !alIsSource(ALstack[chan].ALsource)) - { - DBG_Printf("S_OpenAl: Error %s when make an ALSource!\n",GetALErrorString(ALo_Lasterror)); - ALstack[chan].ALsource = (ALuint)AL_INVALID; - return (ALsizei)AL_INVALID; - } - - ALstack[chan].permanent = perm; - - alSourceQueueBuffers(ALstack[chan].ALsource, 1, &sfxhandle); - if (ALo_GetError() != AL_NO_ERROR) - { - DBG_Printf("S_OpenAl: Error %s when queue up an alSource!\n",GetALErrorString(ALo_Lasterror)); - } - - return chan; -} - -/****************************************************************************** - * - * Creates ?D source - * - ******************************************************************************/ -EXPORT INT32 HWRAPI ( AddSource ) (source3D_data_t *src, u_int sfxhandle) -{ - ALsizei chan = makechan(sfxhandle, (ALboolean)(src?src->permanent:AL_FALSE)); - ALuint sid = (ALuint)AL_INVALID; - if (chan == (ALsizei)AL_INVALID) - return AL_INVALID; - else - sid = ALstack[chan].ALsource; - - if (src) //3D - { -#if 0 - alSourcef(sid, AL_REFERENCE_DISTANCE, src->min_distance); - if (ALo_GetError() != AL_NO_ERROR) - { - DBG_Printf("%s: AL_REFERENCE_DISTANCE, %s", __FUNCTION__, GetALErrorString(ALo_Lasterror)); - } - - alSourcef(sid, AL_MAX_DISTANCE, src->max_distance); - if (ALo_GetError() != AL_NO_ERROR) - { - DBG_Printf("%s: AL_MAX_DISTANCE, %s", __FUNCTION__, GetALErrorString(ALo_Lasterror)); - } -#endif - - if (src->head_relative) - alSourcei(sid, AL_SOURCE_RELATIVE, AL_TRUE); - else - alSourcei(sid, AL_SOURCE_RELATIVE, AL_FALSE); - if (ALo_GetError() != AL_NO_ERROR) - { - DBG_Printf("%s: AL_SOURCE_RELATIVE, %s", __FUNCTION__, GetALErrorString(ALo_Lasterror)); - } - - alSource3f(sid, AL_POSITION, src->pos.x, src->pos.z, src->pos.y); - if (ALo_GetError() != AL_NO_ERROR) - { - DBG_Printf("%s: AL_POSITION, %s", __FUNCTION__, GetALErrorString(ALo_Lasterror)); - } - alSource3f(sid, AL_VELOCITY, src->pos.momx, src->pos.momz, src->pos.momy); - if (ALo_GetError() != AL_NO_ERROR) - { - DBG_Printf("%s: AL_VELOCITY, %s", __FUNCTION__, GetALErrorString(ALo_Lasterror)); - } - } - else //2D - { - alSourcei(sid, AL_SOURCE_RELATIVE, AL_TRUE); - if (ALo_GetError() != AL_NO_ERROR) - { - DBG_Printf("%s: AL_SOURCE_RELATIVE, %s", __FUNCTION__, GetALErrorString(ALo_Lasterror)); - } - } - - alSourcef(sid, AL_ROLLOFF_FACTOR, 0.0f); - if (ALo_GetError() != AL_NO_ERROR) - { - DBG_Printf("%s: AL_ROLLOFF_FACTOR, %s", __FUNCTION__, GetALErrorString(ALo_Lasterror)); - } - - alSourcef(sid, AL_REFERENCE_DISTANCE, 0.0f); - if (ALo_GetError() != AL_NO_ERROR) - { - DBG_Printf("%s: AL_REFERENCE_DISTANC, %s", __FUNCTION__, GetALErrorString(ALo_Lasterror)); - } - return chan; -} - -EXPORT INT32 HWRAPI ( StartSource ) (INT32 chan) -{ - ALint state = AL_NONE; - ALuint sid = (ALuint)AL_INVALID; - - if (chan <= AL_INVALID || !alIsSource(ALstack[chan].ALsource)) - return AL_FALSE; - else - sid = ALstack[chan].ALsource; - - ALo_GetError(); - - alSourcePlay(sid); - if (ALo_GetError() != AL_NO_ERROR) - { - DBG_Printf("%s: alSourcePlay, %s", __FUNCTION__, GetALErrorString(ALo_Lasterror)); - } - - alGetSourcei(sid, AL_SOURCE_STATE, &state); - if (ALo_GetError() != AL_NO_ERROR) - { - DBG_Printf("%s: alGetSourcei, %s", __FUNCTION__, GetALErrorString(ALo_Lasterror)); - } - - return (state == AL_PLAYING); -} - -EXPORT void HWRAPI ( StopSource) (INT32 chan) -{ - ALuint sfxhandle = AL_NONE; - ALuint sid = (ALuint)AL_INVALID; - if (chan <= AL_INVALID || !alIsSource(ALstack[chan].ALsource)) - return; - else - sid = ALstack[chan].ALsource; - - ALo_GetError(); - -#if 1 - alSourceQueueBuffers(sid, 1, &sfxhandle); - if (ALo_GetError() != AL_NO_ERROR) - { - DBG_Printf("%s: alSourceQueueBuffers, %s", __FUNCTION__, GetALErrorString(ALo_Lasterror)); - } -#else - alSourceStop(sid); - if (ALo_GetError() != AL_NO_ERROR) - { - DBG_Printf("%s: alSourceStop, %s", __FUNCTION__, GetALErrorString(ALo_Lasterror)); - } -#endif -} - -EXPORT INT32 HWRAPI ( GetHW3DSVersion) (void) -{ - return VERSION; -} - -EXPORT void HWRAPI (BeginFrameUpdate) (void) -{ - alcSuspendContext(ALContext); - if (ALo_GetError() != AL_NO_ERROR) - { - DBG_Printf("%s: alcSuspendContext, %s", __FUNCTION__, GetALErrorString(ALo_Lasterror)); - } -} - -EXPORT void HWRAPI (EndFrameUpdate) (void) -{ - alcProcessContext(ALContext); - if (ALo_GetError() != AL_NO_ERROR) - { - DBG_Printf("%s: alcProcessContext, %s", __FUNCTION__, GetALErrorString(ALo_Lasterror)); - } -} - -EXPORT INT32 HWRAPI (IsPlaying) (INT32 chan) -{ - ALint state = AL_NONE; - ALuint sid = (ALuint)AL_INVALID; - - if (chan <= AL_INVALID || !alIsSource(ALstack[chan].ALsource)) - return AL_FALSE; - else - sid = ALstack[chan].ALsource; - - ALo_GetError(); - - alGetSourcei(sid, AL_SOURCE_STATE, &state); - if (ALo_GetError() != AL_NO_ERROR) - { - DBG_Printf("%s: alGetSourcei, %s", __FUNCTION__, GetALErrorString(ALo_Lasterror)); - } - - return (state == AL_PLAYING); -} - -/****************************************************************************** - * UpdateListener - * - * Set up main listener properties: - * - position - * - orientation - * - velocity - *****************************************************************************/ -EXPORT void HWRAPI (UpdateListener) (listener_data_t *data, INT32 num) -{ - if (num != 1) return; - - if (data) - { - ALfloat facing[6]; - ALdouble f_angle = 0.0; - if (data->f_angle) f_angle = (ALdouble)((data->f_angle) / 180.0l * M_PIl); - facing[0] = (ALfloat)cos(f_angle); - facing[1] = 0.0f; - facing[2] = (ALfloat)sin(f_angle); - facing[3] = 0.0f; - facing[4] = 1.0f; - facing[5] = 0.0f; - - alListener3f(AL_POSITION,(ALfloat)-data->x,(ALfloat)data->z,(ALfloat)data->y); - if (ALo_GetError() != AL_NO_ERROR) - { - DBG_Printf("%s: AL_POSITIO, %s", __FUNCTION__, GetALErrorString(ALo_Lasterror)); - } - - alListener3f(AL_VELOCITY,(ALfloat)data->momx,(ALfloat)data->momz,(ALfloat)data->momy); - if (ALo_GetError() != AL_NO_ERROR) - { - DBG_Printf("%s: AL_VELOCITY, %s", __FUNCTION__, GetALErrorString(ALo_Lasterror)); - } - - alListenerfv(AL_ORIENTATION, facing); - if (ALo_GetError() != AL_NO_ERROR) - { - DBG_Printf("%s: AL_ORIENTATION, %s", __FUNCTION__, GetALErrorString(ALo_Lasterror)); - } - } - else - { - DBG_Printf("Error: 1st listener data is missing\n"); - } -} - -/****************************************************************************** - * - * Update volume for 2D source and separation (panning) of 2D source - * - *****************************************************************************/ -EXPORT void HWRAPI (UpdateSourceParms) (INT32 chan, INT32 vol, INT32 sep) -{ - ALuint sid = AL_NONE; - ALint is2d = AL_FALSE; - if (chan > AL_INVALID && !alIsSource(ALstack[chan].ALsource)) - return; - else - sid = ALstack[chan].ALsource; - - alGetSourcei(sid, AL_SOURCE_RELATIVE, &is2d); - - if (!is2d) - return; - - if (vol != -1) - { - alSourcef(sid,AL_GAIN,ALvol(vol,256)); - if (ALo_GetError() != AL_NO_ERROR) - { - DBG_Printf("%s: alSourcef, %s", __FUNCTION__, GetALErrorString(ALo_Lasterror)); - } - } - - if (sep != -1) - { - ALSetPan(sid,sep-NORMAL_SEP); - if (ALo_GetError() != AL_NO_ERROR) - { - DBG_Printf("%s: ALSetPan, %s", __FUNCTION__, GetALErrorString(ALo_Lasterror)); - } - } -} - -// -------------------------------------------------------------------------- -// Set the global volume for sound effects -// -------------------------------------------------------------------------- -EXPORT void HWRAPI (SetGlobalSfxVolume) (INT32 vol) -{ - alListenerf(AL_GAIN, ALvol(vol,32)); - if (ALo_GetError() != AL_NO_ERROR) - { - DBG_Printf("%s: AL_GAIN, %s", __FUNCTION__, GetALErrorString(ALo_Lasterror)); - } -} - -//Alam: Not Used? -EXPORT INT32 HWRAPI (SetCone) (INT32 chan, cone_def_t *cone_def) -{ - ALuint sid = AL_NONE; - ALint is2d = AL_FALSE; - if (chan > AL_INVALID && !alIsSource(ALstack[chan].ALsource)) - return AL_FALSE; - else - sid = ALstack[chan].ALsource; - - alGetSourcei(sid, AL_SOURCE_RELATIVE, &is2d); - - if(is2d || !cone_def) - return AL_FALSE; - - alSourcef(sid,AL_CONE_INNER_ANGLE,cone_def->inner); - if (ALo_GetError() != AL_NO_ERROR) - { - DBG_Printf("%s: AL_CONE_INNER_ANGLE, %s", __FUNCTION__, GetALErrorString(ALo_Lasterror)); - } - - alSourcef(sid,AL_CONE_OUTER_ANGLE,cone_def->outer); - if (ALo_GetError() != AL_NO_ERROR) - { - DBG_Printf("%s: AL_CONE_OUTER_ANGL, %s", __FUNCTION__, GetALErrorString(ALo_Lasterror)); - } - - alSourcei(sid,AL_CONE_OUTER_GAIN, cone_def->outer_gain); - if (ALo_GetError() != AL_NO_ERROR) - { - DBG_Printf("%s: AL_CONE_OUTER_GAIN, %s", __FUNCTION__, GetALErrorString(ALo_Lasterror)); - } - - return AL_TRUE; -} - -EXPORT void HWRAPI (Update3DSource) (INT32 chan, source3D_pos_t *sfx) -{ - ALuint sid = AL_NONE; - ALint is2d = AL_FALSE; - if (chan > AL_INVALID && !alIsSource(ALstack[chan].ALsource)) - return; - else - sid = ALstack[chan].ALsource; - - alGetSourcei(sid, AL_SOURCE_RELATIVE, &is2d); - - if (is2d) - return; - - alSource3f(sid, AL_POSITION, sfx->x, sfx->z, sfx->y); - if (ALo_GetError() != AL_NO_ERROR) - { - DBG_Printf("%s: AL_POSITION, %s", __FUNCTION__, GetALErrorString(ALo_Lasterror)); - } - - alSource3f(sid, AL_VELOCITY, sfx->momx, sfx->momz, sfx->momy); - if (ALo_GetError() != AL_NO_ERROR) - { - DBG_Printf("%s: AL_VELOCITY, %s", __FUNCTION__, GetALErrorString(ALo_Lasterror)); - } -} - -//------------------------------------------------------------- -// Load new sound data into source -//------------------------------------------------------------- -EXPORT INT32 HWRAPI (ReloadSource) (INT32 chan, u_int sfxhandle) -{ - ALuint sid; - - if (chan <= AL_INVALID || !alIsSource(ALstack[chan].ALsource) || !alIsBuffer(sfxhandle)) - return AL_INVALID; - else - sid = ALstack[chan].ALsource; - - ALo_GetError(); - - alSourceQueueBuffers(sid, 1, &sfxhandle); - if (ALo_GetError() == AL_INVALID_OPERATION) //Alam: not needed? - { - alSourceStop(sid); - alSourcei(sid, AL_BUFFER, sfxhandle); - ALo_GetError(); - } - if (ALo_Lasterror != AL_NO_ERROR) - { - DBG_Printf("%s: alSourcei, %s", __FUNCTION__, GetALErrorString(ALo_Lasterror)); - } - - return chan; -} - -/****************************************************************************** - * - * Destroy source and remove it from stack if it is a 2D source. - * Otherwise put source into cache - * - *****************************************************************************/ -EXPORT void HWRAPI (KillSource) (INT32 chan) -{ - if (chan > AL_INVALID && (ALsizei)chan <= allocated_sounds) - kill_sound(ALstack + chan); -} - -EXPORT u_int HWRAPI (AddSfx) (sfx_data_t *sfx) -{ - ALuint chan = (ALuint)AL_INVALID; - ALsizei freq = 11025; - ALubyte *data = NULL; - ALsizei size = 0; - - if (!sfx) - return 0; - else - { - data = ((ALubyte *)sfx->data)+8; - size = (ALsizei)(sfx->length-8); - } - - alGenBuffers(1, &chan); - if (ALo_GetError() != AL_NO_ERROR || !alIsBuffer(chan)) - { - DBG_Printf("S_OpenAl: Error %s when make an ALBuffer!\n",GetALErrorString(ALo_Lasterror)); - return (u_int)AL_INVALID; - } - - freq = getfreq(sfx->data, sfx->length); - - alBufferData(chan, AL_FORMAT_MONO8, data, size, freq); - if (ALo_GetError() != AL_NO_ERROR) - { - DBG_Printf("S_OpenAl: Error %s when setting up a alBuffer!\n",GetALErrorString(ALo_Lasterror)); - } - - return chan; -} - -EXPORT void HWRAPI (KillSfx) (u_int sfxhandle) -{ - ALuint ALsfx = sfxhandle; - if (!alIsBuffer(ALsfx)) - return; - alDeleteBuffers(1, &ALsfx); - if (ALo_GetError() == AL_INVALID_OPERATION) - { - // Buffer leak - } - else if (ALo_Lasterror != AL_NO_ERROR) - { - DBG_Printf("%s: alDeleteBuffers, %s", __FUNCTION__, GetALErrorString(ALo_Lasterror)); - } -} - -EXPORT void HWRAPI (GetHW3DSTitle) (char *buf, size_t size) -{ - strncpy(buf, "OpenAL", size); -} - - -#ifdef _WINDOWS -BOOL WINAPI DllMain(HINSTANCE hinstDLL, // handle to DLL module - DWORD fdwReason, // reason for calling function - LPVOID lpvReserved) // reserved -{ - // Perform actions based on the reason for calling. - UNREFERENCED_PARAMETER(lpvReserved); - switch ( fdwReason ) - { - case DLL_PROCESS_ATTACH: - // Initialize once for each new process. - // Return FALSE to fail DLL load. -#ifdef DEBUG_TO_FILE - logstream = fopen("s_openal.log", "wt"); - if (logstream == NULL) - return FALSE; -#endif - DisableThreadLibraryCalls(hinstDLL); - break; - - case DLL_THREAD_ATTACH: - // Do thread-specific initialization. - break; - - case DLL_THREAD_DETACH: - // Do thread-specific cleanup. - break; - - case DLL_PROCESS_DETACH: - // Perform any necessary cleanup. -#ifdef DEBUG_TO_FILE - if ( logstream) - { - fclose(logstream); - logstream = NULL; - } -#endif - break; - } - return TRUE; // Successful DLL_PROCESS_ATTACH. -} -#elif !defined (_WINDOWS) - -// ************************************************************************** -// FUNCTIONS -// ************************************************************************** - -EXPORT void _init() -{ -#ifdef DEBUG_TO_FILE - logstream = fopen("s_openal.log", "w+"); -#endif -} - -EXPORT void _fini() -{ -#ifdef DEBUG_TO_FILE - if (logstream) - fclose(logstream); - logstream = NULL; -#endif -} -#endif - diff --git a/src/hardware/s_openal/s_openal.dev b/src/hardware/s_openal/s_openal.dev deleted file mode 100644 index c8fb9e62b..000000000 --- a/src/hardware/s_openal/s_openal.dev +++ /dev/null @@ -1,59 +0,0 @@ -[Project] -FileName=s_openal.dev -Name=s_openal -Ver=1 -IsCpp=1 -Type=3 -Compiler=-D_M_IX86=500_@@_-Wall_@@_-fexceptions_@@_-D_WINDOWS_@@_ -CppCompiler= -Includes= -Linker=--def ../s_mingw.def_@@_-lopenal32_@@_ -Libs= -UnitCount=1 -Folders= -ObjFiles= -PrivateResource= -ResourceIncludes= -MakeIncludes= -Icon= -ExeOutput=..\..\..\bin -ObjectOutput=..\..\..\objs\Mingw\s_opengl -OverrideOutput=0 -OverrideOutputName=s_openal.dll -HostApplication= -CommandLine= -UseCustomMakefile=0 -CustomMakefile= -IncludeVersionInfo=0 -SupportXPThemes=0 -CompilerSet=0 -CompilerSettings=0000000010001001001001 - -[Unit1] -FileName=s_openal.c -Folder= -Compile=1 -CompileCpp=0 -Link=1 -Priority=1000 -OverrideBuildCmd=0 -BuildCmd= - -[VersionInfo] -Major=0 -Minor=1 -Release=1 -Build=1 -LanguageID=1033 -CharsetID=1252 -CompanyName= -FileVersion=0.1 -FileDescription=Developed using the Dev-C++ IDE -InternalName= -LegalCopyright= -LegalTrademarks= -OriginalFilename=s_openal.dll -ProductName=s_openal -ProductVersion=0.1 -AutoIncBuildNr=0 - diff --git a/src/hardware/s_openal/s_openal.dsp b/src/hardware/s_openal/s_openal.dsp deleted file mode 100644 index ac7fbaa84..000000000 --- a/src/hardware/s_openal/s_openal.dsp +++ /dev/null @@ -1,98 +0,0 @@ -# Microsoft Developer Studio Project File - Name="s_openal" - Package Owner=<4> -# Microsoft Developer Studio Generated Build File, Format Version 6.00 -# ** DO NOT EDIT ** - -# TARGTYPE "Win32 (x86) Dynamic-Link Library" 0x0102 - -CFG=s_openal - Win32 Debug -!MESSAGE This is not a valid makefile. To build this project using NMAKE, -!MESSAGE use the Export Makefile command and run -!MESSAGE -!MESSAGE NMAKE /f "s_openal.mak". -!MESSAGE -!MESSAGE You can specify a configuration when running NMAKE -!MESSAGE by defining the macro CFG on the command line. For example: -!MESSAGE -!MESSAGE NMAKE /f "s_openal.mak" CFG="s_openal - Win32 Debug" -!MESSAGE -!MESSAGE Possible choices for configuration are: -!MESSAGE -!MESSAGE "s_openal - Win32 Release" (based on "Win32 (x86) Dynamic-Link Library") -!MESSAGE "s_openal - Win32 Debug" (based on "Win32 (x86) Dynamic-Link Library") -!MESSAGE - -# Begin Project -# PROP AllowPerConfigDependencies 0 -# PROP Scc_ProjName "" -# PROP Scc_LocalPath "" -CPP=cl.exe -MTL=midl.exe -RSC=rc.exe - -!IF "$(CFG)" == "s_openal - Win32 Release" - -# PROP BASE Use_MFC 0 -# PROP BASE Use_Debug_Libraries 0 -# PROP BASE Output_Dir "Release" -# PROP BASE Intermediate_Dir "Release" -# PROP BASE Target_Dir "" -# PROP Use_MFC 0 -# PROP Use_Debug_Libraries 0 -# PROP Output_Dir "..\..\..\bin\VC\Release\s_openal" -# PROP Intermediate_Dir "..\..\..\objs\VC\Release\s_openal" -# PROP Ignore_Export_Lib 0 -# PROP Target_Dir "" -# ADD BASE CPP /nologo /MT /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "S_OPENAL_EXPORTS" /YX /FD /c -# ADD CPP /nologo /MT /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "__WIN32__" /D "__MSC__" /YX /FD /c -# ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /win32 -# ADD MTL /nologo /D "NDEBUG" /win32 -# SUBTRACT MTL /mktyplib203 -# ADD BASE RSC /l 0x409 /d "NDEBUG" -# ADD RSC /l 0x409 /d "NDEBUG" -BSC32=bscmake.exe -# ADD BASE BSC32 /nologo -# ADD BSC32 /nologo -LINK32=link.exe -# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /machine:I386 -# ADD LINK32 OpenAL32.lib /nologo /dll /pdb:"..\..\..\bin\VC\Release\s_openal.pdb" /machine:I386 /out:"C:\srb2demo2\s_openal.dll" -# SUBTRACT LINK32 /pdb:none - -!ELSEIF "$(CFG)" == "s_openal - Win32 Debug" - -# PROP BASE Use_MFC 0 -# PROP BASE Use_Debug_Libraries 1 -# PROP BASE Output_Dir "Debug" -# PROP BASE Intermediate_Dir "Debug" -# PROP BASE Target_Dir "" -# PROP Use_MFC 0 -# PROP Use_Debug_Libraries 1 -# PROP Output_Dir "..\..\..\bin\VC\Debug\s_openal" -# PROP Intermediate_Dir "..\..\..\objs\VC\Debug\s_openal" -# PROP Ignore_Export_Lib 1 -# PROP Target_Dir "" -# ADD BASE CPP /nologo /MTd /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "S_OPENAL_EXPORTS" /YX /FD /GZ /c -# ADD CPP /nologo /MTd /W4 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "__WIN32__" /D "__MSC__" /D "_MBCS" /D "_USRDLL" /D "S_OPENAL_EXPORTS" /YX /FD /GZ /c -# ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /win32 -# ADD MTL /nologo /D "_DEBUG" /mktyplib203 /win32 -# ADD BASE RSC /l 0x409 /d "_DEBUG" -# ADD RSC /l 0x409 /d "_DEBUG" -BSC32=bscmake.exe -# ADD BASE BSC32 /nologo -# ADD BSC32 /nologo -LINK32=link.exe -# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /debug /machine:I386 /pdbtype:sept -# ADD LINK32 OpenAL32.lib /nologo /dll /pdb:"..\..\..\bin\VC\Debug\s_openal.pdb" /debug /machine:I386 /out:"C:\srb2demo2\s_openaldebug.dll" /pdbtype:sept -# SUBTRACT LINK32 /pdb:none - -!ENDIF - -# Begin Target - -# Name "s_openal - Win32 Release" -# Name "s_openal - Win32 Debug" -# Begin Source File - -SOURCE=.\s_openal.c -# End Source File -# End Target -# End Project diff --git a/src/locale/en.po b/src/locale/en.po index ce4510802..b20dd837f 100644 --- a/src/locale/en.po +++ b/src/locale/en.po @@ -1910,15 +1910,6 @@ msgstr "" msgid " Not found: %s\n" msgstr "" -#: hardware/s_ds3d/s_ds3d.c:617 p_tick.c:168 sdl/i_sound.c:1347 -#: win32/win_snd.c:1073 win32/win_snd.c:1431 -msgid "Done\n" -msgstr "" - -#: hardware/s_ds3d/s_ds3d.c:617 win32/win_snd.c:1073 -msgid "Failed\n" -msgstr "" - #: hu_stuff.c:375 msgid "The chat is muted. You can't say anything at the moment.\n" msgstr "" @@ -3174,21 +3165,6 @@ msgstr "" msgid "I_ShutdownMusic: " msgstr "" -#: sdl/i_sound.c:1494 -msgid " disabled loading FMOD\n" -msgstr "" - -#: sdl/i_sound.c:1513 -msgid " failed to load FMOD\n" -msgstr "" - -#: sdl/i_sound.c:1522 win32/win_snd.c:1237 -#, c-format -msgid "" -"Wrong FMOD DLL version.\n" -"You should be using FMOD %s\n" -msgstr "" - #: sdl/i_sound.c:1611 msgid "I_InitMusic:" msgstr "" @@ -3803,12 +3779,6 @@ msgstr "" msgid "%d mixer devices available\n" msgstr "" -#: win32/win_snd.c:1227 -msgid "" -" failed to load FMOD\n" -" no DigiMusic support\n" -msgstr "" - #: win32/win_snd.c:1289 msgid "No MIDI devices available, music is disabled\n" msgstr "" diff --git a/src/locale/srb2.pot b/src/locale/srb2.pot index c61cbcc97..a25ea69ae 100644 --- a/src/locale/srb2.pot +++ b/src/locale/srb2.pot @@ -1994,15 +1994,6 @@ msgstr "" msgid " Not found: %s\n" msgstr "" -#: hardware/s_ds3d/s_ds3d.c:617 p_tick.c:168 sdl/i_sound.c:1347 -#: win32/win_snd.c:1071 win32/win_snd.c:1429 -msgid "Done\n" -msgstr "" - -#: hardware/s_ds3d/s_ds3d.c:617 win32/win_snd.c:1071 -msgid "Failed\n" -msgstr "" - #: hu_stuff.c:405 msgid "The chat is muted. You can't say anything at the moment.\n" msgstr "" @@ -3377,21 +3368,6 @@ msgstr "" msgid "I_ShutdownMusic: " msgstr "" -#: sdl/i_sound.c:1494 -msgid " disabled loading FMOD\n" -msgstr "" - -#: sdl/i_sound.c:1513 -msgid " failed to load FMOD\n" -msgstr "" - -#: sdl/i_sound.c:1522 win32/win_snd.c:1235 -#, c-format -msgid "" -"Wrong FMOD DLL version.\n" -"You should be using FMOD %s\n" -msgstr "" - #: sdl/i_sound.c:1611 msgid "I_InitMusic:" msgstr "" @@ -3999,12 +3975,6 @@ msgstr "" msgid "%d mixer devices available\n" msgstr "" -#: win32/win_snd.c:1225 -msgid "" -" failed to load FMOD\n" -" no DigiMusic support\n" -msgstr "" - #: win32/win_snd.c:1287 msgid "No MIDI devices available, music is disabled\n" msgstr "" diff --git a/src/p_enemy.c b/src/p_enemy.c index 96b0a16df..dfb237d74 100644 --- a/src/p_enemy.c +++ b/src/p_enemy.c @@ -25,10 +25,6 @@ #include "lua_hook.h" #include "k_kart.h" // SRB2kart -#ifdef HW3SOUND -#include "hardware/hw3sound.h" -#endif - boolean LUA_CallAction(enum actionnum actionnum, mobj_t *actor); INT32 var1; diff --git a/src/p_spec.c b/src/p_spec.c index 8ccfed3c3..d272764be 100644 --- a/src/p_spec.c +++ b/src/p_spec.c @@ -40,10 +40,6 @@ #include "k_kart.h" // SRB2kart #include "console.h" // CON_LogMessage -#ifdef HW3SOUND -#include "hardware/hw3sound.h" -#endif - // Not sure if this is necessary, but it was in w_wad.c, so I'm putting it here too -Shadow Hog #include diff --git a/src/p_user.c b/src/p_user.c index 3133ee49b..afce1d7a7 100644 --- a/src/p_user.c +++ b/src/p_user.c @@ -50,10 +50,6 @@ #include "console.h" // CON_LogMessage #include "m_menu.h" -#ifdef HW3SOUND -#include "hardware/hw3sound.h" -#endif - #ifdef HWRENDER #include "hardware/hw_main.h" #endif diff --git a/src/s_sound.c b/src/s_sound.c index c770957b6..d5ea1d4c7 100644 --- a/src/s_sound.c +++ b/src/s_sound.c @@ -33,13 +33,7 @@ #include "lua_hook.h" // MusicChange hook -#ifdef HW3SOUND -// 3D Sound Interface -#include "hardware/hw3sound.h" -#else static boolean S_AdjustSoundParams(const mobj_t *listener, const mobj_t *source, INT32 *vol, INT32 *sep, INT32 *pitch, sfxinfo_t *sfxinfo); -#endif - static void SetChannelsNum(void); static void Command_Tunes_f(void); static void Command_RestartAudio_f(void); @@ -330,14 +324,6 @@ static void SetChannelsNum(void) if (cv_numChannels.value == 999999999) //Alam_GBC: OH MY ROD!(ROD rimmiced with GOD!) CV_StealthSet(&cv_numChannels,cv_numChannels.defaultvalue); -#ifdef HW3SOUND - if (hws_mode != HWS_DEFAULT_MODE) - { - HW3S_SetSourcesNum(); - return; - } -#endif - if (cv_numChannels.value) channels = (channel_t *)Z_Calloc(cv_numChannels.value * sizeof (channel_t), PU_STATIC, NULL); numofchannels = (channels ? cv_numChannels.value : 0); @@ -387,14 +373,6 @@ void S_StopSounds(void) { INT32 cnum; -#ifdef HW3SOUND - if (hws_mode != HWS_DEFAULT_MODE) - { - HW3S_StopSounds(); - return; - } -#endif - // kill all playing sounds at start of level for (cnum = 0; cnum < numofchannels; cnum++) if (channels[cnum].sfxinfo) @@ -409,13 +387,7 @@ void S_StopSoundByID(void *origin, sfxenum_t sfx_id) // be stopped by new sounds. if (!origin) return; -#ifdef HW3SOUND - if (hws_mode != HWS_DEFAULT_MODE) - { - HW3S_StopSoundByID(origin, sfx_id); - return; - } -#endif + for (cnum = 0; cnum < numofchannels; cnum++) { if (channels[cnum].sfxinfo == &S_sfx[sfx_id] && channels[cnum].origin == origin) @@ -429,13 +401,6 @@ void S_StopSoundByNum(sfxenum_t sfxnum) { INT32 cnum; -#ifdef HW3SOUND - if (hws_mode != HWS_DEFAULT_MODE) - { - HW3S_StopSoundByNum(sfxnum); - return; - } -#endif for (cnum = 0; cnum < numofchannels; cnum++) { if (channels[cnum].sfxinfo == &S_sfx[sfxnum]) @@ -510,14 +475,6 @@ void S_StartSoundAtVolume(const void *origin_p, sfxenum_t sfx_id, INT32 volume) } } -#ifdef HW3SOUND - if (hws_mode != HWS_DEFAULT_MODE) - { - HW3S_StartSound(origin, sfx_id); - return; - }; -#endif - for (i = 0; i <= splitscreen; i++) { player_t *player = &players[displayplayers[i]]; @@ -690,12 +647,7 @@ void S_StartSound(const void *origin, sfxenum_t sfx_id) } // the volume is handled 8 bits -#ifdef HW3SOUND - if (hws_mode != HWS_DEFAULT_MODE) - HW3S_StartSound(origin, sfx_id); - else -#endif - S_StartSoundAtVolume(origin, sfx_id, 255); + S_StartSoundAtVolume(origin, sfx_id, 255); } void S_StopSound(void *origin) @@ -707,13 +659,6 @@ void S_StopSound(void *origin) if (!origin) return; -#ifdef HW3SOUND - if (hws_mode != HWS_DEFAULT_MODE) - { - HW3S_StopSound(origin); - return; - } -#endif for (cnum = 0; cnum < numofchannels; cnum++) { if (channels[cnum].sfxinfo && channels[cnum].origin == origin) @@ -760,7 +705,6 @@ void S_UpdateSounds(void) I_UpdateMumble(NULL, listener[0]); #endif - // Stop cutting FMOD out. WE'RE sick of it. I_UpdateSound(); return; } @@ -795,15 +739,6 @@ void S_UpdateSounds(void) I_UpdateMumble(players[consoleplayer].mo, listener[0]); #endif -#ifdef HW3SOUND - if (hws_mode != HWS_DEFAULT_MODE) - { - HW3S_UpdateSources(); - I_UpdateSound(); - return; - } -#endif - for (i = 0; i <= splitscreen; i++) { player_t *player = &players[displayplayers[i]]; @@ -918,12 +853,8 @@ void S_SetSfxVolume(INT32 volume) CV_SetValue(&cv_soundvolume, volume&0x1F); actualsfxvolume = cv_soundvolume.value; // check for change of var -#ifdef HW3SOUND - hws_mode == HWS_DEFAULT_MODE ? I_SetSfxVolume(volume&0x1F) : HW3S_SetSfxVolume(volume&0x1F); -#else // now hardware volume I_SetSfxVolume(volume&0x1F); -#endif } void S_ClearSfx(void) @@ -1119,11 +1050,6 @@ INT32 S_OriginPlaying(void *origin) if (!origin) return false; -#ifdef HW3SOUND - if (hws_mode != HWS_DEFAULT_MODE) - return HW3S_OriginPlaying(origin); -#endif - for (cnum = 0; cnum < numofchannels; cnum++) if (channels[cnum].origin == origin) return 1; @@ -1136,11 +1062,6 @@ INT32 S_IdPlaying(sfxenum_t id) { INT32 cnum; -#ifdef HW3SOUND - if (hws_mode != HWS_DEFAULT_MODE) - return HW3S_IdPlaying(id); -#endif - for (cnum = 0; cnum < numofchannels; cnum++) if ((size_t)(channels[cnum].sfxinfo - S_sfx) == (size_t)id) return 1; @@ -1155,11 +1076,6 @@ INT32 S_SoundPlaying(void *origin, sfxenum_t id) if (!origin) return 0; -#ifdef HW3SOUND - if (hws_mode != HWS_DEFAULT_MODE) - return HW3S_SoundPlaying(origin, id); -#endif - for (cnum = 0; cnum < numofchannels; cnum++) { if (channels[cnum].origin == origin diff --git a/src/s_sound.h b/src/s_sound.h index be4ed381d..124b74de3 100644 --- a/src/s_sound.h +++ b/src/s_sound.h @@ -296,10 +296,8 @@ void S_StartSoundName(void *mo, const char *soundname); void S_StopSoundByID(void *origin, sfxenum_t sfx_id); void S_StopSoundByNum(sfxenum_t sfxnum); -#ifndef HW3SOUND #define S_StartAttackSound S_StartSound #define S_StartScreamSound S_StartSound -#endif #ifdef MUSICSLOT_COMPATIBILITY // For compatibility with code/scripts relying on older versions diff --git a/src/sdl/Makefile.cfg b/src/sdl/Makefile.cfg index 72a94dca8..3cf04509b 100644 --- a/src/sdl/Makefile.cfg +++ b/src/sdl/Makefile.cfg @@ -90,22 +90,6 @@ ifdef MINGW endif endif -ifndef NOHW -ifdef OPENAL -ifdef MINGW - LIBS:=-lopenal32 $(LIBS) -else - LIBS:=-lopenal $(LIBS) -endif -else -ifdef MINGW -ifdef DS3D - LIBS:=-ldsound -luuid $(LIBS) -endif -endif -endif -endif - ifndef NOLIBBACKTRACE OPTS+=-DHAVE_LIBBACKTRACE ifdef MINGW64 diff --git a/src/sdl/Srb2SDL.dsp b/src/sdl/Srb2SDL.dsp index 6f799f4fb..35e5ec32b 100644 --- a/src/sdl/Srb2SDL.dsp +++ b/src/sdl/Srb2SDL.dsp @@ -45,7 +45,7 @@ MTL=midl.exe # ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /win32 # ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win32 # ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c -# ADD CPP /nologo /G5 /W3 /GX /Zi /Ot /Og /Oi /Op /Oy /Ob1 /I "..\..\libs\libpng-src" /I "..\..\libs\zlib" /D "NDEBUG" /D "SDLMAIN" /D "NO_STDIO_REDIRECT" /D "USE_WGL_SWAP" /D "DIRECTFULLSCREEN" /D "HAVE_SDL" /D "HWRENDER" /D "HW3SOUND" /D "HAVE_FILTER" /D "HAVE_MIXER" /D "USEASM" /D "HAVE_PNG" /FR /FD /GF /c +# ADD CPP /nologo /G5 /W3 /GX /Zi /Ot /Og /Oi /Op /Oy /Ob1 /I "..\..\libs\libpng-src" /I "..\..\libs\zlib" /D "NDEBUG" /D "SDLMAIN" /D "NO_STDIO_REDIRECT" /D "USE_WGL_SWAP" /D "DIRECTFULLSCREEN" /D "HAVE_SDL" /D "HWRENDER" /D "HAVE_FILTER" /D "HAVE_MIXER" /D "USEASM" /D "HAVE_PNG" /FR /FD /GF /c # ADD BASE RSC /l 0x409 /d "NDEBUG" # ADD RSC /l 0x409 /d "NDEBUG" # SUBTRACT RSC /x @@ -72,7 +72,7 @@ LINK32=link.exe # PROP Target_Dir "" MTL=midl.exe # ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /c -# ADD CPP /nologo /G6 /W4 /WX /Gm /GX /ZI /Od /Op /I "..\..\libs\libpng-src" /I "..\..\libs\zlib" /D "_DEBUG" /D "USE_WGL_SWAP" /D "DIRECTFULLSCREEN" /D "HAVE_SDL" /D "HWRENDER" /D "HW3SOUND" /D "HAVE_FILTER" /D "HAVE_MIXER" /D "USEASM" /D "HAVE_PNG" /FR /FD /GZ /c +# ADD CPP /nologo /G6 /W4 /WX /Gm /GX /ZI /Od /Op /I "..\..\libs\libpng-src" /I "..\..\libs\zlib" /D "_DEBUG" /D "USE_WGL_SWAP" /D "DIRECTFULLSCREEN" /D "HAVE_SDL" /D "HWRENDER" /D "HAVE_FILTER" /D "HAVE_MIXER" /D "USEASM" /D "HAVE_PNG" /FR /FD /GZ /c # SUBTRACT CPP /YX # ADD BASE RSC /l 0x409 /d "_DEBUG" # ADD RSC /l 0x409 /d "_DEBUG" @@ -536,18 +536,6 @@ SOURCE=..\y_inter.h # PROP Default_Filter "" # Begin Source File -SOURCE=..\hardware\hw3dsdrv.h -# End Source File -# Begin Source File - -SOURCE=..\hardware\hw3sound.c -# End Source File -# Begin Source File - -SOURCE=..\hardware\hw3sound.h -# End Source File -# Begin Source File - SOURCE=..\hardware\hw_bsp.c # End Source File # Begin Source File @@ -580,14 +568,6 @@ SOURCE=..\hardware\hw_glob.h # End Source File # Begin Source File -SOURCE=..\hardware\hw_light.c -# End Source File -# Begin Source File - -SOURCE=..\hardware\hw_light.h -# End Source File -# Begin Source File - SOURCE=..\hardware\hw_main.c # End Source File # Begin Source File @@ -604,11 +584,6 @@ SOURCE=..\hardware\hw_md2.h # End Source File # Begin Source File -SOURCE=..\hardware\hws_data.h -# End Source File -# End Group -# Begin Group "I_Interface" - # PROP Default_Filter "" # Begin Source File diff --git a/src/sdl/Srb2SDL.dsw b/src/sdl/Srb2SDL.dsw index 4f8f7bdce..888d2fcf3 100644 --- a/src/sdl/Srb2SDL.dsw +++ b/src/sdl/Srb2SDL.dsw @@ -36,18 +36,6 @@ Package=<4> ############################################################################### -Project: "s_openal"=..\hardware\s_openal\s_openal.dsp - Package Owner=<4> - -Package=<5> -{{{ -}}} - -Package=<4> -{{{ -}}} - -############################################################################### - Project: "zlib"=..\..\libs\zlib\projects\visualc6\zlib.dsp - Package Owner=<4> Package=<5> diff --git a/src/sdl/Srb2SDL.props b/src/sdl/Srb2SDL.props index 75839a5b2..f02b9b35e 100644 --- a/src/sdl/Srb2SDL.props +++ b/src/sdl/Srb2SDL.props @@ -6,10 +6,10 @@ - HAVE_ZLIB;HAVE_LIBGME;USE_WGL_SWAP;DIRECTFULLSCREEN;HAVE_SDL;HWRENDER;HW3SOUND;HAVE_FILTER;HAVE_MIXER;SDLMAIN;%(PreprocessorDefinitions) + HAVE_ZLIB;HAVE_LIBGME;USE_WGL_SWAP;DIRECTFULLSCREEN;HAVE_SDL;HWRENDER;HAVE_FILTER;HAVE_MIXER;SDLMAIN;%(PreprocessorDefinitions) - USE_WGL_SWAP;DIRECTFULLSCREEN;HAVE_SDL;HWRENDER;HW3SOUND;HAVE_FILTER;HAVE_MIXER;SDLMAIN;%(PreprocessorDefinitions) + USE_WGL_SWAP;DIRECTFULLSCREEN;HAVE_SDL;HWRENDER;HAVE_FILTER;HAVE_MIXER;SDLMAIN;%(PreprocessorDefinitions) - \ No newline at end of file + diff --git a/src/sdl/hwsym_sdl.c b/src/sdl/hwsym_sdl.c index d3da79355..4b1988c6f 100644 --- a/src/sdl/hwsym_sdl.c +++ b/src/sdl/hwsym_sdl.c @@ -43,10 +43,6 @@ #define _CREATE_DLL_ // necessary for Unix AND Windows -#ifdef HW3SOUND -#include "../hardware/hw3dsdrv.h" -#endif - #define GETFUNC(func) \ else if (0 == strcmp(#func, funcName)) \ funcPointer = &func \ @@ -66,35 +62,16 @@ void *hwSym(const char *funcName,void *handle) { void *funcPointer = NULL; if (0) ; -#ifdef STATIC3DS - GETFUNC(Startup); - GETFUNC(AddSfx); - GETFUNC(AddSource); - GETFUNC(StartSource); - GETFUNC(StopSource); - GETFUNC(GetHW3DSVersion); - GETFUNC(BeginFrameUpdate); - GETFUNC(EndFrameUpdate); - GETFUNC(IsPlaying); - GETFUNC(UpdateListener); - GETFUNC(UpdateSourceParms); - GETFUNC(SetGlobalSfxVolume); - GETFUNC(SetCone); - GETFUNC(Update3DSource); - GETFUNC(ReloadSource); - GETFUNC(KillSource); - GETFUNC(Shutdown); - GETFUNC(GetHW3DSTitle); -#endif #ifdef NOLOADSO else funcPointer = handle; #else else if (handle) - funcPointer = SDL_LoadFunction(handle,funcName); + funcPointer = SDL_LoadFunction(handle, funcName); #endif if (!funcPointer) I_OutputMsg("hwSym for %s: %s\n", funcName, SDL_GetError()); + return funcPointer; } @@ -103,8 +80,6 @@ void *hwSym(const char *funcName,void *handle) \param hwfile Open a handle to the SO \return Handle to SO - - */ void *hwOpen(const char *hwfile) @@ -125,8 +100,6 @@ void *hwOpen(const char *hwfile) \param handle Close the handle of the SO \return void - - */ void hwClose(void *handle) diff --git a/src/sdl/macosx/Srb2mac.pbproj/project.pbxproj b/src/sdl/macosx/Srb2mac.pbproj/project.pbxproj index a4888ec50..24f05a04c 100644 --- a/src/sdl/macosx/Srb2mac.pbproj/project.pbxproj +++ b/src/sdl/macosx/Srb2mac.pbproj/project.pbxproj @@ -255,12 +255,6 @@ path = ../../../bin/Resources/drill.dta; refType = 2; }; - 6755C8BF101802C300A80195 = { - isa = PBXFileReference; - name = fmod.dll; - path = ../../../bin/Resources/fmod.dll; - refType = 2; - }; 6755C8C0101802C300A80195 = { isa = PBXFileReference; name = knux.plr; @@ -425,14 +419,6 @@ name = r_opengl; refType = 4; }; - 677B5ECA10180D7100A80195 = { - children = ( - 84F202CA08A92AA0000C01D8, - ); - isa = PBXGroup; - name = s_openal; - refType = 4; - }; 67B2D0C91018779900A80195 = { fileRef = 84177748085A1097000C01D8; isa = PBXBuildFile; @@ -1071,20 +1057,6 @@ path = ../../hardware/hw_glob.h; refType = 2; }; - 8417773D085A106C000C01D8 = { - fileEncoding = 30; - isa = PBXFileReference; - name = hw_light.c; - path = ../../hardware/hw_light.c; - refType = 2; - }; - 8417773E085A106C000C01D8 = { - fileEncoding = 30; - isa = PBXFileReference; - name = hw_light.h; - path = ../../hardware/hw_light.h; - refType = 2; - }; 8417773F085A106C000C01D8 = { fileEncoding = 30; isa = PBXFileReference; @@ -1113,41 +1085,6 @@ path = ../../hardware/hw_md2.h; refType = 2; }; - 84177743085A106C000C01D8 = { - fileEncoding = 30; - isa = PBXFileReference; - name = hw_trick.c; - path = ../../hardware/hw_trick.c; - refType = 2; - }; - 84177744085A106C000C01D8 = { - fileEncoding = 30; - isa = PBXFileReference; - name = hw3dsdrv.h; - path = ../../hardware/hw3dsdrv.h; - refType = 2; - }; - 84177745085A106C000C01D8 = { - fileEncoding = 30; - isa = PBXFileReference; - name = hw3sound.c; - path = ../../hardware/hw3sound.c; - refType = 2; - }; - 84177746085A106C000C01D8 = { - fileEncoding = 30; - isa = PBXFileReference; - name = hw3sound.h; - path = ../../hardware/hw3sound.h; - refType = 2; - }; - 84177747085A106C000C01D8 = { - fileEncoding = 30; - isa = PBXFileReference; - name = hws_data.h; - path = ../../hardware/hws_data.h; - refType = 2; - }; 84177748085A1097000C01D8 = { fileEncoding = 30; isa = PBXFileReference; @@ -2136,7 +2073,7 @@ buildSettings = { DEBUGGING_SYMBOLS = NO; FRAMEWORK_SEARCH_PATHS = "\"$(LOCAL_LIBRARY_DIR)/Frameworks\""; - HEADER_SEARCH_PATHS = "\"$(LOCAL_LIBRARY_DIR)/Frameworks/SDL.framework/Headers\" \"$(LOCAL_LIBRARY_DIR)/Frameworks/SDL_mixer.framework/Headers\" \"$(LOCAL_LIBRARY_DIR)/Frameworks/OpenAL.framework/Headers\" \"$(LOCAL_LIBRARY_DIR)/Frameworks/libpng.framework/Headers\""; + HEADER_SEARCH_PATHS = "\"$(LOCAL_LIBRARY_DIR)/Frameworks/SDL.framework/Headers\" \"$(LOCAL_LIBRARY_DIR)/Frameworks/SDL_mixer.framework/Headers\" \"$(LOCAL_LIBRARY_DIR)/Frameworks/libpng.framework/Headers\""; INSTALL_PATH = "$(HOME)/Applications"; JAVA_COMPILER_DEBUGGING_SYMBOLS = NO; OPTIMIZATION_CFLAGS = "-O2"; @@ -2328,7 +2265,7 @@ ); buildSettings = { FRAMEWORK_SEARCH_PATHS = "\"$(LOCAL_LIBRARY_DIR)/Frameworks\""; - HEADER_SEARCH_PATHS = "\"$(LOCAL_LIBRARY_DIR)/Frameworks/SDL.framework/Headers\" \"$(LOCAL_LIBRARY_DIR)/Frameworks/SDL_mixer.framework/Headers\" \"$(LOCAL_LIBRARY_DIR)/Frameworks/OpenAL.framework/Headers\" \"$(LOCAL_LIBRARY_DIR)/Frameworks/libpng.framework/Headers\""; + HEADER_SEARCH_PATHS = "\"$(LOCAL_LIBRARY_DIR)/Frameworks/SDL.framework/Headers\" \"$(LOCAL_LIBRARY_DIR)/Frameworks/SDL_mixer.framework/Headers\" \"$(LOCAL_LIBRARY_DIR)/Frameworks/libpng.framework/Headers\""; INSTALL_PATH = "$(HOME)/Applications"; OPTIMIZATION_CFLAGS = "-O0"; OTHER_CFLAGS = "-DMAC_ALERT -DUNIXCOMMON -DSDLMAIN -DHAVE_MIXER -DHAVE_PNG -D_BIG_ENDIAN -DSTDC_HEADERS -DSDL -Wall -W -Wpointer-arith -Wbad-function-cast -Wcast-qual -Wcast-align -Wwrite-strings -Wsign-compare -Waggregate-return -Wmissing-prototypes -Wmissing-declarations -Wnested-externs -fno-strict-aliasing -fno-exceptions -D_DEBUG"; @@ -3521,19 +3458,6 @@ settings = { }; }; - 84F202C708A92A5D000C01D8 = { - isa = PBXFrameworkReference; - name = OpenAL.framework; - path = /Library/Frameworks/OpenAL.framework; - refType = 0; - }; - 84F202CA08A92AA0000C01D8 = { - fileEncoding = 30; - isa = PBXFileReference; - name = s_openal.c; - path = ../../hardware/s_openal/s_openal.c; - refType = 2; - }; }; rootObject = 84177702085A0C64000C01D8; } diff --git a/src/sdl/macosx/Srb2mac.xcodeproj/project.pbxproj b/src/sdl/macosx/Srb2mac.xcodeproj/project.pbxproj index 9ec22ebcc..c95642240 100644 --- a/src/sdl/macosx/Srb2mac.xcodeproj/project.pbxproj +++ b/src/sdl/macosx/Srb2mac.xcodeproj/project.pbxproj @@ -13,13 +13,10 @@ 1E32C4290B6E6D5D0029E058 /* libpng.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1E32C4140B6E6D5D0029E058 /* libpng.framework */; }; 1E32C42B0B6E6D6E0029E058 /* libpng.framework in Copy Frameworks into .app bundle */ = {isa = PBXBuildFile; fileRef = 1E32C4140B6E6D5D0029E058 /* libpng.framework */; }; 1E44AE750B67CC2B00BAD059 /* hw_bsp.c in Sources */ = {isa = PBXBuildFile; fileRef = 1E44AE610B67CC2B00BAD059 /* hw_bsp.c */; }; - 1E44AE770B67CC2B00BAD059 /* hw3sound.c in Sources */ = {isa = PBXBuildFile; fileRef = 1E44AE630B67CC2B00BAD059 /* hw3sound.c */; }; 1E44AE780B67CC2B00BAD059 /* hw_cache.c in Sources */ = {isa = PBXBuildFile; fileRef = 1E44AE640B67CC2B00BAD059 /* hw_cache.c */; }; - 1E44AE7C0B67CC2B00BAD059 /* hw_light.c in Sources */ = {isa = PBXBuildFile; fileRef = 1E44AE680B67CC2B00BAD059 /* hw_light.c */; }; 1E44AE800B67CC2B00BAD059 /* hw_draw.c in Sources */ = {isa = PBXBuildFile; fileRef = 1E44AE6C0B67CC2B00BAD059 /* hw_draw.c */; }; 1E44AE820B67CC2B00BAD059 /* hw_main.c in Sources */ = {isa = PBXBuildFile; fileRef = 1E44AE6E0B67CC2B00BAD059 /* hw_main.c */; }; 1E44AE840B67CC2B00BAD059 /* hw_md2.c in Sources */ = {isa = PBXBuildFile; fileRef = 1E44AE700B67CC2B00BAD059 /* hw_md2.c */; }; - 1E44AE860B67CC2B00BAD059 /* hw_trick.c in Sources */ = {isa = PBXBuildFile; fileRef = 1E44AE720B67CC2B00BAD059 /* hw_trick.c */; }; 1E44AEA40B67CC8500BAD059 /* d_clisrv.c in Sources */ = {isa = PBXBuildFile; fileRef = 1E44AE8D0B67CC8400BAD059 /* d_clisrv.c */; }; 1E44AEA70B67CC8500BAD059 /* d_main.c in Sources */ = {isa = PBXBuildFile; fileRef = 1E44AE900B67CC8400BAD059 /* d_main.c */; }; 1E44AEA80B67CC8500BAD059 /* d_net.c in Sources */ = {isa = PBXBuildFile; fileRef = 1E44AE910B67CC8500BAD059 /* d_net.c */; }; @@ -174,16 +171,11 @@ 1E32C4140B6E6D5D0029E058 /* libpng.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = libpng.framework; path = /Library/Frameworks/libpng.framework; sourceTree = ""; }; 1E44AE440B67CBE800BAD059 /* music.dta */ = {isa = PBXFileReference; lastKnownFileType = text; name = music.dta; path = ../../../bin/Resources/music.dta; sourceTree = SOURCE_ROOT; }; 1E44AE4B0B67CBE800BAD059 /* srb2.wad */ = {isa = PBXFileReference; lastKnownFileType = text; name = srb2.wad; path = ../../../bin/Resources/srb2.wad; sourceTree = SOURCE_ROOT; }; - 1E44AE600B67CC2B00BAD059 /* hw3dsdrv.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = hw3dsdrv.h; path = ../../hardware/hw3dsdrv.h; sourceTree = SOURCE_ROOT; }; 1E44AE610B67CC2B00BAD059 /* hw_bsp.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = hw_bsp.c; path = ../../hardware/hw_bsp.c; sourceTree = SOURCE_ROOT; }; 1E44AE620B67CC2B00BAD059 /* hw_defs.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = hw_defs.h; path = ../../hardware/hw_defs.h; sourceTree = SOURCE_ROOT; }; - 1E44AE630B67CC2B00BAD059 /* hw3sound.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = hw3sound.c; path = ../../hardware/hw3sound.c; sourceTree = SOURCE_ROOT; }; 1E44AE640B67CC2B00BAD059 /* hw_cache.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = hw_cache.c; path = ../../hardware/hw_cache.c; sourceTree = SOURCE_ROOT; }; 1E44AE650B67CC2B00BAD059 /* hw_dll.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = hw_dll.h; path = ../../hardware/hw_dll.h; sourceTree = SOURCE_ROOT; }; 1E44AE660B67CC2B00BAD059 /* hw_gl.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = hw_gl.h; path = ../../hardware/hw_gl.h; sourceTree = SOURCE_ROOT; }; - 1E44AE680B67CC2B00BAD059 /* hw_light.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = hw_light.c; path = ../../hardware/hw_light.c; sourceTree = SOURCE_ROOT; }; - 1E44AE690B67CC2B00BAD059 /* hw_light.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = hw_light.h; path = ../../hardware/hw_light.h; sourceTree = SOURCE_ROOT; }; - 1E44AE6A0B67CC2B00BAD059 /* hw3sound.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = hw3sound.h; path = ../../hardware/hw3sound.h; sourceTree = SOURCE_ROOT; }; 1E44AE6B0B67CC2B00BAD059 /* hw_data.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = hw_data.h; path = ../../hardware/hw_data.h; sourceTree = SOURCE_ROOT; }; 1E44AE6C0B67CC2B00BAD059 /* hw_draw.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = hw_draw.c; path = ../../hardware/hw_draw.c; sourceTree = SOURCE_ROOT; }; 1E44AE6D0B67CC2B00BAD059 /* hw_glob.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = hw_glob.h; path = ../../hardware/hw_glob.h; sourceTree = SOURCE_ROOT; }; @@ -191,9 +183,6 @@ 1E44AE6F0B67CC2B00BAD059 /* hw_main.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = hw_main.h; path = ../../hardware/hw_main.h; sourceTree = SOURCE_ROOT; }; 1E44AE700B67CC2B00BAD059 /* hw_md2.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = hw_md2.c; path = ../../hardware/hw_md2.c; sourceTree = SOURCE_ROOT; }; 1E44AE710B67CC2B00BAD059 /* hw_md2.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = hw_md2.h; path = ../../hardware/hw_md2.h; sourceTree = SOURCE_ROOT; }; - 1E44AE720B67CC2B00BAD059 /* hw_trick.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = hw_trick.c; path = ../../hardware/hw_trick.c; sourceTree = SOURCE_ROOT; }; - 1E44AE730B67CC2B00BAD059 /* hws_data.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = hws_data.h; path = ../../hardware/hws_data.h; sourceTree = SOURCE_ROOT; }; - 1E44AE8A0B67CC6000BAD059 /* asm_defs.inc */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.pascal; name = asm_defs.inc; path = ../../asm_defs.inc; sourceTree = SOURCE_ROOT; }; 1E44AE8D0B67CC8400BAD059 /* d_clisrv.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = d_clisrv.c; path = ../../d_clisrv.c; sourceTree = SOURCE_ROOT; }; 1E44AE8E0B67CC8400BAD059 /* d_clisrv.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = d_clisrv.h; path = ../../d_clisrv.h; sourceTree = SOURCE_ROOT; }; 1E44AE8F0B67CC8400BAD059 /* d_event.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = d_event.h; path = ../../d_event.h; sourceTree = SOURCE_ROOT; }; @@ -527,16 +516,11 @@ 1E44AE5C0B67CC0F00BAD059 /* Hw_Hardware */ = { isa = PBXGroup; children = ( - 1E44AE600B67CC2B00BAD059 /* hw3dsdrv.h */, 1E44AE610B67CC2B00BAD059 /* hw_bsp.c */, 1E44AE620B67CC2B00BAD059 /* hw_defs.h */, - 1E44AE630B67CC2B00BAD059 /* hw3sound.c */, 1E44AE640B67CC2B00BAD059 /* hw_cache.c */, 1E44AE650B67CC2B00BAD059 /* hw_dll.h */, 1E44AE660B67CC2B00BAD059 /* hw_gl.h */, - 1E44AE680B67CC2B00BAD059 /* hw_light.c */, - 1E44AE690B67CC2B00BAD059 /* hw_light.h */, - 1E44AE6A0B67CC2B00BAD059 /* hw3sound.h */, 1E44AE6B0B67CC2B00BAD059 /* hw_data.h */, 1E44AE6C0B67CC2B00BAD059 /* hw_draw.c */, 1E44AE6D0B67CC2B00BAD059 /* hw_glob.h */, @@ -544,8 +528,6 @@ 1E44AE6F0B67CC2B00BAD059 /* hw_main.h */, 1E44AE700B67CC2B00BAD059 /* hw_md2.c */, 1E44AE710B67CC2B00BAD059 /* hw_md2.h */, - 1E44AE720B67CC2B00BAD059 /* hw_trick.c */, - 1E44AE730B67CC2B00BAD059 /* hws_data.h */, ); name = Hw_Hardware; sourceTree = ""; @@ -1072,13 +1054,10 @@ buildActionMask = 2147483647; files = ( 1E44AE750B67CC2B00BAD059 /* hw_bsp.c in Sources */, - 1E44AE770B67CC2B00BAD059 /* hw3sound.c in Sources */, 1E44AE780B67CC2B00BAD059 /* hw_cache.c in Sources */, - 1E44AE7C0B67CC2B00BAD059 /* hw_light.c in Sources */, 1E44AE800B67CC2B00BAD059 /* hw_draw.c in Sources */, 1E44AE820B67CC2B00BAD059 /* hw_main.c in Sources */, 1E44AE840B67CC2B00BAD059 /* hw_md2.c in Sources */, - 1E44AE860B67CC2B00BAD059 /* hw_trick.c in Sources */, 1E44AEA40B67CC8500BAD059 /* d_clisrv.c in Sources */, 1E44AEA70B67CC8500BAD059 /* d_main.c in Sources */, 1E44AEA80B67CC8500BAD059 /* d_net.c in Sources */, @@ -1108,7 +1087,6 @@ 1E44AF220B67CE4100BAD059 /* mserv.c in Sources */, 1E44AF3C0B67CE5F00BAD059 /* p_enemy.c in Sources */, 1E44AF3D0B67CE5F00BAD059 /* p_inter.c in Sources */, - 1E44AF3E0B67CE5F00BAD059 /* p_fab.c in Sources */, 1E44AF3F0B67CE5F00BAD059 /* p_lights.c in Sources */, 1E44AF400B67CE5F00BAD059 /* p_map.c in Sources */, 1E44AF410B67CE5F00BAD059 /* p_maputl.c in Sources */, diff --git a/src/sdl/sdl_sound.c b/src/sdl/sdl_sound.c index 33714f32a..58aa5ee91 100644 --- a/src/sdl/sdl_sound.c +++ b/src/sdl/sdl_sound.c @@ -69,12 +69,6 @@ #include "../d_main.h" -#ifdef HW3SOUND -#include "../hardware/hw3dsdrv.h" -#include "../hardware/hw3sound.h" -#include "hwsym_sdl.h" -#endif - #ifdef HAVE_LIBGME #include "gme/gme.h" #endif @@ -195,11 +189,7 @@ static void Snd_LockAudio(void) //Alam: Lock audio data and uninstall audio call { if (Snd_Mutex) SDL_LockMutex(Snd_Mutex); else if (sound_disabled) return; - else if (midi_disabled && digital_disabled -#ifdef HW3SOUND - && hws_mode == HWS_DEFAULT_MODE -#endif - ) SDL_LockAudio(); + else if (midi_disabled && digital_disabled) SDL_LockAudio(); #ifdef HAVE_MIXER else if (musicStarted) Mix_SetPostMix(NULL, NULL); #endif @@ -209,11 +199,7 @@ static void Snd_UnlockAudio(void) //Alam: Unlock audio data and reinstall audio { if (Snd_Mutex) SDL_UnlockMutex(Snd_Mutex); else if (sound_disabled) return; - else if (midi_disabled && digital_disabled -#ifdef HW3SOUND - && hws_mode == HWS_DEFAULT_MODE -#endif - ) SDL_UnlockAudio(); + else if (midi_disabled && digital_disabled) SDL_UnlockAudio(); #ifdef HAVE_MIXER else if (musicStarted) Mix_SetPostMix(audio.callback, audio.userdata); #endif @@ -536,11 +522,6 @@ void *I_GetSfx(sfxinfo_t *sfx) // else if (sfx->lumpnum != S_GetSfxLumpNum(sfx)) // I_FreeSfx(sfx); -#ifdef HW3SOUND - if (hws_mode != HWS_DEFAULT_MODE) - return HW3S_GetSfx(sfx); -#endif - if (sfx->data) return sfx->data; //Alam: I have it done! @@ -555,39 +536,31 @@ void I_FreeSfx(sfxinfo_t * sfx) // if (sfx->lumpnum<0) // return; -#ifdef HW3SOUND - if (hws_mode != HWS_DEFAULT_MODE) - { - HW3S_FreeSfx(sfx); - } - else -#endif - { - size_t i; + size_t i; - for (i = 1; i < NUMSFX; i++) + for (i = 1; i < NUMSFX; i++) + { + // Alias? Example is the chaingun sound linked to pistol. + if (S_sfx[i].data == sfx->data) { - // Alias? Example is the chaingun sound linked to pistol. - if (S_sfx[i].data == sfx->data) - { - if (S_sfx+i != sfx) S_sfx[i].data = NULL; - S_sfx[i].lumpnum = LUMPERROR; - S_sfx[i].length = 0; - } + if (S_sfx+i != sfx) S_sfx[i].data = NULL; + S_sfx[i].lumpnum = LUMPERROR; + S_sfx[i].length = 0; } - //Snd_LockAudio(); //Alam: too much? - // Loop all channels, check. - for (i = 0; i < NUM_CHANNELS; i++) - { - // Active, and using the same SFX? - if (channels[i].end && channels[i].id == sfx->data) - { - channels[i].end = NULL; // Reset. - } - } - //Snd_UnlockAudio(); //Alam: too much? - Z_Free(sfx->data); } + //Snd_LockAudio(); //Alam: too much? + // Loop all channels, check. + for (i = 0; i < NUM_CHANNELS; i++) + { + // Active, and using the same SFX? + if (channels[i].end && channels[i].id == sfx->data) + { + channels[i].end = NULL; // Reset. + } + } + //Snd_UnlockAudio(); //Alam: too much? + Z_Free(sfx->data); + sfx->data = NULL; sfx->lumpnum = LUMPERROR; } @@ -1081,62 +1054,6 @@ void I_UpdateSoundParams(INT32 handle, UINT8 vol, UINT8 sep, UINT8 pitch) } -#ifdef HW3SOUND - -static void *soundso = NULL; - -static INT32 Init3DSDriver(const char *soName) -{ - if (soName) soundso = hwOpen(soName); -#if defined (_WIN32) && defined (_X86_) && !defined (STATIC3DS) - HW3DS.pfnStartup = hwSym("Startup@8",soundso); - HW3DS.pfnShutdown = hwSym("Shutdown@0",soundso); - HW3DS.pfnAddSfx = hwSym("AddSfx@4",soundso); - HW3DS.pfnAddSource = hwSym("AddSource@8",soundso); - HW3DS.pfnStartSource = hwSym("StartSource@4",soundso); - HW3DS.pfnStopSource = hwSym("StopSource@4",soundso); - HW3DS.pfnGetHW3DSVersion = hwSym("GetHW3DSVersion@0",soundso); - HW3DS.pfnBeginFrameUpdate = hwSym("BeginFrameUpdate@0",soundso); - HW3DS.pfnEndFrameUpdate = hwSym("EndFrameUpdate@0",soundso); - HW3DS.pfnIsPlaying = hwSym("IsPlaying@4",soundso); - HW3DS.pfnUpdateListener = hwSym("UpdateListener@8",soundso); - HW3DS.pfnUpdateSourceParms = hwSym("UpdateSourceParms@12",soundso); - HW3DS.pfnSetCone = hwSym("SetCone@8",soundso); - HW3DS.pfnSetGlobalSfxVolume = hwSym("SetGlobalSfxVolume@4",soundso); - HW3DS.pfnUpdate3DSource = hwSym("Update3DSource@8",soundso); - HW3DS.pfnReloadSource = hwSym("ReloadSource@8",soundso); - HW3DS.pfnKillSource = hwSym("KillSource@4",soundso); - HW3DS.pfnKillSfx = hwSym("KillSfx@4",soundso); - HW3DS.pfnGetHW3DSTitle = hwSym("GetHW3DSTitle@8",soundso); -#else - HW3DS.pfnStartup = hwSym("Startup",soundso); - HW3DS.pfnShutdown = hwSym("Shutdown",soundso); - HW3DS.pfnAddSfx = hwSym("AddSfx",soundso); - HW3DS.pfnAddSource = hwSym("AddSource",soundso); - HW3DS.pfnStartSource = hwSym("StartSource",soundso); - HW3DS.pfnStopSource = hwSym("StopSource",soundso); - HW3DS.pfnGetHW3DSVersion = hwSym("GetHW3DSVersion",soundso); - HW3DS.pfnBeginFrameUpdate = hwSym("BeginFrameUpdate",soundso); - HW3DS.pfnEndFrameUpdate = hwSym("EndFrameUpdate",soundso); - HW3DS.pfnIsPlaying = hwSym("IsPlaying",soundso); - HW3DS.pfnUpdateListener = hwSym("UpdateListener",soundso); - HW3DS.pfnUpdateSourceParms = hwSym("UpdateSourceParms",soundso); - HW3DS.pfnSetCone = hwSym("SetCone",soundso); - HW3DS.pfnSetGlobalSfxVolume = hwSym("SetGlobalSfxVolume",soundso); - HW3DS.pfnUpdate3DSource = hwSym("Update3DSource",soundso); - HW3DS.pfnReloadSource = hwSym("ReloadSource",soundso); - HW3DS.pfnKillSource = hwSym("KillSource",soundso); - HW3DS.pfnKillSfx = hwSym("KillSfx",soundso); - HW3DS.pfnGetHW3DSTitle = hwSym("GetHW3DSTitle",soundso); -#endif - -// if (HW3DS.pfnUpdateListener2 && HW3DS.pfnUpdateListener2 != soundso) - return true; -// else -// return false; -} -#endif - void I_ShutdownSound(void) { if (sound_disabled || !sound_started) @@ -1144,15 +1061,6 @@ void I_ShutdownSound(void) CONS_Printf("I_ShutdownSound: "); -#ifdef HW3SOUND - if (hws_mode != HWS_DEFAULT_MODE) - { - HW3S_Shutdown(); - hwClose(soundso); - return; - } -#endif - if (midi_disabled && digital_disabled) SDL_CloseAudio(); CONS_Printf("%s", M_GetText("shut down\n")); @@ -1169,9 +1077,6 @@ void I_UpdateSound(void) void I_StartupSound(void) { -#ifdef HW3SOUND - const char *sdrv_name = NULL; -#endif #ifndef HAVE_MIXER #ifndef NO_MIDI midi_disabled = @@ -1228,75 +1133,6 @@ void I_StartupSound(void) if (sound_disabled) return; -#ifdef HW3SOUND -#ifdef STATIC3DS - if (M_CheckParm("-3dsound") || M_CheckParm("-ds3d")) - { - hws_mode = HWS_OPENAL; - } -#elif defined (_WIN32) - if (M_CheckParm("-ds3d")) - { - hws_mode = HWS_DS3D; - sdrv_name = "s_ds3d.dll"; - } - else if (M_CheckParm("-fmod3d")) - { - hws_mode = HWS_FMOD3D; - sdrv_name = "s_fmod.dll"; - } - else if (M_CheckParm("-openal")) - { - hws_mode = HWS_OPENAL; - sdrv_name = "s_openal.dll"; - } -#else - if (M_CheckParm("-fmod3d")) - { - hws_mode = HWS_FMOD3D; - sdrv_name = "./s_fmod.so"; - } - else if (M_CheckParm("-openal")) - { - hws_mode = HWS_OPENAL; - sdrv_name = "./s_openal.so"; - } -#endif - else if (M_CheckParm("-sounddriver") && M_IsNextParm()) - { - hws_mode = HWS_OTHER; - sdrv_name = M_GetNextParm(); - } - if (hws_mode != HWS_DEFAULT_MODE) - { - if (Init3DSDriver(sdrv_name)) - { - snddev_t snddev; - - //sound_disabled = true; - //I_AddExitFunc(I_ShutdownSound); - snddev.bps = 16; - snddev.sample_rate = audio.freq; - snddev.numsfxs = NUMSFX; -#if defined (_WIN32) - snddev.cooplevel = 0x00000002; - snddev.hWnd = vid.WndParent; -#endif - if (HW3S_Init(I_Error, &snddev)) - { - audio.userdata = NULL; - CONS_Printf("%s", M_GetText(" Using 3D sound driver\n")); - return; - } - CONS_Printf("%s", M_GetText(" Failed loading 3D sound driver\n")); - // Falls back to default sound system - HW3S_Shutdown(); - hwClose(soundso); - } - CONS_Printf("%s", M_GetText(" Failed loading 3D sound driver\n")); - hws_mode = HWS_DEFAULT_MODE; - } -#endif if (!musicStarted && SDL_OpenAudio(&audio, &audio) < 0) { CONS_Printf("%s", M_GetText(" couldn't open audio with desired format\n")); -- 2.54.0 From f7ba2607170a54de468b48c557e5173ee6a15052 Mon Sep 17 00:00:00 2001 From: Alug Date: Sun, 22 Dec 2024 19:59:42 +0100 Subject: [PATCH 12/53] just skip missing/broken fields in musiccredit handling like vanilla kek still will throw warnings but atleast will show stuff if theres anything left in the musicdef --- src/s_sound.c | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/src/s_sound.c b/src/s_sound.c index d5ea1d4c7..06f6be1eb 100644 --- a/src/s_sound.c +++ b/src/s_sound.c @@ -1229,12 +1229,13 @@ ReadMusicDefFields (UINT16 wadnum, int line, char *stoken, musicdef_t **defp) if (!stricmp(stoken, "lump")) { value = strtok(NULL, " "); + if (!value) { CONS_Alert(CONS_WARNING, "MUSICDEF: Field '%s' is missing name. (file %s, line %d)\n", stoken, wadfiles[wadnum]->filename, line); - return false; + goto skip_lump; } else { @@ -1255,6 +1256,10 @@ ReadMusicDefFields (UINT16 wadnum, int line, char *stoken, musicdef_t **defp) (*defp) = def; } + +skip_lump: + stoken = strtok(NULL, " "); + line++; } else { @@ -1271,7 +1276,7 @@ ReadMusicDefFields (UINT16 wadnum, int line, char *stoken, musicdef_t **defp) CONS_Alert(CONS_WARNING, "MUSICDEF: Field '%s' is missing value. (file %s, line %d)\n", stoken, wadfiles[wadnum]->filename, line); - return false; + goto skip_field; } else { @@ -1323,6 +1328,10 @@ ReadMusicDefFields (UINT16 wadnum, int line, char *stoken, musicdef_t **defp) else CONS_Alert(CONS_WARNING, "MUSICDEF: Invalid field '%s'. (file %s, line %d)\n", stoken, wadfiles[wadnum]->filename, line); #undef ADDDEF + +skip_field: + stoken = strtok(NULL, "= "); + line++; } } -- 2.54.0 From fef98e478dc11da4977f849d5956fa4d2f93d747 Mon Sep 17 00:00:00 2001 From: Alug Date: Mon, 30 Dec 2024 17:55:50 +0100 Subject: [PATCH 13/53] add extra driftgauge option before i forger about it again --- src/d_netcmd.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/d_netcmd.c b/src/d_netcmd.c index 4f8a2b684..a6943fe6a 100644 --- a/src/d_netcmd.c +++ b/src/d_netcmd.c @@ -548,7 +548,7 @@ consvar_t cv_shownametagspectator = {"kartshownametagspectator", "No", CV_SAVE, static CV_PossibleValue_t driftgaugeoffset_cons_t[] = { {-FRACUNIT*128, "MIN"}, {FRACUNIT*128, "MAX"}, {0, NULL}}; static CV_PossibleValue_t driftgaugestyle_cons_t[] = { - {1, "Default"}, {2, "Small"}, {3, "Big Numbers"}, {4, "Numbers Only"}, {0, NULL}}; + {1, "Default"}, {2, "Small"}, {3, "Big Numbers"}, {4, "Numbers Only"}, {5, "Extra"}, {0, NULL}}; consvar_t cv_driftgauge = {"kartdriftgauge", "Off", CV_SAVE, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL}; consvar_t cv_driftgaugeofs = {"kartdriftgaugeoffset", "-20", CV_FLOAT|CV_SAVE, driftgaugeoffset_cons_t, NULL, 0, NULL, NULL, 0, 0, NULL}; -- 2.54.0 From ffc7832ec76df571666da187cfeaaa42360e900a Mon Sep 17 00:00:00 2001 From: Alug Date: Tue, 31 Dec 2024 00:57:32 +0100 Subject: [PATCH 14/53] attempt to optimize column drawers a little --- src/r_draw8.c | 665 +++++++++++++++++++++++++++++-------------------- src/r_things.c | 3 + 2 files changed, 400 insertions(+), 268 deletions(-) diff --git a/src/r_draw8.c b/src/r_draw8.c index 3c7562beb..30fe49372 100644 --- a/src/r_draw8.c +++ b/src/r_draw8.c @@ -34,17 +34,19 @@ void R_DrawColumn_8(void) count = dc_yh - dc_yl; if (count < 0) // Zero length, column does not exceed a pixel. + { return; + } + -#ifdef RANGECHECK if ((unsigned)dc_x >= (unsigned)vid.width || dc_yl < 0 || dc_yh >= vid.height) + { return; -#endif + } // Framebuffer destination address. // Use ylookup LUT to avoid multiply with ScreenWidth. // Use columnofs LUT for subwindows? - dest = &topleft[dc_yl*vid.width + dc_x]; count++; @@ -55,10 +57,15 @@ void R_DrawColumn_8(void) // Inner loop that does the actual texture mapping, e.g. a DDA-like scaling. // This is as fast as it gets. + register const UINT8 *source = dc_source; + register const lighttable_t *colormap = dc_colormap; + + register INT32 heightmask = dc_texheight-1; + + if (dc_texheight & heightmask) // not a power of 2 -- killough { - register const UINT8 *source = dc_source; - register const lighttable_t *colormap = dc_colormap; - register INT32 heightmask = dc_texheight-1; + heightmask++; + heightmask <<= FRACBITS; if (dc_sourcelength <= 0) { @@ -73,55 +80,77 @@ void R_DrawColumn_8(void) npow2max = dc_sourcelength; } - if (dc_texheight & heightmask) // not a power of 2 -- killough + if (frac < 0) { - heightmask++; - heightmask <<= FRACBITS; - - if (frac < 0) - while ((frac += heightmask) < 0); - else - while (frac >= heightmask) - frac -= heightmask; - - do + while ((frac += heightmask) < 0) { - // Re-map color indices from wall texture column - // using a lighting/special effects LUT. - // heightmask is the Tutti-Frutti fix - - // -1 is the lower clamp bound because column posts have a "safe" byte before the real data - // and a few bytes after as well - *dest = colormap[source[CLAMP(frac>>FRACBITS, npow2min, npow2max)]]; - dest += vid.width; - - // Avoid overflow. - if (fracstep > 0x7FFFFFFF - frac) - frac += fracstep - heightmask; - else - frac += fracstep; - - while (frac >= heightmask) - frac -= heightmask; - } while (--count); + ; + } } else { - while ((count -= 2) >= 0) // texture height is a power of 2 + while (frac >= heightmask) { - *dest = colormap[source[(frac>>FRACBITS) & heightmask]]; - dest += vid.width; - frac += fracstep; + frac -= heightmask; + } + } - *dest = colormap[source[(frac>>FRACBITS) & heightmask]]; - dest += vid.width; + do + { + // Re-map color indices from wall texture column + // using a lighting/special effects LUT. + // heightmask is the Tutti-Frutti fix + + // -1 is the lower clamp bound because column posts have a "safe" byte before the real data + // and a few bytes after as well + + // jartha: faster on my AMD FX-6300 CPU. + // Faster than ternaries, faster than std::min/std::max. Don't ask me why. + // I tested by viewing a non-PO2 texture from a consistent distance so it covered the entire screen. + // The framerate difference was about 50 frames at 640x400. + INT32 n = frac >> FRACBITS; + if (n < npow2min) + n = npow2min; + if (n > npow2max) + n = npow2max; + *dest = colormap[source[n]]; + + dest += vid.width; + + // Avoid overflow. + if (fracstep > 0x7FFFFFFF - frac) + { + frac += fracstep - heightmask; + } + else + { frac += fracstep; } - if (count & 1) + while (frac >= heightmask) { - *dest = colormap[source[(frac>>FRACBITS) & heightmask]]; + frac -= heightmask; } + } while (--count); + } + else + { + while ((count -= 2) >= 0) // texture height is a power of 2 + { + *dest = colormap[source[(frac>>FRACBITS) & heightmask]]; + + dest += vid.width; + frac += fracstep; + + *dest = colormap[source[(frac>>FRACBITS) & heightmask]]; + + dest += vid.width; + frac += fracstep; + } + + if (count & 1) + { + *dest = colormap[source[(frac>>FRACBITS) & heightmask]]; } } } @@ -139,34 +168,37 @@ void R_Draw2sMultiPatchColumn_8(void) count = dc_yh - dc_yl; if (count < 0) // Zero length, column does not exceed a pixel. + { return; + } -#ifdef RANGECHECK if ((unsigned)dc_x >= (unsigned)vid.width || dc_yl < 0 || dc_yh >= vid.height) + { return; -#endif + } // Framebuffer destination address. // Use ylookup LUT to avoid multiply with ScreenWidth. // Use columnofs LUT for subwindows? - - //dest = ylookup[dc_yl] + columnofs[dc_x]; dest = &topleft[dc_yl*vid.width + dc_x]; count++; // Determine scaling, which is the only mapping to be done. fracstep = dc_iscale; - //frac = dc_texturemid + (dc_yl - centery)*fracstep; frac = (dc_texturemid + FixedMul((dc_yl << FRACBITS) - centeryfrac, fracstep))*(!dc_hires); // Inner loop that does the actual texture mapping, e.g. a DDA-like scaling. // This is as fast as it gets. + register const UINT8 *source = dc_source; + register const lighttable_t *colormap = dc_colormap; + register INT32 heightmask = dc_texheight-1; + register UINT8 val; + + if (dc_texheight & heightmask) // not a power of 2 -- killough { - register const UINT8 *source = dc_source; - register const lighttable_t *colormap = dc_colormap; - register INT32 heightmask = dc_texheight-1; - register UINT8 val; + heightmask++; + heightmask <<= FRACBITS; if (dc_sourcelength <= 0) { @@ -181,74 +213,94 @@ void R_Draw2sMultiPatchColumn_8(void) npow2max = dc_sourcelength; } - if (dc_texheight & heightmask) // not a power of 2 -- killough + if (frac < 0) { - heightmask++; - heightmask <<= FRACBITS; - - if (frac < 0) - while ((frac += heightmask) < 0); - else - while (frac >= heightmask) - frac -= heightmask; - - do + while ((frac += heightmask) < 0) { - // Re-map color indices from wall texture column - // using a lighting/special effects LUT. - // heightmask is the Tutti-Frutti fix - - // -1 is the lower clamp bound because column posts have a "safe" byte before the real data - // and a few bytes after as well - val = source[CLAMP(frac>>FRACBITS, npow2min, npow2max)]; - - if (val != TRANSPARENTPIXEL) - { - *dest = colormap[val]; - } - - dest += vid.width; - - // Avoid overflow. - if (fracstep > 0x7FFFFFFF - frac) - frac += fracstep - heightmask; - else - frac += fracstep; - - while (frac >= heightmask) - frac -= heightmask; - } while (--count); + ; + } } else { - while ((count -= 2) >= 0) // texture height is a power of 2 + while (frac >= heightmask) { - val = source[(frac>>FRACBITS) & heightmask]; - if (val != TRANSPARENTPIXEL) - { - *dest = colormap[val]; - } + frac -= heightmask; + } + } - dest += vid.width; - frac += fracstep; + do + { + // Re-map color indices from wall texture column + // using a lighting/special effects LUT. + // heightmask is the Tutti-Frutti fix - val = source[(frac>>FRACBITS) & heightmask]; - if (val != TRANSPARENTPIXEL) - { - *dest = colormap[val]; - } + // -1 is the lower clamp bound because column posts have a "safe" byte before the real data + // and a few bytes after as well - dest += vid.width; + // jartha: faster on my AMD FX-6300 CPU. + // Faster than ternaries, faster than std::min/std::max. Don't ask me why. + // I tested by viewing a non-PO2 texture from a consistent distance so it covered the entire screen. + // The framerate difference was about 50 frames at 640x400. + INT32 n = frac >> FRACBITS; + if (n < npow2min) + n = npow2min; + if (n > npow2max) + n = npow2max; + + val = source[n]; + + if (val != TRANSPARENTPIXEL) + { + *dest = colormap[val]; + } + + dest += vid.width; + + // Avoid overflow. + if (fracstep > 0x7FFFFFFF - frac) + { + frac += fracstep - heightmask; + } + else + { frac += fracstep; } - if (count & 1) + while (frac >= heightmask) { - val = source[(frac>>FRACBITS) & heightmask]; - if (val != TRANSPARENTPIXEL) - { - *dest = colormap[val]; - } + frac -= heightmask; + } + } while (--count); + } + else + { + while ((count -= 2) >= 0) // texture height is a power of 2 + { + val = source[(frac>>FRACBITS) & heightmask]; + if (val != TRANSPARENTPIXEL) + { + *dest = colormap[val]; + } + + dest += vid.width; + frac += fracstep; + + val = source[(frac>>FRACBITS) & heightmask]; + if (val != TRANSPARENTPIXEL) + { + *dest = colormap[val]; + } + + dest += vid.width; + frac += fracstep; + } + + if (count & 1) + { + val = source[(frac>>FRACBITS) & heightmask]; + if (val != TRANSPARENTPIXEL) + { + *dest = colormap[val]; } } } @@ -266,35 +318,38 @@ void R_Draw2sMultiPatchTranslucentColumn_8(void) count = dc_yh - dc_yl; if (count < 0) // Zero length, column does not exceed a pixel. + { return; + } -#ifdef RANGECHECK if ((unsigned)dc_x >= (unsigned)vid.width || dc_yl < 0 || dc_yh >= vid.height) + { return; -#endif + } // Framebuffer destination address. // Use ylookup LUT to avoid multiply with ScreenWidth. // Use columnofs LUT for subwindows? - - //dest = ylookup[dc_yl] + columnofs[dc_x]; dest = &topleft[dc_yl*vid.width + dc_x]; count++; // Determine scaling, which is the only mapping to be done. fracstep = dc_iscale; - //frac = dc_texturemid + (dc_yl - centery)*fracstep; frac = (dc_texturemid + FixedMul((dc_yl << FRACBITS) - centeryfrac, fracstep))*(!dc_hires); // Inner loop that does the actual texture mapping, e.g. a DDA-like scaling. // This is as fast as it gets. + register const UINT8 *source = dc_source; + register const UINT8 *transmap = dc_transmap; + register const lighttable_t *colormap = dc_colormap; + register INT32 heightmask = dc_texheight-1; + register UINT8 val; + + if (dc_texheight & heightmask) // not a power of 2 -- killough { - register const UINT8 *source = dc_source; - register const UINT8 *transmap = dc_transmap; - register const lighttable_t *colormap = dc_colormap; - register INT32 heightmask = dc_texheight-1; - register UINT8 val; + heightmask++; + heightmask <<= FRACBITS; if (dc_sourcelength <= 0) { @@ -309,74 +364,94 @@ void R_Draw2sMultiPatchTranslucentColumn_8(void) npow2max = dc_sourcelength; } - if (dc_texheight & heightmask) // not a power of 2 -- killough + if (frac < 0) { - heightmask++; - heightmask <<= FRACBITS; - - if (frac < 0) - while ((frac += heightmask) < 0); - else - while (frac >= heightmask) - frac -= heightmask; - - do + while ((frac += heightmask) < 0) { - // Re-map color indices from wall texture column - // using a lighting/special effects LUT. - // heightmask is the Tutti-Frutti fix - - // -1 is the lower clamp bound because column posts have a "safe" byte before the real data - // and a few bytes after as well - val = source[CLAMP(frac>>FRACBITS, npow2min, npow2max)]; - - if (val != TRANSPARENTPIXEL) - { - *dest = *(transmap + (colormap[val]<<8) + (*dest)); - } - - dest += vid.width; - - // Avoid overflow. - if (fracstep > 0x7FFFFFFF - frac) - frac += fracstep - heightmask; - else - frac += fracstep; - - while (frac >= heightmask) - frac -= heightmask; - } while (--count); + ; + } } else { - while ((count -= 2) >= 0) // texture height is a power of 2 + while (frac >= heightmask) { - val = source[(frac>>FRACBITS) & heightmask]; - if (val != TRANSPARENTPIXEL) - { - *dest = *(transmap + (colormap[val]<<8) + (*dest)); - } + frac -= heightmask; + } + } - dest += vid.width; - frac += fracstep; + do + { + // Re-map color indices from wall texture column + // using a lighting/special effects LUT. + // heightmask is the Tutti-Frutti fix - val = source[(frac>>FRACBITS) & heightmask]; - if (val != TRANSPARENTPIXEL) - { - *dest = *(transmap + (colormap[val]<<8) + (*dest)); - } + // -1 is the lower clamp bound because column posts have a "safe" byte before the real data + // and a few bytes after as well - dest += vid.width; + // jartha: faster on my AMD FX-6300 CPU. + // Faster than ternaries, faster than std::min/std::max. Don't ask me why. + // I tested by viewing a non-PO2 texture from a consistent distance so it covered the entire screen. + // The framerate difference was about 50 frames at 640x400. + INT32 n = frac >> FRACBITS; + if (n < npow2min) + n = npow2min; + if (n > npow2max) + n = npow2max; + + val = source[n]; + + if (val != TRANSPARENTPIXEL) + { + *dest = *(transmap + (colormap[val]<<8) + (*dest)); + } + + dest += vid.width; + + // Avoid overflow. + if (fracstep > 0x7FFFFFFF - frac) + { + frac += fracstep - heightmask; + } + else + { frac += fracstep; } - if (count & 1) + while (frac >= heightmask) { - val = source[(frac>>FRACBITS) & heightmask]; - if (val != TRANSPARENTPIXEL) - { - *dest = *(transmap + (colormap[val]<<8) + (*dest)); - } + frac -= heightmask; + } + } while (--count); + } + else + { + while ((count -= 2) >= 0) // texture height is a power of 2 + { + val = source[(frac>>FRACBITS) & heightmask]; + if (val != TRANSPARENTPIXEL) + { + *dest = *(transmap + (colormap[val]<<8) + (*dest)); + } + + dest += vid.width; + frac += fracstep; + + val = source[(frac>>FRACBITS) & heightmask]; + if (val != TRANSPARENTPIXEL) + { + *dest = *(transmap + (colormap[val]<<8) + (*dest)); + } + + dest += vid.width; + frac += fracstep; + } + + if (count & 1) + { + val = source[(frac>>FRACBITS) & heightmask]; + if (val != TRANSPARENTPIXEL) + { + *dest = *(transmap + (colormap[val]<<8) + (*dest)); } } } @@ -396,21 +471,22 @@ void R_DrawShadeColumn_8(void) return; count = dc_yh - dc_yl; - if (count < 0) - return; -#ifdef RANGECHECK + if (count < 0) // Zero length, column does not exceed a pixel. + { + return; + } + if ((unsigned)dc_x >= (unsigned)vid.width || dc_yl < 0 || dc_yh >= vid.height) - I_Error("R_DrawShadeColumn_8: %d to %d at %d", dc_yl, dc_yh, dc_x); -#endif + { + return; + } // FIXME. As above. - //dest = ylookup[dc_yl] + columnofs[dc_x]; dest = &topleft[dc_yl*vid.width + dc_x]; // Looks familiar. fracstep = dc_iscale; - //frac = dc_texturemid + (dc_yl - centery)*fracstep; frac = (dc_texturemid + FixedMul((dc_yl << FRACBITS) - centeryfrac, fracstep))*(!dc_hires); // Here we do an additional index re-mapping. @@ -438,29 +514,33 @@ void R_DrawTranslucentColumn_8(void) count = dc_yh - dc_yl + 1; if (count <= 0) // Zero length, column does not exceed a pixel. + { return; + } -#ifdef RANGECHECK if ((unsigned)dc_x >= (unsigned)vid.width || dc_yl < 0 || dc_yh >= vid.height) - I_Error("R_DrawTranslucentColumn_8: %d to %d at %d", dc_yl, dc_yh, dc_x); -#endif + { + return; + } // FIXME. As above. - //dest = ylookup[dc_yl] + columnofs[dc_x]; dest = &topleft[dc_yl*vid.width + dc_x]; // Looks familiar. fracstep = dc_iscale; - //frac = dc_texturemid + (dc_yl - centery)*fracstep; frac = (dc_texturemid + FixedMul((dc_yl << FRACBITS) - centeryfrac, fracstep))*(!dc_hires); // Inner loop that does the actual texture mapping, e.g. a DDA-like scaling. // This is as fast as it gets. + register const UINT8 *source = dc_source; + register const UINT8 *transmap = dc_transmap; + register const lighttable_t *colormap = dc_colormap; + register INT32 heightmask = dc_texheight - 1; + + if (dc_texheight & heightmask) { - register const UINT8 *source = dc_source; - register const UINT8 *transmap = dc_transmap; - register const lighttable_t *colormap = dc_colormap; - register INT32 heightmask = dc_texheight - 1; + heightmask++; + heightmask <<= FRACBITS; if (dc_sourcelength <= 0) { @@ -475,53 +555,68 @@ void R_DrawTranslucentColumn_8(void) npow2max = dc_sourcelength; } - if (dc_texheight & heightmask) + if (frac < 0) { - heightmask++; - heightmask <<= FRACBITS; - - if (frac < 0) - while ((frac += heightmask) < 0) - ; - else - while (frac >= heightmask) - frac -= heightmask; - - do + while ((frac += heightmask) < 0) { - // Re-map color indices from wall texture column - // using a lighting/special effects LUT. - // heightmask is the Tutti-Frutti fix - - // -1 is the lower clamp bound because column posts have a "safe" byte before the real data - // and a few bytes after as well - *dest = *(transmap + (colormap[source[CLAMP(frac>>FRACBITS, npow2min, npow2max)]]<<8) + (*dest)); - - dest += vid.width; - - if ((frac += fracstep) >= heightmask) - frac -= heightmask; + ; } - while (--count); } else { - while ((count -= 2) >= 0) // texture height is a power of 2 + while (frac >= heightmask) { - *dest = *(transmap + (colormap[source[(frac>>FRACBITS)&heightmask]]<<8) + (*dest)); - dest += vid.width; - frac += fracstep; - - *dest = *(transmap + (colormap[source[(frac>>FRACBITS)&heightmask]]<<8) + (*dest)); - dest += vid.width; - frac += fracstep; + frac -= heightmask; } + } - if (count & 1) + do + { + // Re-map color indices from wall texture column + // using a lighting/special effects LUT. + // heightmask is the Tutti-Frutti fix + + // -1 is the lower clamp bound because column posts have a "safe" byte before the real data + // and a few bytes after as well + + // jartha: faster on my AMD FX-6300 CPU. + // Faster than ternaries, faster than std::min/std::max. Don't ask me why. + // I tested by viewing a non-PO2 texture from a consistent distance so it covered the entire screen. + // The framerate difference was about 50 frames at 640x400. + INT32 n = frac >> FRACBITS; + if (n < npow2min) + n = npow2min; + if (n > npow2max) + n = npow2max; + + *dest = *(transmap + (colormap[source[n]]<<8) + (*dest)); + + dest += vid.width; + + if ((frac += fracstep) >= heightmask) { - *dest = *(transmap + (colormap[source[(frac>>FRACBITS)&heightmask]]<<8) + (*dest)); + frac -= heightmask; } } + while (--count); + } + else + { + while ((count -= 2) >= 0) // texture height is a power of 2 + { + *dest = *(transmap + (colormap[source[(frac>>FRACBITS)&heightmask]]<<8) + (*dest)); + dest += vid.width; + frac += fracstep; + + *dest = *(transmap + (colormap[source[(frac>>FRACBITS)&heightmask]]<<8) + (*dest)); + dest += vid.width; + frac += fracstep; + } + + if (count & 1) + { + *dest = *(transmap + (colormap[source[(frac>>FRACBITS)&heightmask]]<<8) + (*dest)); + } } } @@ -540,21 +635,30 @@ void R_DrawTranslatedTranslucentColumn_8(void) count = dc_yh - dc_yl + 1; if (count <= 0) // Zero length, column does not exceed a pixel. + { return; + } + + if ((unsigned)dc_x >= (unsigned)vid.width || dc_yl < 0 || dc_yh >= vid.height) + { + return; + } // FIXME. As above. - //dest = ylookup[dc_yl] + columnofs[dc_x]; dest = &topleft[dc_yl*vid.width + dc_x]; // Looks familiar. fracstep = dc_iscale; - //frac = dc_texturemid + (dc_yl - centery)*fracstep; frac = (dc_texturemid + FixedMul((dc_yl << FRACBITS) - centeryfrac, fracstep))*(!dc_hires); // Inner loop that does the actual texture mapping, e.g. a DDA-like scaling. // This is as fast as it gets. + register INT32 heightmask = dc_texheight - 1; + + if (dc_texheight & heightmask) { - register INT32 heightmask = dc_texheight - 1; + heightmask++; + heightmask <<= FRACBITS; if (dc_sourcelength <= 0) { @@ -569,52 +673,68 @@ void R_DrawTranslatedTranslucentColumn_8(void) npow2max = dc_sourcelength; } - if (dc_texheight & heightmask) + if (frac < 0) { - heightmask++; - heightmask <<= FRACBITS; - - if (frac < 0) - while ((frac += heightmask) < 0) - ; - else - while (frac >= heightmask) - frac -= heightmask; - - do + while ((frac += heightmask) < 0) { - // Re-map color indices from wall texture column - // using a lighting/special effects LUT. - // heightmask is the Tutti-Frutti fix - - // -1 is the lower clamp bound because column posts have a "safe" byte before the real data - // and a few bytes after as well - *dest = *(dc_transmap + (dc_colormap[dc_translation[dc_source[CLAMP(frac>>FRACBITS, npow2min, npow2max)]]]<<8) + (*dest)); - dest += vid.width; - - if ((frac += fracstep) >= heightmask) - frac -= heightmask; + ; } - while (--count); } else { - while ((count -= 2) >= 0) // texture height is a power of 2 + while (frac >= heightmask) { - *dest = *(dc_transmap + (dc_colormap[dc_translation[dc_source[(frac>>FRACBITS)&heightmask]]]<<8) + (*dest)); - dest += vid.width; - frac += fracstep; - - *dest = *(dc_transmap + (dc_colormap[dc_translation[dc_source[(frac>>FRACBITS)&heightmask]]]<<8) + (*dest)); - dest += vid.width; - frac += fracstep; + frac -= heightmask; } + } - if (count & 1) + do + { + // Re-map color indices from wall texture column + // using a lighting/special effects LUT. + // heightmask is the Tutti-Frutti fix + + // -1 is the lower clamp bound because column posts have a "safe" byte before the real data + // and a few bytes after as well + + // jartha: faster on my AMD FX-6300 CPU. + // Faster than ternaries, faster than std::min/std::max. Don't ask me why. + // I tested by viewing a non-PO2 texture from a consistent distance so it covered the entire screen. + // The framerate difference was about 50 frames at 640x400. + INT32 n = frac >> FRACBITS; + if (n < npow2min) + n = npow2min; + if (n > npow2max) + n = npow2max; + + *dest = *(dc_transmap + (dc_colormap[dc_translation[dc_source[n]]]<<8) + (*dest)); + + dest += vid.width; + + if ((frac += fracstep) >= heightmask) { - *dest = *(dc_transmap + (dc_colormap[dc_translation[dc_source[(frac>>FRACBITS)&heightmask]]]<<8) + (*dest)); + frac -= heightmask; } } + while (--count); + } + else + { + while ((count -= 2) >= 0) // texture height is a power of 2 + { + *dest = *(dc_transmap + (dc_colormap[dc_translation[dc_source[(frac>>FRACBITS)&heightmask]]]<<8) + (*dest)); + dest += vid.width; + frac += fracstep; + + *dest = *(dc_transmap + (dc_colormap[dc_translation[dc_source[(frac>>FRACBITS)&heightmask]]]<<8) + (*dest)); + dest += vid.width; + frac += fracstep; + } + + if (count & 1) + { + *dest = *(dc_transmap + (dc_colormap[dc_translation[dc_source[(frac>>FRACBITS)&heightmask]]]<<8) + (*dest)); + } } } @@ -630,21 +750,22 @@ void R_DrawTranslatedColumn_8(void) register fixed_t frac, fracstep; count = dc_yh - dc_yl; - if (count < 0) - return; -#ifdef RANGECHECK + if (count < 0) + { + return; + } + if ((unsigned)dc_x >= (unsigned)vid.width || dc_yl < 0 || dc_yh >= vid.height) - I_Error("R_DrawTranslatedColumn_8: %d to %d at %d", dc_yl, dc_yh, dc_x); -#endif + { + return; + } // FIXME. As above. - //dest = ylookup[dc_yl] + columnofs[dc_x]; dest = &topleft[dc_yl*vid.width + dc_x]; // Looks familiar. fracstep = dc_iscale; - //frac = dc_texturemid + (dc_yl-centery)*fracstep; frac = (dc_texturemid + FixedMul((dc_yl << FRACBITS) - centeryfrac, fracstep))*(!dc_hires); // Here we do an additional index re-mapping. @@ -709,7 +830,9 @@ void R_DrawSpan_8 (void) dest = ylookup[ds_y] + columnofs[ds_x1]; if (dest+8 > deststop) + { return; + } while (count >= 8) { @@ -752,12 +875,18 @@ void R_CalcTiltedLighting(fixed_t start, fixed_t end) // I wanna do some optimizing by checking for out-of-range segments on either side to fill in all at once, // but I'm too bad at coding to not crash the game trying to do that. I guess this is fast enough for now... - for (i = left; i <= right; i++) { + for (i = left; i <= right; i++) + { tiltlighting[i] = (start += step) >> FRACBITS; + if (tiltlighting[i] < 0) + { tiltlighting[i] = 0; + } else if (tiltlighting[i] >= MAXLIGHTSCALE) + { tiltlighting[i] = MAXLIGHTSCALE-1; + } } } diff --git a/src/r_things.c b/src/r_things.c index 94d108fec..511c26bd6 100644 --- a/src/r_things.c +++ b/src/r_things.c @@ -623,6 +623,7 @@ void R_DrawMaskedColumn(column_t *column) { dc_source = (UINT8 *)column + 3; dc_sourcelength = column->length; + dc_texheight = column->length; dc_texturemid = basetexturemid - (topdelta<length); dc_sourcelength = column->length; + dc_texheight = column->length; + for (s = (UINT8 *)column+2+column->length, d = dc_source; d < dc_source+column->length; --s) *d++ = *s; dc_texturemid = basetexturemid - (topdelta< Date: Wed, 1 Jan 2025 05:06:52 +0100 Subject: [PATCH 15/53] dont iterate through precip blockmap if there is no precip --- src/hardware/hw_main.c | 2 +- src/r_things.c | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/hardware/hw_main.c b/src/hardware/hw_main.c index 5eefc9c7e..aaf1cb2e6 100644 --- a/src/hardware/hw_main.c +++ b/src/hardware/hw_main.c @@ -4360,7 +4360,7 @@ static void HWR_AddPrecipitationSprites(void) fixed_t drawdist; // save a little time on invisible weather - if (curWeather == PRECIP_BLANK || curWeather == PRECIP_STORM_NORAIN) + if (curWeather == PRECIP_NONE || curWeather == PRECIP_BLANK || curWeather == PRECIP_STORM_NORAIN) { return; } diff --git a/src/r_things.c b/src/r_things.c index 511c26bd6..ca534f54b 100644 --- a/src/r_things.c +++ b/src/r_things.c @@ -1979,7 +1979,7 @@ void R_AddPrecipitationSprites(void) precipmobj_t *th, *next; // no, no infinite draw distance for precipitation. this option at zero is supposed to turn it off - if (drawdist == 0 || curWeather == PRECIP_BLANK || curWeather == PRECIP_STORM_NORAIN) + if (drawdist == 0 || curWeather == PRECIP_NONE || curWeather == PRECIP_BLANK || curWeather == PRECIP_STORM_NORAIN) { return; } -- 2.54.0 From 3ade8b09c5e6a9e44a4de6e409139ad859f6f20f Mon Sep 17 00:00:00 2001 From: Alug Date: Wed, 1 Jan 2025 05:10:52 +0100 Subject: [PATCH 16/53] move early return even earlier so theres no need to constantly init scale and drawdist --- src/hardware/hw_main.c | 2 +- src/r_things.c | 14 ++++++++++---- 2 files changed, 11 insertions(+), 5 deletions(-) diff --git a/src/hardware/hw_main.c b/src/hardware/hw_main.c index aaf1cb2e6..3d7fbbd50 100644 --- a/src/hardware/hw_main.c +++ b/src/hardware/hw_main.c @@ -4359,7 +4359,7 @@ static void HWR_AddPrecipitationSprites(void) fixed_t drawdist; - // save a little time on invisible weather + // save a little time if theres no or invisible weather if (curWeather == PRECIP_NONE || curWeather == PRECIP_BLANK || curWeather == PRECIP_STORM_NORAIN) { return; diff --git a/src/r_things.c b/src/r_things.c index ca534f54b..9bdb9ea67 100644 --- a/src/r_things.c +++ b/src/r_things.c @@ -1972,14 +1972,20 @@ void R_AddSprites(sector_t *sec, INT32 lightlevel) // void R_AddPrecipitationSprites(void) { - fixed_t precipscale = (cv_mobjscaleprecip.value ? mapobjectscale : FRACUNIT); - fixed_t drawdist = ((fixed_t)(cv_drawdist_precip.value) * precipscale); - INT32 xl, xh, yl, yh, bx, by; precipmobj_t *th, *next; + // save a little time if theres no or invisible weather + if (curWeather == PRECIP_NONE || curWeather == PRECIP_BLANK || curWeather == PRECIP_STORM_NORAIN) + { + return; + } + + const fixed_t precipscale = (cv_mobjscaleprecip.value ? mapobjectscale : FRACUNIT); + const fixed_t drawdist = ((fixed_t)(cv_drawdist_precip.value) * precipscale); + // no, no infinite draw distance for precipitation. this option at zero is supposed to turn it off - if (drawdist == 0 || curWeather == PRECIP_NONE || curWeather == PRECIP_BLANK || curWeather == PRECIP_STORM_NORAIN) + if (drawdist == 0) { return; } -- 2.54.0 From 5e1d43b5affe45e0b5382ec3362e8a1d8df30da1 Mon Sep 17 00:00:00 2001 From: Alug Date: Wed, 1 Jan 2025 06:18:05 +0100 Subject: [PATCH 17/53] those will never be changed ever --- src/g_game.c | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/src/g_game.c b/src/g_game.c index e7dc9d92d..c4fbec8bc 100644 --- a/src/g_game.c +++ b/src/g_game.c @@ -701,9 +701,7 @@ const char *G_BuildMapName(INT32 map) */ INT16 G_ClipAimingPitch(INT32 *aiming) { - INT32 limitangle; - - limitangle = ANGLE_90 - 1; + static const INT32 limitangle = ANGLE_90 - 1; if (*aiming > limitangle) *aiming = limitangle; @@ -715,10 +713,8 @@ INT16 G_ClipAimingPitch(INT32 *aiming) INT16 G_SoftwareClipAimingPitch(INT32 *aiming) { - INT32 limitangle; - // note: the current software mode implementation doesn't have true perspective - limitangle = ANGLE_90 - ANG10; // Some viewing fun, but not too far down... + static const INT32 limitangle = ANGLE_90 - ANG10; // Some viewing fun, but not too far down... if (*aiming > limitangle) *aiming = limitangle; -- 2.54.0 From 8f0c5fb5084d3adaefc4e7a8536b96ac567ffb2a Mon Sep 17 00:00:00 2001 From: Alug Date: Wed, 1 Jan 2025 17:06:03 +0100 Subject: [PATCH 18/53] always close any menus when using "connect" command --- src/d_clisrv.c | 3 ++- src/m_menu.c | 7 ++++--- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/src/d_clisrv.c b/src/d_clisrv.c index 5d04b98e0..e6cc26690 100644 --- a/src/d_clisrv.c +++ b/src/d_clisrv.c @@ -3069,9 +3069,10 @@ static void Command_connect(void) return; } + M_ClearMenus(true); + if (Playing() || demo.title) { - M_ClearMenus(true); if (demo.title) G_CheckDemoStatus(); diff --git a/src/m_menu.c b/src/m_menu.c index 8cfe16a97..42cf93f9c 100644 --- a/src/m_menu.c +++ b/src/m_menu.c @@ -4587,7 +4587,7 @@ void M_ClearMenus(boolean callexitmenufunc) if (currentMenu->quitroutine && callexitmenufunc && !currentMenu->quitroutine()) return; // we can't quit this menu (also used to set parameter from the menu) -// Save the config file. I'm sick of crashing the game later and losing all my changes! + // Save the config file. I'm sick of crashing the game later and losing all my changes! COM_BufAddText(va("saveconfig \"%s\" -silent\n", configfile)); if (currentMenu == &MessageDef) // Oh sod off! @@ -9600,16 +9600,17 @@ static void M_DrawConnectMenu(void) highlightflags, va("%u of %d", serverlistpage+1, numPages)); // Did you change the Server Browser address? Have a little reminder. - #ifdef MASTERSERVER +#ifdef MASTERSERVER if (CV_IsSetToDefault(&cv_masterserver)) mservflags = mservflags|highlightflags|V_30TRANS; else mservflags = mservflags|warningflags; + V_DrawRightAlignedSmallString(BASEVIDWIDTH - currentMenu->x, currentMenu->y+3 + MP_ConnectMenu[mp_connect_refresh].alphaKey, mservflags, va("MS: %s", cv_masterserver.string)); M_DrawServerCountAndHorizontalBar(); - #endif +#endif // When switching pages, slide the old page and the // new page across the screen -- 2.54.0 From 8da59dc288f734d0926c39de853a94f8d0ee02ca Mon Sep 17 00:00:00 2001 From: Alug Date: Wed, 1 Jan 2025 17:36:47 +0100 Subject: [PATCH 19/53] slightly cleanup rumble and led ticker --- src/d_main.c | 7 +++++-- src/p_tick.c | 17 +++++++++++------ 2 files changed, 16 insertions(+), 8 deletions(-) diff --git a/src/d_main.c b/src/d_main.c index a44c12ad6..f9e1ca27e 100644 --- a/src/d_main.c +++ b/src/d_main.c @@ -171,14 +171,17 @@ static inline void D_DeviceLEDTick(void) UINT16 color[MAXSPLITSCREENPLAYERS]; UINT16 curcolor[MAXSPLITSCREENPLAYERS]; - if (I_NumJoys() == 0 || (cv_gamepadled[0].value == 0 && cv_gamepadled[1].value == 0 && cv_gamepadled[2].value == 0 && cv_gamepadled[3].value == 0)) + if (I_NumJoys() == 0) { return; } for (i = 0; i <= splitscreen; i++) { - if (cv_usejoystick[i].value == 0) + if (!cv_usejoystick[i].value) + continue; + + if (!cv_gamepadled[i].value) continue; color[i] = G_GetSkinColor(i); diff --git a/src/p_tick.c b/src/p_tick.c index 3b0cadde8..9d5c8539b 100644 --- a/src/p_tick.c +++ b/src/p_tick.c @@ -354,21 +354,25 @@ static void P_DeviceRumbleTick(void) { UINT8 i; - if (I_NumJoys() == 0 || (cv_rumble[0].value == 0 && cv_rumble[1].value == 0 && cv_rumble[2].value == 0 && cv_rumble[3].value == 0)) + if (I_NumJoys() == 0 || gamestate != GS_LEVEL) { return; } for (i = 0; i <= splitscreen; i++) { - player_t *player = &players[displayplayers[i]]; UINT16 low = 0; UINT16 high = 0; - if (!P_IsLocalPlayer(player)) + if (!cv_usejoystick[i].value) continue; - if (cv_usejoystick[i].value == 0) + if (!cv_rumble[i].value) + continue; + + player_t *player = &players[displayplayers[i]]; + + if (!P_IsLocalPlayer(player)) continue; if (!playeringame[displayplayers[i]] || player->spectator) @@ -402,10 +406,11 @@ static void P_DeviceRumbleTick(void) high = 65536 / 256; } - if (low == 0 && high == 0) + // hack alert! i just dont want this thing constantly resetting the rumble lol + if (low == 0 && high == 0) continue; - G_PlayerDeviceRumble(i, low, high, 57); // hack alert! i just dont want this think constantly resetting the rumble lol + G_PlayerDeviceRumble(i, low, high, 57); } } -- 2.54.0 From bb3a65f8ffc8e85a27f4aa234fcb343a1598e450 Mon Sep 17 00:00:00 2001 From: Indev Date: Wed, 1 Jan 2025 19:58:49 +0300 Subject: [PATCH 20/53] Repurpose ST_DrawTextInput into M_DrawTextInputScroll, and move its definition into m_textinput.c. M_DrawTextInput is now a macro using M_DrawTextInputScroll --- src/m_menu.c | 36 ++++-------------------- src/m_menu.h | 4 --- src/m_textinput.c | 71 +++++++++++++++++++++++++++++++++++++++++++++++ src/m_textinput.h | 5 ++++ src/st_stuff.c | 71 +---------------------------------------------- 5 files changed, 82 insertions(+), 105 deletions(-) diff --git a/src/m_menu.c b/src/m_menu.c index 42cf93f9c..03eeef210 100644 --- a/src/m_menu.c +++ b/src/m_menu.c @@ -4980,33 +4980,6 @@ void M_DrawTextBoxFlags(INT32 x, INT32 y, INT32 width, INT32 boxlines, INT32 fla V_DrawFill(x+5, y+5, width*8+6, boxlines*8+6, 239|flags); } -void M_DrawTextInput(INT32 x, INT32 y, textinput_t *input, INT32 flags) -{ - INT32 skullx = x; - - V_DrawString(x, y, V_ALLOWLOWERCASE|flags, input->buffer); - - // draw text cursor for name - if (input->length) - skullx = x+V_SubStringWidth(input->buffer, input->cursor, V_ALLOWLOWERCASE); - - if (skullAnimCounter < 4) // blink cursor - V_DrawCharacter(skullx, y+3, '_'|flags, false); - - // draw selection - if (input->select != input->cursor) - { - size_t start = min(input->select, input->cursor); - size_t end = max(input->select, input->cursor); - - size_t len = end - start; - - INT32 startx = V_SubStringWidth(input->buffer, start, V_ALLOWLOWERCASE); - - V_DrawFill(x+startx, y, V_SubStringWidth(input->buffer+start, len, V_ALLOWLOWERCASE), 8, 103|V_TRANSLUCENT|flags); - } -} - // horizontally centered text static void M_CentreText(INT32 y, const char *string) { @@ -10195,7 +10168,8 @@ static void M_StartServerMenu(INT32 choice) // CONNECT VIA IP // ============== -static char setupm_ip[28]; +#define SETUPM_IP_MAXSIZE ((28-1)*8) +static char setupm_ip[64]; static textinput_t setupm_input_ip; #endif @@ -10203,8 +10177,8 @@ void M_Multiplayer(INT32 choice) { (void)choice; #ifndef NONET - memset(setupm_ip, 0, 28); - M_TextInputInit(&setupm_input_ip, setupm_ip, 28); + memset(setupm_ip, 0, sizeof(setupm_ip)); + M_TextInputInit(&setupm_input_ip, setupm_ip, sizeof(setupm_ip)); #endif M_SetupNextMenu(&MP_MainDef); } @@ -10243,7 +10217,7 @@ Update the maxplayers label... if (itemOn != 9) V_DrawString(x+8,y+12, V_ALLOWLOWERCASE, setupm_ip); else - M_DrawTextInput(x+8, y+12, &setupm_input_ip, 0); + M_DrawTextInputScroll(x+8, y+12, &setupm_input_ip, 0, SETUPM_IP_MAXSIZE); #endif // character bar, ripped off the color bar :V diff --git a/src/m_menu.h b/src/m_menu.h index 9806773b4..72864c669 100644 --- a/src/m_menu.h +++ b/src/m_menu.h @@ -64,10 +64,6 @@ void M_DrawTextBox(INT32 x, INT32 y, INT32 width, INT32 boxlines); // Same but with extra flags applied void M_DrawTextBoxFlags(INT32 x, INT32 y, INT32 width, INT32 boxlines, INT32 flags); -// Draw text input -typedef struct textinput_s textinput_t; -void M_DrawTextInput(INT32 x, INT32 y, textinput_t *input, INT32 flags); - // Used in d_netcmd to restart time attack void M_ModeAttackRetry(INT32 choice); diff --git a/src/m_textinput.c b/src/m_textinput.c index 266a8f300..dfe9f5a64 100644 --- a/src/m_textinput.c +++ b/src/m_textinput.c @@ -1,4 +1,7 @@ #include "m_textinput.h" +#include "m_menu.h" // MAXSTRINGLENGTH +#include "v_video.h" +#include "r_main.h" // renderisnewtic #include "i_system.h" #include "keys.h" #include "console.h" @@ -132,6 +135,8 @@ void M_TextInputInit(textinput_t *input, char *buffer, size_t buffer_size) input->buffer = buffer; input->buffer_size = buffer_size; + input->skull = 0; + M_TextInputClear(input); } @@ -314,3 +319,69 @@ boolean M_TextInputHandle(textinput_t *input, INT32 key) return true; } + +void M_DrawTextInputScroll(INT32 x, INT32 y, textinput_t *input, INT32 flags, INT32 MAXINPUTWIDTH) +{ + if (renderisnewtic) + input->skull++; + input->skull %= 8; + + char nametodraw[MAXSTRINGLENGTH*2+1] = {0}; + + size_t drawstart = 0; + size_t drawend = 0; // Only used for selection + + INT32 skullx = x; + + while (V_SubStringWidth(input->buffer+drawstart, input->cursor-drawstart, V_ALLOWLOWERCASE) > MAXINPUTWIDTH) + ++drawstart; + + size_t drawlength = V_SubStringLengthToFit(input->buffer+drawstart, MAXINPUTWIDTH+8, V_ALLOWLOWERCASE)+1; + drawend = drawstart + drawlength; + + memcpy(nametodraw, input->buffer+drawstart, drawlength); + + if (input->length) + skullx += V_SubStringWidth(nametodraw, input->cursor-drawstart, V_ALLOWLOWERCASE); + + V_DrawString(x, y, V_ALLOWLOWERCASE|flags, nametodraw); + + // draw text cursor for name + if (input->skull < 4) // blink cursor + V_DrawCharacter(skullx, y+3, '_'|flags, false); + + // draw selection + if (input->select != input->cursor) + { + size_t start = min(input->select, input->cursor); + size_t end = max(input->select, input->cursor); + + INT32 startx = 0; + INT32 width = 0; + + // I couldn't figure out one formula so here's bunch of separate cases + if (start < drawstart && end > drawend) // Selection covers whole visible portion of demo name + { + startx = -2; + width = V_StringWidth(nametodraw, V_ALLOWLOWERCASE)+4; + } + else if (start < drawstart) // Only left side of selection is off visible part + { + startx = -2; + size_t len = (end - start) - (drawstart - start); + width = V_SubStringWidth(nametodraw, len, V_ALLOWLOWERCASE)+2; + } + else if (end > drawend) // Only right side of selection is off visible part + { + startx = V_SubStringWidth(nametodraw, start-drawstart, V_ALLOWLOWERCASE); + width = V_StringWidth(nametodraw+(start-drawstart), V_ALLOWLOWERCASE)+2; + } + else // All selection is on visible part + { + startx = V_SubStringWidth(nametodraw, start-drawstart, V_ALLOWLOWERCASE); + width = V_SubStringWidth(nametodraw+(start-drawstart), end-start, V_ALLOWLOWERCASE); + } + + V_DrawFill(x+startx, y, width, 8, 103|V_TRANSLUCENT|flags); + } +} diff --git a/src/m_textinput.h b/src/m_textinput.h index aad5e94ab..649288ec4 100644 --- a/src/m_textinput.h +++ b/src/m_textinput.h @@ -10,6 +10,8 @@ typedef struct textinput_s { char *buffer; size_t buffer_size; + + unsigned skull; } textinput_t; void M_TextInputInit(textinput_t *input, char *buffer, size_t buffer_size); @@ -20,4 +22,7 @@ void M_TextInputSetString(textinput_t *input, const char *c); boolean M_TextInputHandle(textinput_t *input, INT32 key); +#define M_DrawTextInput(x, y, input, flags) M_DrawTextInputScroll((x), (y), (input), (flags), ((input)->buffer_size-1)*8) +void M_DrawTextInputScroll(INT32 x, INT32 y, textinput_t *input, INT32 flags, INT32 MAXINPUTWIDTH); + #endif diff --git a/src/st_stuff.c b/src/st_stuff.c index aaa926515..fa64b3709 100644 --- a/src/st_stuff.c +++ b/src/st_stuff.c @@ -829,82 +829,13 @@ static void ST_overlayDrawer(void) } } -static void ST_DrawTextInput(INT32 x, INT32 y, textinput_t *input, INT32 flags) -{ - static UINT8 skullAnimCounter = 0; - static const INT32 MAXINPUTWIDTH = (MAXSTRINGLENGTH-1)*8; - - if (renderisnewtic) - skullAnimCounter++; - skullAnimCounter %= 8; - - char nametodraw[MAXSTRINGLENGTH*2+1] = {0}; - - size_t drawstart = 0; - size_t drawend = 0; // Only used for selection - - INT32 skullx = x; - - while (V_SubStringWidth(input->buffer+drawstart, input->cursor-drawstart, V_ALLOWLOWERCASE) > MAXINPUTWIDTH) - ++drawstart; - - size_t drawlength = V_SubStringLengthToFit(input->buffer+drawstart, MAXINPUTWIDTH+8, V_ALLOWLOWERCASE)+1; - drawend = drawstart + drawlength; - - memcpy(nametodraw, input->buffer+drawstart, drawlength); - - if (input->length) - skullx += V_SubStringWidth(nametodraw, input->cursor-drawstart, V_ALLOWLOWERCASE); - - V_DrawString(x, y, V_ALLOWLOWERCASE|flags, nametodraw); - - // draw text cursor for name - if (skullAnimCounter < 4) // blink cursor - V_DrawCharacter(skullx, y+3, '_'|flags, false); - - // draw selection - if (input->select != input->cursor) - { - size_t start = min(input->select, input->cursor); - size_t end = max(input->select, input->cursor); - - INT32 startx = 0; - INT32 width = 0; - - // I couldn't figure out one formula so here's bunch of separate cases - if (start < drawstart && end > drawend) // Selection covers whole visible portion of demo name - { - startx = -2; - width = V_StringWidth(nametodraw, V_ALLOWLOWERCASE)+4; - } - else if (start < drawstart) // Only left side of selection is off visible part - { - startx = -2; - size_t len = (end - start) - (drawstart - start); - width = V_SubStringWidth(nametodraw, len, V_ALLOWLOWERCASE)+2; - } - else if (end > drawend) // Only right side of selection is off visible part - { - startx = V_SubStringWidth(nametodraw, start-drawstart, V_ALLOWLOWERCASE); - width = V_StringWidth(nametodraw+(start-drawstart), V_ALLOWLOWERCASE)+2; - } - else // All selection is on visible part - { - startx = V_SubStringWidth(nametodraw, start-drawstart, V_ALLOWLOWERCASE); - width = V_SubStringWidth(nametodraw+(start-drawstart), end-start, V_ALLOWLOWERCASE); - } - - V_DrawFill(x+startx, y, width, 8, 103|V_TRANSLUCENT|flags); - } -} - void ST_DrawDemoTitleEntry(void) { #define x (BASEVIDWIDTH/2 - 139) #define y (BASEVIDHEIGHT/2) M_DrawTextBox(x, y + 4, MAXSTRINGLENGTH, 1); - ST_DrawTextInput(x + 8, y + 12, &demo.titlenameinput, 0); + M_DrawTextInputScroll(x + 8, y + 12, &demo.titlenameinput, 0, (MAXSTRINGLENGTH-1)*8); M_DrawTextBox(x + 30, y - 24, 26, 1); V_DrawString(x + 38, y - 16, V_ALLOWLOWERCASE, "Enter the name of the replay."); -- 2.54.0 From e321d759c0bc8461d5ab7bccf96a718dd5edd2e3 Mon Sep 17 00:00:00 2001 From: Indev Date: Wed, 1 Jan 2025 20:01:54 +0300 Subject: [PATCH 21/53] Thats not defined or used anywhere, bad automerge maybe? --- src/st_stuff.c | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/st_stuff.c b/src/st_stuff.c index fa64b3709..8b431b2f0 100644 --- a/src/st_stuff.c +++ b/src/st_stuff.c @@ -788,8 +788,6 @@ static void ST_overlayDrawer(void) snprintf(directortoggle, 32, "%s - Toggle Director", item1 != NULL ? item1 : item2 != NULL ? item2 : "Not Bound"); V_DrawString(2, BASEVIDHEIGHT-10, V_SNAPTOBOTTOM|V_SNAPTOLEFT|V_HUDTRANSHALF, directortoggle); - - directortextactive = true; } else { -- 2.54.0 From 5d44b445581323f4dfa914dc3be1aa5c8c80a2fe Mon Sep 17 00:00:00 2001 From: Alug Date: Wed, 1 Jan 2025 21:34:02 +0100 Subject: [PATCH 22/53] use FRACUNIT in rumbleticker + some changes - brakedrift will now add to any rumble thats currently going on - both hyu and invul now rumble less heavy on offroad --- src/p_tick.c | 59 ++++++++++++++++++++++++++++++++++++++++++++-------- 1 file changed, 50 insertions(+), 9 deletions(-) diff --git a/src/p_tick.c b/src/p_tick.c index 9d5c8539b..4f91ff89b 100644 --- a/src/p_tick.c +++ b/src/p_tick.c @@ -365,21 +365,31 @@ static void P_DeviceRumbleTick(void) UINT16 high = 0; if (!cv_usejoystick[i].value) + { continue; + } if (!cv_rumble[i].value) + { continue; + } player_t *player = &players[displayplayers[i]]; if (!P_IsLocalPlayer(player)) + { continue; + } if (!playeringame[displayplayers[i]] || player->spectator) + { continue; + } if (player->mo == NULL) + { continue; + } if (player->exiting) { @@ -389,26 +399,50 @@ static void P_DeviceRumbleTick(void) if (player->kartstuff[k_spinouttimer]) { - low = high = 65536 / 4; + low = high = FRACUNIT / 4; } else if (player->kartstuff[k_sneakertimer] > (sneakertime-(TICRATE/2))) { - low = high = 65536 / 8; + low = high = FRACUNIT / 8; } - else if ((player->kartstuff[k_offroad] && !player->kartstuff[k_hyudorotimer]) + else if ((player->kartstuff[k_offroad]) && P_IsObjectOnGround(player->mo) && player->speed != 0) { - low = high = 65536 / 64; + if (player->kartstuff[k_hyudorotimer]) + { + high = FRACUNIT / 128; + } + else if (player->kartstuff[k_invincibilitytimer]) + { + high = FRACUNIT / 64; + } + else + { + low = high = FRACUNIT / 64; + } } - else if (player->kartstuff[k_brakedrift]) + + if (player->kartstuff[k_brakedrift]) { - low = 0; - high = 65536 / 256; + high += FRACUNIT / 256; } // hack alert! i just dont want this thing constantly resetting the rumble lol if (low == 0 && high == 0) + { continue; + } + + // pls dont overflow or smth lel + if (low > FRACUNIT-1) + { + low = FRACUNIT-1; + } + + if (high > FRACUNIT-1) + { + high = FRACUNIT-1; + } G_PlayerDeviceRumble(i, low, high, 57); } @@ -782,8 +816,15 @@ void P_PreTicker(INT32 frames) // Run any "after all the other thinkers" stuff for (i = 0; i < MAXPLAYERS; i++) - if (playeringame[i] && players[i].mo && !P_MobjWasRemoved(players[i].mo)) - P_PlayerAfterThink(&players[i]); + { + if (!playeringame[i]) + continue; + + if (!players[i].mo || P_MobjWasRemoved(players[i].mo)) + continue; + + P_PlayerAfterThink(&players[i]); + } LUA_HookThinkFrame(); -- 2.54.0 From 54fda32591a7fd4cfa6bf1859d361f45c8fad30e Mon Sep 17 00:00:00 2001 From: Alug Date: Wed, 1 Jan 2025 21:52:54 +0100 Subject: [PATCH 23/53] logic error lmao oops --- src/p_tick.c | 13 +------------ 1 file changed, 1 insertion(+), 12 deletions(-) diff --git a/src/p_tick.c b/src/p_tick.c index 4f91ff89b..af4facd53 100644 --- a/src/p_tick.c +++ b/src/p_tick.c @@ -424,7 +424,7 @@ static void P_DeviceRumbleTick(void) if (player->kartstuff[k_brakedrift]) { - high += FRACUNIT / 256; + high = CLAMP((high + FRACUNIT / 256), 0, UINT16_MAX); } // hack alert! i just dont want this thing constantly resetting the rumble lol @@ -433,17 +433,6 @@ static void P_DeviceRumbleTick(void) continue; } - // pls dont overflow or smth lel - if (low > FRACUNIT-1) - { - low = FRACUNIT-1; - } - - if (high > FRACUNIT-1) - { - high = FRACUNIT-1; - } - G_PlayerDeviceRumble(i, low, high, 57); } } -- 2.54.0 From 30dc0abc2512020d342c7d7982ef0fec93e314cc Mon Sep 17 00:00:00 2001 From: Alug Date: Thu, 2 Jan 2025 17:07:41 +0100 Subject: [PATCH 24/53] move camera noclip stuff into its own function its not used in kart anyways and moving it makes crap more readable --- src/p_user.c | 406 ++++++++++++++++++++++++++------------------------- 1 file changed, 208 insertions(+), 198 deletions(-) diff --git a/src/p_user.c b/src/p_user.c index afce1d7a7..51900717e 100644 --- a/src/p_user.c +++ b/src/p_user.c @@ -3398,6 +3398,212 @@ void P_ResetCamera(player_t *player, camera_t *thiscam) while (!P_MoveChaseCamera(player,thiscam,true) && ++tries < 2*TICRATE); } +#ifndef NOCLIPCAM // Disable all z-clipping for noclip cam +static boolean P_CheckNoclipCameraPosition(player_t *player, camera_t *thiscam, fixed_t x, fixed_t y, fixed_t z, boolean resetcalled) +{ + subsector_t *newsubsec; + boolean cameranoclip; + mobj_t *mo = player->mo; + + cameranoclip = ((player->pflags & (PF_NOCLIP|PF_NIGHTSMODE)) + || (mo->flags & (MF_NOCLIP|MF_NOCLIPHEIGHT)) // Noclipping player camera noclips too!! + || (leveltime < introtime)); // Kart intro cam + + // move camera down to move under lower ceilings + newsubsec = R_IsPointInSubsector(((mo->x>>FRACBITS) + (thiscam->x>>FRACBITS))<<(FRACBITS-1), ((mo->y>>FRACBITS) + (thiscam->y>>FRACBITS))<<(FRACBITS-1)); + + if (!newsubsec) + newsubsec = thiscam->subsector; + + if (newsubsec) + { + fixed_t myfloorz, myceilingz; + fixed_t midz = thiscam->z + (thiscam->z - mo->z)/2; + fixed_t midx = ((mo->x>>FRACBITS) + (thiscam->x>>FRACBITS))<<(FRACBITS-1); + fixed_t midy = ((mo->y>>FRACBITS) + (thiscam->y>>FRACBITS))<<(FRACBITS-1); + + // Cameras use the heightsec's heights rather then the actual sector heights. + // If you can see through it, why not move the camera through it too? + if (newsubsec->sector->camsec >= 0) + { + myfloorz = sectors[newsubsec->sector->camsec].floorheight; + myceilingz = sectors[newsubsec->sector->camsec].ceilingheight; + } + else if (newsubsec->sector->heightsec >= 0) + { + myfloorz = sectors[newsubsec->sector->heightsec].floorheight; + myceilingz = sectors[newsubsec->sector->heightsec].ceilingheight; + } + else + { + myfloorz = P_CameraGetFloorZ(thiscam, newsubsec->sector, midx, midy, NULL); + myceilingz = P_CameraGetCeilingZ(thiscam, newsubsec->sector, midx, midy, NULL); + } + + // Check list of fake floors and see if floorz/ceilingz need to be altered. + if (newsubsec->sector->ffloors) + { + ffloor_t *rover; + fixed_t delta1, delta2; + INT32 thingtop = midz + thiscam->height; + + for (rover = newsubsec->sector->ffloors; rover; rover = rover->next) + { + fixed_t topheight, bottomheight; + if (!(rover->flags & FF_BLOCKOTHERS) || !(rover->flags & FF_EXISTS) || !(rover->flags & FF_RENDERALL) || GETSECSPECIAL(rover->master->frontsector->special, 4) == 12) + continue; + + topheight = P_CameraGetFOFTopZ(thiscam, newsubsec->sector, rover, midx, midy, NULL); + bottomheight = P_CameraGetFOFBottomZ(thiscam, newsubsec->sector, rover, midx, midy, NULL); + + delta1 = midz - (bottomheight + + ((topheight - bottomheight)/2)); + delta2 = thingtop - (bottomheight + + ((topheight - bottomheight)/2)); + if (topheight > myfloorz && abs(delta1) < abs(delta2)) + myfloorz = topheight; + if (bottomheight < myceilingz && abs(delta1) >= abs(delta2)) + myceilingz = bottomheight; + } + } + + // Check polyobjects and see if floorz/ceilingz need to be altered + { + INT32 xl, xh, yl, yh, bx, by; + validcount++; + + xl = (unsigned)(tmbbox[BOXLEFT] - bmaporgx)>>MAPBLOCKSHIFT; + xh = (unsigned)(tmbbox[BOXRIGHT] - bmaporgx)>>MAPBLOCKSHIFT; + yl = (unsigned)(tmbbox[BOXBOTTOM] - bmaporgy)>>MAPBLOCKSHIFT; + yh = (unsigned)(tmbbox[BOXTOP] - bmaporgy)>>MAPBLOCKSHIFT; + + BMBOUNDFIX(xl, xh, yl, yh); + + for (by = yl; by <= yh; by++) + { + for (bx = xl; bx <= xh; bx++) + { + INT32 offset; + polymaplink_t *plink; // haleyjd 02/22/06 + + if (bx < 0 || by < 0 || bx >= bmapwidth || by >= bmapheight) + continue; + + offset = by*bmapwidth + bx; + + // haleyjd 02/22/06: consider polyobject lines + plink = polyblocklinks[offset]; + + while (plink) + { + polyobj_t *po = plink->po; + + if (po->validcount != validcount) // if polyobj hasn't been checked + { + sector_t *polysec; + fixed_t delta1, delta2, thingtop; + fixed_t polytop, polybottom; + + po->validcount = validcount; + + if (!P_PointInsidePolyobj(po, x, y) || !(po->flags & POF_SOLID)) + { + plink = (polymaplink_t *)(plink->link.next); + continue; + } + + // We're inside it! Yess... + polysec = po->lines[0]->backsector; + + if (GETSECSPECIAL(polysec->special, 4) == 12) + { // Camera noclip polyobj. + plink = (polymaplink_t *)(plink->link.next); + continue; + } + + if (po->flags & POF_CLIPPLANES) + { + polytop = polysec->ceilingheight; + polybottom = polysec->floorheight; + } + else + { + polytop = INT32_MAX; + polybottom = INT32_MIN; + } + + thingtop = midz + thiscam->height; + delta1 = midz - (polybottom + ((polytop - polybottom)/2)); + delta2 = thingtop - (polybottom + ((polytop - polybottom)/2)); + + if (polytop > myfloorz && abs(delta1) < abs(delta2)) + myfloorz = polytop; + + if (polybottom < myceilingz && abs(delta1) >= abs(delta2)) + myceilingz = polybottom; + } + plink = (polymaplink_t *)(plink->link.next); + } + } + } + } + + // crushed camera + if (myceilingz <= myfloorz + thiscam->height && !resetcalled && !cameranoclip) + { + P_ResetCamera(player, thiscam); + return true; + } + + // camera fit? + if (myceilingz != myfloorz + && myceilingz - thiscam->height < z) + { + z = myceilingz - thiscam->height-FixedMul(11*FRACUNIT, mo->scale); + // is the camera fit is there own sector + } + + // Make the camera a tad smarter with 3d floors + if (newsubsec->sector->ffloors && !cameranoclip) + { + ffloor_t *rover; + + for (rover = newsubsec->sector->ffloors; rover; rover = rover->next) + { + fixed_t topheight, bottomheight; + if ((rover->flags & FF_BLOCKOTHERS) && (rover->flags & FF_RENDERALL) && (rover->flags & FF_EXISTS) && GETSECSPECIAL(rover->master->frontsector->special, 4) == 12) + { + topheight = P_CameraGetFOFTopZ(thiscam, newsubsec->sector, rover, midx, midy, NULL); + bottomheight = P_CameraGetFOFBottomZ(thiscam, newsubsec->sector, rover, midx, midy, NULL); + + if (bottomheight - thiscam->height < z + && midz < bottomheight) + z = bottomheight - thiscam->height-FixedMul(11*FRACUNIT, mo->scale); + + else if (topheight + thiscam->height > z + && midz > topheight) + z = topheight; + + if ((mo->z >= topheight && midz < bottomheight) + || ((mo->z < bottomheight && mo->z+mo->height < topheight) && midz >= topheight)) + { + // Can't see + if (!resetcalled) + P_ResetCamera(player, thiscam); + return true; + } + } + } + } + } + + if (thiscam->z < thiscam->floorz && !cameranoclip) + thiscam->z = thiscam->floorz; + + return false; +} +#endif + boolean P_MoveChaseCamera(player_t *player, camera_t *thiscam, boolean resetcalled) { static boolean lookbackactive[MAXSPLITSCREENPLAYERS]; @@ -3411,10 +3617,6 @@ boolean P_MoveChaseCamera(player_t *player, camera_t *thiscam, boolean resetcall UINT8 timeover; mobj_t *mo; fixed_t f1, f2; -#ifndef NOCLIPCAM - boolean cameranoclip; - subsector_t *newsubsec; -#endif democam.soundmobj = NULL; // reset this each frame, we don't want the game crashing for stupid reasons now do we @@ -3472,12 +3674,6 @@ boolean P_MoveChaseCamera(player_t *player, camera_t *thiscam, boolean resetcall mo = player->mo; -#ifndef NOCLIPCAM - cameranoclip = ((player->pflags & (PF_NOCLIP|PF_NIGHTSMODE)) - || (mo->flags & (MF_NOCLIP|MF_NOCLIPHEIGHT)) // Noclipping player camera noclips too!! - || (leveltime < introtime)); // Kart intro cam -#endif - if (player->pflags & PF_TIMEOVER) // 1 for momentum keep, 2 for turnaround timeover = (player->kartstuff[k_timeovercam] > 2*TICRATE ? 2 : 1); else @@ -3663,194 +3859,8 @@ boolean P_MoveChaseCamera(player_t *player, camera_t *thiscam, boolean resetcall z = mo->z + pviewheight + camheight; #ifndef NOCLIPCAM // Disable all z-clipping for noclip cam - // move camera down to move under lower ceilings - newsubsec = R_IsPointInSubsector(((mo->x>>FRACBITS) + (thiscam->x>>FRACBITS))<<(FRACBITS-1), ((mo->y>>FRACBITS) + (thiscam->y>>FRACBITS))<<(FRACBITS-1)); - - if (!newsubsec) - newsubsec = thiscam->subsector; - - if (newsubsec) - { - fixed_t myfloorz, myceilingz; - fixed_t midz = thiscam->z + (thiscam->z - mo->z)/2; - fixed_t midx = ((mo->x>>FRACBITS) + (thiscam->x>>FRACBITS))<<(FRACBITS-1); - fixed_t midy = ((mo->y>>FRACBITS) + (thiscam->y>>FRACBITS))<<(FRACBITS-1); - - // Cameras use the heightsec's heights rather then the actual sector heights. - // If you can see through it, why not move the camera through it too? - if (newsubsec->sector->camsec >= 0) - { - myfloorz = sectors[newsubsec->sector->camsec].floorheight; - myceilingz = sectors[newsubsec->sector->camsec].ceilingheight; - } - else if (newsubsec->sector->heightsec >= 0) - { - myfloorz = sectors[newsubsec->sector->heightsec].floorheight; - myceilingz = sectors[newsubsec->sector->heightsec].ceilingheight; - } - else - { - myfloorz = P_CameraGetFloorZ(thiscam, newsubsec->sector, midx, midy, NULL); - myceilingz = P_CameraGetCeilingZ(thiscam, newsubsec->sector, midx, midy, NULL); - } - - // Check list of fake floors and see if floorz/ceilingz need to be altered. - if (newsubsec->sector->ffloors) - { - ffloor_t *rover; - fixed_t delta1, delta2; - INT32 thingtop = midz + thiscam->height; - - for (rover = newsubsec->sector->ffloors; rover; rover = rover->next) - { - fixed_t topheight, bottomheight; - if (!(rover->flags & FF_BLOCKOTHERS) || !(rover->flags & FF_EXISTS) || !(rover->flags & FF_RENDERALL) || GETSECSPECIAL(rover->master->frontsector->special, 4) == 12) - continue; - - topheight = P_CameraGetFOFTopZ(thiscam, newsubsec->sector, rover, midx, midy, NULL); - bottomheight = P_CameraGetFOFBottomZ(thiscam, newsubsec->sector, rover, midx, midy, NULL); - - delta1 = midz - (bottomheight - + ((topheight - bottomheight)/2)); - delta2 = thingtop - (bottomheight - + ((topheight - bottomheight)/2)); - if (topheight > myfloorz && abs(delta1) < abs(delta2)) - myfloorz = topheight; - if (bottomheight < myceilingz && abs(delta1) >= abs(delta2)) - myceilingz = bottomheight; - } - } - - // Check polyobjects and see if floorz/ceilingz need to be altered - { - INT32 xl, xh, yl, yh, bx, by; - validcount++; - - xl = (unsigned)(tmbbox[BOXLEFT] - bmaporgx)>>MAPBLOCKSHIFT; - xh = (unsigned)(tmbbox[BOXRIGHT] - bmaporgx)>>MAPBLOCKSHIFT; - yl = (unsigned)(tmbbox[BOXBOTTOM] - bmaporgy)>>MAPBLOCKSHIFT; - yh = (unsigned)(tmbbox[BOXTOP] - bmaporgy)>>MAPBLOCKSHIFT; - - BMBOUNDFIX(xl, xh, yl, yh); - - for (by = yl; by <= yh; by++) - for (bx = xl; bx <= xh; bx++) - { - INT32 offset; - polymaplink_t *plink; // haleyjd 02/22/06 - - if (bx < 0 || by < 0 || bx >= bmapwidth || by >= bmapheight) - continue; - - offset = by*bmapwidth + bx; - - // haleyjd 02/22/06: consider polyobject lines - plink = polyblocklinks[offset]; - - while (plink) - { - polyobj_t *po = plink->po; - - if (po->validcount != validcount) // if polyobj hasn't been checked - { - sector_t *polysec; - fixed_t delta1, delta2, thingtop; - fixed_t polytop, polybottom; - - po->validcount = validcount; - - if (!P_PointInsidePolyobj(po, x, y) || !(po->flags & POF_SOLID)) - { - plink = (polymaplink_t *)(plink->link.next); - continue; - } - - // We're inside it! Yess... - polysec = po->lines[0]->backsector; - - if (GETSECSPECIAL(polysec->special, 4) == 12) - { // Camera noclip polyobj. - plink = (polymaplink_t *)(plink->link.next); - continue; - } - - if (po->flags & POF_CLIPPLANES) - { - polytop = polysec->ceilingheight; - polybottom = polysec->floorheight; - } - else - { - polytop = INT32_MAX; - polybottom = INT32_MIN; - } - - thingtop = midz + thiscam->height; - delta1 = midz - (polybottom + ((polytop - polybottom)/2)); - delta2 = thingtop - (polybottom + ((polytop - polybottom)/2)); - - if (polytop > myfloorz && abs(delta1) < abs(delta2)) - myfloorz = polytop; - - if (polybottom < myceilingz && abs(delta1) >= abs(delta2)) - myceilingz = polybottom; - } - plink = (polymaplink_t *)(plink->link.next); - } - } - } - - // crushed camera - if (myceilingz <= myfloorz + thiscam->height && !resetcalled && !cameranoclip) - { - P_ResetCamera(player, thiscam); - return true; - } - - // camera fit? - if (myceilingz != myfloorz - && myceilingz - thiscam->height < z) - { - z = myceilingz - thiscam->height-FixedMul(11*FRACUNIT, mo->scale); - // is the camera fit is there own sector - } - - // Make the camera a tad smarter with 3d floors - if (newsubsec->sector->ffloors && !cameranoclip) - { - ffloor_t *rover; - - for (rover = newsubsec->sector->ffloors; rover; rover = rover->next) - { - fixed_t topheight, bottomheight; - if ((rover->flags & FF_BLOCKOTHERS) && (rover->flags & FF_RENDERALL) && (rover->flags & FF_EXISTS) && GETSECSPECIAL(rover->master->frontsector->special, 4) == 12) - { - topheight = P_CameraGetFOFTopZ(thiscam, newsubsec->sector, rover, midx, midy, NULL); - bottomheight = P_CameraGetFOFBottomZ(thiscam, newsubsec->sector, rover, midx, midy, NULL); - - if (bottomheight - thiscam->height < z - && midz < bottomheight) - z = bottomheight - thiscam->height-FixedMul(11*FRACUNIT, mo->scale); - - else if (topheight + thiscam->height > z - && midz > topheight) - z = topheight; - - if ((mo->z >= topheight && midz < bottomheight) - || ((mo->z < bottomheight && mo->z+mo->height < topheight) && midz >= topheight)) - { - // Can't see - if (!resetcalled) - P_ResetCamera(player, thiscam); - return true; - } - } - } - } - } - - if (thiscam->z < thiscam->floorz && !cameranoclip) - thiscam->z = thiscam->floorz; + if (P_CheckNoclipCameraPosition(player, thiscam, x, y, z, resetcalled)) + return true; #endif // NOCLIPCAM // point viewed by the camera -- 2.54.0 From e105d8f51eae21b711202ecbdb42a8d42b134e68 Mon Sep 17 00:00:00 2001 From: Alug Date: Fri, 3 Jan 2025 15:54:44 +0100 Subject: [PATCH 25/53] apparently this is slower for everything but rendering --- src/d_clisrv.c | 2 +- src/hardware/hw_main.c | 2 +- src/hardware/hw_portal.c | 2 +- src/p_mobj.c | 4 ++-- src/p_setup.c | 4 ++-- src/p_user.c | 4 ++-- src/r_fps.c | 2 +- src/r_main.h | 11 ----------- src/s_sound.c | 4 ++-- 9 files changed, 12 insertions(+), 23 deletions(-) diff --git a/src/d_clisrv.c b/src/d_clisrv.c index e6cc26690..af6a82289 100644 --- a/src/d_clisrv.c +++ b/src/d_clisrv.c @@ -1959,7 +1959,7 @@ static void CL_ReloadReceivedSavegame(void) for (i = 0; i < MAXSPLITSCREENPLAYERS; i++) { - camera[i].subsector = R_PointInSubsectorFast(camera[i].x, camera[i].y); + camera[i].subsector = R_PointInSubsector(camera[i].x, camera[i].y); } cl_redownloadinggamestate = false; diff --git a/src/hardware/hw_main.c b/src/hardware/hw_main.c index 3d7fbbd50..0c2de5227 100644 --- a/src/hardware/hw_main.c +++ b/src/hardware/hw_main.c @@ -3172,7 +3172,7 @@ static gl_vissprite_t *HWR_NewVisSprite(void) // Finds a floor through which light does not pass. static fixed_t HWR_OpaqueFloorAtPos(fixed_t x, fixed_t y, fixed_t z, fixed_t height) { - const sector_t *sec = R_PointInSubsectorFast(x, y)->sector; + const sector_t *sec = R_PointInSubsector(x, y)->sector; fixed_t floorz = sec->floorheight; if (sec->ffloors) diff --git a/src/hardware/hw_portal.c b/src/hardware/hw_portal.c index f26e71331..27d77af2e 100644 --- a/src/hardware/hw_portal.c +++ b/src/hardware/hw_portal.c @@ -132,7 +132,7 @@ void HWR_PortalFrame(gl_portal_t* portal) { portalclipline = NULL; portalcullsector = NULL; - viewsector = R_PointInSubsectorFast(viewx, viewy)->sector; + viewsector = R_PointInSubsector(viewx, viewy)->sector; } } diff --git a/src/p_mobj.c b/src/p_mobj.c index 03e7e9f99..4a7a34918 100644 --- a/src/p_mobj.c +++ b/src/p_mobj.c @@ -3337,7 +3337,7 @@ boolean P_CameraThinker(player_t *player, camera_t *thiscam, boolean resetcalled if (!itsatwodlevel) P_CheckCameraPosition(thiscam->x, thiscam->y, thiscam); - thiscam->subsector = R_PointInSubsectorFast(thiscam->x, thiscam->y); + thiscam->subsector = R_PointInSubsector(thiscam->x, thiscam->y); thiscam->floorz = tmfloorz; thiscam->ceilingz = tmceilingz; @@ -10415,7 +10415,7 @@ void P_PrecipitationEffects(void) for (y = yl; y <= yh; y += RADIUSSTEP) for (x = xl; x <= xh; x += RADIUSSTEP) { - if (R_PointInSubsectorFast((fixed_t)x, (fixed_t)y)->sector->ceilingpic != skyflatnum) // Found the outdoors! + if (R_PointInSubsector((fixed_t)x, (fixed_t)y)->sector->ceilingpic != skyflatnum) // Found the outdoors! continue; newdist = S_CalculateSoundDistance(players[displayplayers[0]].mo->x, players[displayplayers[0]].mo->y, 0, (fixed_t)x, (fixed_t)y, 0); diff --git a/src/p_setup.c b/src/p_setup.c index 0e7f89dcf..477b805db 100644 --- a/src/p_setup.c +++ b/src/p_setup.c @@ -2437,7 +2437,7 @@ static void P_SetupCamera(UINT8 pnum, camera_t *cam) cam->y = players[pnum].mo->y; cam->z = players[pnum].mo->z; cam->angle = players[pnum].mo->angle; - cam->subsector = R_PointInSubsectorFast(cam->x, cam->y); // make sure camera has a subsector set -- Monster Iestyn (12/11/18) + cam->subsector = R_PointInSubsector(cam->x, cam->y); // make sure camera has a subsector set -- Monster Iestyn (12/11/18) } else { @@ -2462,7 +2462,7 @@ static void P_SetupCamera(UINT8 pnum, camera_t *cam) cam->y = thing->y; cam->z = thing->z; cam->angle = FixedAngle((fixed_t)thing->angle << FRACBITS); - cam->subsector = R_PointInSubsectorFast(cam->x, cam->y); // make sure camera has a subsector set -- Monster Iestyn (12/11/18) + cam->subsector = R_PointInSubsector(cam->x, cam->y); // make sure camera has a subsector set -- Monster Iestyn (12/11/18) } } diff --git a/src/p_user.c b/src/p_user.c index 51900717e..0e587e659 100644 --- a/src/p_user.c +++ b/src/p_user.c @@ -3348,7 +3348,7 @@ void P_DemoCameraMovement(camera_t *cam) democam.soundmobj = awayviewmobj_hack; // update subsector to avoid crashes; - cam->subsector = R_PointInSubsectorFast(cam->x, cam->y); + cam->subsector = R_PointInSubsector(cam->x, cam->y); } void P_ResetCamera(player_t *player, camera_t *thiscam) @@ -3390,7 +3390,7 @@ void P_ResetCamera(player_t *player, camera_t *thiscam) thiscam->relativex = 0; - thiscam->subsector = R_PointInSubsectorFast(thiscam->x,thiscam->y); + thiscam->subsector = R_PointInSubsector(thiscam->x,thiscam->y); thiscam->radius = 20*FRACUNIT; thiscam->height = 16*FRACUNIT; diff --git a/src/r_fps.c b/src/r_fps.c index b861dea56..92eb37a32 100644 --- a/src/r_fps.c +++ b/src/r_fps.c @@ -198,7 +198,7 @@ void R_InterpolateView(fixed_t frac, boolean forceinvalid) viewcos = FINECOSINE(viewangle>>ANGLETOFINESHIFT); viewplayer = newview->player; - viewsector = R_PointInSubsectorFast(viewx, viewy)->sector; + viewsector = R_PointInSubsector(viewx, viewy)->sector; R_SetupFreelook(); } diff --git a/src/r_main.h b/src/r_main.h index 523e924d5..c66c9bf55 100644 --- a/src/r_main.h +++ b/src/r_main.h @@ -140,17 +140,6 @@ FUNCINLINE static ATTRINLINE subsector_t *R_PointInSubsector(fixed_t x, fixed_t return &subsectors[nodenum & ~NF_SUBSECTOR]; } -// uses R_PointOnSideFast -// SHOULD NOT BE USED FOR ANYTHING GAMEPLAY RELATED!! -FUNCINLINE static ATTRINLINE subsector_t *R_PointInSubsectorFast(fixed_t x, fixed_t y) -{ - size_t nodenum = numnodes-1; - - while (!(nodenum & NF_SUBSECTOR)) - nodenum = nodes[nodenum].children[R_PointOnSideFast(x, y, nodes+nodenum)]; - - return &subsectors[nodenum & ~NF_SUBSECTOR]; -} #define R_PointToDist(x, y) R_PointToDist2(viewx, viewy, x, y) #define R_PointToDist2(px2, py2, px1, py1) FixedHypot((px1) - (px2), (py1) - (py2)) diff --git a/src/s_sound.c b/src/s_sound.c index 06f6be1eb..4181d57d4 100644 --- a/src/s_sound.c +++ b/src/s_sound.c @@ -962,7 +962,7 @@ boolean S_AdjustSoundParams(const mobj_t *listener, const mobj_t *source, INT32 INT64 x, y, yl, yh, xl, xh; fixed_t newdist; - if (R_PointInSubsectorFast(listensource.x, listensource.y)->sector->ceilingpic == skyflatnum) + if (R_PointInSubsector(listensource.x, listensource.y)->sector->ceilingpic == skyflatnum) approx_dist = 0; else { @@ -975,7 +975,7 @@ boolean S_AdjustSoundParams(const mobj_t *listener, const mobj_t *source, INT32 for (y = yl; y <= yh; y += FRACUNIT*64) for (x = xl; x <= xh; x += FRACUNIT*64) { - if (R_PointInSubsectorFast(x, y)->sector->ceilingpic == skyflatnum) + if (R_PointInSubsector(x, y)->sector->ceilingpic == skyflatnum) { // Found the outdoors! newdist = S_CalculateSoundDistance(listensource.x, listensource.y, 0, x, y, 0); -- 2.54.0 From 8b94aded16a095efd3d58b42ca5bd597b2d88646 Mon Sep 17 00:00:00 2001 From: Alug Date: Thu, 2 Jan 2025 22:18:52 +0100 Subject: [PATCH 26/53] smol fix --- src/p_mobj.c | 3 +++ src/r_main.h | 4 ++-- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/src/p_mobj.c b/src/p_mobj.c index 4a7a34918..30bc10c9a 100644 --- a/src/p_mobj.c +++ b/src/p_mobj.c @@ -3568,11 +3568,14 @@ static void CalculatePrecipFloor(precipmobj_t *mobj) { // recalculate floorz each time const sector_t *mobjsecsubsec; + if (mobj && mobj->subsector && mobj->subsector->sector) mobjsecsubsec = mobj->subsector->sector; else return; + mobj->floorz = P_GetSectorFloorZAt(mobjsecsubsec, mobj->x, mobj->y); + if (mobjsecsubsec->ffloors) { ffloor_t *rover; diff --git a/src/r_main.h b/src/r_main.h index c66c9bf55..bb407ab4f 100644 --- a/src/r_main.h +++ b/src/r_main.h @@ -104,7 +104,7 @@ FUNCINLINE static ATTRINLINE PUREFUNC INT32 R_PointOnSide(fixed_t x, fixed_t y, FUNCINLINE static ATTRINLINE PUREFUNC INT32 R_PointOnSideFast(fixed_t x, fixed_t y, const node_t *node) { // use cross product to determine side quickly - return ((INT64)y - node->y) * node->dx - ((INT64)x - node->x) * node->dy > 0; + return ((((INT64)y - node->y) * node->dx - ((INT64)x - node->x) * node->dy) >= 0); } FUNCINLINE static ATTRINLINE PUREFUNC INT32 R_PointOnSegSide(fixed_t x, fixed_t y, const seg_t *line) @@ -115,7 +115,7 @@ FUNCINLINE static ATTRINLINE PUREFUNC INT32 R_PointOnSegSide(fixed_t x, fixed_t fixed_t ldy = line->v2->y - ly; // use cross product to determine side quickly - return ((INT64)y - ly) * ldx - ((INT64)x - lx) * ldy > 0; + return ((((INT64)y - ly) * ldx - ((INT64)x - lx) * ldy) >= 0); } angle_t R_PointToAngle(fixed_t x, fixed_t y); -- 2.54.0 From c5b70ccc4aae9880768310f40263dac85be52a66 Mon Sep 17 00:00:00 2001 From: Alug Date: Fri, 3 Jan 2025 15:51:38 +0100 Subject: [PATCH 27/53] do NOT repeatedly call M_Responder!! "thread safety" or smth also put stuff into two seperate functions, since i started hating nesting --- src/d_main.c | 71 ++++++++++++++++++++++++++++++++-------------------- 1 file changed, 44 insertions(+), 27 deletions(-) diff --git a/src/d_main.c b/src/d_main.c index f9e1ca27e..ac4326f65 100644 --- a/src/d_main.c +++ b/src/d_main.c @@ -165,6 +165,48 @@ UINT8 ctrldown = 0; // 0x1 left, 0x2 right UINT8 altdown = 0; // 0x1 left, 0x2 right boolean capslock = 0; // gee i wonder what this does. +static void D_PadScrollInput(int input) +{ + event_t myev = {0, 0, 0, 0}; + myev.type = ev_keydown; + myev.data1 = input; + D_PostEvent(&myev); // put into eventlist +} + +#define SCROLLDELAY 19 // TICRATE * ( (k+2) (1 - [wz + h + j - q]^2 - [(gk + 2g + k + 1)(h + j) + h - z]^2 - [16(k + 1)^3(k + 2)(n + 1)^2 + 1 - f^2]^2 calculated by my butt + +// this is absolutely awful and i hate it lmao +// but le hAx0r to make dpad also be able to scroll in the menu +static void D_GamePadMenuScrollTicker(void) +{ + static SINT8 menuInputDelayTimer = 0; + int key = 0; // butt-on output + + // wish i had a switch ono + if (DPADUPSCROLL) + key = KEY_UPARROW; + else if (DPADDOWNSCROLL) + key = KEY_DOWNARROW; + else if (DPADLEFTSCROLL) + key = KEY_LEFTARROW; + else if (DPADRIGHTSCROLL) + key = KEY_RIGHTARROW; + + if (key) + { + if (menuInputDelayTimer < SCROLLDELAY) + menuInputDelayTimer++; + + if (menuInputDelayTimer == SCROLLDELAY) + D_PadScrollInput(key); + } + else + { + menuInputDelayTimer = 0; + } +} +#undef SCROLLDELAY + static inline void D_DeviceLEDTick(void) { UINT8 i; @@ -651,7 +693,6 @@ static boolean D_Display(void) // ========================================================================= tic_t rendergametic; -static SINT8 menuInputDelayTimer = 0; void D_SRB2Loop(void) { @@ -774,35 +815,11 @@ void D_SRB2Loop(void) doDisplay = true; } -#define DPADSCROLLINPUT(INPUT)\ - {\ - myev.data1 = INPUT;\ - M_Responder(&myev);\ - } // this is absolutely awful and i hate it lmao - if (menuactive && (DPADUPSCROLL || DPADDOWNSCROLL || DPADLEFTSCROLL || DPADRIGHTSCROLL)) + if (menuactive) { - event_t myev; - myev.type = ev_keydown; - - if (menuInputDelayTimer < 19) - menuInputDelayTimer++; - - if (menuInputDelayTimer == 19) // TICRATE * ( (k+2) (1 - [wz + h + j - q]^2 - [(gk + 2g + k + 1)(h + j) + h - z]^2 - [16(k + 1)^3(k + 2)(n + 1)^2 + 1 - f^2]^2 calculated by my butt - { - if (DPADUPSCROLL) - DPADSCROLLINPUT(KEY_UPARROW) - else if (DPADDOWNSCROLL) - DPADSCROLLINPUT(KEY_DOWNARROW) - else if (DPADLEFTSCROLL) - DPADSCROLLINPUT(KEY_LEFTARROW) - else if (DPADRIGHTSCROLL) - DPADSCROLLINPUT(KEY_RIGHTARROW) - } + D_GamePadMenuScrollTicker(); } - else - menuInputDelayTimer = 0; -#undef DPADSCROLLINPUT D_DeviceLEDTick(); } -- 2.54.0 From b69bb8500318f4c3ed0387c685a9a1b90cb7a334 Mon Sep 17 00:00:00 2001 From: Alug Date: Fri, 3 Jan 2025 20:09:28 +0100 Subject: [PATCH 28/53] remove redundant stuff can just set this all the time, its only used when menu is active anyways so it doesent matter if we set it --- src/d_main.c | 5 ++--- src/m_menu.c | 26 ++++++++------------------ 2 files changed, 10 insertions(+), 21 deletions(-) diff --git a/src/d_main.c b/src/d_main.c index ac4326f65..94fe8792d 100644 --- a/src/d_main.c +++ b/src/d_main.c @@ -165,7 +165,7 @@ UINT8 ctrldown = 0; // 0x1 left, 0x2 right UINT8 altdown = 0; // 0x1 left, 0x2 right boolean capslock = 0; // gee i wonder what this does. -static void D_PadScrollInput(int input) +static void D_PadMenuScrollInput(int input) { event_t myev = {0, 0, 0, 0}; myev.type = ev_keydown; @@ -198,7 +198,7 @@ static void D_GamePadMenuScrollTicker(void) menuInputDelayTimer++; if (menuInputDelayTimer == SCROLLDELAY) - D_PadScrollInput(key); + D_PadMenuScrollInput(key); } else { @@ -815,7 +815,6 @@ void D_SRB2Loop(void) doDisplay = true; } - // this is absolutely awful and i hate it lmao if (menuactive) { D_GamePadMenuScrollTicker(); diff --git a/src/m_menu.c b/src/m_menu.c index 03eeef210..6272f57fa 100644 --- a/src/m_menu.c +++ b/src/m_menu.c @@ -3675,40 +3675,28 @@ boolean M_Responder(event_t *ev) break; case KEY_HAT1: ch = KEY_UPARROW; + DPADUPSCROLL = true; break; case KEY_HAT1 + 1: ch = KEY_DOWNARROW; + DPADDOWNSCROLL = true; break; case KEY_HAT1 + 2: ch = KEY_LEFTARROW; + DPADLEFTSCROLL = true; break; case KEY_HAT1 + 3: ch = KEY_RIGHTARROW; + DPADRIGHTSCROLL = true; break; } if (menuactive) { - switch (ev->data1) // if you pressed it set those to true - { - case KEY_HAT1: - DPADUPSCROLL = true; - break; - case KEY_HAT1 + 1: - DPADDOWNSCROLL = true; - break; - case KEY_HAT1 + 2: - DPADLEFTSCROLL = true; - break; - case KEY_HAT1 + 3: - DPADRIGHTSCROLL = true; - break; - } - if (currentMenu == &MISC_ChangeLevelDef || currentMenu == &MP_OfflineServerDef || currentMenu == &MP_ServerDef) { - if (ev->data1 == gamecontrol[gc_fire][0] - || ev->data1 == gamecontrol[gc_fire][1]) + if (ch == gamecontrol[gc_fire][0] + || ch == gamecontrol[gc_fire][1]) { COM_ImmedExecute("add kartencore 1"); } @@ -4383,10 +4371,12 @@ void M_StartControlPanel(void) menuactive = true; + // reset those just in case the game missed the keyup event DPADUPSCROLL = false; DPADDOWNSCROLL = false; DPADLEFTSCROLL = false; DPADRIGHTSCROLL = false; + // if (demo.playback) { -- 2.54.0 From 98db1a57576d0875babb70ad04215507b28a4bca Mon Sep 17 00:00:00 2001 From: Alug Date: Sun, 5 Jan 2025 00:32:23 +0100 Subject: [PATCH 29/53] Further improve sleep accuracy on UNIX systems hanichad https://git.do.srb2.org/STJr/SRB2/-/merge_requests/2583 --- src/sdl/i_system.c | 27 +++++++++++++++++---------- 1 file changed, 17 insertions(+), 10 deletions(-) diff --git a/src/sdl/i_system.c b/src/sdl/i_system.c index 882535203..102f1b162 100644 --- a/src/sdl/i_system.c +++ b/src/sdl/i_system.c @@ -2121,16 +2121,24 @@ void I_Sleep(UINT32 ms) void I_SleepDuration(precise_t duration) { -#if defined(__linux__) || defined(__FreeBSD__) +#if defined(__linux__) || defined(__FreeBSD__) || defined(__HAIKU__) UINT64 precision = I_GetPrecisePrecision(); - struct timespec ts = { - .tv_sec = duration / precision, - .tv_nsec = duration * 1000000000 / precision % 1000000000, - }; - int status; - do status = clock_nanosleep(CLOCK_MONOTONIC, 0, &ts, &ts); - while (status == EINTR); -#else + precise_t dest = I_GetPreciseTime() + duration; + if (duration > 100000) + { + duration -= 100000; // 0.1 ms slack + struct timespec ts = { + .tv_sec = duration / precision, + .tv_nsec = duration * 1000000000 / precision % 1000000000, + }; + int status; + do status = clock_nanosleep(CLOCK_MONOTONIC, 0, &ts, &ts); + while (status == EINTR); + } + + // busy-wait the rest + while (((INT64)dest - (INT64)I_GetPreciseTime()) > 0); +#elif defined (MIN_SLEEP_DURATION_MS) UINT64 precision = I_GetPrecisePrecision(); INT32 sleepvalue = cv_sleep.value; UINT64 delaygranularity; @@ -2159,7 +2167,6 @@ void I_SleepDuration(precise_t duration) } // Otherwise, this is a spinloop. - cur = I_GetPreciseTime(); } #endif -- 2.54.0 From 92649a393dbb240866c176173433c4870ee81fdf Mon Sep 17 00:00:00 2001 From: Alug Date: Sun, 5 Jan 2025 00:41:41 +0100 Subject: [PATCH 30/53] dont cast "infinity" to int lel --- src/d_main.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/d_main.c b/src/d_main.c index 94fe8792d..9bbaa6017 100644 --- a/src/d_main.c +++ b/src/d_main.c @@ -743,7 +743,7 @@ void D_SRB2Loop(void) { // Casting the return value of a function is bad practice (apparently) - double budget = round((1.0 / R_GetFramerateCap()) * I_GetPrecisePrecision()); + double budget = ((R_GetFramerateCap() == 0) ? 0.0 : round((1.0 / R_GetFramerateCap()) * I_GetPrecisePrecision())); capbudget = (precise_t) budget; } -- 2.54.0 From 8ff5cc7cbb21af85ee60c6779df4f40b7cafb67e Mon Sep 17 00:00:00 2001 From: Alug Date: Sun, 5 Jan 2025 15:11:09 +0100 Subject: [PATCH 31/53] --------- --- src/k_kart.c | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/src/k_kart.c b/src/k_kart.c index a6aa76e4d..70410e1c3 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -8179,11 +8179,7 @@ void K_drawKartTimestamp(tic_t drawtime, INT32 TX, INT32 TY, INT16 emblemmap, UI ; else if (mode && !drawtime) { - // apostrophe location _'__ __ - V_DrawKartString(TX+24, TY+3, splitflags, va("'")); - - // quotation mark location _ __"__ - V_DrawKartString(TX+60, TY+3, splitflags, va("\"")); + V_DrawKartString(TX, TY+3, splitflags, va("--'--\"--")); } else { -- 2.54.0 From 7ca2051f8458d14ecdf44b76b67837c797834eee Mon Sep 17 00:00:00 2001 From: Alug Date: Sun, 5 Jan 2025 17:41:02 +0100 Subject: [PATCH 32/53] Adjust slack based on precision https://git.do.srb2.org/STJr/SRB2/-/commit/d20552c49d9fd6a2075ebd7d46b0b133c69f1dbe?merge_request_iid=2583 --- src/sdl/i_system.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/sdl/i_system.c b/src/sdl/i_system.c index 102f1b162..86e818901 100644 --- a/src/sdl/i_system.c +++ b/src/sdl/i_system.c @@ -2124,9 +2124,9 @@ void I_SleepDuration(precise_t duration) #if defined(__linux__) || defined(__FreeBSD__) || defined(__HAIKU__) UINT64 precision = I_GetPrecisePrecision(); precise_t dest = I_GetPreciseTime() + duration; - if (duration > 100000) + if (duration * 100000 / precision > 1) { - duration -= 100000; // 0.1 ms slack + duration -= (precision / 10000); // 0.1 ms slack struct timespec ts = { .tv_sec = duration / precision, .tv_nsec = duration * 1000000000 / precision % 1000000000, -- 2.54.0 From 718fe7e8ae86bac9d1c89a987cd422daaebb6086 Mon Sep 17 00:00:00 2001 From: Alug Date: Sun, 5 Jan 2025 20:12:19 +0100 Subject: [PATCH 33/53] slight slep optimization https://git.do.srb2.org/STJr/SRB2/-/commit/1da55066d43ed6a0cb666999c20316bef463024b?merge_request_iid=2583 --- src/sdl/i_system.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/sdl/i_system.c b/src/sdl/i_system.c index 86e818901..2c8b59ce1 100644 --- a/src/sdl/i_system.c +++ b/src/sdl/i_system.c @@ -2124,9 +2124,10 @@ void I_SleepDuration(precise_t duration) #if defined(__linux__) || defined(__FreeBSD__) || defined(__HAIKU__) UINT64 precision = I_GetPrecisePrecision(); precise_t dest = I_GetPreciseTime() + duration; - if (duration * 100000 / precision > 1) + precise_t slack = (precision / 10000); // 0.1 ms slack + if (duration > slack) { - duration -= (precision / 10000); // 0.1 ms slack + duration -= slack; struct timespec ts = { .tv_sec = duration / precision, .tv_nsec = duration * 1000000000 / precision % 1000000000, -- 2.54.0 From 890779713ac34ebd469fae41924cda18543ece5e Mon Sep 17 00:00:00 2001 From: Alug Date: Sun, 5 Jan 2025 21:23:45 +0100 Subject: [PATCH 34/53] turn off any active menus when using demo play commands --- src/d_netcmd.c | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/d_netcmd.c b/src/d_netcmd.c index a6943fe6a..dfd8eda5e 100644 --- a/src/d_netcmd.c +++ b/src/d_netcmd.c @@ -2435,6 +2435,9 @@ static void Command_Playdemo_f(void) return; } + // turn off any open menus + M_ClearMenus(true); + // disconnect from server here? if (demo.playback) G_StopDemo(); @@ -2480,6 +2483,9 @@ static void Command_Timedemo_f(void) return; } + // turn off any open menus + M_ClearMenus(true); + // disconnect from server here? if (demo.playback) G_StopDemo(); -- 2.54.0 From e796f7e81fa91e9ee95ff4819436d22ae0af2c6e Mon Sep 17 00:00:00 2001 From: Alug Date: Sun, 5 Jan 2025 21:24:48 +0100 Subject: [PATCH 35/53] thats not timedemo lel --- src/d_netcmd.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/d_netcmd.c b/src/d_netcmd.c index dfd8eda5e..eaec437fe 100644 --- a/src/d_netcmd.c +++ b/src/d_netcmd.c @@ -2431,7 +2431,7 @@ static void Command_Playdemo_f(void) if (!demo.playback && gamestate == GS_LEVEL) // special case: allow starting another demo while watching a demo { - CONS_Printf(M_GetText("You can't time a demo while in a game.\n")); + CONS_Printf(M_GetText("You can't play a demo while in a game.\n")); return; } -- 2.54.0 From 7177b396e05ab3a94045b3abca05b55b0c8eeb7d Mon Sep 17 00:00:00 2001 From: Alug Date: Sun, 5 Jan 2025 23:02:27 +0100 Subject: [PATCH 36/53] any of those may be NULL in MakePatch no idea but this crap keeps crashing in some other place every single time i add a check somewhere else --- src/hardware/hw_cache.c | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/src/hardware/hw_cache.c b/src/hardware/hw_cache.c index ad140c025..65e120002 100644 --- a/src/hardware/hw_cache.c +++ b/src/hardware/hw_cache.c @@ -410,6 +410,16 @@ static void HWR_GenerateTexture(INT32 texnum, GLMapTexture_t *gltex, boolean noe // patch may be NULL if glMipmap has been initialised already and makebitmap is false void HWR_MakePatch (patch_t *patch, GLPatch_t *glPatch, GLMipmap_t *glMipmap, boolean makebitmap) { + if (glMipmap == NULL) + return; + + if (patch == NULL || glPatch == NULL) + { + Z_Free(glMipmap->data); + glMipmap->data = NULL; + return; + } + // don't do it twice (like a cache) if (glMipmap->width == 0) { -- 2.54.0 From afa66d0418681237d2f32f0b9944cd2490ff101c Mon Sep 17 00:00:00 2001 From: Alug Date: Mon, 6 Jan 2025 19:01:58 +0100 Subject: [PATCH 37/53] double the slack for slep --- src/sdl/i_system.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/sdl/i_system.c b/src/sdl/i_system.c index 2c8b59ce1..ff1651c3b 100644 --- a/src/sdl/i_system.c +++ b/src/sdl/i_system.c @@ -2124,7 +2124,7 @@ void I_SleepDuration(precise_t duration) #if defined(__linux__) || defined(__FreeBSD__) || defined(__HAIKU__) UINT64 precision = I_GetPrecisePrecision(); precise_t dest = I_GetPreciseTime() + duration; - precise_t slack = (precision / 10000); // 0.1 ms slack + precise_t slack = (precision / 5000); // 0.2 ms slack if (duration > slack) { duration -= slack; -- 2.54.0 From dbb5c1482b59550a44792b2a74478e26cf26bc57 Mon Sep 17 00:00:00 2001 From: Alug Date: Mon, 6 Jan 2025 19:49:29 +0100 Subject: [PATCH 38/53] add a little extra safety here ig this crashed on levelload once so idk maybe player was null ig --- src/d_main.c | 4 ++-- src/r_main.c | 19 ++++++++++++------- 2 files changed, 14 insertions(+), 9 deletions(-) diff --git a/src/d_main.c b/src/d_main.c index 9bbaa6017..95f7c895d 100644 --- a/src/d_main.c +++ b/src/d_main.c @@ -485,11 +485,11 @@ static boolean D_Display(void) { PS_START_TIMING(ps_rendercalltime); - R_ApplyLevelInterpolators(R_UsingFrameInterpolation() ? rendertimefrac : FRACUNIT); + R_ApplyLevelInterpolators(rendertimefrac); for (i = 0; i <= splitscreen; i++) { - if (players[displayplayers[i]].mo || players[displayplayers[i]].playerstate == PST_DEAD) + if (!P_MobjWasRemoved(players[displayplayers[i]].mo) || players[displayplayers[i]].playerstate == PST_DEAD) { viewssnum = i; diff --git a/src/r_main.c b/src/r_main.c index 9541fef41..511bbe293 100644 --- a/src/r_main.c +++ b/src/r_main.c @@ -1060,11 +1060,13 @@ subsector_t *R_IsPointInSubsector(fixed_t x, fixed_t y) mobj_t *viewmobj; -static void -R_SetupCommonFrame -( player_t * player, - subsector_t * subsector) +static void R_SetupCommonFrame(player_t * player, subsector_t * subsector) { + if (!player) + { + return; + } + newview->player = player; newview->x += quake.x; @@ -1073,7 +1075,7 @@ R_SetupCommonFrame newview->roll = R_ViewRollAngle(player); - if (subsector) + if (subsector != NULL) newview->sector = subsector->sector; else newview->sector = R_PointInSubsector(newview->x, newview->y)->sector; @@ -1214,7 +1216,7 @@ void R_SetupFrame(int s, boolean skybox) { player_t *player = &players[displayplayers[s]]; camera_t *thiscam = &camera[s]; - boolean chasecam = (cv_chasecam[s].value != 0); + boolean chasecam = (cv_chasecam[s].value); subsector_t * subsector = NULL; R_SetViewContext(VIEWCONTEXT_PLAYER1 + s); @@ -1263,7 +1265,10 @@ void R_SetupFrame(int s, boolean skybox) newview->y = thiscam->y; newview->z = thiscam->z + (thiscam->height>>1); - R_SetupCommonFrame(player, thiscam->subsector); + if (thiscam != NULL) + subsector = thiscam->subsector; + + R_SetupCommonFrame(player, subsector); } else // use the player's eyes view { -- 2.54.0 From ce31ceda651cdefbee9aaebefcbc7d5bf494eeaf Mon Sep 17 00:00:00 2001 From: Indev Date: Tue, 7 Jan 2025 14:52:19 +0300 Subject: [PATCH 39/53] If available, add map title into crash log --- src/sdl/i_system.c | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/src/sdl/i_system.c b/src/sdl/i_system.c index ff1651c3b..d3de6f6b0 100644 --- a/src/sdl/i_system.c +++ b/src/sdl/i_system.c @@ -178,6 +178,7 @@ static char returnWadPath[256]; #include "../d_net.h" #include "../g_game.h" #include "../filesrch.h" +#include "../z_zone.h" // Z_Free #include "endtxt.h" #include "sdlmain.h" @@ -344,7 +345,17 @@ static void write_backtrace(bt_crash_reason_t reason) fprintf(out, "Compiled: %s %s, commit %s, branch %s\n", compdate, comptime, comprevision, compbranch); if (gamestate == GS_LEVEL) - fprintf(out, "Game map: %s\n", G_BuildMapName(gamemap)); + { + char *title = G_BuildMapTitle(gamemap); + + if (title) + { + fprintf(out, "Game map: %s (%s)\n", title, G_BuildMapName(gamemap)); + Z_Free(title); + } + else + fprintf(out, "Game map: %s\n", G_BuildMapName(gamemap)); + } fprintf(out, "Time of crash: %s\n", asctime(timeinfo)); -- 2.54.0 From 864d747e3bbdcb6df62992ec92ed3b2f15e6cded Mon Sep 17 00:00:00 2001 From: Alug Date: Tue, 7 Jan 2025 19:49:36 +0100 Subject: [PATCH 40/53] check if subsector has sector before assigning --- src/r_main.c | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/src/r_main.c b/src/r_main.c index 511bbe293..2ccd926af 100644 --- a/src/r_main.c +++ b/src/r_main.c @@ -1062,11 +1062,6 @@ mobj_t *viewmobj; static void R_SetupCommonFrame(player_t * player, subsector_t * subsector) { - if (!player) - { - return; - } - newview->player = player; newview->x += quake.x; @@ -1075,7 +1070,7 @@ static void R_SetupCommonFrame(player_t * player, subsector_t * subsector) newview->roll = R_ViewRollAngle(player); - if (subsector != NULL) + if (subsector && subsector->sector) newview->sector = subsector->sector; else newview->sector = R_PointInSubsector(newview->x, newview->y)->sector; -- 2.54.0 From 5c5a5e200e1e8b3c68ef8a33efdde53585bdc2bd Mon Sep 17 00:00:00 2001 From: Alug Date: Tue, 7 Jan 2025 20:16:28 +0100 Subject: [PATCH 41/53] fix fbo crap once again --- src/sdl/i_video.c | 5 ----- src/sdl/ogl_sdl.c | 3 ++- 2 files changed, 2 insertions(+), 6 deletions(-) diff --git a/src/sdl/i_video.c b/src/sdl/i_video.c index 7af6455fe..609afc30a 100644 --- a/src/sdl/i_video.c +++ b/src/sdl/i_video.c @@ -707,11 +707,6 @@ static void I_CheckDesktopRes(void) int currentDisplayIndex = -1; SDL_DisplayMode curmode; - if (desktopwidth == vid.width && desktopheight == vid.height) - { - return; - } - desktopwidth = 0; desktopheight = 0; diff --git a/src/sdl/ogl_sdl.c b/src/sdl/ogl_sdl.c index 9093f9a18..8a3a0eabb 100644 --- a/src/sdl/ogl_sdl.c +++ b/src/sdl/ogl_sdl.c @@ -289,7 +289,8 @@ void OglSdlFinishUpdate(boolean waitvbl) #if defined (__unix__) #ifdef USE_FBO_OGL - xwaylandcrap = false; + if (loaded_config == true) + xwaylandcrap = false; #endif #endif } -- 2.54.0 From c0d4599a35196a691508f3476ee663c89c431689 Mon Sep 17 00:00:00 2001 From: Alug Date: Tue, 7 Jan 2025 23:48:41 +0100 Subject: [PATCH 42/53] TEST: revert sleep stuff for now dedi may sometimes get stuck here somehow --- src/sdl/i_system.c | 23 +++++++---------------- 1 file changed, 7 insertions(+), 16 deletions(-) diff --git a/src/sdl/i_system.c b/src/sdl/i_system.c index d3de6f6b0..7302a12e1 100644 --- a/src/sdl/i_system.c +++ b/src/sdl/i_system.c @@ -2134,22 +2134,13 @@ void I_SleepDuration(precise_t duration) { #if defined(__linux__) || defined(__FreeBSD__) || defined(__HAIKU__) UINT64 precision = I_GetPrecisePrecision(); - precise_t dest = I_GetPreciseTime() + duration; - precise_t slack = (precision / 5000); // 0.2 ms slack - if (duration > slack) - { - duration -= slack; - struct timespec ts = { - .tv_sec = duration / precision, - .tv_nsec = duration * 1000000000 / precision % 1000000000, - }; - int status; - do status = clock_nanosleep(CLOCK_MONOTONIC, 0, &ts, &ts); - while (status == EINTR); - } - - // busy-wait the rest - while (((INT64)dest - (INT64)I_GetPreciseTime()) > 0); + struct timespec ts = { + .tv_sec = duration / precision, + .tv_nsec = duration * 1000000000 / precision % 1000000000, + }; + int status; + do status = clock_nanosleep(CLOCK_MONOTONIC, 0, &ts, &ts); + while (status == EINTR); #elif defined (MIN_SLEEP_DURATION_MS) UINT64 precision = I_GetPrecisePrecision(); INT32 sleepvalue = cv_sleep.value; -- 2.54.0 From ee8fd22f3659498747dd03b3c4f40705c8ea1e19 Mon Sep 17 00:00:00 2001 From: Alug Date: Wed, 8 Jan 2025 00:13:27 +0100 Subject: [PATCH 43/53] oops fix software lel --- src/r_things.c | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/r_things.c b/src/r_things.c index 9bdb9ea67..1cca7bbed 100644 --- a/src/r_things.c +++ b/src/r_things.c @@ -623,7 +623,6 @@ void R_DrawMaskedColumn(column_t *column) { dc_source = (UINT8 *)column + 3; dc_sourcelength = column->length; - dc_texheight = column->length; dc_texturemid = basetexturemid - (topdelta<length); dc_sourcelength = column->length; - dc_texheight = column->length; for (s = (UINT8 *)column+2+column->length, d = dc_source; d < dc_source+column->length; --s) *d++ = *s; -- 2.54.0 From bb91d8e1e33acea5312536d27e4fffbb0977a099 Mon Sep 17 00:00:00 2001 From: Alug Date: Wed, 8 Jan 2025 01:33:37 +0100 Subject: [PATCH 44/53] dont rumble in freecam + player fix --- src/p_tick.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/p_tick.c b/src/p_tick.c index af4facd53..ec77d50cf 100644 --- a/src/p_tick.c +++ b/src/p_tick.c @@ -364,6 +364,8 @@ static void P_DeviceRumbleTick(void) UINT16 low = 0; UINT16 high = 0; + player_t *player = ((i == 0) ? &players[consoleplayer] : &players[displayplayers[i]]); + if (!cv_usejoystick[i].value) { continue; @@ -374,14 +376,12 @@ static void P_DeviceRumbleTick(void) continue; } - player_t *player = &players[displayplayers[i]]; - - if (!P_IsLocalPlayer(player)) + if (player->spectator) { continue; } - if (!playeringame[displayplayers[i]] || player->spectator) + if (camera[i].freecam) { continue; } -- 2.54.0 From f74cd97c4b1567125e29e2465bb7e1790e9aef61 Mon Sep 17 00:00:00 2001 From: Alug Date: Tue, 7 Jan 2025 22:47:35 +0100 Subject: [PATCH 45/53] clean up this mess a little --- src/r_patch.c | 574 ++++++++++++-------------------------------------- src/r_patch.h | 6 +- 2 files changed, 131 insertions(+), 449 deletions(-) diff --git a/src/r_patch.c b/src/r_patch.c index 50dda0c5f..75bd3361c 100644 --- a/src/r_patch.c +++ b/src/r_patch.c @@ -28,425 +28,6 @@ #include "hardware/hw_glob.h" #endif -static unsigned char imgbuf[1<<26]; - -// -// R_CheckIfPatch -// -// Returns true if the lump is a valid patch. -// -boolean R_CheckIfPatch(lumpnum_t lump) -{ - size_t size; - INT16 width, height; - patch_t *patch; - boolean result; - - size = W_LumpLength(lump); - - // minimum length of a valid Doom patch - if (size < 13) - return false; - - patch = (patch_t *)W_CacheLumpNum(lump, PU_STATIC); - - width = SHORT(patch->width); - height = SHORT(patch->height); - - result = (height > 0 && height <= 16384 && width > 0 && width <= 16384 && width < (INT16)(size / 4)); - - if (result) - { - // The dimensions seem like they might be valid for a patch, so - // check the column directory for extra security. All columns - // must begin after the column directory, and none of them must - // point past the end of the patch. - INT16 x; - - for (x = 0; x < width; x++) - { - UINT32 ofs = LONG(patch->columnofs[x]); - - // Need one byte for an empty column (but there's patches that don't know that!) - if (ofs < (UINT32)width * 4 + 8 || ofs >= (UINT32)size) - { - result = false; - break; - } - } - } - - return result; -} - -// -// R_TextureToFlat -// -// Convert a texture to a flat. -// -void R_TextureToFlat(size_t tex, UINT8 *flat) -{ - texture_t *texture = textures[tex]; - - fixed_t col, ofs; - column_t *column; - UINT8 *desttop, *dest, *deststop; - UINT8 *source; - - // yea - R_CheckTextureCache(tex); - - desttop = flat; - deststop = desttop + (texture->width * texture->height); - - for (col = 0; col < texture->width; col++, desttop++) - { - // no post_t info - if (!texture->holes) - { - column = (column_t *)(R_GetColumn(tex, col)); - source = (UINT8 *)(column); - dest = desttop; - for (ofs = 0; dest < deststop && ofs < texture->height; ofs++) - { - if (source[ofs] != TRANSPARENTPIXEL) - *dest = source[ofs]; - dest += texture->width; - } - } - else - { - INT32 topdelta, prevdelta = -1; - column = (column_t *)((UINT8 *)R_GetColumn(tex, col) - 3); - while (column->topdelta != 0xff) - { - topdelta = column->topdelta; - if (topdelta <= prevdelta) - topdelta += prevdelta; - prevdelta = topdelta; - - dest = desttop + (topdelta * texture->width); - source = (UINT8 *)column + 3; - for (ofs = 0; dest < deststop && ofs < column->length; ofs++) - { - if (source[ofs] != TRANSPARENTPIXEL) - *dest = source[ofs]; - dest += texture->width; - } - column = (column_t *)((UINT8 *)column + column->length + 4); - } - } - } -} - -// -// R_PatchToFlat -// -// Convert a patch to a flat. -// -void R_PatchToFlat(patch_t *patch, UINT8 *flat) -{ - fixed_t col, ofs; - column_t *column; - UINT8 *desttop, *dest, *deststop; - UINT8 *source; - - desttop = flat; - deststop = desttop + (SHORT(patch->width) * SHORT(patch->height)); - - for (col = 0; col < SHORT(patch->width); col++, desttop++) - { - INT32 topdelta, prevdelta = -1; - column = (column_t *)((UINT8 *)patch + LONG(patch->columnofs[col])); - - while (column->topdelta != 0xff) - { - topdelta = column->topdelta; - if (topdelta <= prevdelta) - topdelta += prevdelta; - prevdelta = topdelta; - - dest = desttop + (topdelta * SHORT(patch->width)); - source = (UINT8 *)(column) + 3; - for (ofs = 0; dest < deststop && ofs < column->length; ofs++) - { - *dest = source[ofs]; - dest += SHORT(patch->width); - } - column = (column_t *)((UINT8 *)column + column->length + 4); - } - } -} - -// -// R_PatchToMaskedFlat -// -// Convert a patch to a masked flat. -// Now, what is a "masked" flat anyway? -// It means the flat uses two bytes to store image data. -// The upper byte is used to store the transparent pixel, -// and the lower byte stores a palette index. -// -void R_PatchToMaskedFlat(patch_t *patch, UINT16 *raw, boolean flip) -{ - fixed_t col, ofs; - column_t *column; - UINT16 *desttop, *dest, *deststop; - UINT8 *source; - - desttop = raw; - deststop = desttop + (SHORT(patch->width) * SHORT(patch->height)); - - for (col = 0; col < SHORT(patch->width); col++, desttop++) - { - INT32 topdelta, prevdelta = -1; - column = (column_t *)((UINT8 *)patch + LONG(patch->columnofs[flip ? (patch->width-1-col) : col])); - while (column->topdelta != 0xff) - { - topdelta = column->topdelta; - if (topdelta <= prevdelta) - topdelta += prevdelta; - prevdelta = topdelta; - dest = desttop + (topdelta * SHORT(patch->width)); - source = (UINT8 *)(column) + 3; - for (ofs = 0; dest < deststop && ofs < column->length; ofs++) - { - *dest = source[ofs]; - dest += SHORT(patch->width); - } - column = (column_t *)((UINT8 *)column + column->length + 4); - } - } -} - -// -// R_FlatToPatch -// -// Convert a flat to a patch. -// -patch_t *R_FlatToPatch(UINT8 *raw, UINT16 width, UINT16 height, UINT16 leftoffset, UINT16 topoffset, size_t *destsize, boolean transparency) -{ - UINT32 x, y; - UINT8 *img; - UINT8 *imgptr = imgbuf; - UINT8 *colpointers, *startofspan; - size_t size = 0; - - if (!raw) - return NULL; - - // Write image size and offset - WRITEINT16(imgptr, width); - WRITEINT16(imgptr, height); - WRITEINT16(imgptr, leftoffset); - WRITEINT16(imgptr, topoffset); - - // Leave placeholder to column pointers - colpointers = imgptr; - imgptr += width*4; - - // Write columns - for (x = 0; x < width; x++) - { - int lastStartY = 0; - int spanSize = 0; - startofspan = NULL; - - // Write column pointer - WRITEINT32(colpointers, imgptr - imgbuf); - - // Write pixels - for (y = 0; y < height; y++) - { - UINT8 paletteIndex = raw[((y * width) + x)]; - boolean opaque = transparency ? (paletteIndex != TRANSPARENTPIXEL) : true; - - // End span if we have a transparent pixel - if (!opaque) - { - if (startofspan) - WRITEUINT8(imgptr, 0); - startofspan = NULL; - continue; - } - - // Start new column if we need to - if (!startofspan || spanSize == 255) - { - int writeY = y; - - // If we reached the span size limit, finish the previous span - if (startofspan) - WRITEUINT8(imgptr, 0); - - if (y > 254) - { - // Make sure we're aligned to 254 - if (lastStartY < 254) - { - WRITEUINT8(imgptr, 254); - WRITEUINT8(imgptr, 0); - imgptr += 2; - lastStartY = 254; - } - - // Write stopgap empty spans if needed - writeY = y - lastStartY; - - while (writeY > 254) - { - WRITEUINT8(imgptr, 254); - WRITEUINT8(imgptr, 0); - imgptr += 2; - writeY -= 254; - } - } - - startofspan = imgptr; - WRITEUINT8(imgptr, writeY); - imgptr += 2; - spanSize = 0; - - lastStartY = y; - } - - // Write the pixel - WRITEUINT8(imgptr, paletteIndex); - spanSize++; - startofspan[1] = spanSize; - } - - if (startofspan) - WRITEUINT8(imgptr, 0); - - WRITEUINT8(imgptr, 0xFF); - } - - size = imgptr-imgbuf; - img = Z_Malloc(size, PU_STATIC, NULL); - memcpy(img, imgbuf, size); - - Z_Free(raw); - - if (destsize != NULL) - *destsize = size; - return (patch_t *)img; -} - -// -// R_MaskedFlatToPatch -// -// Convert a masked flat to a patch. -// Explanation of "masked" flats in R_PatchToMaskedFlat. -// -patch_t *R_MaskedFlatToPatch(UINT16 *raw, UINT16 width, UINT16 height, UINT16 leftoffset, UINT16 topoffset, size_t *destsize) -{ - UINT32 x, y; - UINT8 *img; - UINT8 *imgptr = imgbuf; - UINT8 *colpointers, *startofspan; - size_t size = 0; - - if (!raw) - return NULL; - - // Write image size and offset - WRITEINT16(imgptr, width); - WRITEINT16(imgptr, height); - WRITEINT16(imgptr, leftoffset); - WRITEINT16(imgptr, topoffset); - - // Leave placeholder to column pointers - colpointers = imgptr; - imgptr += width*4; - - // Write columns - for (x = 0; x < width; x++) - { - int lastStartY = 0; - int spanSize = 0; - startofspan = NULL; - - // Write column pointer - WRITEINT32(colpointers, imgptr - imgbuf); - - // Write pixels - for (y = 0; y < height; y++) - { - UINT16 pixel = raw[((y * width) + x)]; - UINT8 paletteIndex = (pixel & 0xFF); - UINT8 opaque = (pixel != 0xFF00); // If 1, we have a pixel - - // End span if we have a transparent pixel - if (!opaque) - { - if (startofspan) - WRITEUINT8(imgptr, 0); - startofspan = NULL; - continue; - } - - // Start new column if we need to - if (!startofspan || spanSize == 255) - { - int writeY = y; - - // If we reached the span size limit, finish the previous span - if (startofspan) - WRITEUINT8(imgptr, 0); - - if (y > 254) - { - // Make sure we're aligned to 254 - if (lastStartY < 254) - { - WRITEUINT8(imgptr, 254); - WRITEUINT8(imgptr, 0); - imgptr += 2; - lastStartY = 254; - } - - // Write stopgap empty spans if needed - writeY = y - lastStartY; - - while (writeY > 254) - { - WRITEUINT8(imgptr, 254); - WRITEUINT8(imgptr, 0); - imgptr += 2; - writeY -= 254; - } - } - - startofspan = imgptr; - WRITEUINT8(imgptr, writeY); - imgptr += 2; - spanSize = 0; - - lastStartY = y; - } - - // Write the pixel - WRITEUINT8(imgptr, paletteIndex); - spanSize++; - startofspan[1] = spanSize; - } - - if (startofspan) - WRITEUINT8(imgptr, 0); - - WRITEUINT8(imgptr, 0xFF); - } - - size = imgptr-imgbuf; - img = Z_Malloc(size, PU_STATIC, NULL); - memcpy(img, imgbuf, size); - - if (destsize != NULL) - *destsize = size; - return (patch_t *)img; -} - // // R_ParseSpriteInfoFrame // @@ -745,6 +326,124 @@ void R_LoadSpriteInfoLumps(UINT16 wadnum, UINT16 numlumps) } } + +static unsigned char imgbuf[1<<26]; + +// +// R_MaskedFlatToPatch +// +// Convert a masked flat to a patch. +// Explanation of "masked" flats in R_PatchToMaskedFlat. +// +void *R_MaskedFlatToPatch(UINT16 *raw, UINT16 width, UINT16 height, UINT16 leftoffset, UINT16 topoffset, size_t *destsize) +{ + UINT32 x, y; + UINT8 *img; + UINT8 *imgptr = imgbuf; + UINT8 *colpointers, *startofspan; + size_t size = 0; + + if (!raw) + return NULL; + + // Write image size and offset + WRITEINT16(imgptr, width); + WRITEINT16(imgptr, height); + WRITEINT16(imgptr, leftoffset); + WRITEINT16(imgptr, topoffset); + + // Leave placeholder to column pointers + colpointers = imgptr; + imgptr += width*4; + + // Write columns + for (x = 0; x < width; x++) + { + int lastStartY = 0; + int spanSize = 0; + startofspan = NULL; + + // Write column pointer + WRITEINT32(colpointers, imgptr - imgbuf); + + // Write pixels + for (y = 0; y < height; y++) + { + UINT16 pixel = raw[((y * width) + x)]; + UINT8 paletteIndex = (pixel & 0xFF); + UINT8 opaque = (pixel != 0xFF00); // If 1, we have a pixel + + // End span if we have a transparent pixel + if (!opaque) + { + if (startofspan) + WRITEUINT8(imgptr, 0); + startofspan = NULL; + continue; + } + + // Start new column if we need to + if (!startofspan || spanSize == 255) + { + int writeY = y; + + // If we reached the span size limit, finish the previous span + if (startofspan) + WRITEUINT8(imgptr, 0); + + if (y > 254) + { + // Make sure we're aligned to 254 + if (lastStartY < 254) + { + WRITEUINT8(imgptr, 254); + WRITEUINT8(imgptr, 0); + imgptr += 2; + lastStartY = 254; + } + + // Write stopgap empty spans if needed + writeY = y - lastStartY; + + while (writeY > 254) + { + WRITEUINT8(imgptr, 254); + WRITEUINT8(imgptr, 0); + imgptr += 2; + writeY -= 254; + } + } + + startofspan = imgptr; + WRITEUINT8(imgptr, writeY); + imgptr += 2; + spanSize = 0; + + lastStartY = y; + } + + // Write the pixel + WRITEUINT8(imgptr, paletteIndex); + spanSize++; + startofspan[1] = spanSize; + } + + if (startofspan) + WRITEUINT8(imgptr, 0); + + WRITEUINT8(imgptr, 0xFF); + } + + size = imgptr-imgbuf; + img = Z_Malloc(size, PU_STATIC, NULL); + memcpy(img, imgbuf, size); + + if (destsize != NULL) + *destsize = size; + + return img; +} + static UINT16 GetPatchPixel(patch_t *patch, INT32 x, INT32 y, boolean flip) { fixed_t ofs; @@ -904,10 +603,6 @@ void RotatedPatch_DoRotation(rotsprite_t *rotsprite, patch_t *patch, INT32 angle UINT32 i; patch_t *rotated; -#ifdef HWRENDER - patch_t *hwpatch; -#endif - UINT16 *rawdst, *rawconv; size_t size; INT32 bflip = (flip != 0x00); @@ -1020,29 +715,20 @@ void RotatedPatch_DoRotation(rotsprite_t *rotsprite, patch_t *patch, INT32 angle } // make patch - rotated = R_MaskedFlatToPatch(rawconv, width, height, 0, 0, &size); - { - rotated->leftoffset = ox; - rotated->topoffset = oy; - } -#ifdef HWRENDER - if (rendermode == render_opengl) - { - hwpatch = R_CreateHardwarePatch(rotated); - } -#endif // HWRENDER - - //Z_ChangeTag(rotated, PU_PATCH_ROTATED); // important for memory clearing -#ifdef HWRENDER - if (rendermode == render_opengl) - Z_SetUser(hwpatch, (void **)(&rotsprite->patches[idx])); - else -#endif - Z_SetUser(rotated, (void **)(&rotsprite->patches[idx])); - - Z_Free(rawconv); + rotated = (patch_t *)R_MaskedFlatToPatch(rawconv, width, height, 0, 0, &size); rotated->leftoffset = ox; rotated->topoffset = oy; + +#ifdef HWRENDER + if (rendermode == render_opengl) + { + rotated = R_CreateHardwarePatch(rotated); + } +#endif // HWRENDER + + //Z_ChangeTag(rotated, PU_LEVEL); + Z_SetUser(rotated, (void **)(&rotsprite->patches[idx])); + Z_Free(rawconv); } #endif diff --git a/src/r_patch.h b/src/r_patch.h index 5edaa46fb..447f1b4fc 100644 --- a/src/r_patch.h +++ b/src/r_patch.h @@ -40,11 +40,7 @@ typedef struct // Conversions between patches / flats / textures... boolean R_CheckIfPatch(lumpnum_t lump); -void R_TextureToFlat(size_t tex, UINT8 *flat); -void R_PatchToFlat(patch_t *patch, UINT8 *flat); -void R_PatchToMaskedFlat(patch_t *patch, UINT16 *raw, boolean flip); -patch_t *R_FlatToPatch(UINT8 *raw, UINT16 width, UINT16 height, UINT16 leftoffset, UINT16 topoffset, size_t *destsize, boolean transparency); -patch_t *R_MaskedFlatToPatch(UINT16 *raw, UINT16 width, UINT16 height, UINT16 leftoffset, UINT16 topoffset, size_t *destsize); +void *R_MaskedFlatToPatch(UINT16 *raw, UINT16 width, UINT16 height, UINT16 leftoffset, UINT16 topoffset, size_t *destsize); // SpriteInfo extern spriteinfo_t spriteinfo[NUMSPRITES]; -- 2.54.0 From ddc8e4a29e739bba81b651759ef2f50d973254da Mon Sep 17 00:00:00 2001 From: Alug Date: Wed, 8 Jan 2025 01:46:56 +0100 Subject: [PATCH 46/53] clean up gamepad led stuff --- src/d_main.c | 2 +- src/g_input.c | 50 ++++++++++++++++++++++++++++---------------------- 2 files changed, 29 insertions(+), 23 deletions(-) diff --git a/src/d_main.c b/src/d_main.c index 95f7c895d..09218fe72 100644 --- a/src/d_main.c +++ b/src/d_main.c @@ -207,7 +207,7 @@ static void D_GamePadMenuScrollTicker(void) } #undef SCROLLDELAY -static inline void D_DeviceLEDTick(void) +static void D_DeviceLEDTick(void) { UINT8 i; UINT16 color[MAXSPLITSCREENPLAYERS]; diff --git a/src/g_input.c b/src/g_input.c index 7f2fff283..1f3c69464 100644 --- a/src/g_input.c +++ b/src/g_input.c @@ -908,18 +908,23 @@ static const char *gamecontrolname[num_gamecontrols] = #include "k_kart.h" -inline UINT16 G_GetSkinColor(INT32 player) +UINT16 G_GetSkinColor(INT32 playernum) { - // make rgb rainbow vomit when invul or flash blue when grow - if (cv_ledpowerup[player].value && gamestate == GS_LEVEL && players[displayplayers[player]].mo && (players[displayplayers[player]].kartstuff[k_invincibilitytimer] || players[displayplayers[player]].powers[pw_invulnerability] || players[displayplayers[player]].kartstuff[k_growshrinktimer])) - return players[displayplayers[player]].mo->color; + if (gamestate == GS_LEVEL) + { + player_t *player = &players[displayplayers[playernum]]; - // take actual player skincolour when ingame - if (gamestate == GS_LEVEL && players[displayplayers[player]].skincolor) - return players[displayplayers[player]].skincolor; + // make rgb rainbow vomit when invul or flash blue when grow + if (cv_ledpowerup[playernum].value && player->mo && (player->kartstuff[k_invincibilitytimer] || player->kartstuff[k_growshrinktimer] || player->powers[pw_invulnerability])) + return player->mo->color; + + // take actual player skincolour when ingame + if (player->skincolor) + return player->skincolor; + } // otherwise just fallback to whatever the cvar is - switch (player) + switch (playernum) { case 0: return cv_playercolor.value; @@ -939,49 +944,50 @@ inline UINT16 G_GetSkinColor(INT32 player) } } -void G_SetPlayerGamepadIndicatorColor(INT32 player, UINT16 color) +void G_SetPlayerGamepadIndicatorColor(INT32 playernum, UINT16 color) { INT32 device; UINT16 skincolor; byteColor_t byte_color; - I_Assert(player >= 0 && player < MAXSPLITSCREENPLAYERS); + I_Assert(playernum >= 0 && playernum < MAXSPLITSCREENPLAYERS); - if (cv_gamepadled[player].value == 0) + if (cv_gamepadled[playernum].value == 0) return; - device = cv_usejoystick[player].value; + device = cv_usejoystick[playernum].value; if (device <= 0) { return; } - skincolor = color ? color : G_GetSkinColor(player); + skincolor = color ? color : G_GetSkinColor(playernum); byte_color = V_GetColor(colortranslations[skincolor][8]).s; I_SetGamepadIndicatorColor(device, byte_color.red, byte_color.green, byte_color.blue); } -static void G_ResetPlayerGamepadIndicatorColor(INT32 player) +static void G_ResetPlayerGamepadIndicatorColor(INT32 playernum) { - if (cv_gamepadled[player].value == 0) + if (cv_gamepadled[playernum].value == 0) { - INT32 device = cv_usejoystick[player].value; + INT32 device = cv_usejoystick[playernum].value; + if (device <= 0) return; I_SetGamepadIndicatorColor(device, 0, 0, 255); } else - G_SetPlayerGamepadIndicatorColor(player, 0); + G_SetPlayerGamepadIndicatorColor(playernum, 0); } -static void G_ResetPlayerDeviceRumble(INT32 player) +static void G_ResetPlayerDeviceRumble(INT32 playernum) { INT32 device_id; - device_id = cv_usejoystick[player].value; + device_id = cv_usejoystick[playernum].value; if (device_id < 1) { @@ -1006,16 +1012,16 @@ void G_ResetAllDeviceRumbles(void) } } -void G_PlayerDeviceRumble(INT32 player, UINT16 low_strength, UINT16 high_strength, UINT32 duration) +void G_PlayerDeviceRumble(INT32 playernum, UINT16 low_strength, UINT16 high_strength, UINT32 duration) { INT32 device_id; - if (cv_rumble[player].value == 0) + if (cv_rumble[playernum].value == 0) { return; } - device_id = cv_usejoystick[player].value; + device_id = cv_usejoystick[playernum].value; if (device_id < 1) { -- 2.54.0 From cdfef0f884019bd8f5871adfb61a2743ef2273fb Mon Sep 17 00:00:00 2001 From: Alug Date: Wed, 8 Jan 2025 01:48:55 +0100 Subject: [PATCH 47/53] oops forgor those --- src/g_input.h | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/src/g_input.h b/src/g_input.h index 18fff51a4..f6e69337d 100644 --- a/src/g_input.h +++ b/src/g_input.h @@ -134,11 +134,10 @@ extern INT32 gamecontrol4[num_gamecontrols][2]; // peace to my little coder fingers! // check a gamecontrol being active or not -UINT16 G_GetSkinColor(INT32 player); -INT32 G_GetDeviceForPlayer(INT32 player); -void G_SetPlayerGamepadIndicatorColor(INT32 player, UINT16 color); -void G_PlayerDeviceRumble(INT32 player, UINT16 low_strength, UINT16 high_strength, UINT32 duration); +UINT16 G_GetSkinColor(INT32 playernum); +void G_SetPlayerGamepadIndicatorColor(INT32 playernum, UINT16 color); void G_ResetAllDeviceRumbles(void); +void G_PlayerDeviceRumble(INT32 playernum, UINT16 low_strength, UINT16 high_strength, UINT32 duration); // remaps the input event to a game control. void G_MapEventsToControls(event_t *ev); -- 2.54.0 From d01ed388958ee6322f69315cd60615201908c36a Mon Sep 17 00:00:00 2001 From: Alug Date: Wed, 8 Jan 2025 03:17:14 +0100 Subject: [PATCH 48/53] fix "connect" command not saving to last server --- src/d_clisrv.c | 2 ++ src/i_tcp.c | 4 ---- src/m_menu.c | 4 ---- 3 files changed, 2 insertions(+), 8 deletions(-) diff --git a/src/d_clisrv.c b/src/d_clisrv.c index af6a82289..775668d5b 100644 --- a/src/d_clisrv.c +++ b/src/d_clisrv.c @@ -3132,6 +3132,8 @@ static void Command_connect(void) CONS_Alert(CONS_ERROR, M_GetText("There is no network driver\n")); } + CV_Set(&cv_lastserver, I_GetNodeAddress(servernode)); + if (splitscreen != cv_splitplayers.value-1) { splitscreen = cv_splitplayers.value-1; diff --git a/src/i_tcp.c b/src/i_tcp.c index 14dd8b5ed..54c446258 100644 --- a/src/i_tcp.c +++ b/src/i_tcp.c @@ -1669,7 +1669,6 @@ boolean I_InitTcpNetwork(void) // server address only in ip if (serverhostname[0]) { - CV_Set(&cv_lastserver, serverhostname); COM_BufAddText("connect \""); COM_BufAddText(serverhostname); COM_BufAddText("\"\n"); @@ -1679,9 +1678,6 @@ boolean I_InitTcpNetwork(void) } else { - // Not quite sure if we want to save that but i'll do that for now - CV_Set(&cv_lastserver, "any"); - // so we're on a LAN COM_BufAddText("connect any\n"); diff --git a/src/m_menu.c b/src/m_menu.c index 6272f57fa..a2732c3a7 100644 --- a/src/m_menu.c +++ b/src/m_menu.c @@ -9433,9 +9433,6 @@ static void M_Connect(INT32 choice) { // do not call menuexitfunc M_ClearMenus(false); - - CV_Set(&cv_lastserver, I_GetNodeAddress(serverlist[choice-FIRSTSERVERLINE + serverlistpage * SERVERS_PER_PAGE].node)); - COM_BufAddText(va("connect node %d\n", serverlist[choice-FIRSTSERVERLINE + serverlistpage * SERVERS_PER_PAGE].node)); } @@ -10364,7 +10361,6 @@ static void M_ConnectIP(INT32 choice) M_ClearMenus(true); - CV_Set(&cv_lastserver,setupm_ip); COM_BufAddText(va("connect \"%s\"\n", setupm_ip)); // A little "please wait" message. -- 2.54.0 From 165803c95c069be734b78be6f04220d64f1aa6ca Mon Sep 17 00:00:00 2001 From: Alug Date: Wed, 8 Jan 2025 04:00:57 +0100 Subject: [PATCH 49/53] toggle for smol positionnum and posnum animation --- src/g_game.h | 2 ++ src/k_kart.c | 12 ++++++++++-- 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/src/g_game.h b/src/g_game.h index 3a957d00a..d092f229f 100644 --- a/src/g_game.h +++ b/src/g_game.h @@ -167,6 +167,8 @@ DECL_HUD_OFFSET(stat); // Stats #undef DECL_HUD_OFFSET_Y extern consvar_t cv_showinput; +extern consvar_t cv_posanim; +extern consvar_t cv_smallposnum; extern consvar_t cv_newspeedometer; extern consvar_t cv_saltyhop; diff --git a/src/k_kart.c b/src/k_kart.c index 70410e1c3..b8174dc57 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -79,6 +79,10 @@ consvar_t cv_showstats = {"showstats", "Off", CV_SAVE, CV_OnOff, NULL, 0, NULL, consvar_t cv_showinput = {"showinput", "Off", CV_SAVE, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL}; consvar_t cv_showlaptimes = {"showlaptimes", "Off", CV_SAVE, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL}; +consvar_t cv_posanim = {"postitionanimation", "On", CV_SAVE, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL}; +consvar_t cv_smallposnum = {"smallpositionnumber", "Off", CV_SAVE, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL}; + + CV_PossibleValue_t speedo_cons_t[NUMSPEEDOSTUFF]; consvar_t cv_newspeedometer = {"newspeedometer", "Default", CV_SAVE, speedo_cons_t, NULL, 0, NULL, NULL, 0, 0, NULL}; @@ -723,6 +727,10 @@ void K_RegisterKartStuff(void) CV_RegisterVar(&cv_showstats); CV_RegisterVar(&cv_showinput); + + CV_RegisterVar(&cv_posanim); + CV_RegisterVar(&cv_smallposnum); + CV_RegisterVar(&cv_showlaptimes); CV_RegisterVar(&cv_newspeedometer); @@ -8309,13 +8317,13 @@ static void K_DrawKartPositionNum(INT32 num) boolean flipvdraw = false; // used only for 2p splitscreen so overtaking doesn't make 1P's position fly off the screen. boolean overtake = false; - if (stplyr->kartstuff[k_positiondelay] || stplyr->exiting) + if ((cv_posanim.value && stplyr->kartstuff[k_positiondelay]) || stplyr->exiting) { scale *= 2; overtake = true; // this is used for splitscreen stuff in conjunction with flipdraw. } - if (splitscreen || (cv_showinput.value && !splitscreen)) + if (splitscreen || cv_smallposnum.value || cv_showinput.value) scale /= 2; W = FixedMul(W<>FRACBITS; -- 2.54.0 From 51e367a61d40caae37e472c9f1ff0d9d14d6e30c Mon Sep 17 00:00:00 2001 From: Alug Date: Wed, 8 Jan 2025 04:01:48 +0100 Subject: [PATCH 50/53] move saturn hud cvars to k_kart and fix driftgauge extra showing if there is no patch for it its kinda dumb, since technically would allow to not load all of em but im lazy and dont wanna change possiblevalues around --- src/d_main.c | 18 +++++++---- src/d_netcmd.c | 65 -------------------------------------- src/k_kart.c | 86 ++++++++++++++++++++++++++++++++++++++++++-------- src/k_kart.h | 1 + 4 files changed, 86 insertions(+), 84 deletions(-) diff --git a/src/d_main.c b/src/d_main.c index 09218fe72..209e7fb76 100644 --- a/src/d_main.c +++ b/src/d_main.c @@ -1571,8 +1571,10 @@ void D_SRB2Main(void) // Possible value that changes depending on whether required files for speedometer are found or not CV_PossibleValue_t speedo_cons_temp[NUMSPEEDOSTUFF] = {{1, "Default"}, {0, NULL}, {0, NULL}, {0, NULL}, {0, NULL}, {0, NULL}}; + CV_PossibleValue_t driftgaugestyle_cons_temp[NUMSPEEDOSTUFF] = {{1, "Default"}, {2, "Small"}, {3, "Big Numbers"}, {4, "Numbers Only"}, {0, NULL}, {0, NULL}}; // ugh i dont want this but bleh unsigned last_speedo_i = 0; -#define PUSHSPEEDO(id, name) { ++last_speedo_i; speedo_cons_temp[last_speedo_i].value = id; speedo_cons_temp[last_speedo_i].strvalue = name; } + unsigned last_driftgauge_i = 0; +#define PUSHCONS(cons, i, id, name) { ++i; cons[i].value = id; cons[i].strvalue = name; } if (found_extra_kart || found_extra2_kart || found_extra3_kart) // found the funny, add it in! { @@ -1588,7 +1590,7 @@ void D_SRB2Main(void) if (W_CheckMultipleLumps("SP_SMSTC", "K_TRNULL", "SP_MKMH", "SP_MMPH", "SP_MFRAC", "SP_MPERC", NULL)) { xtra_speedo = true; - PUSHSPEEDO(2, "Small"); + PUSHCONS(speedo_cons_temp, last_speedo_i, 2, "Small"); } if (W_LumpExists("SC_SMSTC")) @@ -1598,7 +1600,7 @@ void D_SRB2Main(void) if (W_CheckMultipleLumps("SP_AMSTC", "K_TRNULL", "SP_AKMH", "SP_AMPH", "SP_AFRAC", "SP_APERC", NULL)) { achi_speedo = true; - PUSHSPEEDO(3, "Achii"); + PUSHCONS(speedo_cons_temp, last_speedo_i, 3, "Achii"); } if (W_CheckMultipleLumps("SC_AMSTC", "K_TRNULL", "SC_AKMH", "SC_AMPH", "SC_AFRAC", "SC_APERC", NULL)) @@ -1624,7 +1626,7 @@ void D_SRB2Main(void) "K_KZSP20", "K_KZSP21", "K_KZSP22", "K_KZSP23", "K_KZSP24", "K_KZSP25", NULL)) { kartzspeedo = true; - PUSHSPEEDO(4, "P-Meter"); + PUSHCONS(speedo_cons_temp, last_speedo_i, 4, "P-Meter"); } // stat display for extended player setup @@ -1637,7 +1639,9 @@ void D_SRB2Main(void) nametaggfx = true; if (W_CheckMultipleLumps("K_DGAU","K_DCAU","K_DGSU","K_DCSU", NULL)) + { driftgaugegfx = true; + } if (found_extra3_kart) { @@ -1645,7 +1649,8 @@ void D_SRB2Main(void) if (W_LumpExists("SP_SM3TC")) { xtra_speedo3 = true; - PUSHSPEEDO(5, "Extra"); + PUSHCONS(speedo_cons_temp, last_speedo_i, 5, "Extra"); + PUSHCONS(driftgaugestyle_cons_temp, last_driftgauge_i, 5, "Extra"); } if (W_LumpExists("SC_SM3TC")) @@ -1653,8 +1658,9 @@ void D_SRB2Main(void) } } -#undef PUSHSPEEDO +#undef PUSHCONS memcpy(speedo_cons_t, speedo_cons_temp, sizeof(speedo_cons_t)); + memcpy(driftgaugestyle_cons_t, driftgaugestyle_cons_temp, sizeof(driftgaugestyle_cons_t)); // Do it before P_InitMapData because PNG patch // conversion sometimes needs the palette diff --git a/src/d_netcmd.c b/src/d_netcmd.c index eaec437fe..b01f87e5a 100644 --- a/src/d_netcmd.c +++ b/src/d_netcmd.c @@ -490,12 +490,6 @@ consvar_t cv_pingstyle = {"pingstyle", "New", CV_SAVE, cv_pingstyle_cons_t, 0, 0 consvar_t cv_luaimmersion = {"luaimmersion", "On", CV_SAVE, CV_OnOff, 0, 0, NULL, NULL, 0, 0, NULL}; -consvar_t cv_minihead = {"smallminimapplayers", "Off", CV_SAVE, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL}; - -consvar_t cv_showminimapnames = {"showminimapnames", "Off", CV_SAVE, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL}; - -consvar_t cv_showlapemblem = {"showlapemblem", "On", CV_SAVE, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL}; - consvar_t cv_showviewpointtext = {"showviewpointtext", "On", CV_SAVE, CV_OnOff, 0, 0, NULL, NULL, 0, 0, NULL}; consvar_t cv_showdownloadprompt = {"showdownloadprompt", "On", CV_SAVE, CV_OnOff, 0, 0, NULL, NULL, 0, 0, NULL}; @@ -516,45 +510,6 @@ consvar_t cv_mute = {"mute", "Off", CV_NETVAR|CV_CALL, CV_OnOff, Mute_OnChange, consvar_t cv_sleep = {"cpusleep", "1", CV_SAVE, sleeping_cons_t, NULL, -1, NULL, NULL, 0, 0, NULL}; -static CV_PossibleValue_t nametagtrans_cons_t[] = { - {0, "Never"}, {1, "Far only"}, {2, "Dynamic"}, {3, "Always"}, {4, "HUD Trans."}, {0, NULL}}; -/*static CV_PossibleValue_t nametagscaling_cons_t[] = { - {0, "MIN"}, {320, "MAX"}, {0, NULL}};*/ -static CV_PossibleValue_t nametagdistance_cons_t[] = { - {0, "MIN"}, {640, "MAX"}, {0, NULL}}; -static CV_PossibleValue_t nametagmaxplayer_cons_t[] = { - {1, "MIN"}, {MAXPLAYERS, "MAX"}, {0, NULL}}; -static CV_PossibleValue_t nametagsize_cons_t[] = { - {0, "Off"}, {1, "Small"}, {2, "Minimal"}, {0, NULL}}; -static CV_PossibleValue_t nametagrestat_cons_t[] = { - {0, "Off"}, {1, "Restat"}, {2, "Always"}, {0, NULL}}; - -consvar_t cv_nametag = {"kartnametag", "Off", CV_SAVE, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL}; -consvar_t cv_nametagtrans = {"kartnametagtransparency", "Dynamic", CV_SAVE, nametagtrans_cons_t, NULL, 0, NULL, NULL, 0, 0, NULL}; -consvar_t cv_nametagfacerank = {"kartnametagfacerank", "Off", CV_SAVE, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL}; -consvar_t cv_nametagrestat = {"kartnametagrestat", "Restat", CV_SAVE, nametagrestat_cons_t, NULL, 0, NULL, NULL, 0, 0, NULL}; -consvar_t cv_nametagdist = {"kartnametagdist", "320", CV_SAVE, nametagdistance_cons_t, NULL, 0, NULL, NULL, 0, 0, NULL}; -consvar_t cv_nametagmaxplayers = {"kartnametagmaxplayers", "3", CV_SAVE, nametagmaxplayer_cons_t, NULL, 0, NULL, NULL, 0, 0, NULL}; -consvar_t cv_nametagmaxlenght = {"kartnametagmaxlenght", "12", CV_SAVE, CV_Unsigned, NULL, 0, NULL, NULL, 0, 0, NULL}; -//consvar_t cv_nametagscaling = {"nametagscaling", "160", CV_SAVE, nametagscaling_cons_t, NULL, 0, NULL, NULL, 0, 0, NULL}; -consvar_t cv_showownnametag = {"kartnametagshowown", "Off", CV_SAVE, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL}; -consvar_t cv_smallnametags = {"kartnametagsmall", "Off", CV_SAVE, nametagsize_cons_t, NULL, 0, NULL, NULL, 0, 0, NULL}; -consvar_t cv_nametaghop = {"kartnametaghop", "On", CV_SAVE, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL}; -consvar_t cv_nametagscore = {"kartnametagscore", "Off", CV_SAVE, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL}; -consvar_t cv_shownametagfinish = {"kartshownametagfinished", "No", CV_SAVE, CV_YesNo, NULL, 0, NULL, NULL, 0, 0, NULL}; -consvar_t cv_shownametagspectator = {"kartshownametagspectator", "No", CV_SAVE, CV_YesNo, NULL, 0, NULL, NULL, 0, 0, NULL}; - - -static CV_PossibleValue_t driftgaugeoffset_cons_t[] = { - {-FRACUNIT*128, "MIN"}, {FRACUNIT*128, "MAX"}, {0, NULL}}; -static CV_PossibleValue_t driftgaugestyle_cons_t[] = { - {1, "Default"}, {2, "Small"}, {3, "Big Numbers"}, {4, "Numbers Only"}, {5, "Extra"}, {0, NULL}}; - -consvar_t cv_driftgauge = {"kartdriftgauge", "Off", CV_SAVE, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL}; -consvar_t cv_driftgaugeofs = {"kartdriftgaugeoffset", "-20", CV_FLOAT|CV_SAVE, driftgaugeoffset_cons_t, NULL, 0, NULL, NULL, 0, 0, NULL}; -consvar_t cv_driftgaugetrans = {"kartdriftgaugetransparency", "On", CV_SAVE, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL}; -consvar_t cv_driftgaugestyle = {"kartdriftgaugestyle", "1", CV_SAVE, driftgaugestyle_cons_t, NULL, 0, NULL, NULL, 0, 0, NULL}; - static CV_PossibleValue_t skinselectspin_cons_t[] = { {0, "Off"}, {1, "Slow"}, {2, "2"}, {3, "3"}, {4, "4"}, {5, "5"}, {6, "6"}, {7, "7"}, {8, "8"}, {9, "9"}, {10, "Fast"}, {SKINSELECTSPIN_PAIN, "Pain"}, {0, NULL}}; consvar_t cv_skinselectspin = {"skinselectspin", "5", CV_SAVE, skinselectspin_cons_t, NULL, 0, NULL, NULL, 0, 0, NULL}; @@ -1122,26 +1077,6 @@ void D_RegisterClientCommands(void) CV_RegisterVar(&cv_soundtest); - CV_RegisterVar(&cv_nametag); - CV_RegisterVar(&cv_nametagtrans); - CV_RegisterVar(&cv_nametagfacerank); - CV_RegisterVar(&cv_nametagmaxplayers); - CV_RegisterVar(&cv_nametagmaxlenght); - //CV_RegisterVar(&cv_nametagscaling); - CV_RegisterVar(&cv_nametagdist); - CV_RegisterVar(&cv_showownnametag); - CV_RegisterVar(&cv_smallnametags); - CV_RegisterVar(&cv_nametagrestat); - CV_RegisterVar(&cv_nametaghop); - CV_RegisterVar(&cv_nametagscore); - CV_RegisterVar(&cv_shownametagfinish); - CV_RegisterVar(&cv_shownametagspectator); - - CV_RegisterVar(&cv_driftgauge); - CV_RegisterVar(&cv_driftgaugeofs); - CV_RegisterVar(&cv_driftgaugetrans); - CV_RegisterVar(&cv_driftgaugestyle); - CV_RegisterVar(&cv_perfstats); CV_RegisterVar(&cv_ps_thinkframe_page); CV_RegisterVar(&cv_ps_samplesize); diff --git a/src/k_kart.c b/src/k_kart.c index b8174dc57..8afc37819 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -82,9 +82,18 @@ consvar_t cv_showlaptimes = {"showlaptimes", "Off", CV_SAVE, CV_OnOff, NULL, 0, consvar_t cv_posanim = {"postitionanimation", "On", CV_SAVE, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL}; consvar_t cv_smallposnum = {"smallpositionnumber", "Off", CV_SAVE, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL}; +consvar_t cv_minihead = {"smallminimapplayers", "Off", CV_SAVE, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL}; +consvar_t cv_showminimapnames = {"showminimapnames", "Off", CV_SAVE, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL}; + +consvar_t cv_highresportrait = {"highresportrait", "Off", CV_SAVE, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL}; //make char potraits use their high-res version instead + +consvar_t cv_showlapemblem = {"showlapemblem", "On", CV_SAVE, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL}; +consvar_t cv_darkitembox = {"darkitembox", "On", CV_SAVE, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL}; //itembox gets a dark box with specific items +consvar_t cv_biglaps = {"biglaphud", "On", CV_SAVE, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL}; //here for ppl who dont want to make 2 more patches for their custom hud CV_PossibleValue_t speedo_cons_t[NUMSPEEDOSTUFF]; consvar_t cv_newspeedometer = {"newspeedometer", "Default", CV_SAVE, speedo_cons_t, NULL, 0, NULL, NULL, 0, 0, NULL}; +consvar_t cv_battlespeedo = {"battlespeedo", "Off", CV_SAVE, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL}; //toggle for showing the speedometer in battlemode //hardcode saltyhop mhhm consvar_t cv_saltyhop = {"hardcodehop", "Off", CV_SAVE, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL}; @@ -98,13 +107,45 @@ consvar_t cv_colorizeditembox = {"colorizeditembox", "Off", CV_SAVE, CV_OnOff, N static CV_PossibleValue_t HudColor_cons_t[MAXSKINCOLORS+1]; consvar_t cv_colorizedhudcolor = {"colorizedhudcolor", "Skin Color", CV_SAVE, HudColor_cons_t, NULL, 0, NULL, NULL, 0, 0, NULL}; -consvar_t cv_highresportrait = {"highresportrait", "Off", CV_SAVE, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL}; //make char potraits use their high-res version instead +// driftgauge stuffs +static CV_PossibleValue_t driftgaugeoffset_cons_t[] = { + {-FRACUNIT*128, "MIN"}, {FRACUNIT*128, "MAX"}, {0, NULL}}; +CV_PossibleValue_t driftgaugestyle_cons_t[NUMSPEEDOSTUFF]; -consvar_t cv_darkitembox = {"darkitembox", "On", CV_SAVE, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL}; //itembox gets a dark box with specific items +consvar_t cv_driftgauge = {"kartdriftgauge", "Off", CV_SAVE, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL}; +consvar_t cv_driftgaugeofs = {"kartdriftgaugeoffset", "-20", CV_FLOAT|CV_SAVE, driftgaugeoffset_cons_t, NULL, 0, NULL, NULL, 0, 0, NULL}; +consvar_t cv_driftgaugetrans = {"kartdriftgaugetransparency", "On", CV_SAVE, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL}; +consvar_t cv_driftgaugestyle = {"kartdriftgaugestyle", "1", CV_SAVE, driftgaugestyle_cons_t, NULL, 0, NULL, NULL, 0, 0, NULL}; -consvar_t cv_biglaps = {"biglaphud", "On", CV_SAVE, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL}; //here for ppl who dont want to make 2 more patches for their custom hud +// nametags +static CV_PossibleValue_t nametagtrans_cons_t[] = { + {0, "Never"}, {1, "Far only"}, {2, "Dynamic"}, {3, "Always"}, {4, "HUD Trans."}, {0, NULL}}; +/*static CV_PossibleValue_t nametagscaling_cons_t[] = { + {0, "MIN"}, {320, "MAX"}, {0, NULL}};*/ +static CV_PossibleValue_t nametagdistance_cons_t[] = { + {0, "MIN"}, {640, "MAX"}, {0, NULL}}; +static CV_PossibleValue_t nametagmaxplayer_cons_t[] = { + {1, "MIN"}, {MAXPLAYERS, "MAX"}, {0, NULL}}; +static CV_PossibleValue_t nametagsize_cons_t[] = { + {0, "Off"}, {1, "Small"}, {2, "Minimal"}, {0, NULL}}; +static CV_PossibleValue_t nametagrestat_cons_t[] = { + {0, "Off"}, {1, "Restat"}, {2, "Always"}, {0, NULL}}; + +consvar_t cv_nametag = {"kartnametag", "Off", CV_SAVE, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL}; +consvar_t cv_nametagtrans = {"kartnametagtransparency", "Dynamic", CV_SAVE, nametagtrans_cons_t, NULL, 0, NULL, NULL, 0, 0, NULL}; +consvar_t cv_nametagfacerank = {"kartnametagfacerank", "Off", CV_SAVE, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL}; +consvar_t cv_nametagrestat = {"kartnametagrestat", "Restat", CV_SAVE, nametagrestat_cons_t, NULL, 0, NULL, NULL, 0, 0, NULL}; +consvar_t cv_nametagdist = {"kartnametagdist", "320", CV_SAVE, nametagdistance_cons_t, NULL, 0, NULL, NULL, 0, 0, NULL}; +consvar_t cv_nametagmaxplayers = {"kartnametagmaxplayers", "3", CV_SAVE, nametagmaxplayer_cons_t, NULL, 0, NULL, NULL, 0, 0, NULL}; +consvar_t cv_nametagmaxlenght = {"kartnametagmaxlenght", "12", CV_SAVE, CV_Unsigned, NULL, 0, NULL, NULL, 0, 0, NULL}; +//consvar_t cv_nametagscaling = {"nametagscaling", "160", CV_SAVE, nametagscaling_cons_t, NULL, 0, NULL, NULL, 0, 0, NULL}; +consvar_t cv_showownnametag = {"kartnametagshowown", "Off", CV_SAVE, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL}; +consvar_t cv_smallnametags = {"kartnametagsmall", "Off", CV_SAVE, nametagsize_cons_t, NULL, 0, NULL, NULL, 0, 0, NULL}; +consvar_t cv_nametaghop = {"kartnametaghop", "On", CV_SAVE, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL}; +consvar_t cv_nametagscore = {"kartnametagscore", "Off", CV_SAVE, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL}; +consvar_t cv_shownametagfinish = {"kartshownametagfinished", "No", CV_SAVE, CV_YesNo, NULL, 0, NULL, NULL, 0, 0, NULL}; +consvar_t cv_shownametagspectator = {"kartshownametagspectator", "No", CV_SAVE, CV_YesNo, NULL, 0, NULL, NULL, 0, 0, NULL}; -consvar_t cv_battlespeedo = {"battlespeedo", "Off", CV_SAVE, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL}; //toggle for showing the speedometer in battlemode // SOME IMPORTANT VARIABLES DEFINED IN DOOMDEF.H: // gamespeed is cc (0 for easy, 1 for normal, 2 for hard) @@ -736,9 +777,11 @@ void K_RegisterKartStuff(void) CV_RegisterVar(&cv_battlespeedo); - CV_RegisterVar(&cv_saltyhop); - CV_RegisterVar(&cv_saltyhopsfx); - CV_RegisterVar(&cv_saltysquish); + CV_RegisterVar(&cv_minihead); + CV_RegisterVar(&cv_showminimapnames); + CV_RegisterVar(&cv_showlapemblem); + + CV_RegisterVar(&cv_stagetitle); //Colourized HUD CV_RegisterVar(&cv_colorizedhud); @@ -751,14 +794,31 @@ void K_RegisterKartStuff(void) CV_RegisterVar(&cv_highresportrait); + CV_RegisterVar(&cv_nametag); + CV_RegisterVar(&cv_nametagtrans); + CV_RegisterVar(&cv_nametagfacerank); + CV_RegisterVar(&cv_nametagmaxplayers); + CV_RegisterVar(&cv_nametagmaxlenght); + //CV_RegisterVar(&cv_nametagscaling); + CV_RegisterVar(&cv_nametagdist); + CV_RegisterVar(&cv_showownnametag); + CV_RegisterVar(&cv_smallnametags); + CV_RegisterVar(&cv_nametagrestat); + CV_RegisterVar(&cv_nametaghop); + CV_RegisterVar(&cv_nametagscore); + CV_RegisterVar(&cv_shownametagfinish); + CV_RegisterVar(&cv_shownametagspectator); + + CV_RegisterVar(&cv_driftgauge); + CV_RegisterVar(&cv_driftgaugeofs); + CV_RegisterVar(&cv_driftgaugetrans); + CV_RegisterVar(&cv_driftgaugestyle); + + CV_RegisterVar(&cv_saltyhop); + CV_RegisterVar(&cv_saltyhopsfx); + CV_RegisterVar(&cv_saltysquish); CV_RegisterVar(&cv_slamsound); - CV_RegisterVar(&cv_minihead); - CV_RegisterVar(&cv_showminimapnames); - CV_RegisterVar(&cv_showlapemblem); - - CV_RegisterVar(&cv_stagetitle); - CV_RegisterVar(&cv_lessflicker); CV_RegisterVar(&cv_mouseturn); diff --git a/src/k_kart.h b/src/k_kart.h index 647ae3bf0..34c59c622 100644 --- a/src/k_kart.h +++ b/src/k_kart.h @@ -36,6 +36,7 @@ extern consvar_t cv_battlespeedo; #define NUMSPEEDOSTUFF 6 extern CV_PossibleValue_t speedo_cons_t[NUMSPEEDOSTUFF]; +extern CV_PossibleValue_t driftgaugestyle_cons_t[NUMSPEEDOSTUFF]; boolean K_IsPlayerLosing(player_t *player); boolean K_IsPlayerWanted(player_t *player); -- 2.54.0 From 38b52b826a83e84b4cc5177aefcc148631462653 Mon Sep 17 00:00:00 2001 From: Indev Date: Wed, 8 Jan 2025 12:00:41 +0300 Subject: [PATCH 51/53] huh --- src/p_tick.c | 5 ----- 1 file changed, 5 deletions(-) diff --git a/src/p_tick.c b/src/p_tick.c index ec77d50cf..9d5a64cf3 100644 --- a/src/p_tick.c +++ b/src/p_tick.c @@ -381,11 +381,6 @@ static void P_DeviceRumbleTick(void) continue; } - if (camera[i].freecam) - { - continue; - } - if (player->mo == NULL) { continue; -- 2.54.0 From d9f0c55fee5d5456af4c4c28d927fbe3c31f0de0 Mon Sep 17 00:00:00 2001 From: Alug Date: Fri, 10 Jan 2025 22:31:31 +0100 Subject: [PATCH 52/53] "Invinciblity" --- src/m_menu.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/m_menu.c b/src/m_menu.c index a2732c3a7..c4fad470c 100644 --- a/src/m_menu.c +++ b/src/m_menu.c @@ -2160,7 +2160,7 @@ static menuitem_t OP_MonitorToggleMenu[] = {IT_KEYHANDLER | IT_NOTHING, NULL, "Jawz x2", M_HandleMonitorToggles, KRITEM_DUALJAWZ}, {IT_KEYHANDLER | IT_NOTHING, NULL, "Ballhogs", M_HandleMonitorToggles, KITEM_BALLHOG}, {IT_KEYHANDLER | IT_NOTHING, NULL, "Self-Propelled Bombs", M_HandleMonitorToggles, KITEM_SPB}, - {IT_KEYHANDLER | IT_NOTHING, NULL, "Invinciblity", M_HandleMonitorToggles, KITEM_INVINCIBILITY}, + {IT_KEYHANDLER | IT_NOTHING, NULL, "Invincibility", M_HandleMonitorToggles, KITEM_INVINCIBILITY}, {IT_KEYHANDLER | IT_NOTHING, NULL, "Grow", M_HandleMonitorToggles, KITEM_GROW}, {IT_KEYHANDLER | IT_NOTHING, NULL, "Shrink", M_HandleMonitorToggles, KITEM_SHRINK}, {IT_KEYHANDLER | IT_NOTHING, NULL, "Thunder Shields", M_HandleMonitorToggles, KITEM_THUNDERSHIELD}, -- 2.54.0 From 2a948ca4c2c82b04e71664a6aa60a306d874dc47 Mon Sep 17 00:00:00 2001 From: Alug Date: Fri, 10 Jan 2025 22:46:05 +0100 Subject: [PATCH 53/53] move this --- src/m_menu.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/m_menu.c b/src/m_menu.c index c4fad470c..ace9d585e 100644 --- a/src/m_menu.c +++ b/src/m_menu.c @@ -4336,10 +4336,11 @@ void M_Drawer(void) #ifdef HWRENDER if (rendermode == render_opengl) - V_DrawThinString(0, 0, V_GREENMAP|V_SNAPTOTOP|V_SNAPTOLEFT|V_TRANSLUCENT|V_ALLOWLOWERCASE, ("Opengl")); + V_DrawThinString(0, 0, V_GREENMAP|V_SNAPTOTOP|V_SNAPTOLEFT|V_TRANSLUCENT|V_ALLOWLOWERCASE, ("Opengl")); + else #endif if (rendermode == render_soft) - V_DrawThinString(0, 0, V_REDMAP|V_SNAPTOTOP|V_SNAPTOLEFT|V_TRANSLUCENT|V_ALLOWLOWERCASE, ("Software")); + V_DrawThinString(0, 0, V_REDMAP|V_SNAPTOTOP|V_SNAPTOLEFT|V_TRANSLUCENT|V_ALLOWLOWERCASE, ("Software")); } } } -- 2.54.0