mirror of
https://github.com/ZDoom/raze-gles.git
synced 2024-11-11 15:21:48 +00:00
- make cl_syncinput
work for Duke.
* Current setup was broken and unusable. * Fixed interpolation issues. * Only call `GetInput()` at frame-rate when `cl_syncinput` is 0. * Create `oq16look_ang` and interpolate it for enhanced smoothness. * Always reset `horizAngleAdjust` and `horizSkew` in `processinput_d()`. * Don't pre-scale `sb_avel` in `processinput_d()` and `processinput_r()`. * Promote `p->angvel` from short to fixed_t. * Don't descale `sync[snum].q16horz` in `processinput_d()` and `processinput_r()`. * Ensure `false` bool is provided to `sethorizon()` call in `processinput_d()` and `processinput_r()`. * Reset `p->q16angvel` in `resetplayerstats()`.
This commit is contained in:
parent
158fd46581
commit
f49ded7962
9 changed files with 57 additions and 58 deletions
|
@ -442,13 +442,6 @@ void moveplayers(void) //Players
|
||||||
|
|
||||||
execute(i, s->yvel, otherx);
|
execute(i, s->yvel, otherx);
|
||||||
|
|
||||||
//thisPlayer.smoothcamera = false;
|
|
||||||
//p->q16angvel = G_GetQ16AngleDelta(pPlayer->oq16ang, pPlayer->q16ang);
|
|
||||||
p->oq16ang = p->q16ang;
|
|
||||||
p->oq16horiz = p->q16horiz;
|
|
||||||
p->oq16horizoff = p->q16horizoff;
|
|
||||||
|
|
||||||
|
|
||||||
if (ud.multimode > 1)
|
if (ud.multimode > 1)
|
||||||
if (sprite[ps[otherp].i].extra > 0)
|
if (sprite[ps[otherp].i].extra > 0)
|
||||||
{
|
{
|
||||||
|
|
|
@ -352,8 +352,10 @@ bool GameTicker()
|
||||||
exitlevel();
|
exitlevel();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (!cl_syncinput)
|
||||||
|
{
|
||||||
GetInput();
|
GetInput();
|
||||||
|
}
|
||||||
|
|
||||||
int const smoothRatio = calc_smoothratio(totalclock, ototalclock);
|
int const smoothRatio = calc_smoothratio(totalclock, ototalclock);
|
||||||
|
|
||||||
|
|
|
@ -880,6 +880,7 @@ void checklook(int snum, int sb_snum)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
p->oq16ang = p->q16ang;
|
p->oq16ang = p->q16ang;
|
||||||
|
p->oq16look_ang = p->q16look_ang;
|
||||||
|
|
||||||
if (cl_syncinput)
|
if (cl_syncinput)
|
||||||
applylook(snum, 1);
|
applylook(snum, 1);
|
||||||
|
|
|
@ -2596,11 +2596,8 @@ void processinput_d(int snum)
|
||||||
pi = p->i;
|
pi = p->i;
|
||||||
s = &sprite[pi];
|
s = &sprite[pi];
|
||||||
|
|
||||||
if (!cl_syncinput)
|
|
||||||
{
|
|
||||||
p->horizAngleAdjust = 0;
|
p->horizAngleAdjust = 0;
|
||||||
p->horizSkew = 0;
|
p->horizSkew = 0;
|
||||||
}
|
|
||||||
|
|
||||||
sb_snum = PlayerInputBits(snum, SKB_ALL);
|
sb_snum = PlayerInputBits(snum, SKB_ALL);
|
||||||
|
|
||||||
|
@ -2794,21 +2791,23 @@ void processinput_d(int snum)
|
||||||
p->posxv = 0;
|
p->posxv = 0;
|
||||||
p->posyv = 0;
|
p->posyv = 0;
|
||||||
}
|
}
|
||||||
else if (sb_avel) //p->ang += syncangvel * constant
|
else if (sb_avel && cl_syncinput)
|
||||||
{ //ENGINE calculates angvel for you
|
|
||||||
if (cl_syncinput)
|
|
||||||
{
|
{
|
||||||
|
//p->ang += syncangvel * constant
|
||||||
|
//ENGINE calculates angvel for you
|
||||||
// may still be needed later for demo recording
|
// may still be needed later for demo recording
|
||||||
int tempang;
|
|
||||||
|
|
||||||
tempang = sb_avel << 1; // this is fixed point!
|
if (psectlotag == ST_2_UNDERWATER)
|
||||||
|
{
|
||||||
if (psectlotag == ST_2_UNDERWATER) p->angvel = (tempang - (tempang >> 3)) * sgn(doubvel);
|
p->q16angvel = (sb_avel - (sb_avel >> 3)) * sgn(doubvel);
|
||||||
else p->angvel = tempang * sgn(doubvel);
|
|
||||||
|
|
||||||
p->addang(p->angvel);
|
|
||||||
p->q16ang &= (2048 << FRACBITS) - 1;
|
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
p->q16angvel = sb_avel * sgn(doubvel);
|
||||||
|
}
|
||||||
|
|
||||||
|
p->q16ang += p->q16angvel;
|
||||||
|
p->q16ang &= 0x7FFFFFF;
|
||||||
p->crack_time = 777;
|
p->crack_time = 777;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -3053,8 +3052,8 @@ HORIZONLY:
|
||||||
|
|
||||||
if (cl_syncinput)
|
if (cl_syncinput)
|
||||||
{
|
{
|
||||||
p->q16horiz += (sync[snum].q16horz >> 1);
|
p->q16horiz += sync[snum].q16horz;
|
||||||
sethorizon(snum, sb_snum, 1);
|
sethorizon(snum, sb_snum, 1, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
//Shooting code/changes
|
//Shooting code/changes
|
||||||
|
|
|
@ -3702,21 +3702,23 @@ void processinput_r(int snum)
|
||||||
p->posxv = 0;
|
p->posxv = 0;
|
||||||
p->posyv = 0;
|
p->posyv = 0;
|
||||||
}
|
}
|
||||||
else if (sb_avel) //p->ang += syncangvel * constant
|
else if (sb_avel && cl_syncinput)
|
||||||
{ //ENGINE calculates angvel for you
|
|
||||||
if (cl_syncinput)
|
|
||||||
{
|
{
|
||||||
|
//p->ang += syncangvel * constant
|
||||||
|
//ENGINE calculates angvel for you
|
||||||
// may still be needed later for demo recording
|
// may still be needed later for demo recording
|
||||||
int tempang;
|
|
||||||
|
|
||||||
tempang = sb_avel << 1; // this is fixed point!
|
if (psectlotag == ST_2_UNDERWATER)
|
||||||
|
{
|
||||||
if (psectlotag == 2) p->angvel = (tempang - (tempang >> 3)) * sgn(doubvel);
|
p->q16angvel = (sb_avel - (sb_avel >> 3)) * sgn(doubvel);
|
||||||
else p->angvel = tempang * sgn(doubvel);
|
|
||||||
|
|
||||||
p->addang(p->angvel);
|
|
||||||
p->q16ang &= (2048 << FRACBITS) - 1;
|
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
p->q16angvel = sb_avel * sgn(doubvel);
|
||||||
|
}
|
||||||
|
|
||||||
|
p->q16ang += p->q16angvel;
|
||||||
|
p->q16ang &= 0x7FFFFFF;
|
||||||
p->crack_time = 777;
|
p->crack_time = 777;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -4080,8 +4082,8 @@ HORIZONLY:
|
||||||
|
|
||||||
if (cl_syncinput)
|
if (cl_syncinput)
|
||||||
{
|
{
|
||||||
p->q16horiz += (sync[snum].q16horz >> 1);
|
p->q16horiz += sync[snum].q16horz;
|
||||||
sethorizon(snum, sb_snum, 1);
|
sethorizon(snum, sb_snum, 1, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
//Shooting code/changes
|
//Shooting code/changes
|
||||||
|
|
|
@ -94,7 +94,7 @@ void resetplayerstats(int snum)
|
||||||
p->pyoff = 0;
|
p->pyoff = 0;
|
||||||
p->opyoff = 0;
|
p->opyoff = 0;
|
||||||
p->loogcnt = 0;
|
p->loogcnt = 0;
|
||||||
//p->angvel = 0;
|
p->q16angvel = 0;
|
||||||
p->weapon_sway = 0;
|
p->weapon_sway = 0;
|
||||||
// p->select_dir = 0;
|
// p->select_dir = 0;
|
||||||
p->extra_extra8 = 0;
|
p->extra_extra8 = 0;
|
||||||
|
|
|
@ -551,10 +551,10 @@ void displayrooms(int snum, int smoothratio)
|
||||||
cposz = omyz + mulscale16((int)(myz - omyz), smoothratio);
|
cposz = omyz + mulscale16((int)(myz - omyz), smoothratio);
|
||||||
if (cl_syncinput)
|
if (cl_syncinput)
|
||||||
{
|
{
|
||||||
cang.interpolate(q16ang(oq16myang), q16ang(q16myang), smoothratio);
|
fixed_t osum = (oq16myhoriz + oq16myhorizoff);
|
||||||
fix16_t osum = (oq16myhoriz + oq16myhorizoff);
|
fixed_t sum = (q16myhoriz + q16myhorizoff);
|
||||||
fix16_t sum = (q16myhoriz + q16myhorizoff);
|
|
||||||
choriz = q16horiz(osum + mulscale16(sum - osum, smoothratio));
|
choriz = q16horiz(osum + mulscale16(sum - osum, smoothratio));
|
||||||
|
cang = q16ang(oq16myang + mulscale16(((q16myang + (1024 << FRACBITS) - oq16myang) & 0x7FFFFFF) - (1024 << FRACBITS), smoothratio));
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -571,19 +571,21 @@ void displayrooms(int snum, int smoothratio)
|
||||||
if (cl_syncinput /*|| smoothcamera*/)
|
if (cl_syncinput /*|| smoothcamera*/)
|
||||||
{
|
{
|
||||||
// Original code for when the values are passed through the sync struct
|
// Original code for when the values are passed through the sync struct
|
||||||
cang.interpolate(q16ang(p->oq16ang), q16ang(p->q16ang), smoothratio);
|
fixed_t ohorz = (p->oq16horiz + p->oq16horizoff);
|
||||||
fix16_t osum = (p->oq16horiz + p->oq16horizoff);
|
fixed_t horz = (p->q16horiz + p->q16horizoff);
|
||||||
fix16_t sum = (p->q16horiz + p->q16horizoff);
|
choriz = q16horiz(ohorz + mulscale16(horz - ohorz, smoothratio));
|
||||||
choriz = q16horiz(osum + mulscale16(sum - osum, smoothratio));
|
|
||||||
|
fixed_t oang = (p->oq16ang + p->oq16look_ang);
|
||||||
|
fixed_t ang = (p->q16ang + p->q16look_ang);
|
||||||
|
cang = q16ang(oang + mulscale16(((ang + (1024 << FRACBITS) - oang) & 0x7FFFFFF) - (1024 << FRACBITS), smoothratio));
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
// This is for real time updating of the view direction.
|
// This is for real time updating of the view direction.
|
||||||
cang = q16ang(p->q16ang);
|
cang = q16ang(p->q16ang + p->q16look_ang);
|
||||||
choriz = q16horiz(p->q16horiz + p->q16horizoff);
|
choriz = q16horiz(p->q16horiz + p->q16horizoff);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
cang += q16ang(p->q16look_ang);
|
|
||||||
|
|
||||||
if (p->newowner >= 0)
|
if (p->newowner >= 0)
|
||||||
{
|
{
|
||||||
|
|
|
@ -149,7 +149,7 @@ FSerializer& Serialize(FSerializer& arc, const char* keyname, player_struct& w,
|
||||||
("crack_time", w.crack_time)
|
("crack_time", w.crack_time)
|
||||||
("aim.mode", w.aim_mode)
|
("aim.mode", w.aim_mode)
|
||||||
("auto_aim", w.auto_aim)
|
("auto_aim", w.auto_aim)
|
||||||
("angvel", w.angvel)
|
("q16angvel", w.q16angvel)
|
||||||
("cursectnum", w.cursectnum)
|
("cursectnum", w.cursectnum)
|
||||||
("last_extra", w.last_extra)
|
("last_extra", w.last_extra)
|
||||||
("subweapon", w.subweapon)
|
("subweapon", w.subweapon)
|
||||||
|
|
|
@ -101,8 +101,8 @@ struct player_struct
|
||||||
};
|
};
|
||||||
|
|
||||||
// input handles angle and horizon as fixed16 numbers. We need to account for that as well.
|
// input handles angle and horizon as fixed16 numbers. We need to account for that as well.
|
||||||
fixed_t q16ang, q16horiz, q16horizoff, q16rotscrnang, q16look_ang;
|
fixed_t q16ang, q16horiz, q16horizoff, q16rotscrnang, q16look_ang, q16angvel;
|
||||||
fixed_t oq16ang, oq16horiz, oq16horizoff, oq16rotscrnang; // These are only needed with synchronous mouse input.
|
fixed_t oq16ang, oq16horiz, oq16horizoff, oq16rotscrnang, oq16look_ang; // These are only needed with synchronous mouse input.
|
||||||
fixed_t one_eighty_count;
|
fixed_t one_eighty_count;
|
||||||
|
|
||||||
// using a bit field for this to save a bit of space.
|
// using a bit field for this to save a bit of space.
|
||||||
|
@ -126,7 +126,7 @@ struct player_struct
|
||||||
|
|
||||||
int aim_mode, auto_aim;
|
int aim_mode, auto_aim;
|
||||||
|
|
||||||
short angvel, cursectnum, last_extra, subweapon;
|
short cursectnum, last_extra, subweapon;
|
||||||
short ammo_amount[MAX_WEAPONS], wackedbyactor, frag, fraggedself;
|
short ammo_amount[MAX_WEAPONS], wackedbyactor, frag, fraggedself;
|
||||||
|
|
||||||
short curr_weapon, last_weapon, tipincs, wantweaponfire;
|
short curr_weapon, last_weapon, tipincs, wantweaponfire;
|
||||||
|
|
Loading…
Reference in a new issue