]> de.git.xonotic.org Git - xonotic/xonotic-data.pk3dir.git/blob - qcsrc/client/wall.qc
Xonotic-like code formatting
[xonotic/xonotic-data.pk3dir.git] / qcsrc / client / wall.qc
1 #include "wall.qh"
2
3 void Ent_Wall_PreDraw()
4 {
5         if (self.inactive)
6         {
7                 self.alpha = 0;
8         }
9         else
10         {
11                 vector org;
12                 org = getpropertyvec(VF_ORIGIN);
13                 if(!checkpvs(org, self))
14                         self.alpha = 0;
15                 else if(self.fade_start) {
16                         self.alpha = self.alpha_max / 100.0 * bound(0,
17                                                            (self.fade_end - vlen(org - self.origin - 0.5 * (self.mins + self.maxs)))
18                                                            / (self.fade_end - self.fade_start), 1);
19                 }
20                 else
21                 {
22                         self.alpha = 1;
23                 }
24         }
25         if(self.alpha <= 0)
26                 self.drawmask = 0;
27         else
28                 self.drawmask = MASK_NORMAL;
29 }
30
31 void Ent_Wall_Draw()
32 {
33         float f;
34         var .vector fld;
35
36         if(self.bgmscriptangular)
37                 fld = angles;
38         else
39                 fld = origin;
40         self.fld = self.saved;
41
42         if(self.lodmodelindex1)
43         {
44                 if(autocvar_cl_modeldetailreduction <= 0)
45                 {
46                         if(self.lodmodelindex2 && autocvar_cl_modeldetailreduction <= -2)
47                                 self.modelindex = self.lodmodelindex2;
48                         else if(autocvar_cl_modeldetailreduction <= -1)
49                                 self.modelindex = self.lodmodelindex1;
50                         else
51                                 self.modelindex = self.lodmodelindex0;
52                 }
53                 else
54                 {
55                         float distance = vlen(NearestPointOnBox(self, view_origin) - view_origin);
56                         f = (distance * current_viewzoom + 100.0) * autocvar_cl_modeldetailreduction;
57                         f *= 1.0 / bound(0.01, view_quality, 1);
58                         if(self.lodmodelindex2 && f > self.loddistance2)
59                                 self.modelindex = self.lodmodelindex2;
60                         else if(f > self.loddistance1)
61                                 self.modelindex = self.lodmodelindex1;
62                         else
63                                 self.modelindex = self.lodmodelindex0;
64                 }
65         }
66
67         InterpolateOrigin_Do();
68
69         self.saved = self.fld;
70
71         f = BGMScript(self);
72         if(f >= 0)
73         {
74                 if(self.lip < 0) // < 0: alpha goes from 1 to 1-|lip| when toggled (toggling subtracts lip)
75                         self.alpha = 1 + self.lip * f;
76                 else // > 0: alpha goes from 1-|lip| to 1 when toggled (toggling adds lip)
77                         self.alpha = 1 - self.lip * (1 - f);
78                 self.fld = self.fld + self.movedir * f;
79         }
80         else
81                 self.alpha = 1;
82
83         if(self.alpha >= ALPHA_MIN_VISIBLE)
84                 self.drawmask = MASK_NORMAL;
85         else
86                 self.drawmask = 0;
87 }
88
89 void Ent_Wall_Remove()
90 {
91         if(self.bgmscript)
92                 strunzone(self.bgmscript);
93         self.bgmscript = string_null;
94 }
95
96 void Ent_Wall()
97 {
98         int f;
99         var .vector fld;
100
101         InterpolateOrigin_Undo();
102         self.iflags = IFLAG_ANGLES | IFLAG_ORIGIN;
103
104         if(self.bgmscriptangular)
105                 fld = angles;
106         else
107                 fld = origin;
108         self.fld = self.saved;
109
110         f = ReadByte();
111
112         if(f & 1)
113         {
114                 if(f & 0x40)
115                         self.colormap = ReadShort();
116                 else
117                         self.colormap = 0;
118         }
119
120         if(f & 2)
121         {
122                 self.origin_x = ReadCoord();
123                 self.origin_y = ReadCoord();
124                 self.origin_z = ReadCoord();
125                 setorigin(self, self.origin);
126         }
127
128         if(f & 4)
129         {
130                 if(f & 0x10)
131                 {
132                         self.angles_x = ReadAngle();
133                         self.angles_y = ReadAngle();
134                         self.angles_z = ReadAngle();
135                 }
136                 else
137                         self.angles = '0 0 0';
138         }
139
140         if(f & 8)
141         {
142                 if(f & 0x80)
143                 {
144                         self.lodmodelindex0 = ReadShort();
145                         self.loddistance1 = ReadShort();
146                         self.lodmodelindex1 = ReadShort();
147                         self.loddistance2 = ReadShort();
148                         self.lodmodelindex2 = ReadShort();
149                 }
150                 else
151                 {
152                         self.modelindex = ReadShort();
153                         self.loddistance1 = 0;
154                         self.loddistance2 = 0;
155                 }
156                 self.solid = ReadByte();
157                 self.scale = ReadShort() / 256.0;
158                 if(f & 0x20)
159                 {
160                         self.mins_x = ReadCoord();
161                         self.mins_y = ReadCoord();
162                         self.mins_z = ReadCoord();
163                         self.maxs_x = ReadCoord();
164                         self.maxs_y = ReadCoord();
165                         self.maxs_z = ReadCoord();
166                 }
167                 else
168                         self.mins = self.maxs = '0 0 0';
169                 setsize(self, self.mins, self.maxs);
170
171                 if(self.bgmscript)
172                         strunzone(self.bgmscript);
173                 self.bgmscript = ReadString();
174                 if(substring(self.bgmscript, 0, 1) == "<")
175                 {
176                         self.bgmscript = strzone(substring(self.bgmscript, 1, -1));
177                         self.bgmscriptangular = 1;
178                 }
179                 else
180                 {
181                         self.bgmscript = strzone(self.bgmscript);
182                         self.bgmscriptangular = 0;
183                 }
184                 if(self.bgmscript != "")
185                 {
186                         self.bgmscriptattack = ReadByte() / 64.0;
187                         self.bgmscriptdecay = ReadByte() / 64.0;
188                         self.bgmscriptsustain = ReadByte() / 255.0;
189                         self.bgmscriptrelease = ReadByte() / 64.0;
190                         self.movedir_x = ReadCoord();
191                         self.movedir_y = ReadCoord();
192                         self.movedir_z = ReadCoord();
193                         self.lip = ReadByte() / 255.0;
194                 }
195                 self.fade_start = ReadShort();
196                 self.fade_end = ReadShort();
197                 self.alpha_max = ReadShort();
198                 self.alpha_min = ReadShort();
199                 self.inactive = ReadShort();
200                 BGMScript_InitEntity(self);
201         }
202
203         InterpolateOrigin_Note();
204
205         self.saved = self.fld;
206
207         self.entremove = Ent_Wall_Remove;
208         self.draw = Ent_Wall_Draw;
209         self.predraw = Ent_Wall_PreDraw;
210 }