diff --git a/language.version b/language.version index 5a8bc0270..9d7c4700d 100644 --- a/language.version +++ b/language.version @@ -1,3 +1,3 @@ [default] -SWWM_MODVER="\cyDEMOLITIONIST \cw1.3pre r72 \cu(Sun 29 May 17:51:59 CEST 2022)\c-"; -SWWM_SHORTVER="\cw1.3pre r72 \cu(2022-05-29 17:51:59)\c-"; +SWWM_MODVER="\cyDEMOLITIONIST \cw1.3pre r73 \cu(Sun 29 May 18:07:30 CEST 2022)\c-"; +SWWM_SHORTVER="\cw1.3pre r73 \cu(2022-05-29 18:07:30)\c-"; diff --git a/zscript/handler/swwm_handler_debugrender.zsc b/zscript/handler/swwm_handler_debugrender.zsc index e091d6096..d42cf3936 100644 --- a/zscript/handler/swwm_handler_debugrender.zsc +++ b/zscript/handler/swwm_handler_debugrender.zsc @@ -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))); diff --git a/zscript/hud/swwm_hud.zsc b/zscript/hud/swwm_hud.zsc index 91674d663..d6ac9423a 100644 --- a/zscript/hud/swwm_hud.zsc +++ b/zscript/hud/swwm_hud.zsc @@ -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 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() { diff --git a/zscript/utility/swwm_utility.zsc b/zscript/utility/swwm_utility.zsc index dd14f8f1f..899d079f7 100644 --- a/zscript/utility/swwm_utility.zsc +++ b/zscript/utility/swwm_utility.zsc @@ -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( diff --git a/zscript/weapons/swwm_baseweapon_melee.zsc b/zscript/weapons/swwm_baseweapon_melee.zsc index 65965b48a..4ed2589e5 100644 --- a/zscript/weapons/swwm_baseweapon_melee.zsc +++ b/zscript/weapons/swwm_baseweapon_melee.zsc @@ -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); diff --git a/zscript/weapons/swwm_baseweapon_precisechair.zsc b/zscript/weapons/swwm_baseweapon_precisechair.zsc index 044a4ab15..aa372cdd6 100644 --- a/zscript/weapons/swwm_baseweapon_precisechair.zsc +++ b/zscript/weapons/swwm_baseweapon_precisechair.zsc @@ -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; diff --git a/zscript/weapons/swwm_blazeit.zsc b/zscript/weapons/swwm_blazeit.zsc index 9daaa2d6d..054ae1540 100644 --- a/zscript/weapons/swwm_blazeit.zsc +++ b/zscript/weapons/swwm_blazeit.zsc @@ -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); diff --git a/zscript/weapons/swwm_cbt.zsc b/zscript/weapons/swwm_cbt.zsc index 25857f44f..6a4366a2b 100644 --- a/zscript/weapons/swwm_cbt.zsc +++ b/zscript/weapons/swwm_cbt.zsc @@ -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