From a3e8a0cefd9a410216cd0470b217b9164d9c0a2e Mon Sep 17 00:00:00 2001 From: Randy Heit Date: Tue, 1 Jul 2008 04:06:56 +0000 Subject: [PATCH] - Removed the S_Sound() variant that allows for pointing the origin at an arbitrary point. It has been replaced with a variant that takes a polyobject as a source, since that was the only use that couldn't be rewritten with the other variants. This also fixes the bug that polyobject sounds were not successfully saved and caused a crash when reloading the game. Note that this is a significant change to how equality of sound sources is determined, so some things may not behave quite the same as before. (Which would be a bug, but hopefully everything still sounds the same.) SVN r1059 (trunk) --- docs/rh-log.txt | 8 + src/b_func.cpp | 1 - src/c_console.cpp | 1 - src/d_dehacked.cpp | 1 - src/doomtype.h | 1 + src/f_finale.cpp | 2 +- src/g_level.cpp | 1 - src/g_shared/a_camera.cpp | 1 - src/g_shared/a_movingcamera.cpp | 1 - src/g_strife/a_acolyte.cpp | 2 +- src/g_strife/a_loremaster.cpp | 1 - src/m_menu.cpp | 2 +- src/p_acs.cpp | 5 +- src/p_buildmap.cpp | 1 - src/p_lnspec.cpp | 2 +- src/p_local.h | 1 - src/p_map.cpp | 1 - src/p_maputl.cpp | 1 - src/p_mobj.cpp | 2 +- src/p_setup.cpp | 1 - src/p_slopes.cpp | 1 - src/p_switch.cpp | 11 +- src/p_udmf.cpp | 1 - src/r_defs.h | 15 +- src/r_main.cpp | 1 - src/r_plane.cpp | 1 - src/r_state.h | 5 + src/s_sndseq.cpp | 12 +- src/s_sound.cpp | 551 ++++++++++++++++++++--------- src/s_sound.h | 41 ++- src/sound/fmodsound.cpp | 38 +- src/sound/fmodsound.h | 6 +- src/sound/i_sound.cpp | 4 +- src/sound/i_sound.h | 4 +- src/textures/multipatchtexture.cpp | 1 - src/thingdef/olddecorations.cpp | 1 - src/thingdef/thingdef_codeptr.cpp | 1 - src/thingdef/thingdef_exp.cpp | 1 - src/thingdef/thingdef_main.cpp | 1 - 39 files changed, 477 insertions(+), 255 deletions(-) diff --git a/docs/rh-log.txt b/docs/rh-log.txt index f8f005bd8..25b09a9ab 100644 --- a/docs/rh-log.txt +++ b/docs/rh-log.txt @@ -1,4 +1,12 @@ June 30, 2008 +- Removed the S_Sound() variant that allows for pointing the origin at an + arbitrary point. It has been replaced with a variant that takes a polyobject + as a source, since that was the only use that couldn't be rewritten with the + other variants. This also fixes the bug that polyobject sounds were not + successfully saved and caused a crash when reloading the game. Note that + this is a significant change to how equality of sound sources is determined, + so some things may not behave quite the same as before. (Which would be a + bug, but hopefully everything still sounds the same.) - Adjusted the noise debug table so that fractional volume levels do not run into the adjacent columns. - Added a NullSoundRenderer so that most of the checks against a NULL GSnd diff --git a/src/b_func.cpp b/src/b_func.cpp index 3e72ff435..88663174b 100644 --- a/src/b_func.cpp +++ b/src/b_func.cpp @@ -20,7 +20,6 @@ #include "stats.h" #include "i_system.h" #include "s_sound.h" -#include "vectors.h" #include "a_doomglobal.h" static FRandom pr_botdofire ("BotDoFire"); diff --git a/src/c_console.cpp b/src/c_console.cpp index 66c9b4530..c0fe66a5c 100644 --- a/src/c_console.cpp +++ b/src/c_console.cpp @@ -62,7 +62,6 @@ #include "doomstat.h" #include "d_gui.h" #include "v_video.h" -#include "vectors.h" #include "gi.h" diff --git a/src/d_dehacked.cpp b/src/d_dehacked.cpp index ddcf27806..646d7ed7d 100644 --- a/src/d_dehacked.cpp +++ b/src/d_dehacked.cpp @@ -64,7 +64,6 @@ #include "v_palette.h" #include "a_sharedglobal.h" #include "thingdef/thingdef.h" -#include "vectors.h" #include "dobject.h" #include "r_translate.h" diff --git a/src/doomtype.h b/src/doomtype.h index f062b2781..dac73fe12 100644 --- a/src/doomtype.h +++ b/src/doomtype.h @@ -39,6 +39,7 @@ #include #include "zstring.h" #include "name.h" +#include "vectors.h" // Since this file is included by everything, it seems an appropriate place // to check the NOASM/USEASM macros. diff --git a/src/f_finale.cpp b/src/f_finale.cpp index dc7618001..d83c59385 100644 --- a/src/f_finale.cpp +++ b/src/f_finale.cpp @@ -349,7 +349,7 @@ void F_Ticker () } else if (FinaleStage == 5 && FinaleCount > FinaleEndCount) { - S_StopSound ((fixed_t *)NULL, CHAN_VOICE); + S_StopSound (CHAN_VOICE); F_AdvanceSlideshow (); FinaleCount = 0; } diff --git a/src/g_level.cpp b/src/g_level.cpp index 6dd41b389..366b54aea 100644 --- a/src/g_level.cpp +++ b/src/g_level.cpp @@ -71,7 +71,6 @@ #include "version.h" #include "m_menu.h" #include "statnums.h" -#include "vectors.h" #include "sbarinfo.h" #include "r_translate.h" #include "p_lnspec.h" diff --git a/src/g_shared/a_camera.cpp b/src/g_shared/a_camera.cpp index d2bfeca23..c40b20d89 100644 --- a/src/g_shared/a_camera.cpp +++ b/src/g_shared/a_camera.cpp @@ -37,7 +37,6 @@ #include "a_sharedglobal.h" #include "r_main.h" #include "p_local.h" -#include "vectors.h" class ADoomBuilderCamera : public AActor { diff --git a/src/g_shared/a_movingcamera.cpp b/src/g_shared/a_movingcamera.cpp index 50015f34f..6aef5f30e 100644 --- a/src/g_shared/a_movingcamera.cpp +++ b/src/g_shared/a_movingcamera.cpp @@ -36,7 +36,6 @@ #include "info.h" #include "p_local.h" #include "p_lnspec.h" -#include "vectors.h" /* == InterpolationPoint: node along a camera's path diff --git a/src/g_strife/a_acolyte.cpp b/src/g_strife/a_acolyte.cpp index 87bb3591c..9ac26feb6 100644 --- a/src/g_strife/a_acolyte.cpp +++ b/src/g_strife/a_acolyte.cpp @@ -385,7 +385,7 @@ void A_AcolyteDie (AActor *self) players[0].mo->GiveInventoryType (QuestItemClasses[6]); players[0].SetLogNumber (14); - S_StopSound ((fixed_t *)NULL, CHAN_VOICE); + S_StopSound (CHAN_VOICE); S_Sound (CHAN_VOICE, "svox/voc14", 1, ATTN_NORM); } diff --git a/src/g_strife/a_loremaster.cpp b/src/g_strife/a_loremaster.cpp index c9f433272..a1174b842 100644 --- a/src/g_strife/a_loremaster.cpp +++ b/src/g_strife/a_loremaster.cpp @@ -5,7 +5,6 @@ #include "p_enemy.h" #include "p_local.h" #include "s_sound.h" -#include "vectors.h" static FRandom pr_atk1 ("FooMelee"); diff --git a/src/m_menu.cpp b/src/m_menu.cpp index af52bafd4..adf21135c 100644 --- a/src/m_menu.cpp +++ b/src/m_menu.cpp @@ -2687,7 +2687,7 @@ void M_StartMessage (const char *string, void (*routine)(int), bool input) } if (input) { - S_StopSound ((AActor *)NULL, CHAN_VOICE); + S_StopSound (CHAN_VOICE); S_Sound (CHAN_VOICE, "menu/prompt", 1, ATTN_NONE); } return; diff --git a/src/p_acs.cpp b/src/p_acs.cpp index fde8cd859..ad0c273f0 100644 --- a/src/p_acs.cpp +++ b/src/p_acs.cpp @@ -53,7 +53,6 @@ #include "i_system.h" #include "i_movie.h" #include "sbar.h" -#include "vectors.h" #include "m_swap.h" #include "a_sharedglobal.h" #include "a_doomglobal.h" @@ -4127,8 +4126,8 @@ int DLevelScript::RunScript () if (activationline) { S_Sound ( - activationline->frontsector->soundorg, - CHAN_AUTO, + activationline->frontsector, + CHAN_AUTO, // Not CHAN_AREA, because that'd probably break existing scripts. lookup, (float)(STACK(1)) / 127.f, ATTN_NORM); diff --git a/src/p_buildmap.cpp b/src/p_buildmap.cpp index 2584b7893..706da768a 100644 --- a/src/p_buildmap.cpp +++ b/src/p_buildmap.cpp @@ -12,7 +12,6 @@ #include "v_palette.h" #include "w_wad.h" #include "templates.h" -#include "vectors.h" #include "r_sky.h" #include "r_main.h" #include "r_defs.h" diff --git a/src/p_lnspec.cpp b/src/p_lnspec.cpp index 59ae2af2d..67d42edd9 100644 --- a/src/p_lnspec.cpp +++ b/src/p_lnspec.cpp @@ -2721,7 +2721,7 @@ FUNC(LS_SendToCommunicator) if (it->CheckLocalView (consoleplayer)) { - S_StopSound ((fixed_t *)NULL, CHAN_VOICE); + S_StopSound (CHAN_VOICE); S_Sound (CHAN_VOICE, name, 1, ATTN_NORM); if (arg2 == 0) { diff --git a/src/p_local.h b/src/p_local.h index f2115ac09..34d7369db 100644 --- a/src/p_local.h +++ b/src/p_local.h @@ -488,7 +488,6 @@ enum PO_SPAWNHURT_TYPE }; -extern FPolyObj *polyobjs; // list of all poly-objects on the level extern int po_NumPolyobjs; extern polyspawns_t *polyspawns; // [RH] list of polyobject things to spawn diff --git a/src/p_map.cpp b/src/p_map.cpp index 43a219dc8..67aa71a39 100644 --- a/src/p_map.cpp +++ b/src/p_map.cpp @@ -26,7 +26,6 @@ #include #include "templates.h" -#include "vectors.h" #include "m_alloc.h" #include "m_bbox.h" diff --git a/src/p_maputl.cpp b/src/p_maputl.cpp index e35f2342a..023c1777c 100644 --- a/src/p_maputl.cpp +++ b/src/p_maputl.cpp @@ -39,7 +39,6 @@ // State. #include "r_state.h" #include "templates.h" -#include "vectors.h" static AActor *RoughBlockCheck (AActor *mo, int index); diff --git a/src/p_mobj.cpp b/src/p_mobj.cpp index a1a4a62ee..396de6d0c 100644 --- a/src/p_mobj.cpp +++ b/src/p_mobj.cpp @@ -4491,7 +4491,7 @@ void P_PlaySpawnSound(AActor *missile, AActor *spawner) // If there is no spawner use the spawn position. // But not in a silenced sector. if (!(missile->Sector->Flags & SECF_SILENT)) - S_Sound (&missile->x, CHAN_WEAPON, missile->SeeSound, 1, ATTN_NORM); + S_Sound (missile->x, missile->y, missile->z, CHAN_WEAPON, missile->SeeSound, 1, ATTN_NORM); } } } diff --git a/src/p_setup.cpp b/src/p_setup.cpp index 78ad1f379..3b9e38867 100644 --- a/src/p_setup.cpp +++ b/src/p_setup.cpp @@ -48,7 +48,6 @@ #include "c_console.h" #include "c_cvars.h" #include "p_acs.h" -#include "vectors.h" #include "announcer.h" #include "wi_stuff.h" #include "stats.h" diff --git a/src/p_slopes.cpp b/src/p_slopes.cpp index 503d9d846..93d79172a 100644 --- a/src/p_slopes.cpp +++ b/src/p_slopes.cpp @@ -33,7 +33,6 @@ */ #include "doomtype.h" -#include "vectors.h" #include "p_local.h" #include "r_data.h" #include "cmdlib.h" diff --git a/src/p_switch.cpp b/src/p_switch.cpp index 820ebd90d..14e200f65 100644 --- a/src/p_switch.cpp +++ b/src/p_switch.cpp @@ -577,20 +577,19 @@ bool P_ChangeSwitchTexture (side_t *side, int useAgain, BYTE special, bool *ques // which wasn't necessarily anywhere near the switch if it was // facing a big sector (and which wasn't necessarily for the // button just activated, either). - fixed_t pt[3]; + fixed_t pt[2]; line_t *line = &lines[side->linenum]; bool playsound; pt[0] = line->v1->x + (line->dx >> 1); pt[1] = line->v1->y + (line->dy >> 1); - pt[2] = 0; side->SetTexture(texture, SwitchList[i]->u[0].Texture); if (useAgain || SwitchList[i]->NumFrames > 1) playsound = P_StartButton (side, texture, i, pt[0], pt[1], !!useAgain); else playsound = true; if (playsound) - S_Sound (pt, CHAN_VOICE|CHAN_LISTENERZ|CHAN_IMMOBILE, sound, 1, ATTN_STATIC); + S_Sound (pt[0], pt[1], 0, CHAN_VOICE|CHAN_LISTENERZ, sound, 1, ATTN_STATIC); if (quest != NULL) { *quest = SwitchList[i]->QuestPanel; @@ -648,16 +647,12 @@ void DActiveButton::Tick () FSwitchDef *def = SwitchList[m_SwitchDef]; if (m_Frame == def->NumFrames - 1) { - fixed_t pt[3]; - m_SwitchDef = def->PairIndex; if (m_SwitchDef != 65535) { def = SwitchList[def->PairIndex]; m_Frame = 65535; - pt[0] = m_X; - pt[1] = m_Y; - S_Sound (pt, CHAN_VOICE|CHAN_LISTENERZ|CHAN_IMMOBILE, + S_Sound (m_X, m_Y, 0, CHAN_VOICE|CHAN_LISTENERZ, def->Sound != 0 ? def->Sound : FSoundID("switches/normbutn"), 1, ATTN_STATIC); bFlippable = false; diff --git a/src/p_udmf.cpp b/src/p_udmf.cpp index 67b0bd240..1f761b40f 100644 --- a/src/p_udmf.cpp +++ b/src/p_udmf.cpp @@ -36,7 +36,6 @@ #include "r_data.h" #include "p_setup.h" #include "sc_man.h" -#include "vectors.h" #include "p_lnspec.h" #include "templates.h" #include "i_system.h" diff --git a/src/r_defs.h b/src/r_defs.h index 5a20cc228..15b878032 100644 --- a/src/r_defs.h +++ b/src/r_defs.h @@ -486,7 +486,7 @@ struct sector_t int sky; short seqType; // this sector's sound sequence - fixed_t soundorg[3]; // origin for any sounds played by the sector + fixed_t soundorg[2]; // origin for any sounds played by the sector int validcount; // if == validcount, already checked AActor* thinglist; // list of mobjs in sector @@ -786,8 +786,19 @@ struct FPolyObj ~FPolyObj(); DInterpolation *SetInterpolation(); void StopInterpolation(); - }; +extern FPolyObj *polyobjs; // list of all poly-objects on the level + +inline FArchive &operator<< (FArchive &arc, FPolyObj *&poly) +{ + return arc.SerializePointer (polyobjs, (BYTE **)&poly, sizeof(FPolyObj)); +} + +inline FArchive &operator<< (FArchive &arc, const FPolyObj *&poly) +{ + return arc.SerializePointer (polyobjs, (BYTE **)&poly, sizeof(FPolyObj)); +} + // // BSP node. diff --git a/src/r_main.cpp b/src/r_main.cpp index 696340c26..d376d7f5b 100644 --- a/src/r_main.cpp +++ b/src/r_main.cpp @@ -44,7 +44,6 @@ #include "stats.h" #include "i_video.h" #include "i_system.h" -#include "vectors.h" #include "a_sharedglobal.h" #include "r_translate.h" #include "p_3dmidtex.h" diff --git a/src/r_plane.cpp b/src/r_plane.cpp index eebfaa01e..89f5c70c3 100644 --- a/src/r_plane.cpp +++ b/src/r_plane.cpp @@ -48,7 +48,6 @@ #include "m_alloc.h" #include "v_video.h" -#include "vectors.h" #include "a_sharedglobal.h" #include "c_console.h" diff --git a/src/r_state.h b/src/r_state.h index ebd2d4a72..2ce7b4e8e 100644 --- a/src/r_state.h +++ b/src/r_state.h @@ -87,6 +87,11 @@ inline FArchive &operator<< (FArchive &arc, sector_t *&sec) return arc.SerializePointer (sectors, (BYTE **)&sec, sizeof(*sectors)); } +inline FArchive &operator<< (FArchive &arc, const sector_t *&sec) +{ + return arc.SerializePointer (sectors, (BYTE **)&sec, sizeof(*sectors)); +} + inline FArchive &operator<< (FArchive &arc, line_t *&line) { return arc.SerializePointer (lines, (BYTE **)&line, sizeof(*lines)); diff --git a/src/s_sndseq.cpp b/src/s_sndseq.cpp index 18cb07dcf..4c636a2a4 100644 --- a/src/s_sndseq.cpp +++ b/src/s_sndseq.cpp @@ -132,11 +132,11 @@ public: void Serialize(FArchive &arc); void MakeSound(int loop, FSoundID id) { - S_Sound (&m_Poly->startSpot[0], CHAN_BODY|loop, id, clamp(m_Volume, 0.f, 1.f), m_Atten); + S_Sound (m_Poly, CHAN_BODY|loop, id, clamp(m_Volume, 0.f, 1.f), m_Atten); } bool IsPlaying() { - return S_GetSoundPlayingInfo (&m_Poly->startSpot[0], m_CurrentSoundID); + return S_GetSoundPlayingInfo (m_Poly, m_CurrentSoundID); } void *Source() { @@ -165,7 +165,7 @@ public: } bool IsPlaying() { - return S_GetSoundPlayingInfo (m_Sector->soundorg, m_CurrentSoundID); + return S_GetSoundPlayingInfo (m_Sector, m_CurrentSoundID); } void *Source() { @@ -423,7 +423,7 @@ IMPLEMENT_CLASS (DSeqPolyNode) void DSeqPolyNode::Serialize (FArchive &arc) { Super::Serialize (arc); - arc.SerializePointer (polyobjs, (BYTE **)&m_Poly, sizeof(*polyobjs)); + arc << m_Poly; } IMPLEMENT_CLASS (DSeqSectorNode) @@ -982,7 +982,7 @@ void DSeqActorNode::Destroy () void DSeqSectorNode::Destroy () { if (m_StopSound >= 0) - S_StopSound (m_Sector->soundorg, Channel & 7); + S_StopSound (m_Sector, Channel & 7); if (m_StopSound >= 1) MakeSound (0, m_StopSound); Super::Destroy(); @@ -991,7 +991,7 @@ void DSeqSectorNode::Destroy () void DSeqPolyNode::Destroy () { if (m_StopSound >= 0) - S_StopSound (m_Poly->startSpot, CHAN_BODY); + S_StopSound (m_Poly, CHAN_BODY); if (m_StopSound >= 1) MakeSound (0, m_StopSound); Super::Destroy(); diff --git a/src/s_sound.cpp b/src/s_sound.cpp index a8514e96a..d816cad29 100644 --- a/src/s_sound.cpp +++ b/src/s_sound.cpp @@ -46,7 +46,6 @@ #include "v_text.h" #include "a_sharedglobal.h" #include "gstrings.h" -#include "vectors.h" #include "gi.h" #include "templates.h" #include "zstring.h" @@ -84,6 +83,15 @@ struct MusPlayingInfo bool loop; }; +enum +{ + SOURCE_None, // Sound is always on top of the listener. + SOURCE_Actor, // Sound is coming from an actor. + SOURCE_Sector, // Sound is coming from a sector. + SOURCE_Polyobj, // Sound is coming from a polyobject. + SOURCE_Unattached, // Sound is not attached to any particular emitter. +}; + // EXTERNAL FUNCTION PROTOTYPES -------------------------------------------- extern float S_GetMusicVolume (const char *music); @@ -92,12 +100,13 @@ extern float S_GetMusicVolume (const char *music); // PRIVATE FUNCTION PROTOTYPES --------------------------------------------- -static bool S_CheckSoundLimit(sfxinfo_t *sfx, float pos[3], int near_limit); +static bool S_CheckSoundLimit(sfxinfo_t *sfx, const FVector3 &pos, int near_limit); static void S_ActivatePlayList(bool goBack); -static void CalcPosVel(fixed_t *pt, AActor *mover, int constz, float pos[3], - float vel[3]); -static FSoundChan *S_StartSound(fixed_t *pt, AActor *mover, sector_t *sec, - int channel, FSoundID sound_id, float volume, float attenuation); +static void CalcPosVel(const FSoundChan *chan, FVector3 *pos, FVector3 *vel); +static void CalcPosVel(int type, const AActor *actor, const sector_t *sector, const FPolyObj *poly, + const FVector3 *pt, int constz, FVector3 *pos, FVector3 *vel); +static FSoundChan *S_StartSound(AActor *mover, const sector_t *sec, const FPolyObj *poly, + const FVector3 *pt, int channel, FSoundID sound_id, float volume, float attenuation); static sfxinfo_t *S_LoadSound(sfxinfo_t *sfx); // PRIVATE DATA DEFINITIONS ------------------------------------------------ @@ -138,7 +147,7 @@ void S_NoiseDebug (void) { FSoundChan *chan; FVector3 listener; - fixed_t ox, oy, oz; + FVector3 origin; int y, color; y = 32 * CleanYfac; @@ -161,8 +170,8 @@ void S_NoiseDebug (void) } listener.X = FIXED2FLOAT(players[consoleplayer].camera->x); - listener.Y = FIXED2FLOAT(players[consoleplayer].camera->y); - listener.Z = FIXED2FLOAT(players[consoleplayer].camera->z); + listener.Y = FIXED2FLOAT(players[consoleplayer].camera->z); + listener.Z = FIXED2FLOAT(players[consoleplayer].camera->y); // Display the oldest channel first. for (chan = Channels; chan->NextChan != NULL; chan = chan->NextChan) @@ -171,10 +180,7 @@ void S_NoiseDebug (void) { char temp[32]; - assert(chan->Pt != NULL); - ox = chan->Pt[0]; - oy = chan->Pt[1]; - oz = chan->Pt[2]; + CalcPosVel(chan, &origin, NULL); color = (chan->ChanFlags & CHAN_LOOP) ? CR_BROWN : CR_GREY; // Name @@ -192,23 +198,22 @@ void S_NoiseDebug (void) else { // X coordinate - sprintf (temp, "%d", ox >> FRACBITS); + sprintf (temp, "%.0f", origin.X); screen->DrawText (color, 70, y, temp, TAG_DONE); // Y coordinate - sprintf (temp, "%d", oy >> FRACBITS); + sprintf (temp, "%.0f", origin.Z); screen->DrawText (color, 120, y, temp, TAG_DONE); // Z coordinate - sprintf (temp, "%d", oz >> FRACBITS); + sprintf (temp, "%.0f", origin.Y); screen->DrawText (color, 170, y, temp, TAG_DONE); // Distance if (chan->DistanceScale > 0) { - FVector3 sound(ox, oy, oz); - sound /= FRACUNIT; - sprintf (temp, "%.0f", (sound - listener).Length()); + origin /= FRACUNIT; + sprintf (temp, "%.0f", (origin - listener).Length()); screen->DrawText (color, 260, y, temp, TAG_DONE); } else @@ -226,10 +231,10 @@ void S_NoiseDebug (void) screen->DrawText (color, 300, y, temp, TAG_DONE); // Flags - sprintf (temp, "%s3%sZ%sI%sM%sN%sA%sL%sE", + sprintf (temp, "%s3%sZ%sU%sM%sN%sA%sL%sE", (chan->ChanFlags & CHAN_IS3D) ? TEXTCOLOR_GREEN : TEXTCOLOR_BLACK, (chan->ChanFlags & CHAN_LISTENERZ) ? TEXTCOLOR_GREEN : TEXTCOLOR_BLACK, - (chan->ChanFlags & CHAN_IMMOBILE) ? TEXTCOLOR_GREEN : TEXTCOLOR_BLACK, + (chan->ChanFlags & CHAN_UI) ? TEXTCOLOR_GREEN : TEXTCOLOR_BLACK, (chan->ChanFlags & CHAN_MAYBE_LOCAL) ? TEXTCOLOR_GREEN : TEXTCOLOR_BLACK, (chan->ChanFlags & CHAN_NOPAUSE) ? TEXTCOLOR_GREEN : TEXTCOLOR_BLACK, (chan->ChanFlags & CHAN_AREA) ? TEXTCOLOR_GREEN : TEXTCOLOR_BLACK, @@ -547,9 +552,9 @@ FSoundChan *S_GetChannel(void *syschan) void S_ReturnChannel(FSoundChan *chan) { - if (chan->Mover != NULL) + if (chan->SourceType == SOURCE_Actor && chan->Actor != NULL) { - chan->Mover->SoundChans &= ~(1 << chan->EntChannel); + chan->Actor->SoundChans &= ~(1 << chan->EntChannel); } S_UnlinkChannel(chan); memset(chan, 0, sizeof(*chan)); @@ -596,33 +601,164 @@ void S_LinkChannel(FSoundChan *chan, FSoundChan **head) // // CalcPosVel // -// Calculates a sound's position and velocity for 3D sounds. +// Retrieves a sound's position and velocity for 3D sounds. This version +// is for an already playing sound. +// //========================================================================= -void CalcPosVel (fixed_t *pt, AActor *mover, int constz, - float pos[3], float vel[3]) +void CalcPosVel(const FSoundChan *chan, FVector3 *pos, FVector3 *vel) { - if (mover != NULL) + if (pos != NULL) { - vel[0] = FIXED2FLOAT(mover->momx) * TICRATE; - vel[1] = FIXED2FLOAT(mover->momz) * TICRATE; - vel[2] = FIXED2FLOAT(mover->momy) * TICRATE; - } - else - { - vel[0] = vel[1] = vel[2] = 0.f; - } + fixed_t x, y, z; - pos[0] = FIXED2FLOAT (pt[0]); - pos[2] = FIXED2FLOAT (pt[1]); - if (constz) - { - pos[1] = FIXED2FLOAT(players[consoleplayer].camera->z); - vel[1] = 0.f; + switch (chan->SourceType) + { + case SOURCE_None: + default: + if (players[consoleplayer].camera != NULL) + { + x = players[consoleplayer].camera->x; + y = players[consoleplayer].camera->z; + z = players[consoleplayer].camera->y; + } + else + { + z = y = x = 0; + } + break; + + case SOURCE_Actor: + x = chan->Actor->x; + y = chan->Actor->z; + z = chan->Actor->y; + break; + + case SOURCE_Sector: + x = chan->Sector->soundorg[0]; + y = players[consoleplayer].camera != NULL ? players[consoleplayer].camera->z : 0; + z = chan->Sector->soundorg[1]; + break; + + case SOURCE_Polyobj: + x = chan->Poly->startSpot[0]; + y = chan->Poly->startSpot[2]; + z = chan->Poly->startSpot[1]; + break; + + case SOURCE_Unattached: + pos->X = chan->Point[0]; + pos->Y = !(chan->ChanFlags & CHAN_LISTENERZ) ? chan->Point[1] + : FIXED2FLOAT(players[consoleplayer].camera->z); + pos->Z = chan->Point[2]; + break; + } + if (chan->SourceType != SOURCE_Unattached) + { + if (chan->ChanFlags & CHAN_LISTENERZ) + { + y = players[consoleplayer].camera != NULL ? players[consoleplayer].camera->z : 0; + } + pos->X = FIXED2FLOAT(x); + pos->Y = FIXED2FLOAT(y); + pos->Z = FIXED2FLOAT(z); + } } - else + if (vel != NULL) { - pos[1] = FIXED2FLOAT(pt[2]); + // Only actors maintain velocity information. + if (chan->SourceType == SOURCE_Actor) + { + vel->X = FIXED2FLOAT(chan->Actor->momx) * TICRATE; + vel->Y = FIXED2FLOAT(chan->Actor->momz) * TICRATE; + vel->Z = FIXED2FLOAT(chan->Actor->momy) * TICRATE; + } + else + { + vel->Zero(); + } + } +} + +//========================================================================= +// +// CalcPosVel +// +// This version is for sounds that haven't started yet so have no channel. +// +//========================================================================= + +static void CalcPosVel(int type, const AActor *actor, const sector_t *sector, + const FPolyObj *poly, const FVector3 *pt, int constz, FVector3 *pos, FVector3 *vel) +{ + if (pos != NULL) + { + fixed_t x, y, z; + + switch (type) + { + case SOURCE_None: + default: + if (players[consoleplayer].camera != NULL) + { + x = players[consoleplayer].camera->x; + y = players[consoleplayer].camera->z; + z = players[consoleplayer].camera->y; + } + else + { + z = y = x = 0; + } + break; + + case SOURCE_Actor: + x = actor->x; + y = actor->z; + z = actor->y; + break; + + case SOURCE_Sector: + x = sector->soundorg[0]; + y = players[consoleplayer].camera != NULL ? players[consoleplayer].camera->z : 0; + z = sector->soundorg[1]; + break; + + case SOURCE_Polyobj: + x = poly->startSpot[0]; + y = poly->startSpot[2]; + z = poly->startSpot[1]; + break; + + case SOURCE_Unattached: + pos->X = pt->X; + pos->Y = !constz ? pt->Y : FIXED2FLOAT(players[consoleplayer].camera->z); + pos->Z = pt->Z; + break; + } + if (type != SOURCE_Unattached) + { + if (constz) + { + y = players[consoleplayer].camera != NULL ? players[consoleplayer].camera->z : 0; + } + pos->X = FIXED2FLOAT(x); + pos->Y = FIXED2FLOAT(y); + pos->Z = FIXED2FLOAT(z); + } + } + if (vel != NULL) + { + // Only actors maintain velocity information. + if (type == SOURCE_Actor) + { + vel->X = FIXED2FLOAT(actor->momx) * TICRATE; + vel->Y = FIXED2FLOAT(actor->momz) * TICRATE; + vel->Z = FIXED2FLOAT(actor->momy) * TICRATE; + } + else + { + vel->Zero(); + } } } @@ -630,50 +766,54 @@ void CalcPosVel (fixed_t *pt, AActor *mover, int constz, // // S_StartSound // -// 0 attenuation means full volume over whole level -// 0bPlayerReserve) { - sound_id = FSoundID(S_FindSkinnedSound (mover, sound_id)); + sound_id = FSoundID(S_FindSkinnedSound (actor, sound_id)); near_limit = S_sfx[sound_id].NearLimit; } else if (sfx->bRandomHeader) @@ -730,7 +870,7 @@ static FSoundChan *S_StartSound (fixed_t *pt, AActor *mover, sector_t *sec, // If the sound is unpositioned or comes from the listener, it is // never limited. - if (pt == NULL || mover == players[consoleplayer].camera) + if (type == SOURCE_None || actor == players[consoleplayer].camera) { near_limit = 0; } @@ -760,7 +900,7 @@ static FSoundChan *S_StartSound (fixed_t *pt, AActor *mover, sector_t *sec, } // Select priority. - if (attenuation <= 0 || mover == players[consoleplayer].camera) + if (type == SOURCE_None || actor == players[consoleplayer].camera) { basepriority = 40; } @@ -769,9 +909,9 @@ static FSoundChan *S_StartSound (fixed_t *pt, AActor *mover, sector_t *sec, basepriority = 0; } - if (mover != NULL && channel == CHAN_AUTO) + if (actor != NULL && channel == CHAN_AUTO) { // Select a channel that isn't already playing something. - BYTE mask = mover->SoundChans; + BYTE mask = actor->SoundChans; // Try channel 0 first, then travel from channel 7 down. if ((mask & 1) == 0) @@ -795,14 +935,28 @@ static FSoundChan *S_StartSound (fixed_t *pt, AActor *mover, sector_t *sec, } // If this actor is already playing something on the selected channel, stop it. - if ((mover == NULL && channel != CHAN_AUTO) || (mover != NULL && mover->SoundChans & (1 << channel))) + if ((actor == NULL && channel != CHAN_AUTO) || (actor != NULL && actor->SoundChans & (1 << channel))) { for (chan = Channels; chan != NULL; chan = chan->NextChan) { - if (((mover != NULL && chan->Mover == mover) || (chan->Pt == pt)) && chan->EntChannel == channel) + if (chan->SourceType == type && chan->EntChannel == channel) { - GSnd->StopSound(chan); - break; + bool foundit; + + switch (type) + { + case SOURCE_None: foundit = true; break; + case SOURCE_Actor: foundit = (chan->Actor == actor); break; + case SOURCE_Sector: foundit = (chan->Sector == sec); break; + case SOURCE_Polyobj: foundit = (chan->Poly == poly); break; + case SOURCE_Unattached: foundit = (chan->Point[0] == pt->X && chan->Point[2] == pt->Z && chan->Point[1] == pt->Y); break; + default: foundit = false; break; + } + if (foundit) + { + GSnd->StopSound(chan); + break; + } } } } @@ -810,7 +964,7 @@ static FSoundChan *S_StartSound (fixed_t *pt, AActor *mover, sector_t *sec, // Vary the sfx pitches. if (sfx->PitchMask != 0) { - pitch = NORM_PITCH - (M_Random()&sfx->PitchMask) + (M_Random()&sfx->PitchMask); + pitch = NORM_PITCH - (M_Random() & sfx->PitchMask) + (M_Random() & sfx->PitchMask); } else { @@ -846,23 +1000,22 @@ static FSoundChan *S_StartSound (fixed_t *pt, AActor *mover, sector_t *sec, { chan->SoundID = sound_id; chan->OrgID = FSoundID(org_id); - chan->Mover = mover; - chan->Pt = pt != NULL ? pt : &chan->X; - chan->Sector = sec; chan->SfxInfo = sfx; chan->EntChannel = channel; chan->Volume = volume; - chan->X = x; - chan->Y = y; - chan->Z = z; chan->ChanFlags |= chanflags; chan->NearLimit = near_limit; chan->Pitch = pitch; chan->Priority = basepriority; chan->DistanceScale = attenuation; - if (mover != NULL) + chan->SourceType = type; + switch (type) { - mover->SoundChans |= 1 << channel; + case SOURCE_Actor: chan->Actor = actor; actor->SoundChans |= 1 << channel; break; + case SOURCE_Sector: chan->Sector = sec; break; + case SOURCE_Polyobj: chan->Poly = poly; break; + case SOURCE_Unattached: chan->Point[0] = pt->X; chan->Point[1] = pt->Y; chan->Point[2] = pt->Z; break; + default: break; } } return chan; @@ -898,9 +1051,9 @@ void S_RestartSound(FSoundChan *chan) if (chan->ChanFlags & CHAN_IS3D) { - float pos[3], vel[3]; + FVector3 pos, vel; - CalcPosVel(chan->Pt, chan->Mover, chan->ChanFlags & CHAN_LISTENERZ, pos, vel); + CalcPosVel(chan, &pos, &vel); // If this sound doesn't like playing near itself, don't play it if // that's what would happen. @@ -923,9 +1076,9 @@ void S_RestartSound(FSoundChan *chan) // When called from the savegame loader, the actor's SoundChans // flags will be cleared. During normal gameplay, they should still // be set. - if (ochan->Mover != NULL) + if (ochan->SourceType == SOURCE_Actor) { - ochan->Mover->SoundChans |= 1 << ochan->EntChannel; + ochan->Actor->SoundChans |= 1 << ochan->EntChannel; } } } @@ -938,12 +1091,12 @@ void S_RestartSound(FSoundChan *chan) void S_Sound (int channel, FSoundID sound_id, float volume, float attenuation) { - S_StartSound ((fixed_t *)NULL, NULL, NULL, channel, sound_id, volume, attenuation); + S_StartSound (NULL, NULL, NULL, NULL, channel, sound_id, volume, attenuation); } //========================================================================== // -// S_Sound - Actor is source +// S_Sound - An actor is source // //========================================================================== @@ -951,18 +1104,18 @@ void S_Sound (AActor *ent, int channel, FSoundID sound_id, float volume, float a { if (ent->Sector->Flags & SECF_SILENT) return; - S_StartSound (&ent->x, ent, NULL, channel, sound_id, volume, attenuation); + S_StartSound (ent, NULL, NULL, NULL, channel, sound_id, volume, attenuation); } //========================================================================== // -// S_Sound - A random coordinate is source +// S_Sound - A polyobject is source // //========================================================================== -void S_Sound (fixed_t *pt, int channel, FSoundID sound_id, float volume, float attenuation) +void S_Sound (const FPolyObj *poly, int channel, FSoundID sound_id, float volume, float attenuation) { - S_StartSound (pt, NULL, NULL, channel, sound_id, volume, attenuation); + S_StartSound (NULL, NULL, poly, NULL, channel, sound_id, volume, attenuation); } //========================================================================== @@ -973,11 +1126,8 @@ void S_Sound (fixed_t *pt, int channel, FSoundID sound_id, float volume, float a void S_Sound (fixed_t x, fixed_t y, fixed_t z, int channel, FSoundID sound_id, float volume, float attenuation) { - fixed_t pt[3]; - pt[0] = x; - pt[1] = y; - pt[2] = z; - S_StartSound (pt, NULL, NULL, channel|CHAN_IMMOBILE, sound_id, volume, attenuation); + FVector3 pt(FIXED2FLOAT(x), FIXED2FLOAT(z), FIXED2FLOAT(y)); + S_StartSound (NULL, NULL, NULL, &pt, channel, sound_id, volume, attenuation); } //========================================================================== @@ -986,9 +1136,9 @@ void S_Sound (fixed_t x, fixed_t y, fixed_t z, int channel, FSoundID sound_id, f // //========================================================================== -void S_Sound (sector_t *sec, int channel, FSoundID sfxid, float volume, float attenuation) +void S_Sound (const sector_t *sec, int channel, FSoundID sfxid, float volume, float attenuation) { - S_StartSound (sec->soundorg, NULL, sec, channel, sfxid, volume, attenuation); + S_StartSound (NULL, sec, NULL, NULL, channel, sfxid, volume, attenuation); } //========================================================================== @@ -1043,7 +1193,7 @@ bool S_CheckSingular(int sound_id) // //========================================================================== -bool S_CheckSoundLimit(sfxinfo_t *sfx, float pos[3], int near_limit) +bool S_CheckSoundLimit(sfxinfo_t *sfx, const FVector3 &pos, int near_limit) { FSoundChan *chan; int count; @@ -1052,10 +1202,10 @@ bool S_CheckSoundLimit(sfxinfo_t *sfx, float pos[3], int near_limit) { if (!(chan->ChanFlags & CHAN_EVICTED) && chan->SfxInfo == sfx) { - double dx = FIXED2FLOAT(chan->Pt[0]) - pos[0]; - double dy = FIXED2FLOAT(chan->Pt[1]) - pos[2]; - double dz = FIXED2FLOAT(chan->Pt[2]) - pos[1]; - if (dx*dx + dy*dy + dz*dz <= 256.0*256.0) + FVector3 chanorigin; + + CalcPosVel(chan, &chanorigin, NULL); + if ((chanorigin - pos).LengthSquared() <= 256.0*256.0) { count++; } @@ -1068,27 +1218,86 @@ bool S_CheckSoundLimit(sfxinfo_t *sfx, float pos[3], int near_limit) // // S_StopSound // -// Stops a sound from a single source playing on a specific channel. +// Stops an unpositioned sound from playing on a specific channel. +// //========================================================================== -void S_StopSound (fixed_t *pt, int channel) +void S_StopSound (int channel) { for (FSoundChan *chan = Channels; chan != NULL; chan = chan->NextChan) { - if (((pt == NULL && chan->Pt == &chan->X) || chan->Pt == pt) && - ((i_compatflags & COMPATF_MAGICSILENCE) || chan->EntChannel == channel)) + if (chan->SourceType == SOURCE_None && + (chan->EntChannel == channel || (i_compatflags & COMPATF_MAGICSILENCE))) { GSnd->StopSound(chan); } } } -void S_StopSound (AActor *ent, int channel) +//========================================================================== +// +// S_StopSound +// +// Stops a sound from a single actor from playing on a specific channel. +// +//========================================================================== + +void S_StopSound (AActor *actor, int channel) { // No need to search every channel if we know it's not playing anything. - if (ent != NULL && ent->SoundChans & (1 << channel)) + if (actor != NULL && actor->SoundChans & (1 << channel)) { - S_StopSound (&ent->x, channel); + for (FSoundChan *chan = Channels; chan != NULL; chan = chan->NextChan) + { + if (chan->SourceType == SOURCE_Actor && + chan->Actor == actor && + (chan->EntChannel == channel || (i_compatflags & COMPATF_MAGICSILENCE))) + { + GSnd->StopSound(chan); + } + } + } +} + +//========================================================================== +// +// S_StopSound +// +// Stops a sound from a single sector from playing on a specific channel. +// +//========================================================================== + +void S_StopSound (const sector_t *sec, int channel) +{ + for (FSoundChan *chan = Channels; chan != NULL; chan = chan->NextChan) + { + if (chan->SourceType == SOURCE_Sector && + chan->Sector == sec && + (chan->EntChannel == channel || (i_compatflags & COMPATF_MAGICSILENCE))) + { + GSnd->StopSound(chan); + } + } +} + +//========================================================================== +// +// S_StopSound +// +// Stops a sound from a single polyobject from playing on a specific channel. +// +//========================================================================== + +void S_StopSound (const FPolyObj *poly, int channel) +{ + for (FSoundChan *chan = Channels; chan != NULL; chan = chan->NextChan) + { + if (chan->SourceType == SOURCE_Polyobj && + chan->Poly == poly && + (chan->EntChannel == channel || (i_compatflags & COMPATF_MAGICSILENCE))) + { + GSnd->StopSound(chan); + } } } @@ -1123,18 +1332,18 @@ void S_RelinkSound (AActor *from, AActor *to) for (FSoundChan *chan = Channels; chan != NULL; chan = chan->NextChan) { - if (chan->Mover == from) + if (chan->SourceType == SOURCE_Actor && chan->Actor == from) { - if (to != NULL || !(chan->ChanFlags & CHAN_LOOP)) + if (to != NULL) { - if (chan->Pt == &from->x) - { - chan->Pt = to ? &to->x : &chan->X; - chan->X = from->x; - chan->Y = from->y; - chan->Z = from->z; - } - chan->Mover = to; + chan->Actor = to; + } + else if (!(chan->ChanFlags & CHAN_LOOP)) + { + chan->SourceType = SOURCE_Unattached; + chan->Point[0] = FIXED2FLOAT(from->x); + chan->Point[1] = FIXED2FLOAT(from->z); + chan->Point[2] = FIXED2FLOAT(from->y); } else { @@ -1148,25 +1357,58 @@ void S_RelinkSound (AActor *from, AActor *to) // // S_GetSoundPlayingInfo // -// Is a sound being played by a specific actor/point? +// Is a sound being played by a specific emitter? //========================================================================== -bool S_GetSoundPlayingInfo (fixed_t *pt, int sound_id) +bool S_GetSoundPlayingInfo (const AActor *actor, int sound_id) { if (sound_id > 0) { for (FSoundChan *chan = Channels; chan != NULL; chan = chan->NextChan) { - if (chan->Pt == pt && chan->OrgID == sound_id) + if (chan->OrgID == sound_id && + chan->SourceType == SOURCE_Actor && + chan->Actor == actor) + { return true; + } } } return false; } -bool S_GetSoundPlayingInfo (AActor *ent, int sound_id) +bool S_GetSoundPlayingInfo (const sector_t *sec, int sound_id) { - return S_GetSoundPlayingInfo (ent ? &ent->x : NULL, sound_id); + if (sound_id > 0) + { + for (FSoundChan *chan = Channels; chan != NULL; chan = chan->NextChan) + { + if (chan->OrgID == sound_id && + chan->SourceType == SOURCE_Sector && + chan->Sector == sec) + { + return true; + } + } + } + return false; +} + +bool S_GetSoundPlayingInfo (const FPolyObj *poly, int sound_id) +{ + if (sound_id > 0) + { + for (FSoundChan *chan = Channels; chan != NULL; chan = chan->NextChan) + { + if (chan->OrgID == sound_id && + chan->SourceType == SOURCE_Polyobj && + chan->Poly == poly) + { + return true; + } + } + } + return false; } //========================================================================== @@ -1189,7 +1431,7 @@ bool S_IsActorPlayingSomething (AActor *actor, int channel, int sound_id) for (FSoundChan *chan = Channels; chan != NULL; chan = chan->NextChan) { - if (chan->Pt == &actor->x) + if (chan->SourceType == SOURCE_Actor && chan->Actor == actor) { if (channel == 0 || chan->EntChannel == channel) { @@ -1319,7 +1561,7 @@ void S_RestoreEvictedChannels() void S_UpdateSounds (void *listener_p) { - float pos[3], vel[3]; + FVector3 pos, vel; I_UpdateMusic(); @@ -1338,7 +1580,7 @@ void S_UpdateSounds (void *listener_p) { if ((chan->ChanFlags & (CHAN_EVICTED | CHAN_IS3D)) == CHAN_IS3D) { - CalcPosVel(chan->Pt, chan->Mover, chan->ChanFlags & CHAN_LISTENERZ, pos, vel); + CalcPosVel(chan, &pos, &vel); GSnd->UpdateSoundParams3D(chan, pos, vel); } chan->ChanFlags &= ~CHAN_JUSTSTARTED; @@ -1379,31 +1621,16 @@ FArchive &operator<<(FArchive &arc, FSoundID &sid) static FArchive &operator<<(FArchive &arc, FSoundChan &chan) { - BYTE pt_type; - - if (arc.IsStoring()) + arc << chan.SourceType; + switch (chan.SourceType) { - if (chan.Pt == &chan.X) - { - pt_type = 2; - } - else if (chan.Pt == &chan.Mover->x) - { - pt_type = 1; - } - else - { // WTF? - assert(0); - pt_type = 0; - } + case SOURCE_None: break; + case SOURCE_Actor: arc << chan.Actor; break; + case SOURCE_Sector: arc << chan.Sector; break; + case SOURCE_Polyobj: arc << chan.Poly; break; + case SOURCE_Unattached: arc << chan.Point[0] << chan.Point[1] << chan.Point[2]; break; + default: I_Error("Unknown sound source type %d\n", chan.SourceType); break; } - - arc << pt_type; - arc << chan.Mover; - arc << chan.Sector; - arc << chan.X; - arc << chan.Y; - arc << chan.Z; arc << chan.SoundID; arc << chan.OrgID; arc << chan.Volume; @@ -1418,18 +1645,6 @@ static FArchive &operator<<(FArchive &arc, FSoundChan &chan) if (arc.IsLoading()) { chan.SfxInfo = &S_sfx[chan.SoundID]; - if (pt_type == 1) - { - chan.Pt = &chan.Mover->x; - } - else if (pt_type == 2) - { - chan.Pt = &chan.X; - } - else - { - chan.Pt = &chan.Mover->x; - } } return arc; } diff --git a/src/s_sound.h b/src/s_sound.h index a754eae7d..3760aba74 100644 --- a/src/s_sound.h +++ b/src/s_sound.h @@ -167,26 +167,31 @@ extern int S_SoundCurveSize; // Information about one playing sound. struct sector_t; +struct FPolyObj; struct FSoundChan { void *SysChannel;// Channel information from the system interface. FSoundChan *NextChan; // Next channel in this list. FSoundChan **PrevChan; // Previous channel in this list. - AActor *Mover; // Used for velocity. - sector_t *Sector; // Sector for area sounds. - fixed_t *Pt; // Origin of sound. sfxinfo_t *SfxInfo; // Sound information. - fixed_t X,Y,Z; // Origin if Mover is NULL. + QWORD_UNION StartTime; // Sound start time in DSP clocks. FSoundID SoundID; // Sound ID of playing sound. FSoundID OrgID; // Sound ID of sound used to start this channel. float Volume; float DistanceScale; - int Pitch; // Pitch variation. int ChanFlags; + SWORD Pitch; // Pitch variation. BYTE EntChannel; // Actor's sound channel. SBYTE Priority; SWORD NearLimit; - QWORD_UNION StartTime; // Sound start time in DSP clocks. + BYTE SourceType; + union + { + AActor *Actor; // Used for position and velocity. + const sector_t *Sector; // Sector for area sounds. + const FPolyObj *Poly; // Polyobject sound source. + float Point[3]; // Sound is not attached to any source. + }; }; extern FSoundChan *Channels; @@ -219,9 +224,9 @@ void S_CacheSound (sfxinfo_t *sfx); // Start sound for thing at void S_Sound (int channel, FSoundID sfxid, float volume, float attenuation); void S_Sound (AActor *ent, int channel, FSoundID sfxid, float volume, float attenuation); -void S_Sound (fixed_t *pt, int channel, FSoundID sfxid, float volume, float attenuation); +void S_Sound (const FPolyObj *poly, int channel, FSoundID sfxid, float volume, float attenuation); +void S_Sound (const sector_t *sec, int channel, FSoundID sfxid, float volume, float attenuation); void S_Sound (fixed_t x, fixed_t y, fixed_t z, int channel, FSoundID sfxid, float volume, float attenuation); -void S_Sound (sector_t *sec, int channel, FSoundID sfxid, float volume, float attenuation); // sound channels // channel 0 never willingly overrides @@ -249,8 +254,8 @@ void S_Sound (sector_t *sec, int channel, FSoundID sfxid, float volume, float at // modifier flags #define CHAN_LISTENERZ 8 -#define CHAN_IMMOBILE 16 -#define CHAN_MAYBE_LOCAL 32 +#define CHAN_MAYBE_LOCAL 16 +#define CHAN_UI 32 // Do not record sound in savegames. #define CHAN_NOPAUSE 64 // Do not pause this sound in menus. #define CHAN_AREA 128 // Sound plays from all around. Only valid with sector sounds. #define CHAN_LOOP 256 @@ -274,16 +279,22 @@ void S_CacheRandomSound (sfxinfo_t *sfx); // Checks if a copy of this sound is already playing. bool S_CheckSingular (int sound_id); -// Stops a sound emanating from one of an entity's channels +// Stops a sound emanating from one of an emitter's channels. void S_StopSound (AActor *ent, int channel); -void S_StopSound (fixed_t *pt, int channel); +void S_StopSound (const sector_t *sec, int channel); +void S_StopSound (const FPolyObj *poly, int channel); + +// Stops an origin-less sound from playing from this channel. +void S_StopSound (int channel); // Stop sound for all channels void S_StopAllChannels (void); -// Is the sound playing on one of the entity's channels? -bool S_GetSoundPlayingInfo (AActor *ent, int sound_id); -bool S_GetSoundPlayingInfo (fixed_t *pt, int sound_id); +// Is the sound playing on one of the emitter's channels? +bool S_GetSoundPlayingInfo (const AActor *actor, int sound_id); +bool S_GetSoundPlayingInfo (const sector_t *sector, int sound_id); +bool S_GetSoundPlayingInfo (const FPolyObj *poly, int sound_id); + bool S_IsActorPlayingSomething (AActor *actor, int channel, int sound_id); // Moves all sounds from one mobj to another diff --git a/src/sound/fmodsound.cpp b/src/sound/fmodsound.cpp index 0cf0fdc73..be961ad05 100644 --- a/src/sound/fmodsound.cpp +++ b/src/sound/fmodsound.cpp @@ -67,8 +67,6 @@ extern HWND Window; // Just some extra for music and whatever #define NUM_EXTRA_SOFTWARE_CHANNELS 1 -#define FIXED2FLOAT(x) ((x)/65536.f) - #define MAX_CHANNELS 256 #define SPECTRUM_SIZE 256 @@ -1408,8 +1406,8 @@ FSoundChan *FMODSoundRenderer::StartSound(sfxinfo_t *sfx, float vol, int pitch, CVAR(Float, snd_3dspread, 180, 0) FSoundChan *FMODSoundRenderer::StartSound3D(sfxinfo_t *sfx, float vol, float distscale, - int pitch, int priority, float pos[3], float vel[3], sector_t *sector, int channum, int chanflags, - FSoundChan *reuse_chan) + int pitch, int priority, const FVector3 &pos, const FVector3 &vel, const sector_t *sector, + int channum, int chanflags, FSoundChan *reuse_chan) { int id = int(sfx - &S_sfx[0]); FMOD_RESULT result; @@ -1480,7 +1478,7 @@ FSoundChan *FMODSoundRenderer::StartSound3D(sfxinfo_t *sfx, float vol, float dis chan->setVolume(vol); if (mode & FMOD_3D) { - chan->set3DAttributes((FMOD_VECTOR *)pos, (FMOD_VECTOR *)vel); + chan->set3DAttributes((FMOD_VECTOR *)&pos[0], (FMOD_VECTOR *)&vel[0]); chan->set3DSpread(snd_3dspread); } HandleChannelDelay(chan, reuse_chan, freq); @@ -1546,16 +1544,17 @@ void FMODSoundRenderer::HandleChannelDelay(FMOD::Channel *chan, FSoundChan *reus // //========================================================================== -FMOD_MODE FMODSoundRenderer::SetChanHeadSettings(FMOD::Channel *chan, sfxinfo_t *sfx, float pos[3], int channum, int chanflags, sector_t *sec, FMOD_MODE oldmode) const +FMOD_MODE FMODSoundRenderer::SetChanHeadSettings(FMOD::Channel *chan, sfxinfo_t *sfx, const FVector3 &pos, int channum, int chanflags, const sector_t *sec, FMOD_MODE oldmode) const { if (players[consoleplayer].camera == NULL) { return oldmode; } - float cpos[3]; - cpos[0] = FIXED2FLOAT(players[consoleplayer].camera->x); - cpos[2] = FIXED2FLOAT(players[consoleplayer].camera->y); - cpos[1] = FIXED2FLOAT(players[consoleplayer].camera->z); + FVector3 cpos, mpos; + cpos.X = FIXED2FLOAT(players[consoleplayer].camera->x); + cpos.Y = FIXED2FLOAT(players[consoleplayer].camera->z); + cpos.Z = FIXED2FLOAT(players[consoleplayer].camera->y); + mpos = pos; if ((chanflags & CHAN_AREA) && sec != NULL) { @@ -1567,8 +1566,8 @@ FMOD_MODE FMODSoundRenderer::SetChanHeadSettings(FMOD::Channel *chan, sfxinfo_t // Are we inside the sector? If yes, the closest point is the one we're on. if (P_PointInSector(players[consoleplayer].camera->x, players[consoleplayer].camera->y) == sec) { - pos[0] = cpos[0]; - pos[2] = cpos[2]; + mpos[0] = cpos[0]; + mpos[2] = cpos[2]; cx = players[consoleplayer].camera->x; cy = players[consoleplayer].camera->y; } @@ -1577,8 +1576,8 @@ FMOD_MODE FMODSoundRenderer::SetChanHeadSettings(FMOD::Channel *chan, sfxinfo_t // Find the closest point on the sector's boundary lines and use // that as the perceived origin of the sound. sec->ClosestPoint(players[consoleplayer].camera->x, players[consoleplayer].camera->y, cx, cy); - pos[0] = FIXED2FLOAT(cx); - pos[2] = FIXED2FLOAT(cy); + mpos[0] = FIXED2FLOAT(cx); + mpos[2] = FIXED2FLOAT(cy); } // Set sound height based on channel. if (channum == CHAN_FLOOR) @@ -1598,13 +1597,12 @@ FMOD_MODE FMODSoundRenderer::SetChanHeadSettings(FMOD::Channel *chan, sfxinfo_t { cz = players[consoleplayer].camera->z; } - pos[1] = FIXED2FLOAT(cz); + mpos[1] = FIXED2FLOAT(cz); // How far are we from the perceived sound origin? Within a certain // short distance, we interpolate between 2D panning and full 3D panning. const double interp_range = 32.0; - double dx = cpos[0] - pos[0], dy = cpos[1] - pos[1], dz = cpos[2] - pos[2]; - double dist_sqr = dx*dx + dy*dy + dz*dz; + double dist_sqr = (cpos - mpos).LengthSquared(); if (dist_sqr == 0) { @@ -1630,7 +1628,7 @@ FMOD_MODE FMODSoundRenderer::SetChanHeadSettings(FMOD::Channel *chan, sfxinfo_t } return oldmode; } - else if (cpos[0] == pos[0] && cpos[1] == pos[1] && cpos[2] == pos[2]) + else if (cpos == mpos) { // Head relative return (oldmode & ~FMOD_3D) | FMOD_2D; } @@ -1754,7 +1752,7 @@ void FMODSoundRenderer::SetInactive(bool inactive) // //========================================================================== -void FMODSoundRenderer::UpdateSoundParams3D(FSoundChan *chan, float pos[3], float vel[3]) +void FMODSoundRenderer::UpdateSoundParams3D(FSoundChan *chan, const FVector3 &pos, const FVector3 &vel) { if (chan == NULL || chan->SysChannel == NULL) return; @@ -1771,7 +1769,7 @@ void FMODSoundRenderer::UpdateSoundParams3D(FSoundChan *chan, float pos[3], floa { // Only set the mode if it changed. fchan->setMode(mode); } - fchan->set3DAttributes((FMOD_VECTOR *)pos, (FMOD_VECTOR *)vel); + fchan->set3DAttributes((FMOD_VECTOR *)&pos[0], (FMOD_VECTOR *)&vel[0]); } //========================================================================== diff --git a/src/sound/fmodsound.h b/src/sound/fmodsound.h index ad0dc6049..c9647eb25 100644 --- a/src/sound/fmodsound.h +++ b/src/sound/fmodsound.h @@ -26,7 +26,7 @@ public: // Starts a sound. FSoundChan *StartSound (sfxinfo_t *sfx, float vol, int pitch, int chanflags, FSoundChan *reuse_chan); - FSoundChan *StartSound3D (sfxinfo_t *sfx, float vol, float distscale, int pitch, int priority, float pos[3], float vel[3], sector_t *sector, int channum, int chanflags, FSoundChan *reuse_chan); + FSoundChan *StartSound3D (sfxinfo_t *sfx, float vol, float distscale, int pitch, int priority, const FVector3 &pos, const FVector3 &vel, const sector_t *sector, int channum, int chanflags, FSoundChan *reuse_chan); // Stops a sound channel. void StopSound (FSoundChan *chan); @@ -44,7 +44,7 @@ public: void SetInactive (bool inactive); // Updates the position of a sound channel. - void UpdateSoundParams3D (FSoundChan *chan, float pos[3], float vel[3]); + void UpdateSoundParams3D (FSoundChan *chan, const FVector3 &pos, const FVector3 &vel); void UpdateListener (); void UpdateSounds (); @@ -69,7 +69,7 @@ private: void HandleChannelDelay(FMOD::Channel *chan, FSoundChan *reuse_chan, float freq) const; FSoundChan *CommonChannelSetup(FMOD::Channel *chan, FSoundChan *reuse_chan) const; - FMOD_MODE SetChanHeadSettings(FMOD::Channel *chan, sfxinfo_t *sfx, float pos[3], int channum, int chanflags, sector_t *sec, FMOD_MODE oldmode) const; + FMOD_MODE SetChanHeadSettings(FMOD::Channel *chan, sfxinfo_t *sfx, const FVector3 &pos, int channum, int chanflags, const sector_t *sec, FMOD_MODE oldmode) const; void DoLoad (void **slot, sfxinfo_t *sfx); void getsfx (sfxinfo_t *sfx); diff --git a/src/sound/i_sound.cpp b/src/sound/i_sound.cpp index 4b3116eac..ba4609274 100644 --- a/src/sound/i_sound.cpp +++ b/src/sound/i_sound.cpp @@ -148,7 +148,7 @@ public: { return NULL; } - FSoundChan *StartSound3D (sfxinfo_t *sfx, float vol, float distscale, int pitch, int priority, float pos[3], float vel[3], sector_t *sector, int channum, int chanflags, FSoundChan *reuse_chan) + FSoundChan *StartSound3D (sfxinfo_t *sfx, float vol, float distscale, int pitch, int priority, const FVector3 &pos, const FVector3 &vel, const sector_t *sector, int channum, int chanflags, FSoundChan *reuse_chan) { return NULL; } @@ -184,7 +184,7 @@ public: } // Updates the volume, separation, and pitch of a sound channel. - void UpdateSoundParams3D (FSoundChan *chan, float pos[3], float vel[3]) + void UpdateSoundParams3D (FSoundChan *chan, const FVector3 &pos, const FVector3 &vel) { } diff --git a/src/sound/i_sound.h b/src/sound/i_sound.h index 3dff09436..1ce2573d7 100644 --- a/src/sound/i_sound.h +++ b/src/sound/i_sound.h @@ -90,7 +90,7 @@ public: // Starts a sound. virtual FSoundChan *StartSound (sfxinfo_t *sfx, float vol, int pitch, int chanflags, FSoundChan *reuse_chan) = 0; - virtual FSoundChan *StartSound3D (sfxinfo_t *sfx, float vol, float distscale, int pitch, int priority, float pos[3], float vel[3], sector_t *sector, int channum, int chanflags, FSoundChan *reuse_chan) = 0; + virtual FSoundChan *StartSound3D (sfxinfo_t *sfx, float vol, float distscale, int pitch, int priority, const FVector3 &pos, const FVector3 &vel, const sector_t *sector, int channum, int chanflags, FSoundChan *reuse_chan) = 0; // Stops a sound channel. virtual void StopSound (FSoundChan *chan) = 0; @@ -108,7 +108,7 @@ public: virtual void SetInactive(bool inactive) = 0; // Updates the volume, separation, and pitch of a sound channel. - virtual void UpdateSoundParams3D (FSoundChan *chan, float pos[3], float vel[3]) = 0; + virtual void UpdateSoundParams3D (FSoundChan *chan, const FVector3 &pos, const FVector3 &vel) = 0; virtual void UpdateListener () = 0; virtual void UpdateSounds () = 0; diff --git a/src/textures/multipatchtexture.cpp b/src/textures/multipatchtexture.cpp index dc018dd50..c70345fe5 100644 --- a/src/textures/multipatchtexture.cpp +++ b/src/textures/multipatchtexture.cpp @@ -43,7 +43,6 @@ #include "st_start.h" #include "sc_man.h" #include "templates.h" -#include "vectors.h" #include "r_translate.h" #include "bitmap.h" diff --git a/src/thingdef/olddecorations.cpp b/src/thingdef/olddecorations.cpp index 4139b8856..3a0f64c77 100644 --- a/src/thingdef/olddecorations.cpp +++ b/src/thingdef/olddecorations.cpp @@ -50,7 +50,6 @@ #include "decallib.h" #include "i_system.h" #include "thingdef.h" -#include "vectors.h" #include "r_translate.h" // TYPES ------------------------------------------------------------------- diff --git a/src/thingdef/thingdef_codeptr.cpp b/src/thingdef/thingdef_codeptr.cpp index 8bbb6d14d..524b48a1b 100644 --- a/src/thingdef/thingdef_codeptr.cpp +++ b/src/thingdef/thingdef_codeptr.cpp @@ -60,7 +60,6 @@ #include "p_local.h" #include "c_console.h" #include "doomerrors.h" -#include "vectors.h" #include "a_sharedglobal.h" #include "a_doomglobal.h" #include "thingdef/thingdef.h" diff --git a/src/thingdef/thingdef_exp.cpp b/src/thingdef/thingdef_exp.cpp index 261962c3a..5a7873f40 100644 --- a/src/thingdef/thingdef_exp.cpp +++ b/src/thingdef/thingdef_exp.cpp @@ -41,7 +41,6 @@ #include "sc_man.h" #include "tarray.h" #include "templates.h" -#include "vectors.h" #include "cmdlib.h" #include "i_system.h" #include "m_random.h" diff --git a/src/thingdef/thingdef_main.cpp b/src/thingdef/thingdef_main.cpp index 5339356a4..0b0106b27 100644 --- a/src/thingdef/thingdef_main.cpp +++ b/src/thingdef/thingdef_main.cpp @@ -43,7 +43,6 @@ #include "s_sound.h" #include "cmdlib.h" #include "thingdef.h" -#include "vectors.h" // EXTERNAL FUNCTION PROTOTYPES --------------------------------------------