From 26b886b960afff2418439fe58638e191ef32680e Mon Sep 17 00:00:00 2001 From: Randy Heit Date: Sun, 4 Feb 2007 01:12:50 +0000 Subject: [PATCH] - Fixed: The changecamera special should remove "past viewer" information from the renderer in case the camera changed position or direction since the last time it was looked through. Otherwise, the renderer will interpolate from its previous view for one frame when it is switched to. - Fixed non-POD parameter passing for GCC introduced in the previous commit. SVN r476 (trunk) --- docs/rh-log.txt | 4 ++++ src/p_lnspec.cpp | 10 ++++++++++ src/r_main.cpp | 27 +++++++++++++++++++++++++++ src/r_main.h | 1 + src/s_advsound.cpp | 18 +++++++++--------- src/sound/fmodsound.cpp | 10 +++++----- src/tarray.h | 6 ++++-- 7 files changed, 60 insertions(+), 16 deletions(-) diff --git a/docs/rh-log.txt b/docs/rh-log.txt index db53012cd7..8580b0a511 100644 --- a/docs/rh-log.txt +++ b/docs/rh-log.txt @@ -1,4 +1,8 @@ February 3, 2007 +- Fixed: The changecamera special should remove "past viewer" information + from the renderer in case the camera changed position or direction since + the last time it was looked through. Otherwise, the renderer will + interpolate from its previous view for one frame when it is switched to. - Removed the 63-character limit on sound names. - Reduced the rate at which drowning damage increases. - Added more player water sounds: diff --git a/src/p_lnspec.cpp b/src/p_lnspec.cpp index 7ab3d0558f..d5febfcc17 100644 --- a/src/p_lnspec.cpp +++ b/src/p_lnspec.cpp @@ -2236,6 +2236,7 @@ FUNC(LS_ChangeCamera) if (!playeringame[i]) continue; + AActor *oldcamera = players[i].camera; if (camera) { players[i].camera = camera; @@ -2247,10 +2248,15 @@ FUNC(LS_ChangeCamera) players[i].camera = players[i].mo; players[i].cheats &= ~CF_REVERTPLEASE; } + if (oldcamera != players[i].camera) + { + R_ClearPastViewer (players[i].camera); + } } } else { + AActor *oldcamera = it->player->camera; if (camera) { it->player->camera = camera; @@ -2262,6 +2268,10 @@ FUNC(LS_ChangeCamera) it->player->camera = it; it->player->cheats &= ~CF_REVERTPLEASE; } + if (oldcamera != it->player->camera) + { + R_ClearPastViewer (it->player->camera); + } } return true; diff --git a/src/r_main.cpp b/src/r_main.cpp index 837f00df70..9aad0b3dc3 100644 --- a/src/r_main.cpp +++ b/src/r_main.cpp @@ -978,6 +978,33 @@ void R_FreePastViewers () PastViewers.Clear (); } +//========================================================================== +// +// R_ClearPastViewer +// +// If the actor changed in a non-interpolatable way, remove it. +// +//========================================================================== + +void R_ClearPastViewer (AActor *actor) +{ + for (unsigned int i = 0; i < PastViewers.Size(); ++i) + { + if (PastViewers[i].ViewActor == actor) + { + // Found it, so remove it. + if (i == PastViewers.Size()) + { + PastViewers.Delete (i); + } + else + { + PastViewers.Pop (PastViewers[i]); + } + } + } +} + //========================================================================== // // R_CopyStackedViewParameters diff --git a/src/r_main.h b/src/r_main.h index 0ae0a8a046..4914a7bb38 100644 --- a/src/r_main.h +++ b/src/r_main.h @@ -261,6 +261,7 @@ void clearinterpolations(); void SerializeInterpolations(FArchive &arc); extern void R_FreePastViewers (); +extern void R_ClearPastViewer (AActor *actor); extern int stacked_extralight; extern float stacked_visibility; diff --git a/src/s_advsound.cpp b/src/s_advsound.cpp index 4b22a289f7..ada2aaa435 100644 --- a/src/s_advsound.cpp +++ b/src/s_advsound.cpp @@ -1642,30 +1642,30 @@ CCMD (soundlist) const sfxinfo_t *sfx = &S_sfx[i]; if (sfx->bRandomHeader) { - Printf ("%3d. %s -> #%d {", i, sfx->name, sfx->link); + Printf ("%3d. %s -> #%d {", i, sfx->name.GetChars(), sfx->link); const FRandomSoundList *list = &S_rnd[sfx->link]; for (size_t j = 0; j < list->NumSounds; ++j) { - Printf (" %s ", S_sfx[list->Sounds[j]].name); + Printf (" %s ", S_sfx[list->Sounds[j]].name.GetChars()); } Printf ("}\n"); } else if (sfx->bPlayerReserve) { - Printf ("%3d. %s <>\n", i, sfx->name, sfx->link); + Printf ("%3d. %s <>\n", i, sfx->name.GetChars(), sfx->link); } else if (S_sfx[i].lumpnum != -1) { Wads.GetLumpName (lumpname, sfx->lumpnum); - Printf ("%3d. %s (%s)\n", i, sfx->name, lumpname); + Printf ("%3d. %s (%s)\n", i, sfx->name.GetChars(), lumpname); } else if (S_sfx[i].link != sfxinfo_t::NO_LINK) { - Printf ("%3d. %s -> %s\n", i, sfx->name, S_sfx[sfx->link].name); + Printf ("%3d. %s -> %s\n", i, sfx->name.GetChars(), S_sfx[sfx->link].name.GetChars()); } else { - Printf ("%3d. %s **not present**\n", i, sfx->name); + Printf ("%3d. %s **not present**\n", i, sfx->name.GetChars()); } } } @@ -1688,7 +1688,7 @@ CCMD (soundlinks) !sfx->bRandomHeader && !sfx->bPlayerReserve) { - Printf ("%s -> %s\n", sfx->name, S_sfx[sfx->link].name); + Printf ("%s -> %s\n", sfx->name.GetChars(), S_sfx[sfx->link].name.GetChars()); } } } @@ -1722,10 +1722,10 @@ CCMD (playersounds) { if ((l = PlayerClassLookups[i].ListIndex[j]) != 0xffff) { - Printf ("\n%s, %s:\n", PlayerClassLookups[i].Name, GenderNames[j]); + Printf ("\n%s, %s:\n", PlayerClassLookups[i].Name.GetChars(), GenderNames[j]); for (k = 0; k < NumPlayerReserves; ++k) { - Printf (" %-16s%s\n", reserveNames[k], S_sfx[PlayerSounds[l].LookupSound (k)].name); + Printf (" %-16s%s\n", reserveNames[k], S_sfx[PlayerSounds[l].LookupSound (k)].name.GetChars()); } } } diff --git a/src/sound/fmodsound.cpp b/src/sound/fmodsound.cpp index 656ea1b5d8..e10f33d828 100644 --- a/src/sound/fmodsound.cpp +++ b/src/sound/fmodsound.cpp @@ -701,7 +701,7 @@ long FMODSoundRenderer::StartSound (sfxinfo_t *sfx, int vol, int sep, int pitch, return channel + 1; } - DPrintf ("Sound %s failed to play: %d\n", sfx->name, FSOUND_GetError ()); + DPrintf ("Sound %s failed to play: %d\n", sfx->name.GetChars(), FSOUND_GetError ()); return 0; } @@ -737,7 +737,7 @@ long FMODSoundRenderer::StartSound3D (sfxinfo_t *sfx, float vol, int pitch, int return channel + 1; } - DPrintf ("Sound %s failed to play: %d (%d)\n", sfx->name, FSOUND_GetError (), FSOUND_GetChannelsPlaying ()); + DPrintf ("Sound %s failed to play: %d (%d)\n", sfx->name.GetChars(), FSOUND_GetError (), FSOUND_GetChannelsPlaying ()); return 0; } @@ -941,7 +941,7 @@ void FMODSoundRenderer::LoadSound (sfxinfo_t *sfx) { if (!sfx->data) { - DPrintf ("loading sound \"%s\" (%d) ", sfx->name, sfx - &S_sfx[0]); + DPrintf ("loading sound \"%s\" (%d) ", sfx->name.GetChars(), sfx - &S_sfx[0]); getsfx (sfx); } } @@ -965,7 +965,7 @@ void FMODSoundRenderer::UnloadSound (sfxinfo_t *sfx) sfx->data = NULL; } - DPrintf ("Unloaded sound \"%s\" (%d)\n", sfx->name, sfx - &S_sfx[0]); + DPrintf ("Unloaded sound \"%s\" (%d)\n", sfx->name.GetChars(), sfx - &S_sfx[0]); } // FSOUND_Sample_Upload seems to mess up the signedness of sound data when @@ -1203,7 +1203,7 @@ void FMODSoundRenderer::getsfx (sfxinfo_t *sfx) { if (S_sfx[i].data && S_sfx[i].link == sfxinfo_t::NO_LINK && S_sfx[i].lumpnum == sfx->lumpnum) { - DPrintf ("Linked to %s (%d)\n", S_sfx[i].name, i); + DPrintf ("Linked to %s (%d)\n", S_sfx[i].name.GetChars(), i); sfx->link = i; sfx->ms = S_sfx[i].ms; return; diff --git a/src/tarray.h b/src/tarray.h index 0edf613330..21cb4d38b1 100644 --- a/src/tarray.h +++ b/src/tarray.h @@ -130,8 +130,10 @@ public: if (index < Count) { Array[index].~T(); - memmove (&Array[index], &Array[index+1], sizeof(T)*(Count - index - 1)); - Count--; + if (index < --Count) + { + memmove (&Array[index], &Array[index+1], sizeof(T)*(Count - index)); + } } } // Inserts an item into the array, shifting elements as needed