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