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