X-Git-Url: http://de.git.xonotic.org/?a=blobdiff_plain;f=qcsrc%2Fcsqcmodellib%2Finterpolate.qc;h=994323cfe037334bed894624c7c12089108b069d;hb=e0ac5f9f14e169a1e19d0e36b85cab061a74ed93;hp=817bc531e7fd7aebe7e3341e788bf8d8690db0fe;hpb=24f341e88c43d52141da8bc22459d3d67b2c45a1;p=xonotic%2Fxonotic-data.pk3dir.git diff --git a/qcsrc/csqcmodellib/interpolate.qc b/qcsrc/csqcmodellib/interpolate.qc index 817bc531e..994323cfe 100644 --- a/qcsrc/csqcmodellib/interpolate.qc +++ b/qcsrc/csqcmodellib/interpolate.qc @@ -24,10 +24,12 @@ .vector ivelocity1, ivelocity2; .vector iforward1, iforward2; .vector iup1, iup2; +.vector ivforward1, ivforward2; +.vector ivup1, ivup2; .float itime1, itime2; void InterpolateOrigin_Reset() { - self.iflags &~= IFLAG_INTERNALMASK; + self.iflags &= ~IFLAG_INTERNALMASK; self.itime1 = self.itime2 = 0; } void InterpolateOrigin_Note() @@ -43,8 +45,11 @@ void InterpolateOrigin_Note() else self.iflags |= IFLAG_PREVALID; - self.iorigin1 = self.iorigin2; - self.iorigin2 = self.origin; + if(self.iflags & IFLAG_ORIGIN) + { + self.iorigin1 = self.iorigin2; + self.iorigin2 = self.origin; + } if(self.iflags & IFLAG_AUTOANGLES) if(self.iorigin2 != self.iorigin1) @@ -71,6 +76,28 @@ void InterpolateOrigin_Note() self.iup2 = v_up; } + if(self.iflags & IFLAG_V_ANGLE) + { + fixedmakevectors(self.v_angle); + if(f0 & IFLAG_VALID) + { + self.ivforward1 = self.ivforward2; + self.ivup1 = self.ivup2; + } + else + { + self.ivforward1 = v_forward; + self.ivup1 = v_up; + } + self.ivforward2 = v_forward; + self.ivup2 = v_up; + } + else if(self.iflags & IFLAG_V_ANGLE_X) + { + self.ivforward1_x = self.ivforward2_x; + self.ivforward2_x = self.v_angle_x; + } + if(self.iflags & IFLAG_VELOCITY) { self.ivelocity1 = self.ivelocity2; @@ -79,7 +106,7 @@ void InterpolateOrigin_Note() if(self.iflags & IFLAG_TELEPORTED) { - self.iflags &~= IFLAG_TELEPORTED; + self.iflags &= ~IFLAG_TELEPORTED; self.itime1 = self.itime2 = time; // don't lerp } else if(vlen(self.iorigin2 - self.iorigin1) > 1000) @@ -107,22 +134,36 @@ void InterpolateOrigin_Do() { float f; f = bound(0, (time - self.itime1) / (self.itime2 - self.itime1), 1 + autocvar_cl_lerpexcess); - self.origin = (1 - f) * self.iorigin1 + f * self.iorigin2; + if(self.iflags & IFLAG_ORIGIN) + setorigin(self, (1 - f) * self.iorigin1 + f * self.iorigin2); if(self.iflags & IFLAG_ANGLES) { forward = (1 - f) * self.iforward1 + f * self.iforward2; up = (1 - f) * self.iup1 + f * self.iup2; self.angles = fixedvectoangles2(forward, up); } + if(self.iflags & IFLAG_V_ANGLE) + { + forward = (1 - f) * self.ivforward1 + f * self.ivforward2; + up = (1 - f) * self.ivup1 + f * self.ivup2; + self.v_angle = fixedvectoangles2(forward, up); + } + else if(self.iflags & IFLAG_V_ANGLE_X) + self.v_angle_x = (1 - f) * self.ivforward1_x + f * self.ivforward2_x; if(self.iflags & IFLAG_VELOCITY) self.velocity = (1 - f) * self.ivelocity1 + f * self.ivelocity2; } } void InterpolateOrigin_Undo() { - self.origin = self.iorigin2; + if(self.iflags & IFLAG_ORIGIN) + setorigin(self, self.iorigin2); if(self.iflags & IFLAG_ANGLES) self.angles = fixedvectoangles2(self.iforward2, self.iup2); + if(self.iflags & IFLAG_V_ANGLE) + self.v_angle = fixedvectoangles2(self.ivforward2, self.ivup2); + else if(self.iflags & IFLAG_V_ANGLE_X) + self.v_angle_x = self.ivforward2_x; if(self.iflags & IFLAG_VELOCITY) self.velocity = self.ivelocity2; }