mirror of
https://github.com/DrBeef/ioq3quest.git
synced 2024-11-26 14:01:26 +00:00
Fix issue with multiple item pickup events playing
This was causing horrible audio, as multiple item pickup events were all playing at the same time. This was because the predict player state was being called once per eye, and by the time it came to the right eye it had cleared the buffer and it would just allow server events to get played again. The actual fix is in cg_view.c, line 994, where we only predict if the eye being rendered is the left.
This commit is contained in:
parent
b6896417cf
commit
0772bc8c0b
5 changed files with 28 additions and 21 deletions
|
@ -40,7 +40,6 @@ int sortedTeamPlayers[TEAM_MAXOVERLAY];
|
||||||
int numSortedTeamPlayers;
|
int numSortedTeamPlayers;
|
||||||
|
|
||||||
extern vr_clientinfo_t* vr;
|
extern vr_clientinfo_t* vr;
|
||||||
extern stereoFrame_t hudStereoView;
|
|
||||||
|
|
||||||
char systemChat[256];
|
char systemChat[256];
|
||||||
char teamChat1[256];
|
char teamChat1[256];
|
||||||
|
@ -983,7 +982,7 @@ CG_DrawUpperRight
|
||||||
|
|
||||||
=====================
|
=====================
|
||||||
*/
|
*/
|
||||||
static void CG_DrawUpperRight(stereoFrame_t stereoFrame)
|
static void CG_DrawUpperRight()
|
||||||
{
|
{
|
||||||
float y;
|
float y;
|
||||||
|
|
||||||
|
@ -995,7 +994,7 @@ static void CG_DrawUpperRight(stereoFrame_t stereoFrame)
|
||||||
if ( cg_drawSnapshot.integer ) {
|
if ( cg_drawSnapshot.integer ) {
|
||||||
y = CG_DrawSnapshot( y );
|
y = CG_DrawSnapshot( y );
|
||||||
}
|
}
|
||||||
if (cg_drawFPS.integer && (stereoFrame == STEREO_CENTER || stereoFrame == STEREO_RIGHT)) {
|
if (cg_drawFPS.integer && (cg.stereoView == STEREO_CENTER || cg.stereoView == STEREO_RIGHT)) {
|
||||||
y = CG_DrawFPS( y );
|
y = CG_DrawFPS( y );
|
||||||
}
|
}
|
||||||
if ( cg_drawTimer.integer ) {
|
if ( cg_drawTimer.integer ) {
|
||||||
|
@ -2639,7 +2638,7 @@ static void CG_DrawVignette( void )
|
||||||
CG_Draw2D
|
CG_Draw2D
|
||||||
=================
|
=================
|
||||||
*/
|
*/
|
||||||
static void CG_Draw2D(stereoFrame_t stereoFrame)
|
static void CG_Draw2D()
|
||||||
{
|
{
|
||||||
#ifdef MISSIONPACK
|
#ifdef MISSIONPACK
|
||||||
if (cgs.orderPending && cg.time > cgs.orderTime) {
|
if (cgs.orderPending && cg.time > cgs.orderTime) {
|
||||||
|
@ -2727,10 +2726,10 @@ static void CG_Draw2D(stereoFrame_t stereoFrame)
|
||||||
|
|
||||||
#ifdef MISSIONPACK
|
#ifdef MISSIONPACK
|
||||||
if (!cg_paused.integer) {
|
if (!cg_paused.integer) {
|
||||||
CG_DrawUpperRight(stereoFrame);
|
CG_DrawUpperRight();
|
||||||
}
|
}
|
||||||
#else
|
#else
|
||||||
CG_DrawUpperRight(stereoFrame);
|
CG_DrawUpperRight();
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifndef MISSIONPACK
|
#ifndef MISSIONPACK
|
||||||
|
@ -2757,7 +2756,7 @@ CG_DrawActive
|
||||||
Perform all drawing needed to completely fill the screen
|
Perform all drawing needed to completely fill the screen
|
||||||
=====================
|
=====================
|
||||||
*/
|
*/
|
||||||
void CG_DrawActive( stereoFrame_t stereoView ) {
|
void CG_DrawActive( void ) {
|
||||||
// optionally draw the info screen instead
|
// optionally draw the info screen instead
|
||||||
if ( !cg.snap ) {
|
if ( !cg.snap ) {
|
||||||
CG_DrawInformation();
|
CG_DrawInformation();
|
||||||
|
@ -2800,7 +2799,7 @@ void CG_DrawActive( stereoFrame_t stereoView ) {
|
||||||
|
|
||||||
|
|
||||||
float ipd = trap_Cvar_VariableValue("r_stereoSeparation") / 1000.0f;
|
float ipd = trap_Cvar_VariableValue("r_stereoSeparation") / 1000.0f;
|
||||||
float separation = worldscale * (ipd / 2) * (stereoView == STEREO_LEFT ? -1.0f : 1.0f);
|
float separation = worldscale * (ipd / 2) * (cg.stereoView == STEREO_LEFT ? -1.0f : 1.0f);
|
||||||
|
|
||||||
if (cg.snap->ps.pm_flags & PMF_FOLLOW && vr->follow_mode == VRFM_FIRSTPERSON)
|
if (cg.snap->ps.pm_flags & PMF_FOLLOW && vr->follow_mode == VRFM_FIRSTPERSON)
|
||||||
{
|
{
|
||||||
|
@ -2847,8 +2846,7 @@ void CG_DrawActive( stereoFrame_t stereoView ) {
|
||||||
VectorCopy( baseOrg, cg.refdef.vieworg );
|
VectorCopy( baseOrg, cg.refdef.vieworg );
|
||||||
|
|
||||||
// draw status bar and other floating elements
|
// draw status bar and other floating elements
|
||||||
hudStereoView = stereoView;
|
CG_Draw2D();
|
||||||
CG_Draw2D(hudStereoView);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -25,7 +25,6 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
||||||
#include "../vr/vr_clientinfo.h"
|
#include "../vr/vr_clientinfo.h"
|
||||||
|
|
||||||
int hudflags = 0;
|
int hudflags = 0;
|
||||||
stereoFrame_t hudStereoView = STEREO_CENTER;
|
|
||||||
extern vr_clientinfo_t* vr;
|
extern vr_clientinfo_t* vr;
|
||||||
|
|
||||||
void CG_SetHUDFlags(int flags)
|
void CG_SetHUDFlags(int flags)
|
||||||
|
@ -63,7 +62,7 @@ void CG_AdjustFrom640( float *x, float *y, float *w, float *h ) {
|
||||||
|
|
||||||
const auto depth = (int)trap_Cvar_VariableValue( "vr_hudDepth" );
|
const auto depth = (int)trap_Cvar_VariableValue( "vr_hudDepth" );
|
||||||
int xoffset = 120 - (depth * 20);
|
int xoffset = 120 - (depth * 20);
|
||||||
if (hudStereoView == STEREO_RIGHT) {
|
if (cg.stereoView == STEREO_RIGHT) {
|
||||||
xoffset *= -1;
|
xoffset *= -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -481,6 +481,8 @@ typedef struct {
|
||||||
|
|
||||||
float worldscale;
|
float worldscale;
|
||||||
|
|
||||||
|
stereoFrame_t stereoView;
|
||||||
|
|
||||||
int frametime; // cg.time - cg.oldTime
|
int frametime; // cg.time - cg.oldTime
|
||||||
|
|
||||||
int time; // this is the time value that the client
|
int time; // this is the time value that the client
|
||||||
|
@ -1317,7 +1319,7 @@ void CG_AddLagometerFrameInfo( void );
|
||||||
void CG_AddLagometerSnapshotInfo( snapshot_t *snap );
|
void CG_AddLagometerSnapshotInfo( snapshot_t *snap );
|
||||||
void CG_CenterPrint( const char *str, int y, int charWidth );
|
void CG_CenterPrint( const char *str, int y, int charWidth );
|
||||||
void CG_DrawHead( float x, float y, float w, float h, int clientNum, vec3_t headAngles );
|
void CG_DrawHead( float x, float y, float w, float h, int clientNum, vec3_t headAngles );
|
||||||
void CG_DrawActive( stereoFrame_t stereoView );
|
void CG_DrawActive( void );
|
||||||
void CG_DrawFlagModel( float x, float y, float w, float h, int team, qboolean force2D );
|
void CG_DrawFlagModel( float x, float y, float w, float h, int team, qboolean force2D );
|
||||||
void CG_DrawTeamBackground( int x, int y, int w, int h, float alpha, int team );
|
void CG_DrawTeamBackground( int x, int y, int w, int h, float alpha, int team );
|
||||||
void CG_OwnerDraw(float x, float y, float w, float h, float text_x, float text_y, int ownerDraw, int ownerDrawFlags, int align, float special, float scale, vec4_t color, qhandle_t shader, int textStyle);
|
void CG_OwnerDraw(float x, float y, float w, float h, float text_x, float text_y, int ownerDraw, int ownerDrawFlags, int align, float special, float scale, vec4_t color, qhandle_t shader, int textStyle);
|
||||||
|
|
|
@ -297,8 +297,12 @@ static void CG_TouchItem( centity_t *cent ) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
// grab it
|
if (cg.stereoView == STEREO_LEFT)
|
||||||
BG_AddPredictableEventToPlayerstate( EV_ITEM_PICKUP, cent->currentState.modelindex , &cg.predictedPlayerState);
|
{
|
||||||
|
// grab it
|
||||||
|
BG_AddPredictableEventToPlayerstate(EV_ITEM_PICKUP, cent->currentState.modelindex,
|
||||||
|
&cg.predictedPlayerState);
|
||||||
|
}
|
||||||
|
|
||||||
// remove it from the frame so it won't be drawn
|
// remove it from the frame so it won't be drawn
|
||||||
cent->currentState.eFlags |= EF_NODRAW;
|
cent->currentState.eFlags |= EF_NODRAW;
|
||||||
|
|
|
@ -657,7 +657,7 @@ CG_CalcViewValues
|
||||||
Sets cg.refdef view values
|
Sets cg.refdef view values
|
||||||
===============
|
===============
|
||||||
*/
|
*/
|
||||||
static int CG_CalcViewValues( stereoFrame_t stereoView ) {
|
static int CG_CalcViewValues( ) {
|
||||||
playerState_t *ps;
|
playerState_t *ps;
|
||||||
|
|
||||||
memset( &cg.refdef, 0, sizeof( cg.refdef ) );
|
memset( &cg.refdef, 0, sizeof( cg.refdef ) );
|
||||||
|
@ -755,7 +755,7 @@ static int CG_CalcViewValues( stereoFrame_t stereoView ) {
|
||||||
VectorCopy(cg.refdef.vieworg, cg.vr_vieworigin);
|
VectorCopy(cg.refdef.vieworg, cg.vr_vieworigin);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!cgs.localServer && stereoView == STEREO_LEFT)
|
if (!cgs.localServer && cg.stereoView == STEREO_LEFT)
|
||||||
{
|
{
|
||||||
vec3_t weaponorigin, weaponangles;
|
vec3_t weaponorigin, weaponangles;
|
||||||
CG_CalculateVRWeaponPosition(weaponorigin, weaponangles);
|
CG_CalculateVRWeaponPosition(weaponorigin, weaponangles);
|
||||||
|
@ -954,6 +954,7 @@ void CG_DrawActiveFrame( int serverTime, stereoFrame_t stereoView, qboolean demo
|
||||||
|
|
||||||
cg.time = serverTime;
|
cg.time = serverTime;
|
||||||
cg.demoPlayback = demoPlayback;
|
cg.demoPlayback = demoPlayback;
|
||||||
|
cg.stereoView = stereoView;
|
||||||
|
|
||||||
cg.worldscale = trap_Cvar_VariableValue("vr_worldscale");
|
cg.worldscale = trap_Cvar_VariableValue("vr_worldscale");
|
||||||
|
|
||||||
|
@ -990,8 +991,11 @@ void CG_DrawActiveFrame( int serverTime, stereoFrame_t stereoView, qboolean demo
|
||||||
// this counter will be bumped for every valid scene we generate
|
// this counter will be bumped for every valid scene we generate
|
||||||
cg.clientFrame++;
|
cg.clientFrame++;
|
||||||
|
|
||||||
// update cg.predictedPlayerState
|
if (cg.stereoView == STEREO_LEFT)
|
||||||
CG_PredictPlayerState();
|
{
|
||||||
|
// update cg.predictedPlayerState - only do this on the first eye render
|
||||||
|
CG_PredictPlayerState();
|
||||||
|
}
|
||||||
|
|
||||||
// decide on third person view
|
// decide on third person view
|
||||||
cg.renderingThirdPerson = cg.predictedPlayerState.pm_type == PM_SPECTATOR ||
|
cg.renderingThirdPerson = cg.predictedPlayerState.pm_type == PM_SPECTATOR ||
|
||||||
|
@ -999,7 +1003,7 @@ void CG_DrawActiveFrame( int serverTime, stereoFrame_t stereoView, qboolean demo
|
||||||
cg_thirdPerson.integer;
|
cg_thirdPerson.integer;
|
||||||
|
|
||||||
// build cg.refdef
|
// build cg.refdef
|
||||||
inwater = CG_CalcViewValues( stereoView );
|
inwater = CG_CalcViewValues( );
|
||||||
|
|
||||||
// first person blend blobs, done after AnglesToAxis
|
// first person blend blobs, done after AnglesToAxis
|
||||||
if ( !cg.renderingThirdPerson ) {
|
if ( !cg.renderingThirdPerson ) {
|
||||||
|
@ -1063,7 +1067,7 @@ void CG_DrawActiveFrame( int serverTime, stereoFrame_t stereoView, qboolean demo
|
||||||
}
|
}
|
||||||
|
|
||||||
// actually issue the rendering calls
|
// actually issue the rendering calls
|
||||||
CG_DrawActive( stereoView );
|
CG_DrawActive();
|
||||||
|
|
||||||
if ( cg_stats.integer ) {
|
if ( cg_stats.integer ) {
|
||||||
CG_Printf( "cg.clientFrame:%i\n", cg.clientFrame );
|
CG_Printf( "cg.clientFrame:%i\n", cg.clientFrame );
|
||||||
|
|
Loading…
Reference in a new issue