]> de.git.xonotic.org Git - xonotic/xonotic-data.pk3dir.git/blob - qcsrc/csqcmodel/interpolate.qc
a3140c8e775d1ebce3af9cb1f5d85700ca37f695
[xonotic/xonotic-data.pk3dir.git] / qcsrc / csqcmodel / interpolate.qc
1 // FIXME make this generic code, to be used for other entities too?
2 .vector iorigin1, iorigin2;
3 .vector ivelocity1, ivelocity2;
4 .vector iforward1, iforward2;
5 .vector iup1, iup2;
6 .float itime1, itime2;
7 void InterpolateOrigin_Reset()
8 {
9         self.iflags &~= IFLAG_INTERNALMASK;
10         self.itime1 = self.itime2 = 0;
11 }
12 void InterpolateOrigin_Note()
13 {
14         float dt;
15         float f0;
16
17         dt = time - self.itime2;
18
19         f0 = self.iflags;
20         if(self.iflags & IFLAG_PREVALID)
21                 self.iflags |= IFLAG_VALID;
22         else
23                 self.iflags |= IFLAG_PREVALID;
24
25         self.iorigin1 = self.iorigin2;
26         self.iorigin2 = self.origin;
27
28         if(self.iflags & IFLAG_AUTOANGLES)
29                 if(self.iorigin2 != self.iorigin1)
30                         self.angles = vectoangles(self.iorigin2 - self.iorigin1);
31
32         if(self.iflags & IFLAG_ANGLES)
33         {
34                 fixedmakevectors(self.angles);
35                 if(f0 & IFLAG_VALID)
36                 {
37                         self.iforward1 = self.iforward2;
38                         self.iup1 = self.iup2;
39                 }
40                 else
41                 {
42                         self.iforward1 = v_forward;
43                         self.iup1 = v_up;
44                 }
45                 self.iforward2 = v_forward;
46                 self.iup2 = v_up;
47         }
48
49         if(self.iflags & IFLAG_VELOCITY)
50         {
51                 self.ivelocity1 = self.ivelocity2;
52                 self.ivelocity2 = self.velocity;
53         }
54
55         if(self.iflags & IFLAG_TELEPORTED)
56         {
57                 self.iflags &~= IFLAG_TELEPORTED;
58                 self.itime1 = self.itime2 = time; // don't lerp
59         }
60         else if(vlen(self.iorigin2 - self.iorigin1) > 1000)
61         {
62                 self.itime1 = self.itime2 = time; // don't lerp
63         }
64         else if((self.iflags & IFLAG_VELOCITY) && (vlen(self.ivelocity2 - self.ivelocity1) > 1000))
65         {
66                 self.itime1 = self.itime2 = time; // don't lerp
67         }
68         else if(dt >= 0.2)
69         {
70                 self.itime1 = self.itime2 = time;
71         }
72         else
73         {
74                 self.itime1 = serverprevtime;
75                 self.itime2 = time;
76         }
77 }
78 void InterpolateOrigin_Do()
79 {
80         vector forward, up;
81         if(self.itime1 && self.itime2 && self.itime1 != self.itime2)
82         {
83                 float f;
84                 f = bound(0, (time - self.itime1) / (self.itime2 - self.itime1), 1 + autocvar_cl_lerpexcess);
85                 self.origin = (1 - f) * self.iorigin1 + f * self.iorigin2;
86                 if(self.iflags & IFLAG_ANGLES)
87                 {
88                         forward = (1 - f) * self.iforward1 + f * self.iforward2;
89                         up = (1 - f) * self.iup1 + f * self.iup2;
90                         self.angles = fixedvectoangles2(forward, up);
91                 }
92                 if(self.iflags & IFLAG_VELOCITY)
93                         self.velocity = (1 - f) * self.ivelocity1 + f * self.ivelocity2;
94         }
95 }
96 void InterpolateOrigin_Undo()
97 {
98         self.origin = self.iorigin2;
99         if(self.iflags & IFLAG_ANGLES)
100                 self.angles = fixedvectoangles2(self.iforward2, self.iup2);
101         if(self.iflags & IFLAG_VELOCITY)
102                 self.velocity = self.ivelocity2;
103 }
104