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