Use gametic+fractic for crosshair interpolation, should be smoother than MSTime().

This commit is contained in:
Mari the Deer 2021-06-01 16:51:13 +02:00
commit 0f37e68698
4 changed files with 14 additions and 14 deletions

View file

@ -28,7 +28,7 @@ extend Class SWWMWeapon
ui Vector3 cpos;
ui Color ccol;
ui Vector2 lagvpos;
transient ui uint prevms;
transient ui double prevframe;
override void DoEffect()
{
@ -48,7 +48,7 @@ extend Class SWWMWeapon
{
SWWMWeapon(Owner.player.PendingWeapon).cpos = cpos;
SWWMWeapon(Owner.player.PendingWeapon).lagvpos = lagvpos;
SWWMWeapon(Owner.player.PendingWeapon).prevms = prevms;
SWWMWeapon(Owner.player.PendingWeapon).prevframe = prevframe;
}
}
// extra drawing, usually scopes
@ -67,11 +67,11 @@ extend Class SWWMWeapon
Vector3 ndc = SWWMUtility.ProjectPoint(sb.projdata,e.ViewPos+tdir);
if ( ndc.z >= 1. ) return;
Vector2 vpos = SWWMUtility.NDCToViewport(sb.projdata,ndc);
double frametime = (MSTime()-prevms)/1000.;
double theta = clamp(15.*frametime,0.,1.); // naive, but whatever
if ( !prevms || (lagvpos == (0,0)) ) lagvpos = vpos;
double frametime = ((gametic+e.fractic)-prevframe)/GameTicRate;
double theta = clamp(30.*frametime,0.,1.); // naive, but whatever
if ( !prevframe || (lagvpos == (0,0)) ) lagvpos = vpos;
else lagvpos = lagvpos*(1.-theta)+vpos*theta;
prevms = MSTime();
prevframe = gametic+e.fractic;
int cnum = abs(CVar.FindCVar('crosshair').GetInt());
if ( !cnum ) return;
String tn = String.Format("XHAIR%s%d",(Screen.GetWidth()<640)?"S":"B",cnum);

View file

@ -161,9 +161,9 @@ Class Wallbuster : SWWMWeapon
Vector3 ndc = SWWMUtility.ProjectPoint(sb.projdata,e.ViewPos+tdir);
if ( ndc.z >= 1. ) return;
Vector2 vpos = SWWMUtility.NDCToViewport(sb.projdata,ndc);
double frametime = (MSTime()-prevms)/1000.;
double theta = clamp(15.*frametime,0.,1.); // naive, but whatever
if ( !prevms || (lagvpos == (0,0)) ) lagvpos = vpos;
double frametime = ((gametic+e.fractic)-prevframe)/GameTicRate;
double theta = clamp(30.*frametime,0.,1.); // naive, but whatever
if ( !prevframe || (lagvpos == (0,0)) ) lagvpos = vpos;
else lagvpos = lagvpos*(1.-theta)+vpos*theta;
for ( int i=0; i<25; i++ )
{
@ -173,11 +173,11 @@ Class Wallbuster : SWWMWeapon
ndc = SWWMUtility.ProjectPoint(sb.projdata,e.ViewPos+tdir);
if ( ndc.z >= 1. ) return;
vpos = SWWMUtility.NDCToViewport(sb.projdata,ndc);
if ( !prevms || (lagvpos25[i] == (0,0)) ) lagvpos25[i] = vpos;
if ( !prevframe || (lagvpos25[i] == (0,0)) ) lagvpos25[i] = vpos;
else lagvpos25[i] = lagvpos25[i]*(1.-theta)+vpos*theta;
Screen.DrawTexture(ctex,false,int(lagvpos25[i].x),int(lagvpos25[i].y),DTA_DestWidthF,ts.x*sz,DTA_DestHeightF,ts.y*sz,DTA_AlphaChannel,true,DTA_FillColor,ccol25[i]);
}
prevms = MSTime();
prevframe = gametic+e.fractic;
}
ui Vector3, Color TraceForCrosshair25( int i )

View file

@ -517,7 +517,7 @@ Class DualExplodiumGun : SWWMWeapon
{
SWWMWeapon(Owner.player.PendingWeapon).cpos = sw.cpos;
SWWMWeapon(Owner.player.PendingWeapon).lagvpos = sw.lagvpos;
SWWMWeapon(Owner.player.PendingWeapon).prevms = sw.prevms;
SWWMWeapon(Owner.player.PendingWeapon).prevframe = sw.prevframe;
}
[sw.cpos, sw.ccol] = sw.TraceForCrosshair();
}