2 * Copyright (c) 2011 Rudolf Polzer
4 * Permission is hereby granted, free of charge, to any person obtaining a copy
5 * of this software and associated documentation files (the "Software"), to
6 * deal in the Software without restriction, including without limitation the
7 * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
8 * sell copies of the Software, and to permit persons to whom the Software is
9 * furnished to do so, subject to the following conditions:
11 * The above copyright notice and this permission notice shall be included in
12 * all copies or substantial portions of the Software.
14 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
15 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
17 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
18 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
19 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
23 #include "../dpdefs/csprogsdefs.qh"
24 #include "../client/defs.qh"
25 #include "../warpzonelib/anglestransform.qh"
26 #include "../client/autocvars.qh"
27 #include "interpolate.qh"
28 #include "cl_model.qh"
33 .vector iorigin1, iorigin2;
34 .vector ivelocity1, ivelocity2;
35 .vector iforward1, iforward2;
37 .vector ivforward1, ivforward2;
39 .float itime1, itime2;
40 void InterpolateOrigin_Reset()
42 self.iflags &= ~IFLAG_INTERNALMASK;
43 self.itime1 = self.itime2 = 0;
45 void InterpolateOrigin_Note()
50 dt = time - self.itime2;
53 if(self.iflags & IFLAG_PREVALID)
54 self.iflags |= IFLAG_VALID;
56 self.iflags |= IFLAG_PREVALID;
58 if(self.iflags & IFLAG_ORIGIN)
60 self.iorigin1 = self.iorigin2;
61 self.iorigin2 = self.origin;
64 if(self.iflags & IFLAG_AUTOANGLES)
65 if(self.iorigin2 != self.iorigin1)
66 self.angles = vectoangles(self.iorigin2 - self.iorigin1);
68 if(self.iflags & IFLAG_AUTOVELOCITY)
69 if(self.itime2 != self.itime1)
70 self.velocity = (self.iorigin2 - self.iorigin1) * (1.0 / (self.itime2 - self.itime1));
72 if(self.iflags & IFLAG_ANGLES)
74 fixedmakevectors(self.angles);
77 self.iforward1 = self.iforward2;
78 self.iup1 = self.iup2;
82 self.iforward1 = v_forward;
85 self.iforward2 = v_forward;
89 if(self.iflags & IFLAG_V_ANGLE)
91 fixedmakevectors(self.v_angle);
94 self.ivforward1 = self.ivforward2;
95 self.ivup1 = self.ivup2;
99 self.ivforward1 = v_forward;
102 self.ivforward2 = v_forward;
105 else if(self.iflags & IFLAG_V_ANGLE_X)
107 self.ivforward1_x = self.ivforward2_x;
108 self.ivforward2_x = self.v_angle.x;
111 if(self.iflags & IFLAG_VELOCITY)
113 self.ivelocity1 = self.ivelocity2;
114 self.ivelocity2 = self.velocity;
117 if(self.iflags & IFLAG_TELEPORTED)
119 self.iflags &= ~IFLAG_TELEPORTED;
120 self.itime1 = self.itime2 = time; // don't lerp
122 else if(vlen(self.iorigin2 - self.iorigin1) > 1000)
124 self.itime1 = self.itime2 = time; // don't lerp
126 else if((self.iflags & IFLAG_VELOCITY) && (vlen(self.ivelocity2 - self.ivelocity1) > 1000))
128 self.itime1 = self.itime2 = time; // don't lerp
132 self.itime1 = self.itime2 = time;
136 self.itime1 = serverprevtime;
140 void InterpolateOrigin_Do()
143 if(self.itime1 && self.itime2 && self.itime1 != self.itime2)
146 f = bound(0, (time - self.itime1) / (self.itime2 - self.itime1), 1 + autocvar_cl_lerpexcess);
147 if(self.iflags & IFLAG_ORIGIN)
148 setorigin(self, (1 - f) * self.iorigin1 + f * self.iorigin2);
149 if(self.iflags & IFLAG_ANGLES)
151 forward = (1 - f) * self.iforward1 + f * self.iforward2;
152 up = (1 - f) * self.iup1 + f * self.iup2;
153 self.angles = fixedvectoangles2(forward, up);
155 if(self.iflags & IFLAG_V_ANGLE)
157 forward = (1 - f) * self.ivforward1 + f * self.ivforward2;
158 up = (1 - f) * self.ivup1 + f * self.ivup2;
159 self.v_angle = fixedvectoangles2(forward, up);
161 else if(self.iflags & IFLAG_V_ANGLE_X)
162 self.v_angle_x = (1 - f) * self.ivforward1_x + f * self.ivforward2_x;
163 if(self.iflags & IFLAG_VELOCITY)
164 self.velocity = (1 - f) * self.ivelocity1 + f * self.ivelocity2;
167 void InterpolateOrigin_Undo()
169 if(self.iflags & IFLAG_ORIGIN)
170 setorigin(self, self.iorigin2);
171 if(self.iflags & IFLAG_ANGLES)
172 self.angles = fixedvectoangles2(self.iforward2, self.iup2);
173 if(self.iflags & IFLAG_V_ANGLE)
174 self.v_angle = fixedvectoangles2(self.ivforward2, self.ivup2);
175 else if(self.iflags & IFLAG_V_ANGLE_X)
176 self.v_angle_x = self.ivforward2_x;
177 if(self.iflags & IFLAG_VELOCITY)
178 self.velocity = self.ivelocity2;