Stop reinventing lerp() all over the place.

This commit is contained in:
Mari the Deer 2022-05-29 18:07:30 +02:00
commit 65597c181a
10 changed files with 38 additions and 31 deletions

View file

@ -60,7 +60,7 @@ extend Class SWWMHandler
private ui void DrawActor( RenderEvent e, Actor a )
{
Vector3 pos = a.prev*(1.-e.FracTic)+a.pos*e.FracTic;
Vector3 pos = SWWMUtility.LerpVector3(a.prev,a.pos,e.FracTic);
if ( a is 'DynamicLight' ) DrawWorldCircle(e,pos,a.args[3]*2,Color(a.args[0],a.args[1],a.args[2]));
if ( (a.radius > 0.) && (a.height > 0.) )
{
@ -86,9 +86,9 @@ extend Class SWWMHandler
DrawWorldLine(e,pos,pos+y*16,"Green");
DrawWorldLine(e,pos,pos+z*16,"Blue");
if ( a.vel != (0,0,0) ) DrawWorldLine(e,pos,pos+a.vel*GameTicRate,"Yellow");
if ( a.target ) DrawWorldLine(e,pos,a.target.prev*(1.-e.FracTic)+a.target.pos*e.FracTic,"Gold");
if ( a.tracer ) DrawWorldLine(e,pos,a.tracer.prev*(1.-e.FracTic)+a.tracer.pos*e.FracTic,"Orange");
if ( a.master ) DrawWorldLine(e,pos,a.master.prev*(1.-e.FracTic)+a.master.pos*e.FracTic,"Purple");
if ( a.target ) DrawWorldLine(e,pos,SWWMUtility.LerpVector3(a.target.prev,a.target.pos,e.FracTic),"Gold");
if ( a.tracer ) DrawWorldLine(e,pos,SWWMUtility.LerpVector3(a.tracer.prev,a.tracer.pos,e.FracTic),"Orange");
if ( a.master ) DrawWorldLine(e,pos,SWWMUtility.LerpVector3(a.master.prev,a.master.pos,e.FracTic),"Purple");
double hdiff = a.Height/2;
if ( a.bFLOATBOB ) hdiff += a.GetBobOffset();
Vector3 ndc = SWWMUtility.ProjectPoint(projdata,e.viewpos+level.Vec3Diff(e.viewpos,pos+(0,0,hdiff)));

View file

@ -1338,7 +1338,7 @@ Class SWWMStatusBar : BaseStatusBar
{
let targ = trackers[i];
if ( !targ ) continue;
Vector3 ndc = SWWMUtility.ProjectPoint(projdata,ViewPos+level.Vec3Diff(ViewPos,targ.prevpos*(1.-fractic)+targ.pos*fractic));
Vector3 ndc = SWWMUtility.ProjectPoint(projdata,ViewPos+level.Vec3Diff(ViewPos,SWWMUtility.LerpVector3(targ.prevpos,targ.pos,fractic)));
if ( ndc.z >= 1. ) continue;
Vector2 vpos = SWWMUtility.NDCToViewport(projdata,ndc);
tag = targ.mytag;
@ -1748,9 +1748,9 @@ Class SWWMStatusBar : BaseStatusBar
private void DrawMapGrid( Vector2 basepos )
{
double zoomlevel = oldminimapzoom*(1.-FracTic)+minimapzoom*FracTic;
double zoomlevel = SWWMUtility.Lerp(oldminimapzoom,minimapzoom,FracTic);
double zoomview = MAPVIEWDIST*zoomlevel, zoomclip = CLIPDIST*zoomlevel;
Vector2 cpos = players[consoleplayer].Camera.prev.xy*(1.-FracTic)+players[consoleplayer].Camera.pos.xy*FracTic;
Vector2 cpos = SWWMUtility.LerpVector2(players[consoleplayer].Camera.prev.xy,players[consoleplayer].Camera.pos.xy,FracTic);
// find farthest visible southwest grid point from camera position
int maxlines = int(zoomview/64);
Vector2 gpt = (cpos-(zoomview,zoomview))/128;
@ -1850,9 +1850,9 @@ Class SWWMStatusBar : BaseStatusBar
private void DrawMapLines( Vector2 basepos )
{
double zoomlevel = oldminimapzoom*(1.-FracTic)+minimapzoom*FracTic;
double zoomlevel = SWWMUtility.Lerp(oldminimapzoom,minimapzoom,FracTic);
double zoomview = MAPVIEWDIST*zoomlevel, zoomclip = CLIPDIST*zoomlevel;
Vector2 cpos = players[consoleplayer].Camera.prev.xy*(1.-FracTic)+players[consoleplayer].Camera.pos.xy*FracTic;
Vector2 cpos = SWWMUtility.LerpVector2(players[consoleplayer].Camera.prev.xy,players[consoleplayer].Camera.pos.xy,FracTic);
Sector csec = players[consoleplayer].Camera.CurSector;
for ( int i=0; i<level.lines.Size(); i++ )
{
@ -1960,9 +1960,9 @@ Class SWWMStatusBar : BaseStatusBar
}
private void DrawMapMarkers( Vector2 basepos )
{
double zoomlevel = oldminimapzoom*(1.-FracTic)+minimapzoom*FracTic;
double zoomlevel = SWWMUtility.Lerp(oldminimapzoom,minimapzoom,FracTic);
double zoomview = MAPVIEWDIST*zoomlevel, zoomclip = CLIPDIST*zoomlevel;
Vector2 cpos = players[consoleplayer].Camera.prev.xy*(1.-FracTic)+players[consoleplayer].Camera.pos.xy*FracTic;
Vector2 cpos = SWWMUtility.LerpVector2(players[consoleplayer].Camera.prev.xy,players[consoleplayer].Camera.pos.xy,FracTic);
Sector csec = players[consoleplayer].Camera.CurSector;
if ( !mi ) mi = ThinkerIterator.Create("MapMarker",Thinker.STAT_MAPMARKER);
else mi.Reinit();
@ -2045,9 +2045,9 @@ Class SWWMStatusBar : BaseStatusBar
}
private void DrawMapThings( Vector2 basepos )
{
double zoomlevel = oldminimapzoom*(1.-FracTic)+minimapzoom*FracTic;
double zoomlevel = SWWMUtility.Lerp(oldminimapzoom,minimapzoom,FracTic);
double zoomview = MAPVIEWDIST*zoomlevel, zoomclip = CLIPDIST*zoomlevel;
Vector2 cpos = players[consoleplayer].Camera.prev.xy*(1.-FracTic)+players[consoleplayer].Camera.pos.xy*FracTic;
Vector2 cpos = SWWMUtility.LerpVector2(players[consoleplayer].Camera.prev.xy,players[consoleplayer].Camera.pos.xy,FracTic);
Sector csec = players[consoleplayer].Camera.CurSector;
for ( SWWMSimpleTracker t=hnd.strackers; t; t=t.next )
{
@ -2061,7 +2061,7 @@ Class SWWMStatusBar : BaseStatusBar
double radius;
if ( t.target )
{
pos = t.target.prev.xy*(1.-FracTic)+t.target.pos.xy*FracTic;
pos = SWWMUtility.LerpVector2(t.target.prev.xy,t.target.pos.xy,FracTic);
angle = t.target.angle;
radius = t.isbeam?(t.target.speed*cos(t.target.pitch)):t.target.radius;
}
@ -2170,7 +2170,7 @@ Class SWWMStatusBar : BaseStatusBar
double alph = clamp(((t.lastupdate+mtime)-level.maptime)/35.,0.,1.);
if ( t.isbeam ) alph *= t.target?(t.target.alpha/t.target.default.alpha):0.;
double theta = clamp(5.*FrameTime,0.,1.);
t.smoothalpha = t.smoothalpha*(1.-theta)+alph*theta;
t.smoothalpha = SWWMUtility.Lerp(t.smoothalpha,alph,theta);
}
else t.smoothalpha = 0.;
}

View file

@ -344,7 +344,7 @@ Class SWWMMainMenu : SWWMCleanMenu
// naive, but whatever
if ( swwm_oldlogo ) theta = clamp(2.*frametime,0.,1.);
else theta = clamp(4.*frametime,0.,1.);
if ( prevms ) demopos = demopos*(1.-theta)-40*theta;
if ( prevms ) demopos = SWWMUtility.Lerp(demopos,-40,theta);
double alph = clamp(1.-(demopos/100),0.,1.);
if ( !swwm_oldlogo )
{

View file

@ -801,10 +801,10 @@ Class Demolitionist : PlayerPawn
player.WeaponState |= WF_WEAPONBOBBING; // always bob
Vector2 cur = Super.BobWeapon(ticfrac);
if ( !oldbob ) player.WeaponState &= ~WF_WEAPONBOBBING;
double fangle = oldangle*(1.-ticfrac)+angle*ticfrac;
double fpitch = (oldpitch*(1.-ticfrac)+pitch*ticfrac);
double flagangle = (oldlagangle*(1.-ticfrac)+lagangle*ticfrac);
double flagpitch = (oldlagpitch*(1.-ticfrac)+lagpitch*ticfrac);
double fangle = SWWMUtility.Lerp(oldangle,angle,ticfrac);
double fpitch = SWWMUtility.Lerp(oldpitch,pitch,ticfrac);
double flagangle = SWWMUtility.Lerp(oldlagangle,lagangle,ticfrac);
double flagpitch = SWWMUtility.Lerp(oldlagpitch,lagpitch,ticfrac);
double diffang = fangle-flagangle;
double diffpitch = fpitch-flagpitch;
if ( abs(diffang) > 1. )
@ -817,7 +817,7 @@ Class Demolitionist : PlayerPawn
int sgn = (diffpitch>0)?1:-1;
diffpitch = abs(diffpitch)**.7*sgn;
}
Vector3 flagvel = oldlagvel*(1.-ticfrac)+lagvel*ticfrac;
Vector3 flagvel = SWWMUtility.LerpVector3(oldlagvel,lagvel,ticfrac);
double diffx = flagvel dot (cos(flagangle+90),sin(flagangle+90),0);
double diffy = flagvel dot (0,0,1);
if ( abs(diffx) > 1. )
@ -838,7 +838,7 @@ Class Demolitionist : PlayerPawn
cur.x += diffx*4.;
cur.y += diffy*4.;
}
return cur*(oldlagready*(1.-ticfrac)+lagready*ticfrac);
return cur*SWWMUtility.Lerp(oldlagready,lagready,ticfrac);
}
override void PlayerThink()
{

View file

@ -233,7 +233,14 @@ Class SWWMUtility
{
return a*(1.-theta)+b*theta;
}
static clearscope Vector3 LerpVector3( Vector3 a, Vector3 b, double theta )
{
return a*(1.-theta)+b*theta;
}
static clearscope Vector2 LerpVector2( Vector2 a, Vector2 b, double theta )
{
return a*(1.-theta)+b*theta;
}
static clearscope Color LerpColor( Color a, Color b, double theta )
{
Color c = Color(

View file

@ -151,7 +151,7 @@ Class ParryField : Actor
{
hdir = level.Vec3Diff(a.pos,a.target.Vec3Offset(0,0,a.target.height/2)).unit();
double theta = max(FRandom[Parry](0.,1.)**2.,.1);
dir = dir*(1.-theta)+hdir*theta;
dir = SWWMUtility.LerpVector3(dir,hdir,theta);
}
// push away
if ( a.bSEEKERMISSILE ) a.tracer = a.target;
@ -434,7 +434,7 @@ extend Class SWWMWeapon
// things can instantly cease to exist after taking damage (wow)
if ( mt.hits[i].a )
{
if ( mt.hits[i].a.player ) mt.hits[i].a.A_QuakeEx(quakin,quakin,quakin,6,0,1,"",QF_RELATIVE|QF_SCALEDOWN,rollIntensity:0.125*quakin);
if ( mt.hits[i].a.player ) mt.hits[i].a.A_QuakeEx(quakin,quakin,quakin,6,0,1,"",QF_RELATIVE|QF_SCALEDOWN,rollIntensity:.125*quakin);
if ( !mt.hits[i].a.bNOBLOOD && !mt.hits[i].a.bDORMANT && (raging || !mt.hits[i].a.bINVULNERABLE) )
{
mt.hits[i].a.TraceBleed(newdmg,invoker);

View file

@ -70,7 +70,7 @@ extend Class SWWMWeapon
double theta = clamp(15.*frametime,0.,1.); // naive, but whatever
Vector2 oldvpos = lagvpos;
if ( !prevframe || (lagvpos == (0,0)) ) oldvpos = lagvpos = vpos;
else lagvpos = lagvpos*(1.-theta)+vpos*theta;
else lagvpos = SWWMUtility.LerpVector2(lagvpos,vpos,theta);
prevframe = MSTimeF();
int cnum = abs(CVar.FindCVar('crosshair').GetInt());
if ( !cnum ) return;

View file

@ -131,7 +131,7 @@ Class Hellblazer : SWWMWeapon
for ( int i=0; i<3; i++ )
{
if ( !seektarget[i] ) continue;
Vector3 tpos = seektarget[i].prev*(1.-e.FracTic)+seektarget[i].pos*e.FracTic;
Vector3 tpos = SWWMUtility.LerpVector3(seektarget[i].prev,seektarget[i].pos,e.FracTic);
Vector3 ndc = SWWMUtility.ProjectPoint(projdata,e.viewpos+level.Vec3Diff(e.viewpos,tpos+(0,0,seektarget[i].Height/2)));
if ( ndc.z > 1. ) continue;
Vector2 vpos = SWWMUtility.NDCToViewport(projdata,ndc);

View file

@ -162,7 +162,7 @@ Class Wallbuster : SWWMWeapon
double frametime = (MSTimeF()-prevframe)/1000.;
double theta = clamp(15.*frametime,0.,1.); // naive, but whatever
if ( !prevframe || (lagvpos == (0,0)) ) lagvpos = vpos;
else lagvpos = lagvpos*(1.-theta)+vpos*theta;
else lagvpos = SWWMUtility.LerpVector2(lagvpos,vpos,theta);
Vector2 oldvpos;
for ( int i=0; i<25; i++ )
{
@ -173,7 +173,7 @@ Class Wallbuster : SWWMWeapon
vpos = SWWMUtility.NDCToViewport(sb.projdata,ndc);
oldvpos = lagvpos25[i];
if ( !prevframe || (lagvpos25[i] == (0,0)) ) oldvpos = lagvpos25[i] = vpos;
else lagvpos25[i] = lagvpos25[i]*(1.-theta)+vpos*theta;
else lagvpos25[i] = SWWMUtility.LerpVector2(lagvpos25[i],vpos,theta);
int streak = int(max(abs(oldvpos.x-lagvpos25[i].x),abs(oldvpos.y-lagvpos25[i].y)));
for ( int j=0; j<streak; j++ ) Screen.DrawTexture(ctex,false,int(SWWMUtility.lerp(oldvpos.x,lagvpos25[i].x,j/double(streak))),int(SWWMUtility.lerp(oldvpos.y,lagvpos25[i].y,j/double(streak))),DTA_DestWidthF,ts.x*sz,DTA_DestHeightF,ts.y*sz,DTA_AlphaChannel,true,DTA_FillColor,ccol,DTA_Alpha,(j*.5)/streak);
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]);