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
22 #include "interpolate.qh"
25 .vector iorigin1, iorigin2;
26 .vector ivelocity1, ivelocity2;
27 .vector iforward1, iforward2;
29 .vector ivforward1, ivforward2;
31 .float itime1, itime2;
32 void InterpolateOrigin_Reset(entity this)
34 this.iflags &= ~IFLAG_INTERNALMASK;
35 this.itime1 = this.itime2 = 0;
37 void InterpolateOrigin_Note(entity this)
39 float dt = time - this.itime2;
42 if (this.iflags & IFLAG_PREVALID) this.iflags |= IFLAG_VALID;
43 else this.iflags |= IFLAG_PREVALID;
45 if (this.iflags & IFLAG_ORIGIN)
47 this.iorigin1 = this.iorigin2;
48 this.iorigin2 = this.origin;
51 if (this.iflags & IFLAG_AUTOANGLES
53 != this.iorigin1) this.angles = vectoangles(this.iorigin2 - this.iorigin1);
55 if (this.iflags & IFLAG_AUTOVELOCITY
57 != this.itime1) this.velocity = (this.iorigin2 - this.iorigin1) * (1.0 / (this.itime2 - this.itime1));
59 if (this.iflags & IFLAG_ANGLES)
61 fixedmakevectors(this.angles);
64 this.iforward1 = this.iforward2;
65 this.iup1 = this.iup2;
69 this.iforward1 = v_forward;
72 this.iforward2 = v_forward;
76 if (this.iflags & IFLAG_V_ANGLE)
78 fixedmakevectors(this.v_angle);
81 this.ivforward1 = this.ivforward2;
82 this.ivup1 = this.ivup2;
86 this.ivforward1 = v_forward;
89 this.ivforward2 = v_forward;
92 else if (this.iflags & IFLAG_V_ANGLE_X)
94 this.ivforward1_x = this.ivforward2_x;
95 this.ivforward2_x = this.v_angle.x;
98 if (this.iflags & IFLAG_VELOCITY)
100 this.ivelocity1 = this.ivelocity2;
101 this.ivelocity2 = this.velocity;
104 if (this.iflags & IFLAG_TELEPORTED)
106 this.iflags &= ~IFLAG_TELEPORTED;
107 this.itime1 = this.itime2 = time; // don't lerp
109 else if (vdist(this.iorigin2 - this.iorigin1, >, 1000))
111 this.itime1 = this.itime2 = time; // don't lerp
113 else if ((this.iflags & IFLAG_VELOCITY) && vdist(this.ivelocity2 - this.ivelocity1, >, 1000))
115 this.itime1 = this.itime2 = time; // don't lerp
119 this.itime1 = this.itime2 = time;
123 this.itime1 = serverprevtime;
128 /** set origin based on iorigin1 (old pos), iorigin2 (desired pos), and time */
129 void InterpolateOrigin_Do(entity this)
131 if (this.itime1 && this.itime2 && this.itime1 != this.itime2)
133 float f = bound(0, (time - this.itime1) / (this.itime2 - this.itime1), 1 + autocvar_cl_lerpexcess);
135 if (this.iflags & IFLAG_ORIGIN) setorigin(this, f_1 * this.iorigin1 + f * this.iorigin2);
136 if (this.iflags & IFLAG_ANGLES)
138 vector forward = f_1 * this.iforward1 + f * this.iforward2;
139 vector up = f_1 * this.iup1 + f * this.iup2;
140 this.angles = fixedvectoangles2(forward, up);
142 if (this.iflags & IFLAG_V_ANGLE)
144 vector forward = f_1 * this.ivforward1 + f * this.ivforward2;
145 vector up = f_1 * this.ivup1 + f * this.ivup2;
146 this.v_angle = fixedvectoangles2(forward, up);
148 else if (this.iflags & IFLAG_V_ANGLE_X)
150 this.v_angle_x = f_1 * this.ivforward1.x + f * this.ivforward2.x;
152 if (this.iflags & IFLAG_VELOCITY) this.velocity = f_1 * this.ivelocity1 + f * this.ivelocity2;
156 /** snap origin to iorigin2 (actual origin) */
157 void InterpolateOrigin_Undo(entity this)
159 if (this.iflags & IFLAG_ORIGIN) setorigin(this, this.iorigin2);
160 if (this.iflags & IFLAG_ANGLES) this.angles = fixedvectoangles2(this.iforward2, this.iup2);
161 if (this.iflags & IFLAG_V_ANGLE) this.v_angle = fixedvectoangles2(this.ivforward2, this.ivup2);
162 else if (this.iflags & IFLAG_V_ANGLE_X) this.v_angle_x = this.ivforward2_x;
163 if (this.iflags & IFLAG_VELOCITY) this.velocity = this.ivelocity2;