]> de.git.xonotic.org Git - xonotic/xonotic-data.pk3dir.git/blob - qcsrc/client/antiwall.qc
71268b0b8a55c3239501485789200953e7bcb46c
[xonotic/xonotic-data.pk3dir.git] / qcsrc / client / antiwall.qc
1 #include "antiwall.qh"
2
3 void Ent_Antiwall_PreDraw()
4 {
5     if (self.inactive) {
6         self.alpha = 0;
7     } else {
8         vector org;
9         org = getpropertyvec(VF_ORIGIN);
10         if(!checkpvs(org, self))
11             self.alpha = 0;
12         else if(self.fade_start) {
13             self.alpha = self.alpha_max / 100.0 * bound(0,
14                                (self.fade_end - vlen(org - self.origin - 0.5 * (self.mins + self.maxs)))
15                                / (self.fade_end - self.fade_start), 1);
16         } else {
17             self.alpha = 1;
18         }
19     }
20     if(self.alpha <= 0)
21         self.drawmask = 0;
22     else
23         self.drawmask = MASK_NORMAL;
24 }
25
26 void Ent_Antiwall_Draw()
27 {
28         float f;
29
30         if(self.lodmodelindex1)
31         {
32                 if(autocvar_cl_modeldetailreduction <= 0)
33                 {
34                         if(self.lodmodelindex2 && autocvar_cl_modeldetailreduction <= -2)
35                                 self.modelindex = self.lodmodelindex2;
36                         else if(autocvar_cl_modeldetailreduction <= -1)
37                                 self.modelindex = self.lodmodelindex1;
38                         else
39                                 self.modelindex = self.lodmodelindex0;
40                 }
41                 else
42                 {
43                         float distance = vlen(NearestPointOnBox(self, view_origin) - view_origin);
44                         f = (distance * current_viewzoom + 100.0) * autocvar_cl_modeldetailreduction;
45                         f *= 1.0 / bound(0.01, view_quality, 1);
46                         if(self.lodmodelindex2 && f > self.loddistance2)
47                                 self.modelindex = self.lodmodelindex2;
48                         else if(f > self.loddistance1)
49                                 self.modelindex = self.lodmodelindex1;
50                         else
51                                 self.modelindex = self.lodmodelindex0;
52                 }
53         }
54
55         InterpolateOrigin_Do();
56 }
57
58 void Ent_Antiwall_Remove()
59 {
60 }
61
62 void Ent_Antiwall()
63 {
64         float f;
65
66         InterpolateOrigin_Undo();
67         self.iflags = IFLAG_ANGLES | IFLAG_ORIGIN;
68
69         f = ReadByte();
70
71         if(f & 1)
72         {
73                 if(f & 0x40)
74                         self.colormap = ReadShort();
75                 else
76                         self.colormap = 0;
77         }
78
79         if(f & 2)
80         {
81                 self.origin_x = ReadCoord();
82                 self.origin_y = ReadCoord();
83                 self.origin_z = ReadCoord();
84                 setorigin(self, self.origin);
85         }
86
87         if(f & 4)
88         {
89                 if(f & 0x10)
90                 {
91                         self.angles_x = ReadAngle();
92                         self.angles_y = ReadAngle();
93                         self.angles_z = ReadAngle();
94                 }
95                 else
96                         self.angles = '0 0 0';
97         }
98
99         if(f & 8)
100         {
101                 if(f & 0x80)
102                 {
103                         self.lodmodelindex0 = ReadShort();
104                         self.loddistance1 = ReadShort();
105                         self.lodmodelindex1 = ReadShort();
106                         self.loddistance2 = ReadShort();
107                         self.lodmodelindex2 = ReadShort();
108                 }
109                 else
110                 {
111                         self.modelindex = ReadShort();
112                         self.loddistance1 = 0;
113                         self.loddistance2 = 0;
114                 }
115                 self.scale = ReadShort() / 256.0;
116                 if(f & 0x20)
117                 {
118                         self.mins_x = ReadCoord();
119                         self.mins_y = ReadCoord();
120                         self.mins_z = ReadCoord();
121                         self.maxs_x = ReadCoord();
122                         self.maxs_y = ReadCoord();
123                         self.maxs_z = ReadCoord();
124                 }
125                 else
126                         self.mins = self.maxs = '0 0 0';
127                 setsize(self, self.mins, self.maxs);
128
129         self.fade_start = ReadShort();
130         self.fade_end = ReadShort();
131         self.alpha_max = ReadShort();
132         self.inactive = ReadShort();
133         self.solid = ReadByte();
134         self.illusion = ReadShort();
135         if (!self.fade_start) {
136             self.fade_start = 50;
137         }
138         if (!self.fade_end) {
139             self.fade_end = 150;
140         }
141         if (!self.alpha_max) {
142             self.alpha_max = 1;
143         }
144         }
145         InterpolateOrigin_Note();
146
147         self.entremove = Ent_Antiwall_Remove;
148         self.draw = Ent_Antiwall_Draw;
149     self.predraw = Ent_Antiwall_PreDraw;
150 }
151