diff --git a/engine/code/cgame/cg_predict.c b/engine/code/cgame/cg_predict.c index efd094f8..d29ad5af 100644 --- a/engine/code/cgame/cg_predict.c +++ b/engine/code/cgame/cg_predict.c @@ -320,6 +320,10 @@ static void CG_ExtrapolatePlayerState( qboolean grabAngles ) { if ( !grabAngles ) { out->damagePitch = prev->ps.damagePitch; 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++ ) { @@ -420,6 +424,10 @@ static void CG_InterpolatePlayerState( qboolean grabAngles ) { if ( !grabAngles ) { 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->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 @@ -1009,6 +1017,7 @@ void CG_PredictPlayerState( void ) { // over the net. // This function overwrites the damageYaw and damagePitch values based on // 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 ); // } // END diff --git a/engine/code/cgame/cg_view.c b/engine/code/cgame/cg_view.c index 8def9770..277a0f5d 100644 --- a/engine/code/cgame/cg_view.c +++ b/engine/code/cgame/cg_view.c @@ -690,9 +690,7 @@ static int CG_CalcViewValues( void ) { VectorCopy( ps->origin, cg.refdef.vieworg ); // STONELANCE (uses new way of sending view angles) // VectorCopy( ps->viewangles, cg.refdefViewAngles ); - cg.refdefViewAngles[PITCH] = BYTE2ANGLE(ps->damagePitch); - cg.refdefViewAngles[YAW] = BYTE2ANGLE(ps->damageYaw); - cg.refdefViewAngles[ROLL] = 0; + VectorCopy( ps->damageAngles, cg.refdefViewAngles ); // END AnglesToAxis( cg.refdefViewAngles, cg.refdef.viewaxis ); return CG_CalcFov(); @@ -759,9 +757,7 @@ static int CG_CalcViewValues( void ) { // if( !cg_paused.integer ) // Com_Printf( "5 predictedPlayerState damageYaw %d\n", ps->damageYaw ); - cg.refdefViewAngles[PITCH] = BYTE2ANGLE(ps->damagePitch); - cg.refdefViewAngles[YAW] = BYTE2ANGLE(ps->damageYaw); - cg.refdefViewAngles[ROLL] = 0; + VectorCopy( ps->damageAngles, cg.refdefViewAngles ); } // rear view mirror setup @@ -795,8 +791,8 @@ static int CG_CalcViewValues( void ) { #else // Use third-person mouse view (not car viewpoint) angles[ROLL] = 0; - angles[PITCH] = 0; // BYTE2ANGLE(ps->damagePitch); - angles[YAW] = BYTE2ANGLE(ps->damageYaw); + angles[PITCH] = 0; // ps->damageAngles[PITCH]; + angles[YAW] = ps->damageAngles[YAW]; #endif AnglesToAxis( angles, cg.mmapRefdef.viewaxis ); diff --git a/engine/code/game/bg_misc.c b/engine/code/game/bg_misc.c index 291a50da..f1a2027c 100644 --- a/engine/code/game/bg_misc.c +++ b/engine/code/game/bg_misc.c @@ -1938,8 +1938,8 @@ void BG_PlayerStateToEntityState( playerState_t *ps, entityState_t *s, qboolean } // View Angles - s->angles2[PITCH] = BYTE2ANGLE(ps->damagePitch); - s->angles2[YAW] = BYTE2ANGLE(ps->damageYaw); + s->angles2[PITCH] = ps->damageAngles[PITCH]; + s->angles2[YAW] = ps->damageAngles[YAW]; // s->angles2[YAW] = ps->movementDir; // END s->legsAnim = ps->legsAnim; @@ -2065,8 +2065,8 @@ void BG_PlayerStateToEntityStateExtraPolate( playerState_t *ps, entityState_t *s // END // View Angles - s->angles2[PITCH] = BYTE2ANGLE(ps->damagePitch); - s->angles2[YAW] = BYTE2ANGLE(ps->damageYaw); + s->angles2[PITCH] = ps->damageAngles[PITCH]; + s->angles2[YAW] = ps->damageAngles[YAW]; // s->angles2[YAW] = ps->movementDir; // END s->legsAnim = ps->legsAnim; diff --git a/engine/code/game/bg_pmove.c b/engine/code/game/bg_pmove.c index f73037b8..d06f5de0 100644 --- a/engine/code/game/bg_pmove.c +++ b/engine/code/game/bg_pmove.c @@ -961,7 +961,7 @@ static void PM_NoclipMove( void ) { VectorMA (pm->ps->origin, pml.frametime, pm->ps->velocity, pm->ps->origin); // 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 */ ); // END } @@ -2375,6 +2375,9 @@ void PM_UpdateViewAngles( playerState_t *ps, const usercmd_t *cmd, int controlMo int i; 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 } @@ -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 - if (controlMode == CT_MOUSE){ - if (i == PITCH){ - ps->damagePitch = ANGLE2BYTE( SHORT2ANGLE( temp ) ); - } - if (i == YAW){ - ps->damageYaw = ANGLE2BYTE( SHORT2ANGLE( temp ) ); - } +// Q3Rally +// ps->viewangles[i] = SHORT2ANGLE(temp); + if ( controlMode == CT_MOUSE ) { + ps->damageAngles[i] = SHORT2ANGLE(temp); } // 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 } @@ -2427,7 +2436,7 @@ void trap_SnapVector( float *v ); void PmoveSingle (pmove_t *pmove) { // STONELANCE - vec3_t delta; + //vec3_t delta; float dot; // END @@ -2519,10 +2528,7 @@ void PmoveSingle (pmove_t *pmove) { PM_UpdateViewAngles( pm->ps, &pm->cmd, pm->controlMode ); // AngleVectors (pm->ps->viewangles, pml.forward, pml.right, pml.up); - delta[YAW] = BYTE2ANGLE(pm->ps->damageYaw); - delta[PITCH] = BYTE2ANGLE(pm->ps->damagePitch); - delta[ROLL] = 0; - AngleVectors (delta, pml.forward, pml.right, pml.up); + AngleVectors (pm->ps->damageAngles, pml.forward, pml.right, pml.up); // END if ( pm->cmd.upmove < 10 ) { diff --git a/engine/code/game/bg_wheel_forces.c b/engine/code/game/bg_wheel_forces.c index 29078ff8..042b8ab0 100644 --- a/engine/code/game/bg_wheel_forces.c +++ b/engine/code/game/bg_wheel_forces.c @@ -517,7 +517,7 @@ void PM_AddRoadForces(car_t *car, carBody_t *body, carPoint_t *points, float sec } 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) 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) car->wheelAngle = -20.0f; - pm->ps->damagePitch = ANGLE2BYTE(0.0f); - pm->ps->damageYaw = ANGLE2BYTE(car->wheelAngle); + pm->ps->damageAngles[PITCH] = 0.0f; + pm->ps->damageAngles[YAW] = car->wheelAngle; + + pm->ps->damagePitch = ANGLE2BYTE(pm->ps->damageAngles[PITCH]); + pm->ps->damageYaw = ANGLE2BYTE(pm->ps->damageAngles[YAW]); } } else { diff --git a/engine/code/game/g_active.c b/engine/code/game/g_active.c index d48e163d..33a9b374 100644 --- a/engine/code/game/g_active.c +++ b/engine/code/game/g_active.c @@ -1769,8 +1769,9 @@ void SpectatorClientEndFrame( gentity_t *ent ) { } } - ent->client->ps.damagePitch = ANGLE2BYTE(ent->client->ps.viewangles[PITCH]); - ent->client->ps.damageYaw = ANGLE2BYTE(ent->client->ps.viewangles[YAW]); + VectorCopy( ent->client->ps.viewangles, ent->client->ps.damageAngles ); + 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; return; diff --git a/engine/code/game/g_client.c b/engine/code/game/g_client.c index bf331487..aa89341c 100644 --- a/engine/code/game/g_client.c +++ b/engine/code/game/g_client.c @@ -590,9 +590,10 @@ void SetClientViewAngle( gentity_t *ent, vec3_t angle ) { VectorCopy( angle, ent->s.angles ); VectorCopy (ent->s.angles, ent->client->ps.viewangles); // STONELANCE - VectorCopy( angle, ent->s.angles2 ); - ent->client->ps.damagePitch = ANGLE2BYTE(ent->s.angles2[PITCH]); - ent->client->ps.damageYaw = ANGLE2BYTE(ent->s.angles2[YAW]); + VectorCopy (ent->s.angles, ent->client->ps.damageAngles); + VectorCopy( angle, ent->s.angles2 ); // FIXME: need this? + ent->client->ps.damagePitch = ANGLE2BYTE(ent->client->ps.damageAngles[PITCH]); + ent->client->ps.damageYaw = ANGLE2BYTE(ent->client->ps.damageAngles[YAW]); // END } diff --git a/engine/code/game/g_main.c b/engine/code/game/g_main.c index 34ee1401..8e59d8f4 100644 --- a/engine/code/game/g_main.c +++ b/engine/code/game/g_main.c @@ -1143,9 +1143,10 @@ void MoveClientToIntermission( gentity_t *ent ) { VectorCopy( level.intermission_origin, ent->client->ps.origin ); // STONELANCE (used for viewing angles client side) // 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? - ent->client->ps.damagePitch = ANGLE2BYTE(ent->s.angles2[PITCH]); - 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 ent->client->ps.pm_type = PM_INTERMISSION; diff --git a/engine/code/qcommon/q_shared.h b/engine/code/qcommon/q_shared.h index 5d3e024b..8d41f785 100644 --- a/engine/code/qcommon/q_shared.h +++ b/engine/code/qcommon/q_shared.h @@ -1347,6 +1347,11 @@ typedef struct playerState_s { int pmove_framecount; int jumppad_frame; 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;