mirror of
https://github.com/Q3Rally-Team/q3rally.git
synced 2025-02-17 17:51:07 +00:00
Fix camera not rotating smoothly
Reducing camera angle in damageYaw to 8-bit caused camera to be limited to 256 angles and not rotate smoothly. Restore setting it locally in higher precision as a separate variable (damageAngles) but still keep it as 8-bit in damagePitch/damageYaw so it networks correctly. Issue introduced in "Fix sending angles in damagePitch/damageYaw".
This commit is contained in:
parent
226fc030cd
commit
528645fe86
9 changed files with 60 additions and 38 deletions
|
@ -320,6 +320,10 @@ static void CG_ExtrapolatePlayerState( qboolean grabAngles ) {
|
||||||
if ( !grabAngles ) {
|
if ( !grabAngles ) {
|
||||||
out->damagePitch = prev->ps.damagePitch;
|
out->damagePitch = prev->ps.damagePitch;
|
||||||
out->damageYaw = prev->ps.damageYaw;
|
out->damageYaw = prev->ps.damageYaw;
|
||||||
|
|
||||||
|
out->damageAngles[PITCH] = BYTE2ANGLE(prev->ps.damagePitch);
|
||||||
|
out->damageAngles[YAW] = BYTE2ANGLE(prev->ps.damageYaw);
|
||||||
|
out->damageAngles[ROLL] = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
for ( i = 0 ; i < 3 ; i++ ) {
|
for ( i = 0 ; i < 3 ; i++ ) {
|
||||||
|
@ -420,6 +424,10 @@ static void CG_InterpolatePlayerState( qboolean grabAngles ) {
|
||||||
if ( !grabAngles ) {
|
if ( !grabAngles ) {
|
||||||
out->damagePitch = ANGLE2BYTE(LerpAngle( BYTE2ANGLE(prev->ps.damagePitch), BYTE2ANGLE(next->ps.damagePitch), f ));
|
out->damagePitch = ANGLE2BYTE(LerpAngle( BYTE2ANGLE(prev->ps.damagePitch), BYTE2ANGLE(next->ps.damagePitch), f ));
|
||||||
out->damageYaw = ANGLE2BYTE(LerpAngle( BYTE2ANGLE(prev->ps.damageYaw), BYTE2ANGLE(next->ps.damageYaw), f ));
|
out->damageYaw = ANGLE2BYTE(LerpAngle( BYTE2ANGLE(prev->ps.damageYaw), BYTE2ANGLE(next->ps.damageYaw), f ));
|
||||||
|
|
||||||
|
out->damageAngles[PITCH] = LerpAngle( BYTE2ANGLE(prev->ps.damagePitch), BYTE2ANGLE(next->ps.damagePitch), f );
|
||||||
|
out->damageAngles[YAW] = LerpAngle( BYTE2ANGLE(prev->ps.damageYaw), BYTE2ANGLE(next->ps.damageYaw), f );
|
||||||
|
out->damageAngles[ROLL] = 0;
|
||||||
}
|
}
|
||||||
// END
|
// END
|
||||||
|
|
||||||
|
@ -1009,6 +1017,7 @@ void CG_PredictPlayerState( void ) {
|
||||||
// over the net.
|
// over the net.
|
||||||
// This function overwrites the damageYaw and damagePitch values based on
|
// This function overwrites the damageYaw and damagePitch values based on
|
||||||
// the command and the delta_angles of the player
|
// the command and the delta_angles of the player
|
||||||
|
// This also sets damageAngles which is not reduced to 8-bit
|
||||||
PM_UpdateViewAngles( cg_pmove.ps, &cg_pmove.cmd, cg_controlMode.integer );
|
PM_UpdateViewAngles( cg_pmove.ps, &cg_pmove.cmd, cg_controlMode.integer );
|
||||||
// }
|
// }
|
||||||
// END
|
// END
|
||||||
|
|
|
@ -690,9 +690,7 @@ static int CG_CalcViewValues( void ) {
|
||||||
VectorCopy( ps->origin, cg.refdef.vieworg );
|
VectorCopy( ps->origin, cg.refdef.vieworg );
|
||||||
// STONELANCE (uses new way of sending view angles)
|
// STONELANCE (uses new way of sending view angles)
|
||||||
// VectorCopy( ps->viewangles, cg.refdefViewAngles );
|
// VectorCopy( ps->viewangles, cg.refdefViewAngles );
|
||||||
cg.refdefViewAngles[PITCH] = BYTE2ANGLE(ps->damagePitch);
|
VectorCopy( ps->damageAngles, cg.refdefViewAngles );
|
||||||
cg.refdefViewAngles[YAW] = BYTE2ANGLE(ps->damageYaw);
|
|
||||||
cg.refdefViewAngles[ROLL] = 0;
|
|
||||||
// END
|
// END
|
||||||
AnglesToAxis( cg.refdefViewAngles, cg.refdef.viewaxis );
|
AnglesToAxis( cg.refdefViewAngles, cg.refdef.viewaxis );
|
||||||
return CG_CalcFov();
|
return CG_CalcFov();
|
||||||
|
@ -759,9 +757,7 @@ static int CG_CalcViewValues( void ) {
|
||||||
// if( !cg_paused.integer )
|
// if( !cg_paused.integer )
|
||||||
// Com_Printf( "5 predictedPlayerState damageYaw %d\n", ps->damageYaw );
|
// Com_Printf( "5 predictedPlayerState damageYaw %d\n", ps->damageYaw );
|
||||||
|
|
||||||
cg.refdefViewAngles[PITCH] = BYTE2ANGLE(ps->damagePitch);
|
VectorCopy( ps->damageAngles, cg.refdefViewAngles );
|
||||||
cg.refdefViewAngles[YAW] = BYTE2ANGLE(ps->damageYaw);
|
|
||||||
cg.refdefViewAngles[ROLL] = 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// rear view mirror setup
|
// rear view mirror setup
|
||||||
|
@ -795,8 +791,8 @@ static int CG_CalcViewValues( void ) {
|
||||||
#else
|
#else
|
||||||
// Use third-person mouse view (not car viewpoint)
|
// Use third-person mouse view (not car viewpoint)
|
||||||
angles[ROLL] = 0;
|
angles[ROLL] = 0;
|
||||||
angles[PITCH] = 0; // BYTE2ANGLE(ps->damagePitch);
|
angles[PITCH] = 0; // ps->damageAngles[PITCH];
|
||||||
angles[YAW] = BYTE2ANGLE(ps->damageYaw);
|
angles[YAW] = ps->damageAngles[YAW];
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
AnglesToAxis( angles, cg.mmapRefdef.viewaxis );
|
AnglesToAxis( angles, cg.mmapRefdef.viewaxis );
|
||||||
|
|
|
@ -1938,8 +1938,8 @@ void BG_PlayerStateToEntityState( playerState_t *ps, entityState_t *s, qboolean
|
||||||
}
|
}
|
||||||
|
|
||||||
// View Angles
|
// View Angles
|
||||||
s->angles2[PITCH] = BYTE2ANGLE(ps->damagePitch);
|
s->angles2[PITCH] = ps->damageAngles[PITCH];
|
||||||
s->angles2[YAW] = BYTE2ANGLE(ps->damageYaw);
|
s->angles2[YAW] = ps->damageAngles[YAW];
|
||||||
// s->angles2[YAW] = ps->movementDir;
|
// s->angles2[YAW] = ps->movementDir;
|
||||||
// END
|
// END
|
||||||
s->legsAnim = ps->legsAnim;
|
s->legsAnim = ps->legsAnim;
|
||||||
|
@ -2065,8 +2065,8 @@ void BG_PlayerStateToEntityStateExtraPolate( playerState_t *ps, entityState_t *s
|
||||||
// END
|
// END
|
||||||
|
|
||||||
// View Angles
|
// View Angles
|
||||||
s->angles2[PITCH] = BYTE2ANGLE(ps->damagePitch);
|
s->angles2[PITCH] = ps->damageAngles[PITCH];
|
||||||
s->angles2[YAW] = BYTE2ANGLE(ps->damageYaw);
|
s->angles2[YAW] = ps->damageAngles[YAW];
|
||||||
// s->angles2[YAW] = ps->movementDir;
|
// s->angles2[YAW] = ps->movementDir;
|
||||||
// END
|
// END
|
||||||
s->legsAnim = ps->legsAnim;
|
s->legsAnim = ps->legsAnim;
|
||||||
|
|
|
@ -961,7 +961,7 @@ static void PM_NoclipMove( void ) {
|
||||||
VectorMA (pm->ps->origin, pml.frametime, pm->ps->velocity, pm->ps->origin);
|
VectorMA (pm->ps->origin, pml.frametime, pm->ps->velocity, pm->ps->origin);
|
||||||
|
|
||||||
// STONELANCE
|
// STONELANCE
|
||||||
pm->ps->viewangles[YAW] = BYTE2ANGLE(pm->ps->damageYaw);
|
pm->ps->viewangles[YAW] = pm->ps->damageAngles[YAW];
|
||||||
PM_InitializeVehicle(pm->car, pm->ps->origin, pm->ps->viewangles, pm->ps->velocity /* , pm->car_frontweight_dist */ );
|
PM_InitializeVehicle(pm->car, pm->ps->origin, pm->ps->viewangles, pm->ps->velocity /* , pm->car_frontweight_dist */ );
|
||||||
// END
|
// END
|
||||||
}
|
}
|
||||||
|
@ -2375,6 +2375,9 @@ void PM_UpdateViewAngles( playerState_t *ps, const usercmd_t *cmd, int controlMo
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
if ( ps->pm_type == PM_INTERMISSION || ps->pm_type == PM_SPINTERMISSION) {
|
if ( ps->pm_type == PM_INTERMISSION || ps->pm_type == PM_SPINTERMISSION) {
|
||||||
|
ps->damageAngles[PITCH] = BYTE2ANGLE( ps->damagePitch );
|
||||||
|
ps->damageAngles[YAW] = BYTE2ANGLE( ps->damageYaw );
|
||||||
|
ps->damageAngles[ROLL] = 0;
|
||||||
return; // no view changes at all
|
return; // no view changes at all
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2400,18 +2403,24 @@ void PM_UpdateViewAngles( playerState_t *ps, const usercmd_t *cmd, int controlMo
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// STONELANCE use damage yaw and pitch for view angles
|
// Q3Rally
|
||||||
if (controlMode == CT_MOUSE){
|
// ps->viewangles[i] = SHORT2ANGLE(temp);
|
||||||
if (i == PITCH){
|
if ( controlMode == CT_MOUSE ) {
|
||||||
ps->damagePitch = ANGLE2BYTE( SHORT2ANGLE( temp ) );
|
ps->damageAngles[i] = SHORT2ANGLE(temp);
|
||||||
}
|
|
||||||
if (i == YAW){
|
|
||||||
ps->damageYaw = ANGLE2BYTE( SHORT2ANGLE( temp ) );
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
// END
|
// END
|
||||||
// SKWID
|
}
|
||||||
// ps->viewangles[i] = SHORT2ANGLE(temp);
|
|
||||||
|
// STONELANCE use damage yaw and pitch for view angles
|
||||||
|
if ( controlMode == CT_MOUSE ) {
|
||||||
|
// camera view angle
|
||||||
|
ps->damagePitch = ANGLE2BYTE( SHORT2ANGLE( ps->damageAngles[PITCH] ) );
|
||||||
|
ps->damageYaw = ANGLE2BYTE( SHORT2ANGLE( ps->damageAngles[YAW] ) );
|
||||||
|
} else /* CT_JOYSTICK */ {
|
||||||
|
// wheel angle
|
||||||
|
ps->damageAngles[PITCH] = BYTE2ANGLE( ps->damagePitch );
|
||||||
|
ps->damageAngles[YAW] = BYTE2ANGLE( ps->damageYaw );
|
||||||
|
ps->damageAngles[ROLL] = 0;
|
||||||
}
|
}
|
||||||
// END
|
// END
|
||||||
}
|
}
|
||||||
|
@ -2427,7 +2436,7 @@ void trap_SnapVector( float *v );
|
||||||
|
|
||||||
void PmoveSingle (pmove_t *pmove) {
|
void PmoveSingle (pmove_t *pmove) {
|
||||||
// STONELANCE
|
// STONELANCE
|
||||||
vec3_t delta;
|
//vec3_t delta;
|
||||||
float dot;
|
float dot;
|
||||||
// END
|
// END
|
||||||
|
|
||||||
|
@ -2519,10 +2528,7 @@ void PmoveSingle (pmove_t *pmove) {
|
||||||
PM_UpdateViewAngles( pm->ps, &pm->cmd, pm->controlMode );
|
PM_UpdateViewAngles( pm->ps, &pm->cmd, pm->controlMode );
|
||||||
|
|
||||||
// AngleVectors (pm->ps->viewangles, pml.forward, pml.right, pml.up);
|
// AngleVectors (pm->ps->viewangles, pml.forward, pml.right, pml.up);
|
||||||
delta[YAW] = BYTE2ANGLE(pm->ps->damageYaw);
|
AngleVectors (pm->ps->damageAngles, pml.forward, pml.right, pml.up);
|
||||||
delta[PITCH] = BYTE2ANGLE(pm->ps->damagePitch);
|
|
||||||
delta[ROLL] = 0;
|
|
||||||
AngleVectors (delta, pml.forward, pml.right, pml.up);
|
|
||||||
// END
|
// END
|
||||||
|
|
||||||
if ( pm->cmd.upmove < 10 ) {
|
if ( pm->cmd.upmove < 10 ) {
|
||||||
|
|
|
@ -517,7 +517,7 @@ void PM_AddRoadForces(car_t *car, carBody_t *body, carPoint_t *points, float sec
|
||||||
}
|
}
|
||||||
|
|
||||||
if (pm->controlMode == CT_MOUSE){
|
if (pm->controlMode == CT_MOUSE){
|
||||||
car->wheelAngle = WheelAngle(pm->ps->viewangles[YAW], BYTE2ANGLE(pm->ps->damageYaw));
|
car->wheelAngle = WheelAngle(pm->ps->viewangles[YAW], pm->ps->damageAngles[YAW]);
|
||||||
|
|
||||||
if (v < 0.5f && v > -0.5f)
|
if (v < 0.5f && v > -0.5f)
|
||||||
car->wheelAngle = 0.0;
|
car->wheelAngle = 0.0;
|
||||||
|
@ -561,8 +561,11 @@ void PM_AddRoadForces(car_t *car, carBody_t *body, carPoint_t *points, float sec
|
||||||
if (car->wheelAngle < -20.0f)
|
if (car->wheelAngle < -20.0f)
|
||||||
car->wheelAngle = -20.0f;
|
car->wheelAngle = -20.0f;
|
||||||
|
|
||||||
pm->ps->damagePitch = ANGLE2BYTE(0.0f);
|
pm->ps->damageAngles[PITCH] = 0.0f;
|
||||||
pm->ps->damageYaw = ANGLE2BYTE(car->wheelAngle);
|
pm->ps->damageAngles[YAW] = car->wheelAngle;
|
||||||
|
|
||||||
|
pm->ps->damagePitch = ANGLE2BYTE(pm->ps->damageAngles[PITCH]);
|
||||||
|
pm->ps->damageYaw = ANGLE2BYTE(pm->ps->damageAngles[YAW]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
|
|
|
@ -1769,8 +1769,9 @@ void SpectatorClientEndFrame( gentity_t *ent ) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
ent->client->ps.damagePitch = ANGLE2BYTE(ent->client->ps.viewangles[PITCH]);
|
VectorCopy( ent->client->ps.viewangles, ent->client->ps.damageAngles );
|
||||||
ent->client->ps.damageYaw = ANGLE2BYTE(ent->client->ps.viewangles[YAW]);
|
ent->client->ps.damagePitch = ANGLE2BYTE(ent->client->ps.damageAngles[PITCH]);
|
||||||
|
ent->client->ps.damageYaw = ANGLE2BYTE(ent->client->ps.damageAngles[YAW]);
|
||||||
|
|
||||||
ent->client->ps.pm_flags |= PMF_OBSERVE;
|
ent->client->ps.pm_flags |= PMF_OBSERVE;
|
||||||
return;
|
return;
|
||||||
|
|
|
@ -590,9 +590,10 @@ void SetClientViewAngle( gentity_t *ent, vec3_t angle ) {
|
||||||
VectorCopy( angle, ent->s.angles );
|
VectorCopy( angle, ent->s.angles );
|
||||||
VectorCopy (ent->s.angles, ent->client->ps.viewangles);
|
VectorCopy (ent->s.angles, ent->client->ps.viewangles);
|
||||||
// STONELANCE
|
// STONELANCE
|
||||||
VectorCopy( angle, ent->s.angles2 );
|
VectorCopy (ent->s.angles, ent->client->ps.damageAngles);
|
||||||
ent->client->ps.damagePitch = ANGLE2BYTE(ent->s.angles2[PITCH]);
|
VectorCopy( angle, ent->s.angles2 ); // FIXME: need this?
|
||||||
ent->client->ps.damageYaw = ANGLE2BYTE(ent->s.angles2[YAW]);
|
ent->client->ps.damagePitch = ANGLE2BYTE(ent->client->ps.damageAngles[PITCH]);
|
||||||
|
ent->client->ps.damageYaw = ANGLE2BYTE(ent->client->ps.damageAngles[YAW]);
|
||||||
// END
|
// END
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1143,9 +1143,10 @@ void MoveClientToIntermission( gentity_t *ent ) {
|
||||||
VectorCopy( level.intermission_origin, ent->client->ps.origin );
|
VectorCopy( level.intermission_origin, ent->client->ps.origin );
|
||||||
// STONELANCE (used for viewing angles client side)
|
// STONELANCE (used for viewing angles client side)
|
||||||
// VectorCopy (level.intermission_angle, ent->client->ps.viewangles);
|
// VectorCopy (level.intermission_angle, ent->client->ps.viewangles);
|
||||||
|
VectorCopy (level.intermission_angle, ent->client->ps.damageAngles);
|
||||||
VectorCopy( level.intermission_angle, ent->s.angles2 ); // FIXME: need this?
|
VectorCopy( level.intermission_angle, ent->s.angles2 ); // FIXME: need this?
|
||||||
ent->client->ps.damagePitch = ANGLE2BYTE(ent->s.angles2[PITCH]);
|
ent->client->ps.damagePitch = ANGLE2BYTE(ent->client->ps.damageAngles[PITCH]);
|
||||||
ent->client->ps.damageYaw = ANGLE2BYTE(ent->s.angles2[YAW]);
|
ent->client->ps.damageYaw = ANGLE2BYTE(ent->client->ps.damageAngles[YAW]);
|
||||||
// END
|
// END
|
||||||
ent->client->ps.pm_type = PM_INTERMISSION;
|
ent->client->ps.pm_type = PM_INTERMISSION;
|
||||||
|
|
||||||
|
|
|
@ -1347,6 +1347,11 @@ typedef struct playerState_s {
|
||||||
int pmove_framecount;
|
int pmove_framecount;
|
||||||
int jumppad_frame;
|
int jumppad_frame;
|
||||||
int entityEventSequence;
|
int entityEventSequence;
|
||||||
|
|
||||||
|
// float angles for camera view angle (CT_MOUSE) or wheel angle (CT_JOYSTICK)
|
||||||
|
// they are networked as 8-bit in playerState_t damagePitch and damageYaw
|
||||||
|
// and float in entityState_t angles2
|
||||||
|
vec3_t damageAngles;
|
||||||
} playerState_t;
|
} playerState_t;
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue